From b6d51123c72731e7737bf558616c41ac25661a33 Mon Sep 17 00:00:00 2001
From: Ralty <78720179+Raltyro@users.noreply.github.com>
Date: Sun, 3 Aug 2025 19:26:50 +0700
Subject: [PATCH] Datas, Flags related stuff
---
project.xml | 11 ++++--
.../funkin/backend/scripting/GlobalScript.hx | 10 +++++
source/funkin/backend/system/Flags.hx | 38 +++++++++----------
source/funkin/backend/system/MainState.hx | 12 ------
.../backend/system/macros/FlagMacro.macro.hx | 23 +++++------
source/funkin/game/PlayState.hx | 8 ++--
source/funkin/menus/PauseSubState.hx | 2 +-
source/funkin/options/Options.hx | 6 ++-
.../funkin/options/categories/MiscOptions.hx | 6 ++-
source/funkin/savedata/FunkinSave.hx | 10 +++--
10 files changed, 69 insertions(+), 57 deletions(-)
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) {