early custom classes
This commit is contained in:
@@ -3,6 +3,7 @@ package funkin.scripting;
|
||||
import lime.app.Application;
|
||||
import flixel.util.FlxDestroyUtil.IFlxDestroyable;
|
||||
import haxe.io.Path;
|
||||
import hscript.IHScriptCustomConstructor;
|
||||
|
||||
/**
|
||||
* Class used for scripting.
|
||||
@@ -154,6 +155,15 @@ class Script extends FlxBasic implements IFlxDestroyable {
|
||||
return new DummyScript(path);
|
||||
}
|
||||
|
||||
public static function createCustomClass(s:ScriptClass) {
|
||||
var t:Class<IScriptClassInstance> = cast Type.resolveClass('${s.classPath}__Softcoded');
|
||||
if (t == null) {
|
||||
Logs.trace('Class at ${s.classPath} was not found.', ERROR);
|
||||
return null;
|
||||
}
|
||||
return new ScriptCustomClass(s, t);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance of the script class.
|
||||
* @param path
|
||||
@@ -277,11 +287,64 @@ class Script extends FlxBasic implements IFlxDestroyable {
|
||||
}
|
||||
|
||||
class ScriptClass {
|
||||
public var classPath:String = null;
|
||||
public var folderlessPath:String = null;
|
||||
|
||||
public function new() {}
|
||||
|
||||
public function get(field:String):Dynamic {return null;}
|
||||
|
||||
public function set(field:String, v:Dynamic) {}
|
||||
|
||||
public function call(field:String, ?args:Array<Dynamic>) {return null;}
|
||||
public function hasField(field:String):Bool {return false;}
|
||||
|
||||
/**
|
||||
* Calls the function `func` defined in the class.
|
||||
* @param func Name of the function
|
||||
* @param parameters (Optional) Parameters of the function.
|
||||
* @return Result (if void, then null)
|
||||
*/
|
||||
public function call(func:String, parameters:Array<Dynamic>, parent:Dynamic):Dynamic {
|
||||
var result = onCall(func, parameters == null ? [] : parameters, parent);
|
||||
return result;
|
||||
}
|
||||
|
||||
public function onCall(func:String, parameters:Array<Dynamic>, parent:Dynamic):Dynamic {return null;}
|
||||
|
||||
private function importFailedCallback(cl:Array<String>):Bool {
|
||||
var path = cl.join("/");
|
||||
|
||||
var scr = Script.create(Paths.script('$folderlessPath$path', null, true));
|
||||
if (!(scr is DummyScript)) {
|
||||
// script is valid
|
||||
var cla = scr.getClass(cl.last());
|
||||
if (cla != null) {
|
||||
set(cl.last(), Script.createCustomClass(cla));
|
||||
} else {
|
||||
set(cl.last(), scr);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class ScriptCustomClass implements IHScriptCustomConstructor {
|
||||
var scrClass:ScriptClass;
|
||||
var scrType:Class<IScriptClassInstance>;
|
||||
public function new(scrClass:ScriptClass, scrType:Class<IScriptClassInstance>) {
|
||||
this.scrClass = scrClass;
|
||||
this.scrType = scrType;
|
||||
}
|
||||
public function hnew(...args:Dynamic):Dynamic {
|
||||
var a = [for(arg in args) arg];
|
||||
a.insert(0, scrClass);
|
||||
return Type.createInstance(scrType, a);
|
||||
}
|
||||
}
|
||||
|
||||
interface IScriptClassInstance {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user