diff --git a/source/funkin/backend/scripting/Script.hx b/source/funkin/backend/scripting/Script.hx index 1522db09..fc673207 100644 --- a/source/funkin/backend/scripting/Script.hx +++ b/source/funkin/backend/scripting/Script.hx @@ -15,12 +15,12 @@ class Script extends FlxBasic implements IFlxDestroyable { */ public static var staticVariables:Map = []; - public static function getDefaultVariables(?script:Script):Map { return [ // Haxe related stuff "Std" => Std, "Math" => Math, + "Reflect" => Reflect, "StringTools" => StringTools, "Json" => haxe.Json, @@ -125,6 +125,8 @@ class Script extends FlxBasic implements IFlxDestroyable { */ public var path:String = null; + private var didLoad:Bool = false; + /** * Creates a script from the specified asset path. The language is automatically determined. * @param path Path in assets @@ -164,10 +166,14 @@ class Script extends FlxBasic implements IFlxDestroyable { * Loads the script */ public function load() { + if(didLoad) return; + var oldScript = curScript; curScript = this; onLoad(); curScript = oldScript; + + didLoad = true; } /** diff --git a/source/funkin/backend/scripting/events/StageNodeEvent.hx b/source/funkin/backend/scripting/events/StageNodeEvent.hx new file mode 100644 index 00000000..93465fa6 --- /dev/null +++ b/source/funkin/backend/scripting/events/StageNodeEvent.hx @@ -0,0 +1,26 @@ +package funkin.backend.scripting.events; + +import funkin.game.Stage; +import haxe.xml.Access; + +final class StageNodeEvent extends CancellableEvent { + /** + * The stage instance + */ + public var stage:Stage; + + /** + * The node which is currently being parsed + */ + public var node:Access; + + /** + * The sprite which was parsed + */ + public var sprite:Dynamic; + + /** + * The name of the node, quicker access than e.node.name + */ + public var name:String; +} \ No newline at end of file diff --git a/source/funkin/backend/scripting/events/StageXMLEvent.hx b/source/funkin/backend/scripting/events/StageXMLEvent.hx new file mode 100644 index 00000000..16693d33 --- /dev/null +++ b/source/funkin/backend/scripting/events/StageXMLEvent.hx @@ -0,0 +1,21 @@ +package funkin.backend.scripting.events; + +import funkin.game.Stage; +import haxe.xml.Access; + +final class StageXMLEvent extends CancellableEvent { + /** + * The stage instance + */ + public var stage:Stage; + + /** + * The xml + */ + public var xml:Access; + + /** + * The object which was parsed + */ + public var elems:Array; +} \ No newline at end of file diff --git a/source/funkin/game/Stage.hx b/source/funkin/game/Stage.hx index 22e37019..a48ed8fc 100644 --- a/source/funkin/game/Stage.hx +++ b/source/funkin/game/Stage.hx @@ -1,5 +1,7 @@ package funkin.game; +import funkin.backend.scripting.events.StageXMLEvent; +import funkin.backend.scripting.events.StageNodeEvent; import flixel.math.FlxPoint; import funkin.backend.MusicBeatGroup; import flixel.FlxState; @@ -35,8 +37,14 @@ class Stage extends FlxBasic implements IBeatReceiver { } catch(e) { Logs.trace('Couldn\'t load stage "$stage": ${e.message}', ERROR); } - if (stageXML != null) { + if (PlayState.instance != null) { + stageScript = Script.create(Paths.script('data/stages/$stage')); + PlayState.instance.scripts.add(stageScript); + stageScript.load(); + } + + if (stageXML != null) { var spritesParentFolder = ""; if (PlayState.instance != null) { if (stageXML.has.zoom) { @@ -59,6 +67,11 @@ class Stage extends FlxBasic implements IBeatReceiver { elems.push(node); } + if (PlayState.instance != null) { + var event = PlayState.instance.scripts.event("onStageXMLParsed", EventManager.get(StageXMLEvent).recycle(this, stageXML, elems)); + elems = event.elems; + } + for(node in elems) { var sprite:Dynamic = switch(node.name) { case "sprite" | "spr" | "sparrow": @@ -123,6 +136,11 @@ class Stage extends FlxBasic implements IBeatReceiver { PlayState.instance.comboGroup; default: null; } + + if(PlayState.instance != null) { + sprite = PlayState.instance.scripts.event("onStageNodeParsed", EventManager.get(StageNodeEvent).recycle(this, node, sprite, node.name)).sprite; + } + if (sprite != null) { for(e in node.nodes.property) XMLUtil.applyXMLProperty(sprite, e); @@ -155,11 +173,9 @@ class Stage extends FlxBasic implements IBeatReceiver { }); if (PlayState.instance == null) return; - stageScript = Script.create(Paths.script('data/stages/$stage')); for(k=>e in stageSprites) { stageScript.set(k, e); } - PlayState.instance.scripts.add(stageScript); } public function addCharPos(name:String, node:Access, ?nonXMLInfo:StageCharPosInfo):StageCharPos {