Datas, Flags related stuff

This commit is contained in:
Ralty
2025-08-03 19:26:50 +07:00
parent b3ccc299ba
commit b6d51123c7
10 changed files with 69 additions and 57 deletions
+8 -3
View File
@@ -10,7 +10,11 @@
<!--
CHANGE THE SAVE PATH & NAME FOR YOUR MOD HERE!
-->
<app save-path="YoshiCrafter29/CodenameEngine" save-name="save-default" mod-saves="true" />
<haxedef name="SAVE_PATH" value="CodenameEngine"/>
<haxedef name="SAVE_NAME" value="save-default"/>
<haxedef name="SAVE_OPTIONS_PATH" value="CodenameEngine"/>
<haxedef name="SAVE_OPTIONS_NAME" value="options"/>
<!--Switch Export with Unique ApplicationID and Icon-->
<set name="APP_ID" value="0x0100f6c013bbc000" />
@@ -109,7 +113,7 @@
<!-- Comment this out to disable Discord RPC !-->
<section if="cpp">
<!-- <define name="DISCORD_RPC" if="desktop"/> -->
<define name="DISCORD_RPC" if="desktop"/>
</section>
<!-- Uncomment this to achive faster compile times, will strip extraneous and commonly unused features. -->
@@ -222,9 +226,10 @@
<!-- Fix compiling issues -->
<setenv name="HAXEPATH" value="./"/>
<haxedef name="HXCPP_M32" if="32bit" />
<haxedef name="HXCPP_CHECK_POINTER" if="release" />
<haxedef name="HXCPP_STACK_LINE" if="release" />
<haxedef name="HXCPP_DEBUG_LINK" if="release" />
<haxedef name="HXCPP_DEBUG_LINK" if="debug" />
<haxedef name="HXCPP_CATCH_SEGV" />
<haxedef name="hscriptPos" /> <!-- for logging -->
@@ -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() {
+18 -20
View File
@@ -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<String, String> = [];
public static var MOD_REDIRECT_STATES:Map<String, String> = [];
// -- 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<String> = [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<String> = ["missnote1", "missnote2", "missnote3"];
public static var DEFAULT_INTRO_SOUNDS:Array<String> = ["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<String>) {
-12
View File
@@ -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());
}
@@ -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<TrimmedString>:
field.kind = FVar(macro: Array<String>, expr);
parser = macro value.split(",").map((e) -> e.trim());
parser = macro value.split(",").map((e) -> e == 'NULL' ? null : e.trim());
case macro: Array<String>:
parser = macro value.split(",");
parser = macro value.split(",").map((e) -> e == 'NULL' ? null : e);
case (macro: Array<Int>) | (macro: Array<FlxColor>):
parser = macro value.split(",").map((e) -> Std.parseInt(e));
parser = macro value.split(",").map((e) -> e == 'NULL' ? null : Std.parseInt(e));
case macro: Array<Float>:
parser = macro value.split(",").map((e) -> Std.parseFloat(e));
parser = macro value.split(",").map((e) -> e == 'NULL' ? null : Std.parseFloat(e));
case macro: Array<Bool>:
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<K, V>", field.pos);
//Context.error("Flag " + field.name + " cannot be a Map<K, V>", 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<String>, Array<Int>, Array<Float>, Array<Bool> or Array<TrimmedString>", field.pos);
}
if(parser == null) {
Context.error("Flag " + field.name + " must be either a Bool, Int, String, Array<String>, Array<Bool> or Array<TrimmedString>", field.pos);
if (parser == null) {
Context.error("Flag " + field.name + " must be either a Bool, Int, Float, String, Array<String>, Array<Int>, Array<Float>, Array<Bool> or Array<TrimmedString>", field.pos);
continue;
}
+4 -4
View File
@@ -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<String> = [Flags.DEFAULT_PREPARE_SPRITE, Flags.DEFAULT_READY_SPRITE, Flags.DEFAULT_SET_SPRITE, Flags.DEFAULT_GO_SPRITE];
public var introSprites:Array<String> = Flags.DEFAULT_INTRO_SPRITES.copy();
/**
* Array of sounds for the intro.
*/
public var introSounds:Array<String> = [Flags.DEFAULT_INTRO3_SOUND, Flags.DEFAULT_INTRO2_SOUND, Flags.DEFAULT_INTRO1_SOUND, Flags.DEFAULT_INTROGO_SOUND];
public var introSounds:Array<String> = Flags.DEFAULT_INTRO_SOUNDS.copy();
/**
* Whenever the game is paused or not.
@@ -1765,7 +1765,7 @@ class PlayState extends MusicBeatState
var directionID:Null<Int> = 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;
+1 -1
View File
@@ -42,7 +42,7 @@ class PauseSubState extends MusicBeatSubstate
public function new(?items:Array<String>, ?selectCall:NameEvent->Void) {
super();
menuItems = items != null ? items : Flags.DEFAULT_PAUSE_ITEMS;
menuItems = items != null ? items : Flags.DEFAULT_PAUSE_ITEMS.copy();
this.selectCall = selectCall;
}
+5 -1
View File
@@ -193,8 +193,12 @@ class Options
public static var SOLO_DEV_RELOAD(get, null):Array<FlxKey>;
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) {
@@ -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();
}));
}
}
+6 -4
View File
@@ -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) {