create ConsoleMacro to allow easy initialization of classes into flixels console

This commit is contained in:
Cameron Taylor
2025-08-19 16:05:08 -04:00
committed by Eric
parent aaa722abcf
commit 520f7fbe68
3 changed files with 71 additions and 1 deletions
+1
View File
@@ -145,6 +145,7 @@ class Main extends Sprite
#if FEATURE_DEBUG_FUNCTIONS
game.debugger.interaction.addTool(new funkin.util.TrackerToolButtonUtil());
funkin.util.macro.ConsoleMacro.init();
#end
#if !html5
+2 -1
View File
@@ -11,6 +11,7 @@ import funkin.ui.debug.charting.ChartEditorState.ChartEditorLiveInputStyle;
import funkin.ui.debug.charting.ChartEditorState.ChartEditorTheme;
import funkin.ui.debug.stageeditor.StageEditorState.StageEditorTheme;
import funkin.util.FileUtil;
import funkin.util.macro.ConsoleMacro;
import funkin.util.SerializerUtil;
import funkin.mobile.ui.FunkinHitbox;
import thx.semver.Version;
@@ -20,7 +21,7 @@ import funkin.api.newgrounds.Leaderboards;
#end
@:nullSafety
class Save
class Save implements ConsoleClass
{
public static final SAVE_DATA_VERSION:thx.semver.Version = "2.1.1";
public static final SAVE_DATA_VERSION_RULE:thx.semver.VersionRule = ">=2.1.0 <2.2.0";
+68
View File
@@ -0,0 +1,68 @@
package funkin.util.macro;
import haxe.macro.Context;
import haxe.macro.Expr;
#if !macro
import flixel.FlxG;
#end
using haxe.macro.TypeTools;
using haxe.macro.ComplexTypeTools;
class ConsoleMacro
{
#if !macro
/**
* Gets called in `Main.hx` after FlxGame is initalized, and is what we use to easy add debug functions to flixel console
*/
public static function init():Void
{
for (className in classes)
{
var classInstance = Type.resolveClass(className);
if (classInstance != null) FlxG.console.registerClass(classInstance);
}
}
#end
// Runtime-accessible array of console classes
static var classes:Array<String> = [];
/**
* Called at runtime to register a class with the console
*/
public static function registerClass(className:String):Void
{
classes.push(className);
trace("Registered console class: " + className);
}
#if macro
static macro function buildConsoleClass():Array<Field>
{
var cl = Context.getLocalClass().toString();
var fields = Context.getBuildFields();
// Generate a static field with initialization expression that runs at class load time
var initFieldName = "__consoleRegistration_" + StringTools.replace(cl, ".", "_");
var initField =
{
name: initFieldName,
access: [AStatic, APrivate],
kind: FVar(macro :Bool, macro
{
funkin.util.macro.ConsoleMacro.registerClass($v{cl});
true;
}),
pos: Context.currentPos()
};
fields.push(initField);
trace("Generated console registration for: " + cl);
return fields;
}
#end
}
@:autoBuild(funkin.util.macro.ConsoleMacro.buildConsoleClass())
interface ConsoleClass {}