From 7f2fd11ab0fd646be274a4798115044155a4a785 Mon Sep 17 00:00:00 2001 From: Bitto Date: Tue, 7 Apr 2026 11:38:08 +0100 Subject: [PATCH] "Swap Event Sides" option for charter --- assets/languages/en/Options.xml | 3 ++ assets/languages/es/Options.xml | 7 +++-- assets/languages/pt/Options.xml | 3 ++ source/funkin/editors/charter/Charter.hx | 29 ++++++++++--------- source/funkin/editors/charter/CharterEvent.hx | 10 +++---- .../funkin/editors/charter/CharterEventAdd.hx | 11 ++++--- source/funkin/options/Options.hx | 1 + .../funkin/options/categories/DebugOptions.hx | 1 + 8 files changed, 41 insertions(+), 24 deletions(-) diff --git a/assets/languages/en/Options.xml b/assets/languages/en/Options.xml index d1958961fc..1cde775d71 100644 --- a/assets/languages/en/Options.xml +++ b/assets/languages/en/Options.xml @@ -177,6 +177,9 @@ Editor SFXs If checked, will play sound effects when working on editors (ex: will play sfxs when checking checkboxes...) + Swap Event Sides + If checked, global events will be on the left of the strumlines. + Chart Pretty Print If checked, the saved files from the chart editor will be formatted to be easily viewable diff --git a/assets/languages/es/Options.xml b/assets/languages/es/Options.xml index bd25ee90b8..60ad120cd9 100644 --- a/assets/languages/es/Options.xml +++ b/assets/languages/es/Options.xml @@ -117,7 +117,7 @@ Transmición de Música Si está activado, la música será transmitida en tiempo real, liberando un montón de RAM, aunque usará más CPU si hay mucho audio al mismo tiempo (EXPERIMENTAL). Desactivarlo consumirá más RAM, especialmente en canciones más largas. Si no estás seguro, déjalo activado. - + Transmición de Vocales Si está activado, las vocales también serán transmitidas, impactará el rendimiento si hay muchas vocales (EXPERIMENTAL). Si no estás seguro, déjalo desactivade. @@ -158,10 +158,13 @@ Desactivar Tamaño Mínimo Desactiva el tamaño mínimo de los editores (Editores Adaptables debe estar activado). - + Sonidos del Editor Si está activado, habran sonidos en los editores (ej: al activar opciones...) + Cambiar Lados de Eventos + Si está activado, eventos globales estarán a la izquierda de las pistas. + Si está activado, los charts se guardarán de forma más legible (no aplica a XMLs) Difuminado Intensivo diff --git a/assets/languages/pt/Options.xml b/assets/languages/pt/Options.xml index c9f02aac1e..82ce97c7d7 100644 --- a/assets/languages/pt/Options.xml +++ b/assets/languages/pt/Options.xml @@ -177,6 +177,9 @@ Sons de Editor Se marcado, tocará efeitos sonoros nos editores (ex: ao carregar em caixas...) + Trocar Lados de Eventos + Se marcado, eventos globais estarão no lado esquerdo das pistas. + Mapas Legíveis Se marcado, os ficheiros guardados no editor de mapas serão formatados para serem fácilmente legíveis. diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index a1c39bf891..513d5f6d0d 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -443,25 +443,26 @@ class Charter extends UIState { gridBackdrops = new CharterBackdropGroup(strumLines); gridBackdrops.notesGroup = this.notesGroup; - leftEventRowText = new UIText(0, -40, 0, translate("info.localEvents"), 12); + leftEventRowText = new UIText(0, -40, 0, translate("info." + (Options.charterSwapEventSides ? "globalEvents" : "localEvents")), 12); leftEventRowText.alignment = "center"; leftEventRowText.alpha = 0.75; leftEventsBackdrop = new EventBackdrop(false); leftEventsBackdrop.x = -leftEventsBackdrop.width; leftEventRowText.cameras = leftEventsBackdrop.cameras = leftEventsGroup.cameras = [charterCamera]; - leftEventsGroup.eventsBackdrop = leftEventsBackdrop; - leftEventsGroup.eventsRowText = leftEventRowText; - rightEventRowText = new UIText(0, -40, 0, translate("info.globalEvents"), 12); + rightEventRowText = new UIText(0, -40, 0, translate("info." + (Options.charterSwapEventSides ? "localEvents" : "globalEvents")), 12); rightEventRowText.alignment = "center"; rightEventRowText.alpha = 0.75; rightEventsBackdrop = new EventBackdrop(true); rightEventsBackdrop.x = 0; rightEventRowText.cameras = rightEventsBackdrop.cameras = rightEventsGroup.cameras = [charterCamera]; - rightEventsGroup.eventsBackdrop = rightEventsBackdrop; - rightEventsGroup.eventsRowText = rightEventRowText; + + leftEventsGroup.eventsBackdrop = Options.charterSwapEventSides ? rightEventsBackdrop : leftEventsBackdrop; + leftEventsGroup.eventsRowText = Options.charterSwapEventSides ? rightEventRowText : leftEventRowText; + rightEventsGroup.eventsBackdrop = Options.charterSwapEventSides ? leftEventsBackdrop : rightEventsBackdrop; + rightEventsGroup.eventsRowText = Options.charterSwapEventSides ? leftEventRowText : rightEventRowText; // thank you neo for pointing out im stupid -lunar // this is future lunar i completely forgot what neo pointed out but hes awesome go follow him on twitter @@ -537,12 +538,12 @@ class Charter extends UIState { strumlineInfoBG.cameras = [charterCamera]; strumLines.cameras = [charterCamera]; - localAddEventSpr = new CharterEventAdd(false); + localAddEventSpr = new CharterEventAdd(Options.charterSwapEventSides); localAddEventSpr.x -= localAddEventSpr.bWidth; localAddEventSpr.cameras = [charterCamera]; localAddEventSpr.alpha = 0; - globalAddEventSpr = new CharterEventAdd(true); + globalAddEventSpr = new CharterEventAdd(!Options.charterSwapEventSides); globalAddEventSpr.x = 0; globalAddEventSpr.cameras = [charterCamera]; globalAddEventSpr.alpha = 0; @@ -920,11 +921,12 @@ class Charter extends UIState { n.cursor = HAND; }, function (e:CharterEvent) { e.snappedToGrid = false; - e.setPosition(e.eventsBackdrop.x + (e.global ? 0 : e.eventsBackdrop.width - e.bWidth) + (mousePos.x - dragStartPos.x), e.step * 40 + (mousePos.y - dragStartPos.y) - 17); + var isGlobal = e.global != Options.charterSwapEventSides; + e.setPosition(e.eventsBackdrop.x + (isGlobal ? 0 : e.eventsBackdrop.width - e.bWidth) + (mousePos.x - dragStartPos.x), e.step * 40 + (mousePos.y - dragStartPos.y) - 17); e.y = CoolUtil.bound(e.y, -17, (__endStep*40)-17); e.cursor = HAND; - e.displayGlobal = e.x + (e.bWidth/2) > ((strumLines.totalKeyCount*40)/2); + e.displayGlobal = e.x + (e.bWidth/2) > ((strumLines.totalKeyCount*40)/2) != Options.charterSwapEventSides; }); currentCursor = HAND; } else { @@ -1045,7 +1047,7 @@ class Charter extends UIState { var e:CharterEvent = cast s; var newEvent = new CharterEvent(e.step, [for (event in e.events) Reflect.copy(event)], e.global); newEvent.refreshEventIcons(); - (e.global ? rightEventsGroup : leftEventsGroup).add(newEvent); + ((e.global != Options.charterSwapEventSides) ? rightEventsGroup : leftEventsGroup).add(newEvent); newSelection.push(newEvent); } } @@ -1123,11 +1125,12 @@ class Charter extends UIState { // Event Spr for (addEventSpr in [localAddEventSpr, globalAddEventSpr]) { addEventSpr.incorporeal = true; - if ((!addEventSpr.global ? mousePos.x < 0 : mousePos.x > strumLines.totalKeyCount * 40) && gridActionType == NONE && inBoundsY) { + var onLeft:Bool = (!addEventSpr.global) != Options.charterSwapEventSides; + if ((onLeft ? mousePos.x < 0 : mousePos.x > strumLines.totalKeyCount * 40) && gridActionType == NONE && inBoundsY) { var event = getHoveredEvent(mousePos.y, !addEventSpr.global ? leftEventsGroup : rightEventsGroup); var hoveredWidth:Float = event != null ? 27 + 40 + event.bWidth : addEventSpr.bWidth; - if ((!addEventSpr.global ? mousePos.x > -hoveredWidth : mousePos.x < strumLines.totalKeyCount * 40 + hoveredWidth)) { + if ((onLeft ? mousePos.x > -hoveredWidth : mousePos.x < strumLines.totalKeyCount * 40 + hoveredWidth)) { addEventSpr.incorporeal = false; if (event != null) addEventSpr.updateEdit(event); diff --git a/source/funkin/editors/charter/CharterEvent.hx b/source/funkin/editors/charter/CharterEvent.hx index f159c83a51..e4c590aa0a 100644 --- a/source/funkin/editors/charter/CharterEvent.hx +++ b/source/funkin/editors/charter/CharterEvent.hx @@ -50,7 +50,7 @@ class CharterEvent extends UISliceSprite implements ICharterSelectable { if (snappedToGrid && eventsBackdrop != null) { bWidth = 37 + (icons.length * 22); - x = eventsBackdrop.x + (global ? 0 : eventsBackdrop.width - bWidth); + x = eventsBackdrop.x + ((global != Options.charterSwapEventSides) ? 0 : eventsBackdrop.width - bWidth); } for(k=>i in icons) { @@ -68,7 +68,7 @@ class CharterEvent extends UISliceSprite implements ICharterSelectable { selectedColorTransform(sprite.colorTransform); } - flipX = displayGlobal; + flipX = (displayGlobal != Options.charterSwapEventSides); } @:noCompletion private inline function selectedColorTransform(transform:ColorTransform) { @@ -282,9 +282,9 @@ class CharterEvent extends UISliceSprite implements ICharterSelectable { shouldDoArrow = event.params[1] && event.params[3] != "CLASSIC"; // is Tweened and isnt Lerped icon = getIconFromStrumline(event.params[0]); // camera movement, use health icon } - + if (icon == null) icon = generateDefaultIcon(event.name); - + if(event.params != null && shouldDoArrow && !inMenu) { var group = new EventIconGroup(); group.add(icon); @@ -412,7 +412,7 @@ class CharterEvent extends UISliceSprite implements ICharterSelectable { draggable = true; bWidth = 37 + (icons.length * 22); - x = (snappedToGrid && eventsBackdrop != null && global ? eventsBackdrop.x - bWidth : (global ? 0 : -bWidth)); + x = (snappedToGrid && eventsBackdrop != null && (global != Options.charterSwapEventSides) ? eventsBackdrop.x - bWidth : ((global != Options.charterSwapEventSides) ? 0 : -bWidth)); } } diff --git a/source/funkin/editors/charter/CharterEventAdd.hx b/source/funkin/editors/charter/CharterEventAdd.hx index dca9d30891..ee7ec48ec7 100644 --- a/source/funkin/editors/charter/CharterEventAdd.hx +++ b/source/funkin/editors/charter/CharterEventAdd.hx @@ -13,7 +13,8 @@ class CharterEventAdd extends UISliceSprite { public function new(global:Bool) { super(0, 0, 100, 34, 'editors/charter/event-spr-add'); - this.global = flipX = global; + this.global = global; + flipX = (global != Options.charterSwapEventSides); sideText = new UIText(0, -40, 0, TU.translate("charter.eventType-" + (global ? "global" : "local")), 12); sideText.alignment = "center"; sideText.alpha = 0.75; @@ -49,7 +50,7 @@ class CharterEventAdd extends UISliceSprite { super.update(elapsed); if (FlxG.state.subState != null) return; - text.follow(this, global ? bWidth - text.width - (text.text == TU.translate("charter.addEvent") ? 15 : 20) : 20, (bHeight - text.height) / 2); + text.follow(this, (global != Options.charterSwapEventSides) ? bWidth - text.width - (text.text == TU.translate("charter.addEvent") ? 15 : 20) : 20, (bHeight - text.height) / 2); sideText.follow(this, (bWidth/2) - (sideText.fieldWidth/2), -(sideText.height + 2)); alpha = sprAlpha * 0.75; text.alpha = sprAlpha; @@ -64,7 +65,8 @@ class CharterEventAdd extends UISliceSprite { this.y = (step * 40) - (bHeight / 2); text.text = TU.translate("charter.addEvent"); framesOffset = 0; bWidth = 37 + Math.ceil(text.width); - x = global ? Charter.instance.strumLines.members[Charter.instance.strumLines.members.length-1].x + (40*Charter.instance.strumLines.members[Charter.instance.strumLines.members.length-1].keyCount) : -(bWidth); + x = (global != Options.charterSwapEventSides) ? Charter.instance.strumLines.members[Charter.instance.strumLines.members.length-1].x + (40*Charter.instance.strumLines.members[Charter.instance.strumLines.members.length-1].keyCount) : -(bWidth); + sideText.text = TU.translate("charter.eventType-" + (global ? "global" : "local")); } public function updateEdit(event:CharterEvent) { @@ -73,6 +75,7 @@ class CharterEventAdd extends UISliceSprite { this.y = event.y; text.text = TU.translate("charter.editEvent"); framesOffset = 9; bWidth = 27 + Math.ceil(text.width) + event.bWidth; - x = global ? Charter.instance.strumLines.members[Charter.instance.strumLines.members.length-1].x + (40*Charter.instance.strumLines.members[Charter.instance.strumLines.members.length-1].keyCount) : -(bWidth); + x = (event.global != Options.charterSwapEventSides) ? Charter.instance.strumLines.members[Charter.instance.strumLines.members.length-1].x + (40*Charter.instance.strumLines.members[Charter.instance.strumLines.members.length-1].keyCount) : -(bWidth); + sideText.text = TU.translate("charter.eventType-" + (event.global ? "global" : "local")); } } \ No newline at end of file diff --git a/source/funkin/options/Options.hx b/source/funkin/options/Options.hx index 377dc1918a..b3984580fe 100644 --- a/source/funkin/options/Options.hx +++ b/source/funkin/options/Options.hx @@ -58,6 +58,7 @@ class Options */ public static var intensiveBlur:Bool = true; public static var editorSFX:Bool = true; + public static var charterSwapEventSides:Bool = false; public static var editorCharterPrettyPrint:Bool = false; public static var editorCharacterPrettyPrint:Bool = true; diff --git a/source/funkin/options/categories/DebugOptions.hx b/source/funkin/options/categories/DebugOptions.hx index 74b2eb8a7d..4f63da38be 100644 --- a/source/funkin/options/categories/DebugOptions.hx +++ b/source/funkin/options/categories/DebugOptions.hx @@ -13,6 +13,7 @@ class DebugOptions extends TreeMenuScreen { add(new Checkbox(getNameID("editorCharterPrettyPrint"), getDescID("editorCharterPrettyPrint"), "editorCharterPrettyPrint")); add(new Checkbox(getNameID("editorCharacterPrettyPrint"), getDescID("editorCharacterPrettyPrint"), "editorCharacterPrettyPrint")); add(new Checkbox(getNameID("editorStagePrettyPrint"), getDescID("editorStagePrettyPrint"), "editorStagePrettyPrint")); + add(new Checkbox(getNameID("charterSwapEventSides"), getDescID("charterSwapEventSides"), "charterSwapEventSides")); add(new Checkbox(getNameID("intensiveBlur"), getDescID("intensiveBlur"), "intensiveBlur")); add(new Checkbox(getNameID("charterAutoSaves"), getDescID("charterAutoSaves"), "charterAutoSaves")); add(new NumOption(getNameID("charterAutoSaveTime"), getDescID("charterAutoSaveTime"), 60, 60*10, 1, "charterAutoSaveTime"));