From afdb0a182d56e922118a8b07147e39a024cf0c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=8D=9A=7ENex?= <87421482+NexIsDumb@users.noreply.github.com> Date: Fri, 4 Oct 2024 16:55:32 +0200 Subject: [PATCH] 1 men, 2 pregnant FINISHED WOHOO READY FOR THE TESTERSSS!!! Co-Authored-By: Ne_Eo --- assets/languages/en/Options.xml | 11 +++- assets/languages/en/config.ini | 2 + assets/languages/it/config.ini | 4 +- .../funkin/backend/utils/TranslationUtil.hx | 24 +++++--- source/funkin/menus/ui/Alphabet.hx | 4 ++ source/funkin/options/Options.hx | 7 ++- source/funkin/options/OptionsMenu.hx | 45 +++++++++----- source/funkin/options/OptionsScreen.hx | 44 ++++++++++++-- source/funkin/options/OptionsTree.hx | 23 ++++++- source/funkin/options/TreeMenu.hx | 50 +++++++++++----- .../options/categories/LanguageOptions.hx | 60 +++++++++++++++++++ .../funkin/options/categories/MiscOptions.hx | 20 ------- source/funkin/options/type/ArrayOption.hx | 15 +++++ source/funkin/options/type/Checkbox.hx | 9 ++- source/funkin/options/type/NumOption.hx | 15 +++++ source/funkin/options/type/OptionType.hx | 13 +++- source/funkin/options/type/TextOption.hx | 21 ++++++- source/funkin/savedata/FunkinSave.hx | 7 ++- 18 files changed, 301 insertions(+), 73 deletions(-) create mode 100644 source/funkin/options/categories/LanguageOptions.hx diff --git a/assets/languages/en/Options.xml b/assets/languages/en/Options.xml index 3010049d..7ce98f01 100644 --- a/assets/languages/en/Options.xml +++ b/assets/languages/en/Options.xml @@ -1,5 +1,7 @@ + No Description + Options Menu Select a category to continue. @@ -13,6 +15,9 @@ Appearance Change Appearance options such as Flashing menus... + Language + Change the language that the engine uses. + Miscellaneous Use this menu to reset save data or engine settings. @@ -65,10 +70,12 @@ If unchecked, will stop the camera from zooming in every 4 beats - + Language - The language that the engine currently uses (the default one is {0}). + Language by {0} (Version: {1}) + + Force Crash Select this option to force a crash. diff --git a/assets/languages/en/config.ini b/assets/languages/en/config.ini index 80a92684..2aa42bba 100644 --- a/assets/languages/en/config.ini +++ b/assets/languages/en/config.ini @@ -2,6 +2,8 @@ name="English" credits="Codename Engine Devs" version="0.0.1" +; Moving these in the wiki when releasing ; Shows missing ID:s as {id} and prints in the console Missing Translation IDs: id ; otherwhise uses the other languages (based on the chosen order) for the missing translations +; NOTE: it is recommended to use this feature for debug only, but do as you wish showMissingIds="true" \ No newline at end of file diff --git a/assets/languages/it/config.ini b/assets/languages/it/config.ini index 9816f955..cd9e30b5 100644 --- a/assets/languages/it/config.ini +++ b/assets/languages/it/config.ini @@ -1,7 +1,9 @@ -name="Italian" +name="Italiano" credits="Nex_isDumb" version="0.0.1" +; Moving these in the wiki when releasing ; Shows missing ID:s as {id} and prints in the console Missing Translation IDs: id ; otherwhise uses the other languages (based on the chosen order) for the missing translations +; NOTE: it is recommended to use this feature for debug only, but do as you wish showMissingIds="false" \ No newline at end of file diff --git a/source/funkin/backend/utils/TranslationUtil.hx b/source/funkin/backend/utils/TranslationUtil.hx index 00fa2bc6..f6a9d0b6 100644 --- a/source/funkin/backend/utils/TranslationUtil.hx +++ b/source/funkin/backend/utils/TranslationUtil.hx @@ -29,7 +29,7 @@ final class TranslationUtil * It is filled with the default language. * * This is filled in if the current language is not the same as the default language. - * Its used when showMissingIds is false. + * Its used when showMissingIds in the config is false (or is not present). * * It'll never be `null`. **/ @@ -63,8 +63,6 @@ final class TranslationUtil */ public static var foundLanguages:Array = []; - public static var showMissingIds:Bool = false; - // Private private static inline var LANG_FOLDER:String = "languages"; private static var langConfigs:Map = []; @@ -116,8 +114,7 @@ final class TranslationUtil config = getConfig(name); stringMap = loadLanguage(name); - - showMissingIds = config.get("showMissingIds").getDefault("false") == "true"; + alternativeStringMap = name == Flags.DEFAULT_LANGUAGE || config.get("showMissingIds").getDefault("false") == "true" ? [] : loadLanguage(Flags.DEFAULT_LANGUAGE); #end } @@ -135,13 +132,18 @@ final class TranslationUtil public static inline function translateDiff(?id:String, ?params:Array):String return get("diff." + id.toLowerCase(), params, id); - public static inline function exists(id:String):Bool - return #if TRANSLATIONS_SUPPORT stringMap.exists(id) #else false #end; + public static function exists(id:String):Bool { + #if TRANSLATIONS_SUPPORT + for (map in [stringMap, alternativeStringMap]) if (map.exists(id)) return true; + #end + return false; + } public static function getRaw(id:String, ?def:String):IFormatInfo { #if TRANSLATIONS_SUPPORT - if (stringMap.exists(id)) return stringMap.get(id); + for (map in [stringMap, alternativeStringMap]) if (map.exists(id)) + return map.get(id); #end if(def != null) @@ -314,6 +316,10 @@ final class TranslationUtil return langConfigs.exists(lang) ? langConfigs.get(lang) : getDefaultConfig(lang); } + public static inline function isShowingMissingIds():Bool { + return alternativeStringMap != []; + } + public static inline function translationsMain(key:String):String return '$LANG_FOLDER/$key'; @@ -350,7 +356,7 @@ final class TranslationUtil return Options.language == Flags.DEFAULT_LANGUAGE; @:noCompletion private static function get_isLanguageLoaded():Bool - return Lambda.count(stringMap) > 0; + return Lambda.count(stringMap) > 0 || (isShowingMissingIds() && Lambda.count(alternativeStringMap) > 0); } @:structInit diff --git a/source/funkin/menus/ui/Alphabet.hx b/source/funkin/menus/ui/Alphabet.hx index c76fcb42..10779521 100644 --- a/source/funkin/menus/ui/Alphabet.hx +++ b/source/funkin/menus/ui/Alphabet.hx @@ -209,6 +209,10 @@ class Alphabet extends FlxSpriteGroup addText(); } } + + override function draw() { + super.draw(); + } } class AlphaCharacter extends FlxSprite diff --git a/source/funkin/options/Options.hx b/source/funkin/options/Options.hx index 98fad245..046adf10 100644 --- a/source/funkin/options/Options.hx +++ b/source/funkin/options/Options.hx @@ -127,7 +127,12 @@ class Options if (!__eventAdded) { Lib.application.onExit.add(function(i:Int) { - trace("Saving settings..."); + Logs.traceColored([ + Logs.getPrefix("Options"), + Logs.logText("Saving "), + Logs.logText("settings", GREEN), + Logs.logText("...") + ], VERBOSE); save(); }); __eventAdded = true; diff --git a/source/funkin/options/OptionsMenu.hx b/source/funkin/options/OptionsMenu.hx index bddd6626..750eb373 100644 --- a/source/funkin/options/OptionsMenu.hx +++ b/source/funkin/options/OptionsMenu.hx @@ -13,7 +13,9 @@ class OptionsMenu extends TreeMenu { name: 'optionsTree.controls-name', desc: 'optionsTree.controls-desc', state: null, - substate: funkin.options.keybinds.KeybindsOptions + substate: (name:String, desc:String) -> { + return new funkin.options.keybinds.KeybindsOptions(); + } }, { name: 'optionsTree.gameplay-name', @@ -27,6 +29,14 @@ class OptionsMenu extends TreeMenu { suffix: " >", state: AppearanceOptions }, + #if TRANSLATIONS_SUPPORT + { + name: 'optionsTree.language-name', + desc: 'optionsTree.language-desc', + suffix: " >", + state: LanguageOptions + }, + #end { name: 'optionsTree.miscellaneous-name', desc: 'optionsTree.miscellaneous-desc', @@ -51,27 +61,27 @@ class OptionsMenu extends TreeMenu { bg.antialiasing = true; add(bg); - main = new OptionsScreen(TU.translate("optionsMenu.header.title"), TU.translate("optionsMenu.header.desc"), [for(o in mainOptions) { - var name = o.name; - var desc = o.desc; - if(TU.exists(name)) name = TU.translate(name); - if(TU.exists(desc)) desc = TU.translate(desc); - var visualName = name; - if (o.suffix != null) visualName += o.suffix; - new TextOption(visualName, desc, function() { + main = new OptionsScreen("optionsMenu.header.title", "optionsMenu.header.desc", [for(o in mainOptions) { + new TextOption(o.name, o.desc, o.suffix, function() { if (o.substate != null) { persistentUpdate = false; persistentDraw = true; if (o.substate is MusicBeatSubstate) { openSubState(o.substate); - } else { - openSubState(Type.createInstance(o.substate, [name, desc])); + } else if(Reflect.isFunction(o.substate)) { + var substate:(name:String, desc:String) -> MusicBeatSubstate = o.substate; + openSubState(substate(o.name, o.desc)); + } else { // o.substate is Class + openSubState(Type.createInstance(o.substate, [o.name, o.desc])); } } else { if (o.state is OptionsScreen) { optionsTree.add(o.state); - } else { - optionsTree.add(Type.createInstance(o.state, [name, desc])); + } else if(Reflect.isFunction(o.state)) { + var state:(name:String, desc:String) -> OptionsScreen = o.state; + optionsTree.add(state(o.name, o.desc)); + } else { // o.state is Class + optionsTree.add(Type.createInstance(o.state, [o.name, o.desc])); } } }); @@ -92,7 +102,14 @@ class OptionsMenu extends TreeMenu { main.add(o); } } + } + public function reloadStrings() { + for(o in main.members) { + o.reloadStrings(); + } + optionsTree.reloadStrings(); + reloadLabels(); } public override function exit() { @@ -113,7 +130,7 @@ class OptionsMenu extends TreeMenu { continue; } var name = node.getAtt("name"); - var desc = node.getAtt("desc").getDefault("No Description"); + var desc = node.getAtt("desc").getDefault("optionsMenu.desc-missing"); switch(node.name) { case "checkbox": diff --git a/source/funkin/options/OptionsScreen.hx b/source/funkin/options/OptionsScreen.hx index 89ef09d6..7522b0b2 100644 --- a/source/funkin/options/OptionsScreen.hx +++ b/source/funkin/options/OptionsScreen.hx @@ -14,13 +14,26 @@ class OptionsScreen extends FlxTypedSpriteGroup { public var name:String; public var desc:String; + /** + * The prefix to add to the translations ids. + **/ public var prefix:String = ""; + private var rawName(default, set):String; + private var rawDesc(default, set):String; + + public inline function getNameID(name):String { + return prefix + name + "-name"; + } + public inline function getDescID(name):String { + return prefix + name + "-desc"; + } + public function getName(name:String, ?args:Array):String { - return TU.translate(prefix + name + "-name", args); + return TU.translate(getNameID(name), args); } public function getDesc(name:String, ?args:Array):String { - return TU.translate(prefix + name + "-desc", args); + return TU.translate(getDescID(name), args); } public function translate(name:String, ?args:Array):String { return TU.translate(prefix + name, args); @@ -28,12 +41,33 @@ class OptionsScreen extends FlxTypedSpriteGroup { public function new(name:String, desc:String, ?prefix:String, ?options:Array) { super(); - this.name = name; - this.desc = desc; - if (prefix != null) this.prefix = prefix; + rawName = name; + rawDesc = desc; + this.prefix = prefix != null ? prefix : ""; if (options != null) for(o in options) add(o); } + function set_rawName(v:String) { + rawName = v; + this.name = TU.exists(rawName) ? TU.translate(rawName) : rawName; + return v; + } + + function set_rawDesc(v:String) { + rawDesc = v; + this.desc = TU.exists(rawDesc) ? TU.translate(rawDesc) : rawDesc; + return v; + } + + public function reloadStrings() { + this.rawName = rawName; + this.rawDesc = rawDesc; + + for(o in members) { + o.reloadStrings(); + } + } + public override function update(elapsed:Float) { super.update(elapsed); diff --git a/source/funkin/options/OptionsTree.hx b/source/funkin/options/OptionsTree.hx index c457d52e..9fd9e590 100644 --- a/source/funkin/options/OptionsTree.hx +++ b/source/funkin/options/OptionsTree.hx @@ -3,6 +3,7 @@ package funkin.options; class OptionsTree extends FlxTypedGroup { public var lastMenu:OptionsScreen; public var treeParent:TreeMenu; + public var wasClosing:Bool = false; //public override function new() { // super(); //} @@ -13,18 +14,33 @@ class OptionsTree extends FlxTypedGroup { last.update(elapsed); } + public function updateAll(elapsed:Float) { + for (member in members) { + if(member == null) continue; + if(member.active && member.exists) { + member.update(elapsed); + } + } + } public override function draw() { super.draw(); - if (lastMenu != null) { + if (lastMenu != null) { // manually draw lastMenu since it got removed from the members list lastMenu.draw(); } } + public function reloadStrings() { + for(o in members) { + o.reloadStrings(); + } + } + public override function add(m:OptionsScreen) { super.add(m); setup(m); clearLastMenu(); + wasClosing = false; onMenuChange(); return m; } @@ -32,8 +48,10 @@ class OptionsTree extends FlxTypedGroup { var last = members.last(); super.insert(pos, m); setup(m); - if (last != members.last()) + if (last != members.last()) { + wasClosing = false; onMenuChange(); + } return m; } @@ -45,6 +63,7 @@ class OptionsTree extends FlxTypedGroup { } function __subMenuClose(m:OptionsScreen) { + wasClosing = true; clearLastMenu(); lastMenu = m; remove(m, true); diff --git a/source/funkin/options/TreeMenu.hx b/source/funkin/options/TreeMenu.hx index 96e17d20..fb4d13c1 100644 --- a/source/funkin/options/TreeMenu.hx +++ b/source/funkin/options/TreeMenu.hx @@ -3,6 +3,7 @@ package funkin.options; import flixel.FlxState; import flixel.tweens.FlxTween; import flixel.util.typeLimit.OneOfTwo; +import flixel.util.typeLimit.OneOfThree; import funkin.backend.FunkinText; import funkin.editors.ui.UIState; import funkin.menus.MainMenuState; @@ -64,21 +65,47 @@ class TreeMenu extends UIState { if (menuChangeTween != null) menuChangeTween.cancel(); + // i hate this code - Nex + // we need to rewrite OptionsTree to be more sane + var current = null; + var last = null; + var wasClosing = optionsTree.wasClosing; + + current = optionsTree.members.last(); + if (wasClosing) { + last = optionsTree.lastMenu; + } else if (optionsTree.members.length > 1) { + last = optionsTree.members[optionsTree.members.length - 2]; // previous + } + + if (current != null) + current.visible = true; + menuChangeTween = FlxTween.tween(FlxG.camera.scroll, {x: FlxG.width * Math.max(0, (optionsTree.members.length-1))}, 1.5, {ease: menuTransitionEase, onComplete: function(t) { optionsTree.clearLastMenu(); + if (!wasClosing && last != null) // only hide if they are opening a menu + last.visible = false; menuChangeTween = null; }}); - var t = ""; - for(o in optionsTree.members) - t += '${o.name} > '; - pathLabel.text = t; - - var idk:OptionsScreen = optionsTree.members.last(); - if (idk.members.length > 0) updateDesc(idk.members[idk.curSelected].desc); + reloadLabels(); } } + public function onMenuClose(m:OptionsScreen) { + CoolUtil.playMenuSFX(CANCEL); + } + + public function reloadLabels() { + var t = ""; + for(o in optionsTree.members) + t += '${o.name} > '; + pathLabel.text = t; + + var idk:OptionsScreen = optionsTree.members.last(); + if (idk.members.length > 0) updateDesc(idk.members[idk.curSelected].desc); + } + public function updateDesc(moreTxt:String = '') { pathDesc.text = optionsTree.members.last().desc; if (moreTxt != null && moreTxt.length > 0) pathDesc.text += '\n' + moreTxt; @@ -91,14 +118,9 @@ class TreeMenu extends UIState { lastState = null; } - public function onMenuClose(m:OptionsScreen) { - CoolUtil.playMenuSFX(CANCEL); - } - var menuChangeTween:FlxTween; public override function update(elapsed:Float) { super.update(elapsed); - Framerate.offset.y = pathBG.height; // in case path gets so long it goes offscreen @@ -112,8 +134,8 @@ class TreeMenu extends UIState { typedef OptionCategory = { var name:String; var desc:String; - var state:OneOfTwo>; - var ?substate:OneOfTwo>; + var state:OneOfThree, (name:String, desc:String) -> OptionsScreen>; + var ?substate:OneOfThree, (name:String, desc:String) -> MusicBeatSubstate>; var ?suffix:String; } diff --git a/source/funkin/options/categories/LanguageOptions.hx b/source/funkin/options/categories/LanguageOptions.hx new file mode 100644 index 00000000..03e79651 --- /dev/null +++ b/source/funkin/options/categories/LanguageOptions.hx @@ -0,0 +1,60 @@ +package funkin.options.categories; + +class LanguageBox extends Checkbox { + public var langID:String; + + public function new(name:String, langID:String) { + this.langID = langID; + super(name, "LanguageOptions.language-desc", null, null); + } + + override function reloadStrings() { + super.reloadStrings(); + } + + override function set_rawDesc(v:String) { + rawDesc = v; + var config = TU.getConfig(langID); + this.desc = TU.exists(rawDesc) ? TU.translate( + rawDesc, [config["credits"], config["version"]] + ) : rawDesc; + return v; + } + + override function update(elapsed:Float) { + var lastChecked = checked; + checked = langID == TU.curLanguage; + if(lastChecked != checked) + checkbox.animation.play("checking", true, !checked); + super.update(elapsed); + } + + override function onSelect() { + checked = !checked; + if(checked) { + TranslationUtil.setLanguage(langID); + if(FlxG.state is OptionsMenu) { + var menu:OptionsMenu = cast FlxG.state; + menu.reloadStrings(); + trace("Reloading strings"); + } + } + checkbox.animation.play("checking", true, !checked); + } +} + +class LanguageOptions extends OptionsScreen { + public override function new(title:String, desc:String) { + super(title, desc, "LanguageOptions."); + + var langArray:Array = TranslationUtil.foundLanguages; + + for(lang in langArray) { + var split = lang.split("/"); + var langId = split.first(); + var langName = split.last(); + var checkbox = new LanguageBox(langName, langId); + add(checkbox); + } + } +} diff --git a/source/funkin/options/categories/MiscOptions.hx b/source/funkin/options/categories/MiscOptions.hx index 9971c8e3..8529d907 100644 --- a/source/funkin/options/categories/MiscOptions.hx +++ b/source/funkin/options/categories/MiscOptions.hx @@ -5,26 +5,6 @@ class MiscOptions extends OptionsScreen { public override function new(title:String, desc:String) { super(title, desc, "MiscOptions."); - { // Language Option - var lanArray:Array = TranslationUtil.foundLanguages; - - // TODO: add credits based on the config file - add(new ArrayOption( - getName("language"), - getDesc("language", [Flags.DEFAULT_LANGUAGE]), - [for(lan in lanArray) lan.split("/").first()], - [for(lan in lanArray) lan.split("/").last()], - "language", - function(path:String) { - TranslationUtil.setLanguage(path); - parent.remove(this); - // Reload the current screen - // todo add parent.reload(); - this.clear(); - parent.add(new MiscOptions(title, desc)); - })); - } - add(new TextOption( getName("forceCrash"), getDesc("forceCrash"), diff --git a/source/funkin/options/type/ArrayOption.hx b/source/funkin/options/type/ArrayOption.hx index 40c4942c..5a1496ec 100644 --- a/source/funkin/options/type/ArrayOption.hx +++ b/source/funkin/options/type/ArrayOption.hx @@ -15,6 +15,8 @@ class ArrayOption extends OptionType { public var parent:Dynamic; + private var rawText(default, set):String; + public var text(get, set):String; private function get_text() {return __text.text;} private function set_text(v:String) {return __text.text = v;} @@ -37,6 +39,19 @@ class ArrayOption extends OptionType { add(__text = new Alphabet(100, 20, text, true)); add(__selectiontext = new Alphabet(__text.width + 120, -30, formatTextOption(), false)); + + rawText = text; + } + + override function reloadStrings() { + super.reloadStrings(); + this.rawText = rawText; + } + + function set_rawText(v:String) { + rawText = v; + __text.text = TU.exists(rawText) ? TU.translate(rawText) : rawText; + return v; } public override function draw() { diff --git a/source/funkin/options/type/Checkbox.hx b/source/funkin/options/type/Checkbox.hx index ba8b0519..835920ef 100644 --- a/source/funkin/options/type/Checkbox.hx +++ b/source/funkin/options/type/Checkbox.hx @@ -42,7 +42,9 @@ class Checkbox extends TextOption { baseCheckboxOffset.set(checkbox.offset.x, checkbox.offset.y); this.optionName = optionName; - checked = Reflect.field(parent, optionName); + if(optionName != null) { + checked = Reflect.field(parent, optionName); + } } public override function update(elapsed:Float) { @@ -58,7 +60,10 @@ class Checkbox extends TextOption { } public override function onSelect() { - Reflect.setField(parent, optionName, checked = !checked); + checked = !checked; + if(optionName != null) { + Reflect.setField(parent, optionName, checked); + } checkbox.animation.play("checking", true, !checked); } diff --git a/source/funkin/options/type/NumOption.hx b/source/funkin/options/type/NumOption.hx index 541981f9..17c7ff80 100644 --- a/source/funkin/options/type/NumOption.hx +++ b/source/funkin/options/type/NumOption.hx @@ -18,6 +18,8 @@ class NumOption extends OptionType { public var parent:Dynamic; + private var rawText(default, set):String; + public var text(get, set):String; private function get_text() {return __text.text;} private function set_text(v:String) {return __text.text = v;} @@ -39,6 +41,19 @@ class NumOption extends OptionType { add(__text = new Alphabet(100, 20, text, true)); add(__number = new Alphabet(__text.width + 120, -30, ': $currentSelection', false)); + + rawText = text; + } + + override function reloadStrings() { + super.reloadStrings(); + this.rawText = rawText; + } + + function set_rawText(v:String) { + rawText = v; + __text.text = TU.exists(rawText) ? TU.translate(rawText) : rawText; + return v; } public override function onChangeSelection(change:Float):Void diff --git a/source/funkin/options/type/OptionType.hx b/source/funkin/options/type/OptionType.hx index 26699723..268c5c44 100644 --- a/source/funkin/options/type/OptionType.hx +++ b/source/funkin/options/type/OptionType.hx @@ -7,10 +7,21 @@ class OptionType extends FlxSpriteGroup { public var controls(get, null):Controls; public var selected:Bool = false; public var desc:String; + public var rawDesc(default, set):String; public function new(desc:String) { super(); - this.desc = desc; + rawDesc = desc; + } + + function set_rawDesc(v:String) { + rawDesc = v; + this.desc = TU.exists(rawDesc) ? TU.translate(rawDesc) : rawDesc; + return v; + } + + public function reloadStrings() { + this.rawDesc = rawDesc; } private function get_controls() {return PlayerSettings.solo.controls;} diff --git a/source/funkin/options/type/TextOption.hx b/source/funkin/options/type/TextOption.hx index 60d1a190..b16d285d 100644 --- a/source/funkin/options/type/TextOption.hx +++ b/source/funkin/options/type/TextOption.hx @@ -6,15 +6,34 @@ class TextOption extends OptionType { public var selectCallback:Void->Void; private var __text:Alphabet; + private var rawText(default, set):String; public var text(get, set):String; private function get_text() {return __text.text;} private function set_text(v:String) {return __text.text = v;} - public function new(text:String, desc:String, selectCallback:Void->Void) { + /** + * If you change this afterwards you will need to call `reloadStrings()`, or manually set rawText to rawText. + **/ + public var suffix:String; + + public function new(text:String, desc:String, ?suffix:String = "", ?selectCallback:Void->Void = null) { super(desc); this.selectCallback = selectCallback; add(__text = new Alphabet(100, 20, text, true)); + this.suffix = suffix; + rawText = text; + } + + override function reloadStrings() { + super.reloadStrings(); + this.rawText = rawText; + } + + function set_rawText(v:String) { + rawText = v; + __text.text = (TU.exists(rawText) ? TU.translate(rawText) : rawText) + suffix; + return v; } public override function draw() { diff --git a/source/funkin/savedata/FunkinSave.hx b/source/funkin/savedata/FunkinSave.hx index 20337df6..b2df2242 100644 --- a/source/funkin/savedata/FunkinSave.hx +++ b/source/funkin/savedata/FunkinSave.hx @@ -32,7 +32,12 @@ class FunkinSave { if (!__eventAdded) { Lib.application.onExit.add(function(i:Int) { - trace("Saving savedata..."); + Logs.traceColored([ + Logs.getPrefix("FunkinSave"), + Logs.logText("Saving "), + Logs.logText("savedata", GREEN), + Logs.logText("...") + ], VERBOSE); flush(); }); __eventAdded = true;