From 409eaea5c69fdc2b4a8ffe78fbb0fec4c35429c9 Mon Sep 17 00:00:00 2001 From: Yoshman29 Date: Thu, 6 Oct 2022 23:20:13 +0200 Subject: [PATCH] scripting --- source/funkin/scripting/HScript.hx | 23 ++++++++++++++--- source/funkin/scripting/Script.hx | 40 +++++++++++++++++++++-------- source/{ => funkin/system}/Paths.hx | 16 +++++++++++- source/import.hx | 4 +-- 4 files changed, 65 insertions(+), 18 deletions(-) rename source/{ => funkin/system}/Paths.hx (92%) diff --git a/source/funkin/scripting/HScript.hx b/source/funkin/scripting/HScript.hx index cd2e516a..acdb51db 100644 --- a/source/funkin/scripting/HScript.hx +++ b/source/funkin/scripting/HScript.hx @@ -1,18 +1,33 @@ package funkin.scripting; +import hscript.Expr.Error; import openfl.Assets; import hscript.*; class HScript extends Script { var interp:Interp; - public override function create(path:String) { - super.create(path); + public override function onCreate(path:String) { + super.onCreate(path); + + interp = new Interp(); var code:String = Assets.getText(path); - interp = new Interp(); + var parser = new hscript.Parser(); + parser.allowJSON = parser.allowMetadata = parser.allowTypes = true; + var expr:Expr; + try { + expr = parser.parseString(code, filename); + } catch(e) { + return; + } + interp.errorHandler = _errorHandler; } - public override function call() { + private function _errorHandler(error:Error) { + error('$fileName:${error.line}: ${Std.string(error.e)}'); + } + public override function call(func:String, parameters:Array) { + // TODO: call } } \ No newline at end of file diff --git a/source/funkin/scripting/Script.hx b/source/funkin/scripting/Script.hx index 7982e519..00db47ed 100644 --- a/source/funkin/scripting/Script.hx +++ b/source/funkin/scripting/Script.hx @@ -1,29 +1,43 @@ package funkin.scripting; import haxe.io.Path; +import openfl.utils.Assets; /** * Class used for scripting. */ class Script { + /** + * [Description] All available script extensions + */ + public static var scriptExtensions:Array = [ + "hx", "hscript", "hsc" + ]; + /** * [Description] Currently executing script. */ public static var curScript:Script = null; + /** + * [Description] Script name (with extension) + */ + public var fileName:String; + /** * [Description] Creates a script from the specified asset path. The language is automatically determined. - * @param path + * @param path Path in assets */ public static function create(path:String):Script { - if (Assets.exists(file)) { + if (Assets.exists(path)) { return switch(Path.extension(path).toLowerCase()) { - case "hx" | "hscript" | "hsc": new HScript(path); - default: new DummyScript(); + case "hx" | "hscript" | "hsc": + new HScript(path); + default: + new DummyScript(path); } - } else { - return new DummyScript(path); } + return new DummyScript(path); } /** @@ -31,9 +45,10 @@ class Script { * @param path */ public function new(path:String) { + fileName = Path.withoutDirectory(path); var oldScript = curScript; curScript = this; - create(path); + onCreate(path); curScript = oldScript; } @@ -42,21 +57,21 @@ class Script { * [Description] Internal. Creates the script. * @param path Path to the script. */ - public function create(path:String) {} + public function onCreate(path:String) {} /** * [Description] Calls the function `func` defined in the script. * @param func Name of the function * @param parameters (Optional) Parameters of the function. * @return Dynamic Result (if void, then null) */ - public function call(func:String, ?parameters:Array):Dynamic {} + public function call(func:String, ?parameters:Array):Dynamic {return null;} /** * [Description] Gets the variable `variable` from the script's variables. * @param variable Name of the variable. * @return Dynamic Variable (or null if it doesn't exists) */ - public function get(variable:String):Dynamic {} + public function get(variable:String):Dynamic {return null;} /** * [Description] Gets the variable `variable` from the script's variables. @@ -70,5 +85,8 @@ class Script { * @param text Text of the error (ex: Null Object Reference). * @param additionalInfo Additional information you could provide. */ - public function error(text:String, additionalInfo:Dynamic):Void {} + public function error(text:String, additionalInfo:Dynamic):Void { + // TODO: Logs (like on YCE) + trace('$text'); + } } diff --git a/source/Paths.hx b/source/funkin/system/Paths.hx similarity index 92% rename from source/Paths.hx rename to source/funkin/system/Paths.hx index e493d820..565a06a2 100644 --- a/source/Paths.hx +++ b/source/funkin/system/Paths.hx @@ -1,10 +1,11 @@ -package; +package funkin.system; import flixel.FlxG; import flixel.graphics.frames.FlxAtlasFrames; import openfl.utils.AssetType; import openfl.utils.Assets as OpenFlAssets; import funkin.mods.ModsFolder; +import funkin.scripting.Script; using StringTools; @@ -97,6 +98,19 @@ class Paths return getPath('images/$key.png', IMAGE, library); } + inline static public function script(key:String, ?library:String) { + var scriptPath = getPath(key, TEXT, library); + var p:String; + for(ex in Script.scriptExtensions) { + p = getPath('$key.$ex', TEXT, library); + if (OpenFlAssets.exists(p)) { + scriptPath = p; + break; + } + } + return scriptPath; + } + static public function chart(song:String, ?difficulty:String = "normal"):String { difficulty = difficulty.toLowerCase(); song = song.toLowerCase(); diff --git a/source/import.hx b/source/import.hx index 15ff41d2..e183684b 100644 --- a/source/import.hx +++ b/source/import.hx @@ -1,7 +1,7 @@ #if !macro -import Paths; -import funkin.game.PlayState; +import funkin.system.Paths; import funkin.system.MusicBeatState; import funkin.system.MusicBeatSubstate; import funkin.system.CoolUtil; +import funkin.game.PlayState; #end \ No newline at end of file