diff --git a/project.xml b/project.xml index 97c07c70..cc285817 100644 --- a/project.xml +++ b/project.xml @@ -10,7 +10,11 @@ - + + + + + @@ -109,7 +113,7 @@
- +
@@ -222,9 +226,10 @@ + - + diff --git a/source/funkin/backend/scripting/GlobalScript.hx b/source/funkin/backend/scripting/GlobalScript.hx index a604c457..8bb1fa8b 100644 --- a/source/funkin/backend/scripting/GlobalScript.hx +++ b/source/funkin/backend/scripting/GlobalScript.hx @@ -73,6 +73,16 @@ class GlobalScript { }); FlxG.signals.preStateSwitch.add(function() { call("preStateSwitch", []); + + var stateName = Type.getClassName(Type.getClass(@:privateAccess FlxG.game._requestedState)); + stateName = stateName.substring(stateName.lastIndexOf(".") + 1); + if (Flags.MOD_REDIRECT_STATES.exists(stateName)) { + @:privateAccess { + var classFromString = Type.resolveClass(Flags.MOD_REDIRECT_STATES.get(stateName)); + if (classFromString != null) FlxG.game._requestedState = Type.createInstance(classFromString, []); + else FlxG.game._requestedState = new funkin.backend.scripting.ModState(Flags.MOD_REDIRECT_STATES.get(stateName)); + } + } }); FlxG.signals.preUpdate.add(function() { diff --git a/source/funkin/backend/system/Flags.hx b/source/funkin/backend/system/Flags.hx index dc59dfbd..bdc0ebb2 100644 --- a/source/funkin/backend/system/Flags.hx +++ b/source/funkin/backend/system/Flags.hx @@ -35,7 +35,7 @@ class Flags { public static var MOD_DISCORD_LOGO_KEY:String = ""; public static var MOD_DISCORD_LOGO_TEXT:String = ""; - @:bypass public static var MOD_REDIRECT_STATES:Map = []; + public static var MOD_REDIRECT_STATES:Map = []; // -- Codename's Default Flags -- public static var CURRENT_API_VERSION:Int = 1; public static var COMMIT_NUMBER:Int = GitCommitMacro.commitNumber; @@ -157,10 +157,8 @@ class Flags { public static var ICON_OFFSET:Float = 26; public static var ICON_LERP:Float = 0.33; - public static var DEFAULT_PREPARE_SPRITE:String = null; - public static var DEFAULT_READY_SPRITE:String = 'game/ready'; - public static var DEFAULT_SET_SPRITE:String = 'game/set'; - public static var DEFAULT_GO_SPRITE:String = 'game/go'; + public static var DEFAULT_INTRO_LENGTH:Int = 5; + public static var DEFAULT_INTRO_SPRITES:Array = [null, 'game/ready', 'game/set', 'game/go']; public static var CAM_BOP_STRENGTH:Float = 0.015; public static var HUD_BOP_STRENGTH:Float = 0.03; @@ -210,13 +208,8 @@ class Flags { public static var DEFAULT_PAUSE_MENU_MUSIC:String = "breakfast"; public static var DEFAULT_GAMEOVER_MUSIC:String = "gameOver"; - public static var DEFAULT_MISS1_SOUND:String = "missnote1"; - public static var DEFAULT_MISS2_SOUND:String = "missnote2"; - public static var DEFAULT_MISS3_SOUND:String = "missnote3"; - public static var DEFAULT_INTRO1_SOUND:String = "intro1"; - public static var DEFAULT_INTRO2_SOUND:String = "intro2"; - public static var DEFAULT_INTRO3_SOUND:String = "intro3"; - public static var DEFAULT_INTROGO_SOUND:String = "introGo"; + public static var DEFAULT_MISS_SOUNDS:Array = ["missnote1", "missnote2", "missnote3"]; + public static var DEFAULT_INTRO_SOUNDS:Array = ["intro3", "intro2", "intro1", "introGo"]; public static var DEFAULT_GAMEOVERSFX_SOUND:String = "gameOverSFX"; public static var DEFAULT_GAMEOVEREND_SOUND:String = "gameOverEnd"; @@ -271,14 +264,19 @@ class Flags { if (!(data.length > 0)) return; var res = IniUtil.parseString(data); - if (res.exists("Common")) for (key => value in res.get("Common")) flags["MOD_" + key] = value; - if (res.exists("Discord")) for (key => value in res.get("Discord")) flags["MOD_DISCORD_" + key] = value; - if (res.exists("Flags")) for (key => value in res.get("Flags")) flags[key] = value; - - if (res.exists("StateRedirects")) for (key => value in res.get("StateRedirects")) - if (!Flags.MOD_REDIRECT_STATES.exists(key)) Flags.MOD_REDIRECT_STATES.set(key, value); - if (res.exists("StateRedirects.force")) for (key => value in res.get("StateRedirects.force")) - Flags.MOD_REDIRECT_STATES.set(key, value); + for (name => section in res) { + switch (name) { + case "Common": for (key => value in section) flags["MOD_" + key] = value; + case "Discord": for (key => value in section) flags["MOD_DISCORD_" + key] = value; + case "Flags": for (key => value in section) flags[key] = value; + case "StateRedirects.force": for (key => value in section) MOD_REDIRECT_STATES.set(key, value); + case "StateRedirects": for (key => value in section) if (!MOD_REDIRECT_STATES.exists(key)) MOD_REDIRECT_STATES.set(key, value); + case "Global": // do nothing + default: + if (Type.typeof(Reflect.field(Flags, name)) == Type.typeof(section)) Reflect.setField(Flags, name, section); + else trace('Invalid section $name'); + } + } } public static function loadFromDatas(datas:Array) { diff --git a/source/funkin/backend/system/MainState.hx b/source/funkin/backend/system/MainState.hx index 1ed8b740..1788db20 100644 --- a/source/funkin/backend/system/MainState.hx +++ b/source/funkin/backend/system/MainState.hx @@ -135,18 +135,6 @@ class MainState extends FlxState { } } - FlxG.signals.preStateSwitch.add(() -> { - var stateName = Type.getClassName(Type.getClass(@:privateAccess FlxG.game._requestedState)); - stateName = stateName.substring(stateName.lastIndexOf(".") + 1); - if (Flags.MOD_REDIRECT_STATES.exists(stateName)) { - @:privateAccess { - var classFromString = Type.resolveClass(Flags.MOD_REDIRECT_STATES.get(stateName)); - if (classFromString != null) FlxG.game._requestedState = Type.createInstance(classFromString, []); - else FlxG.game._requestedState = new funkin.backend.scripting.ModState(Flags.MOD_REDIRECT_STATES.get(stateName)); - } - } - }); - if (!Flags.DISABLE_WARNING_SCREEN) FlxG.switchState(new funkin.menus.WarningState()); else FlxG.switchState(new TitleState()); } diff --git a/source/funkin/backend/system/macros/FlagMacro.macro.hx b/source/funkin/backend/system/macros/FlagMacro.macro.hx index 622bada9..27b0e841 100644 --- a/source/funkin/backend/system/macros/FlagMacro.macro.hx +++ b/source/funkin/backend/system/macros/FlagMacro.macro.hx @@ -35,7 +35,7 @@ class FlagMacro { var skip = field.meta.hasMeta(":bypass"); var hasLazy = field.meta.hasMeta(":lazy"); - if(skip) continue; + if (skip) continue; switch (field.kind) { case FVar(type, expr): @@ -61,9 +61,8 @@ class FlagMacro { } } - if(expr == null) - Context.error('Flag ' + field.name + ' must have a default value', field.pos); - if(type == null) { + if (expr == null) Context.error('Flag ' + field.name + ' must have a default value', field.pos); + if (type == null) { switch(expr.expr) { case EConst(CIdent("true")) | EConst(CIdent("false")): type = macro: Bool; @@ -84,13 +83,13 @@ class FlagMacro { switch(type) { case macro: Array: field.kind = FVar(macro: Array, expr); - parser = macro value.split(",").map((e) -> e.trim()); + parser = macro value.split(",").map((e) -> e == 'NULL' ? null : e.trim()); case macro: Array: - parser = macro value.split(","); + parser = macro value.split(",").map((e) -> e == 'NULL' ? null : e); case (macro: Array) | (macro: Array): - parser = macro value.split(",").map((e) -> Std.parseInt(e)); + parser = macro value.split(",").map((e) -> e == 'NULL' ? null : Std.parseInt(e)); case macro: Array: - parser = macro value.split(",").map((e) -> Std.parseFloat(e)); + parser = macro value.split(",").map((e) -> e == 'NULL' ? null : Std.parseFloat(e)); case macro: Array: parser = macro value.split(",").map(parseBool); case macro: TrimmedString: @@ -183,13 +182,15 @@ class FlagMacro { case TPath({name: "Array", pack: []}): Context.error("Flag " + field.name + " cannot be an Array that isn't a String or Bool or TrimmedString or Int or Float", field.pos); case TPath({name: "Map", pack: []}): - Context.error("Flag " + field.name + " cannot be a Map", field.pos); + //Context.error("Flag " + field.name + " cannot be a Map", field.pos); + resetExprs.push(macro $i{field.name} = ${expr}); + continue; default: Context.error("Flag " + field.name + " must be either a Bool, Int, Float, String, Array, Array, Array, Array or Array", field.pos); } - if(parser == null) { - Context.error("Flag " + field.name + " must be either a Bool, Int, String, Array, Array or Array", field.pos); + if (parser == null) { + Context.error("Flag " + field.name + " must be either a Bool, Int, Float, String, Array, Array, Array, Array or Array", field.pos); continue; } diff --git a/source/funkin/game/PlayState.hx b/source/funkin/game/PlayState.hx index 0413d6f1..79bf9b79 100644 --- a/source/funkin/game/PlayState.hx +++ b/source/funkin/game/PlayState.hx @@ -457,15 +457,15 @@ class PlayState extends MusicBeatState /** * Length of the intro countdown. */ - public var introLength:Int = 5; + public var introLength:Int = Flags.DEFAULT_INTRO_LENGTH; /** * Array of sprites for the intro. */ - public var introSprites:Array = [Flags.DEFAULT_PREPARE_SPRITE, Flags.DEFAULT_READY_SPRITE, Flags.DEFAULT_SET_SPRITE, Flags.DEFAULT_GO_SPRITE]; + public var introSprites:Array = Flags.DEFAULT_INTRO_SPRITES.copy(); /** * Array of sounds for the intro. */ - public var introSounds:Array = [Flags.DEFAULT_INTRO3_SOUND, Flags.DEFAULT_INTRO2_SOUND, Flags.DEFAULT_INTRO1_SOUND, Flags.DEFAULT_INTROGO_SOUND]; + public var introSounds:Array = Flags.DEFAULT_INTRO_SOUNDS.copy(); /** * Whenever the game is paused or not. @@ -1765,7 +1765,7 @@ class PlayState extends MusicBeatState var directionID:Null = note == null ? direction : note.strumID; if (playerID == null || directionID == null || playerID == -1) return; - var event:NoteMissEvent = gameAndCharsEvent("onPlayerMiss", EventManager.get(NoteMissEvent).recycle(note, -10, 1, muteVocalsOnMiss, note != null ? -0.0475 : -0.04, Paths.sound(FlxG.random.getObject([Flags.DEFAULT_MISS1_SOUND, Flags.DEFAULT_MISS2_SOUND, Flags.DEFAULT_MISS3_SOUND])), FlxG.random.float(0.1, 0.2), note == null, combo > 5, "sad", true, true, "miss", strumLines.members[playerID].characters, playerID, note != null ? note.noteType : null, directionID, 0)); + var event:NoteMissEvent = gameAndCharsEvent("onPlayerMiss", EventManager.get(NoteMissEvent).recycle(note, -10, 1, muteVocalsOnMiss, note != null ? -0.0475 : -0.04, Paths.sound(FlxG.random.getObject(Flags.DEFAULT_MISS_SOUNDS)), FlxG.random.float(0.1, 0.2), note == null, combo > 5, "sad", true, true, "miss", strumLines.members[playerID].characters, playerID, note != null ? note.noteType : null, directionID, 0)); strumLine.onMiss.dispatch(event); if (event.cancelled) return; diff --git a/source/funkin/menus/PauseSubState.hx b/source/funkin/menus/PauseSubState.hx index 259dc56c..f790c1eb 100644 --- a/source/funkin/menus/PauseSubState.hx +++ b/source/funkin/menus/PauseSubState.hx @@ -42,7 +42,7 @@ class PauseSubState extends MusicBeatSubstate public function new(?items:Array, ?selectCall:NameEvent->Void) { super(); - menuItems = items != null ? items : Flags.DEFAULT_PAUSE_ITEMS; + menuItems = items != null ? items : Flags.DEFAULT_PAUSE_ITEMS.copy(); this.selectCall = selectCall; } diff --git a/source/funkin/options/Options.hx b/source/funkin/options/Options.hx index 094afac5..20432b55 100644 --- a/source/funkin/options/Options.hx +++ b/source/funkin/options/Options.hx @@ -193,8 +193,12 @@ class Options public static var SOLO_DEV_RELOAD(get, null):Array; public static function load() { + var path = haxe.macro.Compiler.getDefine("SAVE_OPTIONS_PATH"), name = haxe.macro.Compiler.getDefine("SAVE_OPTIONS_NAME"); + if (path == null) path = 'CodenameEngine'; + if (name == null) name = 'options'; + if (__save == null) __save = new FlxSave(); - __save.bind("options", "CodenameEngine"); + __save.bind(name, path); __load(); if (!__eventAdded) { diff --git a/source/funkin/options/categories/MiscOptions.hx b/source/funkin/options/categories/MiscOptions.hx index e72bafc8..e5791a68 100644 --- a/source/funkin/options/categories/MiscOptions.hx +++ b/source/funkin/options/categories/MiscOptions.hx @@ -1,5 +1,7 @@ package funkin.options.categories; +import funkin.savedata.FunkinSave; + class MiscOptions extends TreeMenuScreen { public function new() { super('optionsTree.miscellaneous-name', 'optionsTree.miscellaneous-desc', 'MiscOptions.'); @@ -20,7 +22,9 @@ class MiscOptions extends TreeMenuScreen { add(new Separator()); add(new TextOption(getNameID('resetSaveData'), getDescID('resetSaveData'), () -> { - // TODO: SAVE DATA RESETTING + FunkinSave.save.erase(); + FunkinSave.highscores.clear(); + FunkinSave.flush(); })); } } \ No newline at end of file diff --git a/source/funkin/savedata/FunkinSave.hx b/source/funkin/savedata/FunkinSave.hx index dca3701c..93a8cfea 100644 --- a/source/funkin/savedata/FunkinSave.hx +++ b/source/funkin/savedata/FunkinSave.hx @@ -24,10 +24,12 @@ class FunkinSave { public static var save:FlxSave; public static function init() { - //trace(Application.current.meta.get('save-path')); - //trace(Application.current.meta.get('save-name')); - save = new FlxSave(); - save.bind('save-default', #if sys 'YoshiCrafter29/CodenameEngine' #else 'CodenameEngine' #end); + var path = haxe.macro.Compiler.getDefine("SAVE_PATH"), name = haxe.macro.Compiler.getDefine("SAVE_NAME"); + if (path == null) path = 'CodenameEngine'; + if (name == null) name = 'save-default'; + + if (save == null) save = new FlxSave(); + save.bind(name, path); load(); if (!__eventAdded) {