From 15a18bb3daf21c920266afee968e55e0325458ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=8D=9A=7ENex?= <87421482+NexIsDumb@users.noreply.github.com> Date: Wed, 18 Sep 2024 16:10:19 +0200 Subject: [PATCH] importable scripts through stage.xml + new call extensions feature --- assets/data/scripts/pixel.hx | 1 + assets/data/stages/school-evil.hx | 1 - assets/data/stages/school-evil.xml | 1 + assets/data/stages/school.hx | 2 +- assets/data/stages/school.xml | 2 ++ source/funkin/game/Stage.hx | 36 ++++++++++++++++++++++++++---- 6 files changed, 37 insertions(+), 6 deletions(-) diff --git a/assets/data/scripts/pixel.hx b/assets/data/scripts/pixel.hx index 48dfb279..8f1887c8 100644 --- a/assets/data/scripts/pixel.hx +++ b/assets/data/scripts/pixel.hx @@ -1,3 +1,4 @@ +// import funkin.game.HudCamera; import funkin.backend.scripting.events.NoteHitEvent; diff --git a/assets/data/stages/school-evil.hx b/assets/data/stages/school-evil.hx index af086dab..c29dbeea 100644 --- a/assets/data/stages/school-evil.hx +++ b/assets/data/stages/school-evil.hx @@ -1,5 +1,4 @@ function create() { - importScript("data/scripts/pixel"); isSpooky = true; // Make transition work between school types diff --git a/assets/data/stages/school-evil.xml b/assets/data/stages/school-evil.xml index 568b3aad..48ee14b7 100644 --- a/assets/data/stages/school-evil.xml +++ b/assets/data/stages/school-evil.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/assets/data/stages/school.hx b/assets/data/stages/school.hx index 5cba9421..dc55a69d 100644 --- a/assets/data/stages/school.hx +++ b/assets/data/stages/school.hx @@ -1,5 +1,5 @@ +// function create() { - importScript("data/scripts/pixel"); if (PlayState.SONG.meta.name.toLowerCase() == "roses") { bgGirls.animation.remove("danceLeft"); bgGirls.animation.remove("danceRight"); diff --git a/assets/data/stages/school.xml b/assets/data/stages/school.xml index dabf463b..7a2740ad 100644 --- a/assets/data/stages/school.xml +++ b/assets/data/stages/school.xml @@ -1,5 +1,7 @@ + + diff --git a/source/funkin/game/Stage.hx b/source/funkin/game/Stage.hx index af36d445..10168945 100644 --- a/source/funkin/game/Stage.hx +++ b/source/funkin/game/Stage.hx @@ -6,6 +6,7 @@ import flixel.math.FlxPoint; import flixel.FlxState; import haxe.xml.Access; import funkin.backend.system.interfaces.IBeatReceiver; +import funkin.backend.scripting.DummyScript; import funkin.backend.scripting.Script; import haxe.io.Path; @@ -18,6 +19,7 @@ class Stage extends FlxBasic implements IBeatReceiver { public var stageScript:Script; public var state:FlxState; public var characterPoses:Map = []; + public var xmlImportedScripts:Map = []; private var spritesParentFolder = ""; @@ -45,6 +47,7 @@ class Stage extends FlxBasic implements IBeatReceiver { stageScript.load(); } + var event = null; if (stageXML != null) { if (PlayState.instance != null) { var parsed:Null; @@ -68,8 +71,8 @@ class Stage extends FlxBasic implements IBeatReceiver { } if (PlayState.instance != null) { - var event = PlayState.instance.scripts.event("onStageXMLParsed", EventManager.get(StageXMLEvent).recycle(this, stageXML, elems)); - elems = event.elems; + event = EventManager.get(StageXMLEvent).recycle(this, stageXML, elems); + elems = PlayState.instance.scripts.event("onStageXMLParsed", event).elems; } for(node in elems) { @@ -86,7 +89,7 @@ class Stage extends FlxBasic implements IBeatReceiver { state.add(spr); spr; case "box" | "solid": - if ( !node.has.name || !node.has.width || !node.has.height) continue; + if (!node.has.name || !node.has.width || !node.has.height) continue; var spr = new FlxSprite( (node.has.x) ? Std.parseFloat(node.att.x).getDefault(0) : 0, @@ -134,6 +137,22 @@ class Stage extends FlxBasic implements IBeatReceiver { ); PlayState.instance.add(PlayState.instance.comboGroup); PlayState.instance.comboGroup; + case "use-extension" | "extension" | "ext": + if (!node.has.script || PlayState.instance == null) continue; + + var folder = node.getAtt("folder").getDefault("data/scripts/"); + if (!folder.endsWith("/")) folder += "/"; + + var path = folder + node.getAtt("script"); + var daScript = Script.create(Paths.script(path)); + if (daScript is DummyScript) throw 'Script at ${path} does not exist.'; + else { + xmlImportedScripts.set(daScript, node.getAtt("isShortLived") == "true"); + PlayState.instance.scripts.add(daScript); + daScript.load(); + } + + null; default: null; } @@ -173,8 +192,17 @@ class Stage extends FlxBasic implements IBeatReceiver { }); if (PlayState.instance == null) return; - for(k=>e in stageSprites) { + + for (k=>e in stageSprites) stageScript.set(k, e); + + // idk lemme check anyways just in case scripts did smth - Nex + if (event != null) PlayState.instance.scripts.event("onPostStageCreation", event); + + // shortlived scripts destroy when the stage finishes setting up - Nex + for (s=>b in xmlImportedScripts) if (b) { + PlayState.instance.scripts.remove(s); + s.destroy(); } }