Custom Stage XML Nodes

This commit is contained in:
NeeEoo
2023-05-31 18:58:16 +02:00
parent e3a88da009
commit eff4133246
4 changed files with 73 additions and 4 deletions
+7 -1
View File
@@ -15,12 +15,12 @@ class Script extends FlxBasic implements IFlxDestroyable {
*/
public static var staticVariables:Map<String, Dynamic> = [];
public static function getDefaultVariables(?script:Script):Map<String, Dynamic> {
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;
}
/**
@@ -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;
}
@@ -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<Access>;
}
+19 -3
View File
@@ -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 {