package editors; #if LUA_ALLOWED import llua.Lua; import llua.LuaL; import llua.State; import llua.Convert; #end import flixel.FlxG; import flixel.tweens.FlxTween; import flixel.tweens.FlxEase; import flixel.text.FlxText; import flixel.group.FlxGroup.FlxTypedGroup; import flixel.math.FlxPoint; import flixel.system.FlxSound; import flixel.util.FlxTimer; import flixel.FlxSprite; import flixel.FlxCamera; import flixel.util.FlxColor; import flixel.FlxBasic; #if sys import sys.FileSystem; import sys.io.File; #end import Type.ValueType; import Controls; import DialogueBoxPsych; using StringTools; class EditorLua { public static var Function_Stop = 1; public static var Function_Continue = 0; #if LUA_ALLOWED public var lua:State = null; #end var lePlayState:editors.EditorPlayState = null; public function new(script:String) { #if LUA_ALLOWED lua = LuaL.newstate(); LuaL.openlibs(lua); Lua.init_callbacks(lua); //trace('Lua version: ' + Lua.version()); //trace("LuaJIT version: " + Lua.versionJIT()); var result:Dynamic = LuaL.dofile(lua, script); var resultStr:String = Lua.tostring(lua, result); if(resultStr != null && result != 0) { lime.app.Application.current.window.alert(resultStr, 'Error on .LUA script!'); trace('Error on .LUA script! ' + resultStr); lua = null; return; } trace('Lua file loaded succesfully:' + script); var curState:Dynamic = FlxG.state; lePlayState = curState; // Lua variables set('Function_Stop', Function_Stop); set('Function_Continue', Function_Continue); set('inChartEditor', true); set('curBpm', Conductor.bpm); set('bpm', PlayState.SONG.bpm); set('scrollSpeed', PlayState.SONG.speed); set('crochet', Conductor.crochet); set('stepCrochet', Conductor.stepCrochet); set('songLength', FlxG.sound.music.length); set('songName', PlayState.SONG.song); set('screenWidth', FlxG.width); set('screenHeight', FlxG.height); for (i in 0...4) { set('defaultPlayerStrumX' + i, 0); set('defaultPlayerStrumY' + i, 0); set('defaultOpponentStrumX' + i, 0); set('defaultOpponentStrumY' + i, 0); } set('downscroll', ClientPrefs.downScroll); set('middlescroll', ClientPrefs.middleScroll); //stuff 4 noobz like you B) Lua_helper.add_callback(lua, "getProperty", function(variable:String) { var killMe:Array = variable.split('.'); if(killMe.length > 1) { var coverMeInPiss:Dynamic = Reflect.getProperty(lePlayState, killMe[0]); for (i in 1...killMe.length-1) { coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); } return Reflect.getProperty(coverMeInPiss, killMe[killMe.length-1]); } return Reflect.getProperty(lePlayState, variable); }); Lua_helper.add_callback(lua, "setProperty", function(variable:String, value:Dynamic) { var killMe:Array = variable.split('.'); if(killMe.length > 1) { var coverMeInPiss:Dynamic = Reflect.getProperty(lePlayState, killMe[0]); for (i in 1...killMe.length-1) { coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]); } return Reflect.setProperty(coverMeInPiss, killMe[killMe.length-1], value); } return Reflect.setProperty(lePlayState, variable, value); }); Lua_helper.add_callback(lua, "getPropertyFromGroup", function(obj:String, index:Int, variable:Dynamic) { if(Std.isOfType(Reflect.getProperty(lePlayState, obj), FlxTypedGroup)) { return Reflect.getProperty(Reflect.getProperty(lePlayState, obj).members[index], variable); } var leArray:Dynamic = Reflect.getProperty(lePlayState, obj)[index]; if(leArray != null) { if(Type.typeof(variable) == ValueType.TInt) { return leArray[variable]; } return Reflect.getProperty(leArray, variable); } return null; }); Lua_helper.add_callback(lua, "setPropertyFromGroup", function(obj:String, index:Int, variable:Dynamic, value:Dynamic) { if(Std.isOfType(Reflect.getProperty(lePlayState, obj), FlxTypedGroup)) { return Reflect.setProperty(Reflect.getProperty(lePlayState, obj).members[index], variable, value); } var leArray:Dynamic = Reflect.getProperty(lePlayState, obj)[index]; if(leArray != null) { if(Type.typeof(variable) == ValueType.TInt) { return leArray[variable] = value; } return Reflect.setProperty(leArray, variable, value); } }); Lua_helper.add_callback(lua, "removeFromGroup", function(obj:String, index:Int, dontDestroy:Bool = false) { if(Std.isOfType(Reflect.getProperty(lePlayState, obj), FlxTypedGroup)) { var sex = Reflect.getProperty(lePlayState, obj).members[index]; if(!dontDestroy) sex.kill(); Reflect.getProperty(lePlayState, obj).remove(sex, true); if(!dontDestroy) sex.destroy(); return; } Reflect.getProperty(lePlayState, obj).remove(Reflect.getProperty(lePlayState, obj)[index]); }); Lua_helper.add_callback(lua, "getColorFromHex", function(color:String) { if(!color.startsWith('0x')) color = '0xff' + color; return Std.parseInt(color); }); Lua_helper.add_callback(lua, "setGraphicSize", function(obj:String, x:Int, y:Int = 0) { var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); if(poop != null) { poop.setGraphicSize(x, y); poop.updateHitbox(); return; } }); Lua_helper.add_callback(lua, "scaleObject", function(obj:String, x:Float, y:Float) { var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); if(poop != null) { poop.scale.set(x, y); poop.updateHitbox(); return; } }); Lua_helper.add_callback(lua, "updateHitbox", function(obj:String) { var poop:FlxSprite = Reflect.getProperty(lePlayState, obj); if(poop != null) { poop.updateHitbox(); return; } }); call('onCreate', []); #end } public function call(event:String, args:Array):Dynamic { #if LUA_ALLOWED if(lua == null) { return Function_Continue; } Lua.getglobal(lua, event); for (arg in args) { Convert.toLua(lua, arg); } var result:Null = Lua.pcall(lua, args.length, 1, 0); if(result != null && resultIsAllowed(lua, result)) { /*var resultStr:String = Lua.tostring(lua, result); var error:String = Lua.tostring(lua, -1); Lua.pop(lua, 1);*/ if(Lua.type(lua, -1) == Lua.LUA_TSTRING) { var error:String = Lua.tostring(lua, -1); Lua.pop(lua, 1); if(error == 'attempt to call a nil value') { //Makes it ignore warnings and not break stuff if you didn't put the functions on your lua file return Function_Continue; } } var conv:Dynamic = Convert.fromLua(lua, result); return conv; } #end return Function_Continue; } #if LUA_ALLOWED function resultIsAllowed(leLua:State, leResult:Null) { //Makes it ignore warnings switch(Lua.type(leLua, leResult)) { case Lua.LUA_TNIL | Lua.LUA_TBOOLEAN | Lua.LUA_TNUMBER | Lua.LUA_TSTRING | Lua.LUA_TTABLE: return true; } return false; } #end public function set(variable:String, data:Dynamic) { #if LUA_ALLOWED if(lua == null) { return; } Convert.toLua(lua, data); Lua.setglobal(lua, variable); #end } #if LUA_ALLOWED public function getBool(variable:String) { var result:String = null; Lua.getglobal(lua, variable); result = Convert.fromLua(lua, -1); Lua.pop(lua, 1); if(result == null) { return false; } // YES! FINALLY IT WORKS //trace('variable: ' + variable + ', ' + result); return (result == 'true'); } #end public function stop() { #if LUA_ALLOWED if(lua == null) { return; } Lua.close(lua); lua = null; #end } }