From 8a010ea48059ec0e8161d1cb147040170c1d9158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=92=9C=20Rodney=2C=20An=20Imaginative=20Furball=20?= =?UTF-8?q?=F0=9F=92=99?= Date: Wed, 11 Dec 2024 16:02:48 -0500 Subject: [PATCH 1/4] progress --- .vscode/settings.json | 1 + Project.hxp | 2 +- .../backend/scripting/types/LuaScript.hx | 188 +++++++++++++++++- readme.md | 2 +- setup/data.json | 6 +- 5 files changed, 191 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f7b5fd94..f30b3679 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,7 @@ "Infront", "jignored", "LOCKON", + "lscript", "luajit", "PAGEUP", "preprocesor", diff --git a/Project.hxp b/Project.hxp index b1ba5bac..6156de27 100644 --- a/Project.hxp +++ b/Project.hxp @@ -258,7 +258,7 @@ class EngineAsset { addHaxelib('moonchart', 'git'); if ( canHaxeScript.exists()) addHaxelib('hscript-improved', 'git'); - if ( canLuaScript .exists()) addHaxelib('linc_luajit', 'git'); + if ( canLuaScript .exists()) addHaxelib('lscript', 'git'); if ( discordRPC .exists()) addHaxelib('hxdiscord_rpc'); if (allowVideos .exists()) addHaxelib('hxvlc', 'git'); if (knowsVersionID.exists()) addHaxelib('thx.semver'); diff --git a/engine/source/backend/scripting/types/LuaScript.hx b/engine/source/backend/scripting/types/LuaScript.hx index 9c3d63b8..3bd2a12a 100644 --- a/engine/source/backend/scripting/types/LuaScript.hx +++ b/engine/source/backend/scripting/types/LuaScript.hx @@ -1,6 +1,7 @@ package backend.scripting.types; #if CAN_LUA_SCRIPT +import lscript.LScript; #end /** @@ -13,23 +14,204 @@ final class LuaScript extends Script { public static final exts:Array = ['lua']; #if CAN_LUA_SCRIPT + public var lscript:LScript; + @:access(backend.Console.formatLogInfo) static function getScriptImports(script:LuaScript):Map { return [ + // Lime + OpenFL // + 'Assets' => openfl.utils.Assets, + 'Application' => lime.app.Application, + 'window' => lime.app.Application.current.window, + + // Flixel // + 'FlxBasic' => FlxBasic, + 'FlxCamera' => FlxCamera, + 'FlxG' => FlxG, + 'FlxObject' => FlxObject, + 'FlxSprite' => FlxSprite, + 'FlxState' => FlxState, + 'FlxSubState' => FlxSubState, + 'FlxTypeText' => FlxTypeText, + 'FlxGroup' => FlxGroup, + 'FlxSpriteGroup' => FlxSpriteGroup, + 'FlxTypedGroup' => FlxTypedGroup, + 'FlxTypedSpriteGroup' => FlxTypedSpriteGroup, + 'FlxAngle' => FlxAngle, + 'FlxMath' => FlxMath, + 'FlxPoint' => Type.resolveClass('flixel.math.FlxPoint_HSC'), + 'FlxRect' => FlxRect, + 'FlxVelocity' => FlxVelocity, + 'FlxSound' => FlxSound, + 'FlxSoundGroup' => FlxSoundGroup, + 'FlxText' => FlxText, + 'FlxEase' => FlxEase, + 'FlxTween' => FlxTween, + 'FlxAxes' => Type.resolveClass('flixel.util.FlxAxes_HSC'), + 'FlxColor' => Type.resolveClass('flixel.util.FlxColor_HSC'), + 'FlxGradient' => FlxGradient, + 'FlxSave' => FlxSave, + 'FlxTypedSignal' => Type.resolveClass('flixel.util.FlxTypedSignal_HSC'), + 'FlxSkewedSprite' => flixel.addons.effects.FlxSkewedSprite, + 'FlxBackdrop' => flixel.addons.display.FlxBackdrop, + 'FlxSort' => FlxSort, + 'FlxTimer' => FlxTimer, + 'OneOfFour' => Type.resolveClass('flixel.util.typeLimit.OneOfFour_HSC'), + 'OneOfThree' => Type.resolveClass('flixel.util.typeLimit.OneOfThree_HSC'), + 'OneOfTwo' => Type.resolveClass('flixel.util.typeLimit.OneOfTwo_HSC'), + 'FlxArrayUtil' => FlxArrayUtil, + 'FlxColorTransformUtil' => FlxColorTransformUtil, + 'FlxDestroyUtil' => FlxDestroyUtil, + 'FlxSpriteUtil' => FlxSpriteUtil, + 'FlxStringUtil' => FlxStringUtil, + + // Engine // + 'Controls' => Controls, + 'PlayConfig' => PlayConfig, + 'Conductor' => Conductor, + 'BeatGroup' => BeatGroup, + 'BeatSpriteGroup' => BeatSpriteGroup, + 'BeatTypedGroup' => BeatTypedGroup, + 'BeatTypedSpriteGroup' => BeatTypedSpriteGroup, + 'BeatState' => BeatState, + 'BeatSubState' => BeatSubState, + 'TypeXY' => TypeXY, + 'Position' => Position, + 'Script' => Script, + 'ScriptGroup' => ScriptGroup, + 'ScriptedState' => backend.scripting.states.ScriptedState, + 'ScriptedSubState' => backend.scripting.states.ScriptedSubState, + 'GlobalScript' => GlobalScript, + 'HaxeScript' => HaxeScript, + 'InvalidScript' => InvalidScript, + 'LuaScript' => LuaScript, + 'Main' => Main, + #if MOD_SUPPORT + 'Modding' => Modding, + #end + 'ModType' => Type.resolveClass('backend.system.Paths.ModType_HSC'), + 'ModPath' => Type.resolveClass('backend.system.Paths.ModPath_HSC'), + 'Paths' => Paths, + 'Settings' => Settings, + 'DifficultyHolder' => DifficultyHolder, + 'LevelHolder' => LevelHolder, + 'FlxWindow' => FlxWindow, + 'mainWindow' => FlxWindow.direct, + 'ArrowField' => ArrowField, + 'Note' => Note, + 'Strum' => Strum, + 'SpriteText' => SpriteText, + 'SpriteTextLine' => SpriteTextLine, + 'SpriteTextCharacter' => SpriteTextCharacter, + 'HealthIcon' => HealthIcon, + 'WindowBounds' => WindowBounds, + 'AnimationContext' => Type.resolveClass('objects.BaseSprite.AnimationContext_HSC'), + 'BaseSprite' => BaseSprite, + 'BeatSprite' => BeatSprite, + 'Character' => Character, + 'PlayState' => PlayState, + 'FunkinUtil' => FunkinUtil, + 'ParseUtil' => ParseUtil, + 'PlatformUtil' => PlatformUtil, + 'SpriteUtil' => SpriteUtil, + + // Extra // + #if KNOWS_VERSION_ID + 'Version' => Type.resolveClass('thx.semver.Version_HSC'), + #end + + // Custom Functions // + 'addInfrontOf' => (obj:FlxBasic, from:FlxBasic, ?into:FlxTypedGroup) -> + return SpriteUtil.addInfrontOf(obj, from, into), + 'addBehind' => (obj:FlxBasic, from:FlxBasic, ?into:FlxTypedGroup) -> + return SpriteUtil.addBehind(obj, from, into), + 'print' => (value:Dynamic) -> _log(Console.formatLogInfo(value, LogMessage, script.pathing.format(), FromLua)), 'log' => (value:Dynamic, level:String = LogMessage) -> _log(Console.formatLogInfo(value, level, script.pathing.format(), FromLua)), 'disableScript' => () -> - script.active = false + script.active = false, + + // self // + '__this__' => script ]; } @:allow(backend.scripting.Script.create) - override function new(file:ModPath, ?code:String) { - log('Lua scripting isn\'t supported... yet.', SystemMessage); + override function new(file:ModPath, ?code:String) super(file, code); + + override function renderScript(file:ModPath, ?code:String):Void { + try { + var content:String = Paths.getFileContent(file); + this.code = content.trim() == '' ? code : content; + } catch(error:haxe.Exception) { + log('Error while trying to get script contents: ${error.message}', ErrorMessage); + this.code = ''; + } + lscript = new LScript(this.code); + } + + @:access(backend.Console.formatLogInfo) + override function loadCodeString(code:String):Void { + try { + // for (name => thing in getScriptImports(this)) + // set(name, thing); + canRun = true; + return; + } catch(error:haxe.Exception) + _log(Console.formatLogInfo(error.message, ErrorMessage, pathing.format()), ErrorMessage); + canRun = false; + } + + override public function loadCodeFromString(code:String, ?vars:Map, ?funcToRun:String, ?funcArgs:Array):LuaScript { + var script:LuaScript = new LuaScript('', code); + for (name => thing in vars) + script.set(name, thing); + script.call(funcToRun, funcArgs ?? []); + script.load(); + return script; + } + + override function load():Void { + super.load(); + if (!loaded && canRun) { + try { + lscript.execute(); + loaded = true; + call('new'); + } catch(error:haxe.Exception) + log('Error while trying to execute script: ${error.message}', ErrorMessage); + } + } + + override function get_parent():Dynamic + return lscript.parent; + override function set_parent(value:Dynamic):Dynamic + return lscript.parent = value; + + override public function set(variable:String, value:Dynamic):Void + lscript.setVar(variable, value); + override public function get(variable:String, ?def:Dynamic):Dynamic + return lscript.getVar(variable) ?? def; + + override public function call(func:String, ?args:Array):Dynamic + return lscript.callFunc(func, args ?? []); + override public function event(func:String, event:SC):SC { + event.returnCall = call(func, [event]); + return event; + } + + override public function destroy() { + if (lscript.luaState != null) { + llua.Lua.close(lscript.luaState); + lscript.luaState = null; + } + if (lscript != null) + lscript = null; + super.destroy(); } #else @:allow(backend.scripting.Script.create) diff --git a/readme.md b/readme.md index f6bbb7a9..2094ae8c 100644 --- a/readme.md +++ b/readme.md @@ -13,7 +13,7 @@ WIP ### Stuff From Others [CNE Devs](https://github.com/CodenameCrew): [`flixel`](https://github.com/CodenameCrew/cne-flixel) and [`flixel-addons`](https://github.com/CodenameCrew/cne-flixel-addons) forks, [`hscript-improved`](https://github.com/CodenameCrew/hscript-improved) and one of this engine's inspirations! -[SuperPowers04](https://github.com/superpowers04): [`linc_luajit`](https://github.com/superpowers04/linc_luajit), for all my lua needs. +[SrtHero278](https://github.com/SrtHero278): [`lscript`](https://github.com/SrtHero278/lscript), for all my lua needs. [Guillaume Desquesnes](https://github.com/elnabo): [`json2object`](https://github.com/elnabo/json2object), a great json parser! Too bad it fuckings hates Dynamic. diff --git a/setup/data.json b/setup/data.json index 7d646d43..fb62c958 100644 --- a/setup/data.json +++ b/setup/data.json @@ -32,8 +32,8 @@ "url": "https://github.com/CodenameCrew/hscript-improved" }, { - "name": "linc_luajit", "version": "git", - "url": "https://github.com/superpowers04/linc_luajit" + "name": "lscript", "version": "git", + "url": "https://github.com/SrtHero278/lscript" }, {"name": "hxdiscord_rpc"}, { @@ -51,7 +51,7 @@ "description": "include haxe scripting support" }, { - "name": "linc_luajit", + "name": "lscript", "description": "include lua scripting support" }, { From fede4d9f51f1b2cb779e10b7b16f1d368901d65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=92=9C=20Rodney=2C=20An=20Imaginative=20Furball=20?= =?UTF-8?q?=F0=9F=92=99?= Date: Wed, 11 Dec 2024 18:13:08 -0500 Subject: [PATCH 2/4] merge baby --- engine/assets | 2 +- extras | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/assets b/engine/assets index 7ce26d80..23c2be26 160000 --- a/engine/assets +++ b/engine/assets @@ -1 +1 @@ -Subproject commit 7ce26d80a84b4ef544732ab37945bb6ae997a464 +Subproject commit 23c2be261ab04b87a79a1c761abeb84f29d6ff1a diff --git a/extras b/extras index 5d010982..6cdec999 160000 --- a/extras +++ b/extras @@ -1 +1 @@ -Subproject commit 5d010982537f8572fd48326ce9edc53fcc9ab80f +Subproject commit 6cdec999254348e6158cc281bb15614d80cd8570 From f67b22339ea88209f2d6496e1213583d0292d18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=92=9C=20Rodney=2C=20An=20Imaginative=20Furball=20?= =?UTF-8?q?=F0=9F=92=99?= Date: Wed, 11 Dec 2024 18:27:31 -0500 Subject: [PATCH 3/4] prevent Linux actions from going on forever --- Project.hxp | 3 ++- engine/source/imaginative/backend/scripting/types/LuaScript.hx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Project.hxp b/Project.hxp index 7a3f13a0..6d23049c 100644 --- a/Project.hxp +++ b/Project.hxp @@ -153,7 +153,8 @@ class EngineAsset { // script related if (scriptSupport.exists()) { canHaxeScript.enable(); - canLuaScript.enable(); + if (!isLinux()) // can't finish compiling for some reason, causes action to go on forever + canLuaScript.enable(); disableDCE.enable(); scriptedStates.enable(); diff --git a/engine/source/imaginative/backend/scripting/types/LuaScript.hx b/engine/source/imaginative/backend/scripting/types/LuaScript.hx index b4573665..b3e6034a 100644 --- a/engine/source/imaginative/backend/scripting/types/LuaScript.hx +++ b/engine/source/imaginative/backend/scripting/types/LuaScript.hx @@ -216,7 +216,7 @@ final class LuaScript extends Script { #else @:allow(imaginative.backend.scripting.Script.create) override function new(file:ModPath, ?_:String) { - log('Lua scripting isn\'t supported in this build.', SystemMessage); + log(#if linux 'LScript doesn\'t compile on linux for some reason.' #else 'Lua scripting isn\'t supported in this build.' #end, SystemMessage); super(file, null); } #end From d216309ac7b69a0ff2b7020b4cb9884415908284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=92=9C=20Rodney=2C=20An=20Imaginative=20Furball=20?= =?UTF-8?q?=F0=9F=92=99?= Date: Thu, 12 Dec 2024 13:21:44 -0500 Subject: [PATCH 4/4] Update LuaScript.hx --- .../backend/scripting/types/LuaScript.hx | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/engine/source/imaginative/backend/scripting/types/LuaScript.hx b/engine/source/imaginative/backend/scripting/types/LuaScript.hx index b3e6034a..6d6d5f39 100644 --- a/engine/source/imaginative/backend/scripting/types/LuaScript.hx +++ b/engine/source/imaginative/backend/scripting/types/LuaScript.hx @@ -144,21 +144,15 @@ final class LuaScript extends Script { super(file, code); override function renderScript(file:ModPath, ?code:String):Void { - try { - var content:String = Paths.getFileContent(file); - this.code = content.trim() == '' ? code : content; - } catch(error:haxe.Exception) { - log('Error while trying to get script contents: ${error.message}', ErrorMessage); - this.code = ''; - } + super.renderScript(file, code); lscript = new LScript(this.code); } @:access(imaginative.backend.Console.formatLogInfo) override function loadCodeString(code:String):Void { try { - // for (name => thing in getScriptImports(this)) - // set(name, thing); + for (name => thing in getScriptImports(this)) + set(name, thing); canRun = true; return; } catch(error:haxe.Exception) @@ -166,12 +160,20 @@ final class LuaScript extends Script { canRun = false; } - override public function loadCodeFromString(code:String, ?vars:Map, ?funcToRun:String, ?funcArgs:Array):LuaScript { + /** + * Load's code from string. + * @param code The script code. + * @param vars Variables to input into the lua script instance. + * @param funcToRun Function to run inside the lua script instance. + * @param funcArgs Arguments to run for said function. + * @return `LuaScript` ~ The lua script instance from string. + */ + public static function loadCodeFromString(code:String, ?vars:Map, ?funcToRun:String, ?funcArgs:Array):LuaScript { var script:LuaScript = new LuaScript('', code); for (name => thing in vars) script.set(name, thing); - script.call(funcToRun, funcArgs ?? []); script.load(); + script.call(funcToRun, funcArgs ?? []); return script; }