Custom Stage XML Nodes
This commit is contained in:
@@ -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>;
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user