diff --git a/project.xml b/project.xml
index 4c48a50f..8fd1fe5b 100644
--- a/project.xml
+++ b/project.xml
@@ -197,6 +197,9 @@
+
+
+
diff --git a/source/funkin/backend/system/Main.hx b/source/funkin/backend/system/Main.hx
index 78c76b97..e0a56ce2 100644
--- a/source/funkin/backend/system/Main.hx
+++ b/source/funkin/backend/system/Main.hx
@@ -63,6 +63,9 @@ class Main extends Sprite
public function new()
{
super();
+
+ instance = this;
+
CrashHandler.init();
addChild(game = new FunkinGame(gameWidth, gameHeight, MainState, Options.framerate, Options.framerate, skipSplash, startFullscreen));
diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx
index 8ff3b364..878191e3 100644
--- a/source/funkin/editors/charter/Charter.hx
+++ b/source/funkin/editors/charter/Charter.hx
@@ -622,7 +622,7 @@ class Charter extends UIState {
}
}
- if (gridActionType == NONE && mousePos.x < 0) {
+ if (gridActionType == NONE && mousePos.x < 0 && mousePos.x > -addEventSpr.bWidth) {
addEventSpr.incorporeal = false;
addEventSpr.sprAlpha = lerp(addEventSpr.sprAlpha, 0.75, 0.25);
var event = getHoveredEvent(mousePos.y);
@@ -677,9 +677,16 @@ class Charter extends UIState {
}, function (e:CharterEvent) {
eventsGroup.add(e);
e.revive();
- });
+ e.refreshEventIcons();
+ }, false);
sortNotes();
+ for (s in selection)
+ if (s is CharterEvent) {
+ Charter.instance.updateBPMEvents();
+ break;
+ }
+
if (addToUndo)
this.addToUndo(CCreateSelection(selection));
return [];
@@ -700,6 +707,12 @@ class Charter extends UIState {
}
sortNotes();
+ for (s in selection)
+ if (s is CharterEvent) {
+ Charter.instance.updateBPMEvents();
+ break;
+ }
+
if (addToUndo)
this.addToUndo(CDeleteSelection(selection));
return [];
@@ -1035,21 +1048,26 @@ class Charter extends UIState {
var v = undoList.shift();
switch(v) {
case null: // do nothing
- case CCreateSelection(selection):
- deleteSelection(selection, false);
- case CDeleteSelection(selection):
- createSelection(selection, false);
- case CSustainChange(changes):
- for(n in changes)
- n.note.updatePos(n.note.step, n.note.id, n.before, n.note.type);
- case CSelectionDrag(selection, change):
- for (s in selection)
- if (s.draggable) s.handleDrag(change * -1);
- this.selection = selection;
case CDeleteStrumLine(strumLineID, strumLine):
createStrumline(strumLineID, strumLine, false);
case CCreateStrumLine(strumLineID, strumLine):
deleteStrumline(strumLineID, false);
+ case CCreateSelection(selection):
+ deleteSelection(selection, false);
+ case CDeleteSelection(selection):
+ createSelection(selection, false);
+ case CSelectionDrag(selection, change):
+ for (s in selection)
+ if (s.draggable) s.handleDrag(change * -1);
+ this.selection = selection;
+ case CEditSustains(changes):
+ for(n in changes)
+ n.note.updatePos(n.note.step, n.note.id, n.before, n.note.type);
+ case CEditEvent(event, oldEvents, newEvents):
+ event.events = oldEvents.copy();
+ event.refreshEventIcons();
+
+ Charter.instance.updateBPMEvents();
}
if (v != null)
redoList.insert(0, v);
@@ -1071,21 +1089,26 @@ class Charter extends UIState {
var v = redoList.shift();
switch(v) {
case null: // do nothing
- case CCreateSelection(selection):
- createSelection(selection, false);
- case CDeleteSelection(selection):
- deleteSelection(selection, false);
- case CSustainChange(changes):
- for(n in changes)
- n.note.updatePos(n.note.step, n.note.id, n.after, n.note.type);
- case CSelectionDrag(selection, change):
- for (s in selection)
- if (s.draggable) s.handleDrag(change);
- this.selection = selection;
case CDeleteStrumLine(strumLineID, strumLine):
deleteStrumline(strumLineID, false);
case CCreateStrumLine(strumLineID, strumLine):
createStrumline(strumLineID, strumLine, false);
+ case CCreateSelection(selection):
+ createSelection(selection, false);
+ case CDeleteSelection(selection):
+ deleteSelection(selection, false);
+ case CSelectionDrag(selection, change):
+ for (s in selection)
+ if (s.draggable) s.handleDrag(change);
+ this.selection = selection;
+ case CEditSustains(changes):
+ for(n in changes)
+ n.note.updatePos(n.note.step, n.note.id, n.after, n.note.type);
+ case CEditEvent(event, oldEvents, newEvents):
+ event.events = newEvents.copy();
+ event.refreshEventIcons();
+
+ Charter.instance.updateBPMEvents();
}
if (v != null)
undoList.insert(0, v);
@@ -1174,7 +1197,7 @@ class Charter extends UIState {
function changeNoteSustain(change:Float) {
if (selection.length <= 0 || change == 0) return;
- addToUndo(CSustainChange([
+ addToUndo(CEditSustains([
for(s in selection) {
if (s is CharterNote) {
var n:CharterNote = cast(s, CharterNote);
@@ -1231,7 +1254,7 @@ class Charter extends UIState {
}
}
- public function updateBPMEvents(newEvent:CharterEvent) {
+ public function updateBPMEvents() {
buildEvents();
Conductor.mapBPMChanges(PlayState.SONG);
@@ -1245,12 +1268,13 @@ class Charter extends UIState {
}
enum CharterChange {
+ CCreateStrumLine(strumLineID:Int, strumLine:ChartStrumLine);
+ CDeleteStrumLine(strumLineID:Int, strumLine:ChartStrumLine);
CCreateSelection(selection:Selection);
CDeleteSelection(selection:Selection);
CSelectionDrag(selection:Selection, change:FlxPoint);
- CSustainChange(notes:Array);
- CCreateStrumLine(strumLineID:Int, strumLine:ChartStrumLine);
- CDeleteStrumLine(strumLineID:Int, strumLine:ChartStrumLine);
+ CEditSustains(notes:Array);
+ CEditEvent(event:CharterEvent, oldEvents:Array, newEvents:Array);
}
enum CharterCopyboardObject {
@@ -1269,11 +1293,11 @@ typedef NoteSustainChange = {
this = array == null ? [] : array;
// too lazy to put this in every for loop so i made it a abstract
- public inline function loop(onNote:CharterNote->Void, ?onEvent:CharterEvent->Void) {
+ public inline function loop(onNote:CharterNote->Void, ?onEvent:CharterEvent->Void, ?draggableOnly:Bool = true) {
for (s in this) {
- if (s is CharterNote && onNote != null && s.draggable)
+ if (s is CharterNote && onNote != null && (draggableOnly ? s.draggable: true))
onNote(cast(s, CharterNote));
- else if (s is CharterEvent && onEvent != null && s.draggable)
+ else if (s is CharterEvent && onEvent != null && (draggableOnly ? s.draggable: true))
onEvent(cast(s, CharterEvent));
}
}
diff --git a/source/funkin/editors/charter/CharterEvent.hx b/source/funkin/editors/charter/CharterEvent.hx
index 21723627..aa593a50 100644
--- a/source/funkin/editors/charter/CharterEvent.hx
+++ b/source/funkin/editors/charter/CharterEvent.hx
@@ -77,10 +77,8 @@ class CharterEvent extends UISliceSprite implements ICharterSelectable {
return (selectionBox.x + selectionBox.bWidth > x) && (selectionBox.x < x + bWidth) && (selectionBox.y + selectionBox.bHeight > y) && (selectionBox.y < y + bHeight);
}
- public function handleDrag(change:FlxPoint) {
+ public function handleDrag(change:FlxPoint)
y = ((step += change.x) * 40) - 17;
- Charter.instance.updateBPMEvents(this);
- }
public function refreshEventIcons() {
while(icons.length > 0) {
diff --git a/source/funkin/editors/charter/CharterEventAdd.hx b/source/funkin/editors/charter/CharterEventAdd.hx
index 19547f1a..254f822c 100644
--- a/source/funkin/editors/charter/CharterEventAdd.hx
+++ b/source/funkin/editors/charter/CharterEventAdd.hx
@@ -19,14 +19,10 @@ class CharterEventAdd extends UISliceSprite {
public override function onHovered() {
super.onHovered();
if (FlxG.mouse.justReleased) {
- if (curCharterEvent != null) {
- Charter.instance.openSubState(new CharterEventScreen(curCharterEvent));
- } else {
- var event:CharterEvent = new CharterEvent(step, []);
- Charter.instance.eventsGroup.add(event);
-
- Charter.instance.openSubState(new CharterEventScreen(event));
- }
+ if (curCharterEvent != null)
+ Charter.instance.openSubState(new CharterEventScreen(step, curCharterEvent));
+ else
+ Charter.instance.openSubState(new CharterEventScreen(step));
}
}
diff --git a/source/funkin/editors/charter/CharterEventScreen.hx b/source/funkin/editors/charter/CharterEventScreen.hx
index c4f913d4..fa2e63a9 100644
--- a/source/funkin/editors/charter/CharterEventScreen.hx
+++ b/source/funkin/editors/charter/CharterEventScreen.hx
@@ -1,5 +1,6 @@
package funkin.editors.charter;
+import funkin.backend.chart.ChartData.ChartEvent;
import funkin.backend.system.Conductor;
import flixel.group.FlxGroup;
import funkin.editors.charter.EventsData;
@@ -11,6 +12,9 @@ class CharterEventScreen extends UISubstateWindow {
public var cam:FlxCamera;
public var chartEvent:CharterEvent;
+ public var step:Float = 0;
+ public var events:Array = [];
+
public var iconsPanel:FlxGroup;
public var eventName:UIText;
@@ -22,13 +26,17 @@ class CharterEventScreen extends UISubstateWindow {
public var saveButton:UIButton;
public var deleteButton:UIButton;
- public function new(chartEvent:CharterEvent) {
+ public function new(step:Float, ?chartEvent:Null) {
+ if (chartEvent != null) this.chartEvent = chartEvent;
+ this.step = step;
super();
- this.chartEvent = chartEvent;
}
public override function create() {
- winTitle = "Event group properties";
+ var creatingEvent:Bool = chartEvent == null;
+ if (creatingEvent) chartEvent = new CharterEvent(step, []);
+
+ winTitle = creatingEvent ? "Create Event Group" : "Edit Event Group";
winWidth = 960;
super.create();
@@ -36,6 +44,8 @@ class CharterEventScreen extends UISubstateWindow {
FlxG.sound.music.pause(); // prevent the song from continuing
Charter.instance.vocals.pause();
+ events = chartEvent.events.copy();
+
var bg:FlxSprite = new FlxSprite(windowSpr.x + 1, windowSpr.y + 31, Paths.image('editors/ui/scrollbar-bg'));
bg.setGraphicSize(30, windowSpr.bHeight - 32);
bg.updateHitbox();
@@ -46,12 +56,12 @@ class CharterEventScreen extends UISubstateWindow {
addButton = new UIButton(windowSpr.x + 1, windowSpr.y + 31, "", function() {
openSubState(new CharterEventTypeSelection(function(eventName) {
- chartEvent.events.push({
+ events.push({
time: Conductor.getTimeForStep(chartEvent.step),
params: [],
name: eventName
});
- changeTab(chartEvent.events.length-1);
+ changeTab(events.length-1);
}));
});
addButton.bWidth = addButton.bHeight = 30;
@@ -69,10 +79,24 @@ class CharterEventScreen extends UISubstateWindow {
saveCurTab();
chartEvent.refreshEventIcons();
- if (chartEvent.events.length <= 0)
- Charter.instance.eventsGroup.remove(chartEvent, true);
+ if (events.length <= 0)
+ Charter.instance.deleteSelection([chartEvent]);
+ else {
+ var oldEvents:Array = chartEvent.events.copy();
+ chartEvent.events = events;
+
+ if (creatingEvent)
+ Charter.instance.createSelection([chartEvent]);
+ else {
+ chartEvent.events = events;
+ chartEvent.refreshEventIcons();
+
+ Charter.instance.addToUndo(CEditEvent(chartEvent, oldEvents, events.copy()));
+ }
+ }
+
close();
- Charter.instance.updateBPMEvents(chartEvent);
+ Charter.instance.updateBPMEvents();
});
saveButton.x -= saveButton.bWidth;
saveButton.y -= saveButton.bHeight;
@@ -80,7 +104,7 @@ class CharterEventScreen extends UISubstateWindow {
deleteButton = new UIButton(saveButton.x - 10, saveButton.y, "Delete", function() {
if (curEvent >= 0) {
- chartEvent.events.splice(curEvent, 1);
+ events.splice(curEvent, 1);
changeTab(curEvent, false);
}
});
@@ -106,9 +130,9 @@ class CharterEventScreen extends UISubstateWindow {
paramsPanel.remove(e);
}
- if (id >= 0 && id < chartEvent.events.length) {
+ if (id >= 0 && id < events.length) {
curEvent = id;
- var curEvent = chartEvent.events[curEvent];
+ var curEvent = events[curEvent];
eventName.text = curEvent.name;
// add new elements
var y:Float = eventName.y + eventName.height + 10;
@@ -176,7 +200,7 @@ class CharterEventScreen extends UISubstateWindow {
while(iconsPanel.members.length > 0)
iconsPanel.remove(iconsPanel.members[0], true).destroy();
- for(k=>e in chartEvent.events) {
+ for(k=>e in events) {
var butt = new UIButton(windowSpr.x + 1, windowSpr.y + 66 + (k*30), "", function() {
changeTab(k);
});
@@ -197,10 +221,10 @@ class CharterEventScreen extends UISubstateWindow {
public function saveCurTab() {
if (curEvent < 0) return;
- chartEvent.events[curEvent].params = [
+ events[curEvent].params = [
for(p in paramsFields) {
if (p is UIDropDown) {
- var dataParams = EventsData.getEventParams(chartEvent.events[curEvent].name);
+ var dataParams = EventsData.getEventParams(events[curEvent].name);
if (dataParams[paramsFields.indexOf(p)].type == TStrumLine) cast(p, UIDropDown).index;
else cast(p, UIDropDown).label.text;
}