diff --git a/source/ModchartState.hx b/source/ModchartState.hx new file mode 100644 index 0000000..de54a62 --- /dev/null +++ b/source/ModchartState.hx @@ -0,0 +1,608 @@ +// this file is for modchart things, this is to declutter playstate.hx + +// Lua + +import flixel.tweens.FlxEase; +import flixel.tweens.FlxTween; +import flixel.util.FlxColor; +import openfl.geom.Matrix; +import openfl.display.BitmapData; +import lime.app.Application; +import flixel.FlxSprite; +#if windows +import llua.Convert; +import llua.Lua; +import llua.State; +import llua.LuaL; +#end + +import flixel.FlxBasic; +import flixel.FlxCamera; +import flixel.FlxG; + +class ModchartState +{ + + #if windows + + public static var lua:State = null; + + function callLua(func_name : String, args : Array, ?type : String) : Dynamic + { + var result : Any = null; + + Lua.getglobal(lua, func_name); + + for( arg in args ) { + Convert.toLua(lua, arg); + } + + result = Lua.pcall(lua, args.length, 1, 0); + var p = Lua.tostring(lua,result); + var e = getLuaErrorMessage(lua); + + if (e != null) + { + if (p != null) + { + Application.current.window.alert("LUA ERROR:\n" + p + "\nhaxe things: " + e,"Kade Engine Modcharts"); + lua = null; + LoadingState.loadAndSwitchState(new MainMenuState()); + } + // trace('err: ' + e); + } + if( result == null) { + return null; + } else { + return convert(result, type); + } + + } + + function getType(l, type):Any + { + return switch Lua.type(l,type) { + case t if (t == Lua.LUA_TNIL): null; + case t if (t == Lua.LUA_TNUMBER): Lua.tonumber(l, type); + case t if (t == Lua.LUA_TSTRING): (Lua.tostring(l, type):String); + case t if (t == Lua.LUA_TBOOLEAN): Lua.toboolean(l, type); + case t: throw 'you don goofed up. lua type error ($t)'; + } + } + + function getReturnValues(l) { + var lua_v:Int; + var v:Any = null; + while((lua_v = Lua.gettop(l)) != 0) { + var type:String = getType(l,lua_v); + v = convert(lua_v, type); + Lua.pop(l, 1); + } + return v; + } + + + private function convert(v : Any, type : String) : Dynamic { // I didn't write this lol + if( Std.is(v, String) && type != null ) { + var v : String = v; + if( type.substr(0, 4) == 'array' ) { + if( type.substr(4) == 'float' ) { + var array : Array = v.split(','); + var array2 : Array = new Array(); + + for( vars in array ) { + array2.push(Std.parseFloat(vars)); + } + + return array2; + } else if( type.substr(4) == 'int' ) { + var array : Array = v.split(','); + var array2 : Array = new Array(); + + for( vars in array ) { + array2.push(Std.parseInt(vars)); + } + + return array2; + } else { + var array : Array = v.split(','); + return array; + } + } else if( type == 'float' ) { + return Std.parseFloat(v); + } else if( type == 'int' ) { + return Std.parseInt(v); + } else if( type == 'bool' ) { + if( v == 'true' ) { + return true; + } else { + return false; + } + } else { + return v; + } + } else { + return v; + } + } + + function getLuaErrorMessage(l) { + var v:String = Lua.tostring(l, -1); + Lua.pop(l, 1); + return v; + } + + public function setVar(var_name : String, object : Dynamic){ + // trace('setting variable ' + var_name + ' to ' + object); + + Lua.pushnumber(lua,object); + Lua.setglobal(lua, var_name); + } + + public function getVar(var_name : String, type : String) : Dynamic { + var result : Any = null; + + // trace('getting variable ' + var_name + ' with a type of ' + type); + + Lua.getglobal(lua, var_name); + result = Convert.fromLua(lua,-1); + Lua.pop(lua,1); + + if( result == null ) { + return null; + } else { + var result = convert(result, type); + //trace(var_name + ' result: ' + result); + return result; + } + } + + function getActorByName(id:String):Dynamic + { + // pre defined names + switch(id) + { + case 'boyfriend': + @:privateAccess + return PlayState.boyfriend; + case 'girlfriend': + @:privateAccess + return PlayState.gf; + case 'dad': + @:privateAccess + return PlayState.dad; + } + // lua objects or what ever + if (luaSprites.get(id) == null) + return PlayState.PlayState.strumLineNotes.members[Std.parseInt(id)]; + return luaSprites.get(id); + } + + public static var luaSprites:Map = []; + + + + function makeLuaSprite(spritePath:String,toBeCalled:String, drawBehind:Bool) + { + #if sys + var data:BitmapData = BitmapData.fromFile(Sys.getCwd() + "assets/data/" + PlayState.SONG.song.toLowerCase() + '/' + spritePath + ".png"); + + var sprite:FlxSprite = new FlxSprite(0,0); + var imgWidth:Float = FlxG.width / data.width; + var imgHeight:Float = FlxG.height / data.height; + var scale:Float = imgWidth <= imgHeight ? imgWidth : imgHeight; + + // Cap the scale at x1 + if (scale > 1) + { + scale = 1; + } + + sprite.makeGraphic(Std.int(data.width * scale),Std.int(data.width * scale),FlxColor.TRANSPARENT); + + var data2:BitmapData = sprite.pixels.clone(); + var matrix:Matrix = new Matrix(); + matrix.identity(); + matrix.scale(scale, scale); + data2.fillRect(data2.rect, FlxColor.TRANSPARENT); + data2.draw(data, matrix, null, null, null, true); + sprite.pixels = data2; + + luaSprites.set(toBeCalled,sprite); + // and I quote: + // shitty layering but it works! + @:privateAccess + { + if (drawBehind) + { + PlayState.instance.removeObject(PlayState.gf); + PlayState.instance.removeObject(PlayState.boyfriend); + PlayState.instance.removeObject(PlayState.dad); + } + PlayState.instance.addObject(sprite); + if (drawBehind) + { + PlayState.instance.addObject(PlayState.gf); + PlayState.instance.addObject(PlayState.boyfriend); + PlayState.instance.addObject(PlayState.dad); + } + } + #end + return toBeCalled; + } + #end + + public function die() + { + Lua.close(lua); + lua = null; + } + + // LUA SHIT + + function new() + { + trace('opening a lua state (because we are cool :))'); + lua = LuaL.newstate(); + LuaL.openlibs(lua); + trace("Lua version: " + Lua.version()); + trace("LuaJIT version: " + Lua.versionJIT()); + Lua.init_callbacks(lua); + + var result = LuaL.dofile(lua, Paths.lua(PlayState.SONG.song.toLowerCase() + "/modchart")); // execute le file + + if (result != 0) + { + Application.current.window.alert("LUA COMPILE ERROR:\n" + Lua.tostring(lua,result),"Kade Engine Modcharts"); + lua = null; + LoadingState.loadAndSwitchState(new MainMenuState()); + } + + // get some fukin globals up in here bois + + setVar("difficulty", PlayState.storyDifficulty); + setVar("bpm", Conductor.bpm); + setVar("scrollspeed", FlxG.save.data.scrollSpeed != 1 ? FlxG.save.data.scrollSpeed : PlayState.SONG.speed); + setVar("fpsCap", FlxG.save.data.fpsCap); + setVar("downscroll", FlxG.save.data.downscroll); + + setVar("curStep", 0); + setVar("curBeat", 0); + setVar("crochet", Conductor.stepCrochet); + setVar("safeZoneOffset", Conductor.safeZoneOffset); + + setVar("hudZoom", PlayState.instance.camHUD.zoom); + setVar("cameraZoom", FlxG.camera.zoom); + + setVar("cameraAngle", FlxG.camera.angle); + setVar("camHudAngle", PlayState.instance.camHUD.angle); + + setVar("followXOffset",0); + setVar("followYOffset",0); + + setVar("showOnlyStrums", false); + setVar("strumLine1Visible", true); + setVar("strumLine2Visible", true); + + setVar("screenWidth",FlxG.width); + setVar("screenHeight",FlxG.height); + setVar("hudWidth", PlayState.instance.camHUD.width); + setVar("hudHeight", PlayState.instance.camHUD.height); + + setVar("mustHit", false); + + setVar("strumLineY", PlayState.instance.strumLine.y); + + // callbacks + + // sprites + + trace(Lua_helper.add_callback(lua,"makeSprite", makeLuaSprite)); + + Lua_helper.add_callback(lua,"destroySprite", function(id:String) { + var sprite = luaSprites.get(id); + if (sprite == null) + return false; + PlayState.instance.removeObject(sprite); + return true; + }); + + // hud/camera + + trace(Lua_helper.add_callback(lua,"setHudAngle", function (x:Float) { + PlayState.instance.camHUD.angle = x; + })); + + trace(Lua_helper.add_callback(lua,"setHudPosition", function (x:Int, y:Int) { + PlayState.instance.camHUD.x = x; + PlayState.instance.camHUD.y = y; + })); + + trace(Lua_helper.add_callback(lua,"getHudX", function () { + return PlayState.instance.camHUD.x; + })); + + trace(Lua_helper.add_callback(lua,"getHudY", function () { + return PlayState.instance.camHUD.y; + })); + + trace(Lua_helper.add_callback(lua,"setCamPosition", function (x:Int, y:Int) { + FlxG.camera.x = x; + FlxG.camera.y = y; + })); + + trace(Lua_helper.add_callback(lua,"getCameraX", function () { + return FlxG.camera.x; + })); + + trace(Lua_helper.add_callback(lua,"getCameraY", function () { + return FlxG.camera.y; + })); + + trace(Lua_helper.add_callback(lua,"setCamZoom", function(zoomAmount:Int) { + FlxG.camera.zoom = zoomAmount; + })); + + trace(Lua_helper.add_callback(lua,"setHudZoom", function(zoomAmount:Int) { + PlayState.instance.camHUD.zoom = zoomAmount; + })); + + // actors + + trace(Lua_helper.add_callback(lua,"getRenderedNotes", function() { + return PlayState.instance.notes.length; + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteX", function(id:Int) { + return PlayState.instance.notes.members[id].x; + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteY", function(id:Int) { + return PlayState.instance.notes.members[id].y; + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteType", function(id:Int) { + return PlayState.instance.notes.members[id].noteData; + })); + + trace(Lua_helper.add_callback(lua,"isSustain", function(id:Int) { + return PlayState.instance.notes.members[id].isSustainNote; + })); + + trace(Lua_helper.add_callback(lua,"isParentSustain", function(id:Int) { + return PlayState.instance.notes.members[id].prevNote.isSustainNote; + })); + + + trace(Lua_helper.add_callback(lua,"getRenderedNoteParentX", function(id:Int) { + return PlayState.instance.notes.members[id].prevNote.x; + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteParentY", function(id:Int) { + return PlayState.instance.notes.members[id].prevNote.y; + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteHit", function(id:Int) { + return PlayState.instance.notes.members[id].mustPress; + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteCalcX", function(id:Int) { + if (PlayState.instance.notes.members[id].mustPress) + return PlayState.playerStrums.members[Math.floor(Math.abs(PlayState.instance.notes.members[id].noteData))].x; + return PlayState.strumLineNotes.members[Math.floor(Math.abs(PlayState.instance.notes.members[id].noteData))].x; + })); + + trace(Lua_helper.add_callback(lua,"anyNotes", function() { + return PlayState.instance.notes.members.length != 0; + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteStrumtime", function(id:Int) { + return PlayState.instance.notes.members[id].strumTime; + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteScaleX", function(id:Int) { + return PlayState.instance.notes.members[id].scale.x; + })); + + trace(Lua_helper.add_callback(lua,"setRenderedNotePos", function(x:Float,y:Float, id:Int) { + if (PlayState.instance.notes.members[id] == null) + throw('error! you cannot set a rendered notes position when it doesnt exist! ID: ' + id); + else + { + PlayState.instance.notes.members[id].modifiedByLua = true; + PlayState.instance.notes.members[id].x = x; + PlayState.instance.notes.members[id].y = y; + } + })); + + trace(Lua_helper.add_callback(lua,"setRenderedNoteAlpha", function(alpha:Float, id:Int) { + PlayState.instance.notes.members[id].modifiedByLua = true; + PlayState.instance.notes.members[id].alpha = alpha; + })); + + trace(Lua_helper.add_callback(lua,"setRenderedNoteScale", function(scale:Float, id:Int) { + PlayState.instance.notes.members[id].modifiedByLua = true; + PlayState.instance.notes.members[id].setGraphicSize(Std.int(PlayState.instance.notes.members[id].width * scale)); + })); + + trace(Lua_helper.add_callback(lua,"setRenderedNoteScale", function(scaleX:Int, scaleY:Int, id:Int) { + PlayState.instance.notes.members[id].modifiedByLua = true; + PlayState.instance.notes.members[id].setGraphicSize(scaleX,scaleY); + })); + + trace(Lua_helper.add_callback(lua,"getRenderedNoteWidth", function(id:Int) { + return PlayState.instance.notes.members[id].width; + })); + + + trace(Lua_helper.add_callback(lua,"setRenderedNoteAngle", function(angle:Float, id:Int) { + PlayState.instance.notes.members[id].modifiedByLua = true; + PlayState.instance.notes.members[id].angle = angle; + })); + + trace(Lua_helper.add_callback(lua,"setActorX", function(x:Int,id:String) { + getActorByName(id).x = x; + })); + + trace(Lua_helper.add_callback(lua,"setActorAlpha", function(alpha:Float,id:String) { + getActorByName(id).alpha = alpha; + })); + + trace(Lua_helper.add_callback(lua,"setActorY", function(y:Int,id:String) { + getActorByName(id).y = y; + })); + + trace(Lua_helper.add_callback(lua,"setActorAngle", function(angle:Int,id:String) { + getActorByName(id).angle = angle; + })); + + trace(Lua_helper.add_callback(lua,"setActorScale", function(scale:Float,id:String) { + getActorByName(id).setGraphicSize(Std.int(getActorByName(id).width * scale)); + })); + + + trace(Lua_helper.add_callback(lua,"getActorWidth", function (id:String) { + return getActorByName(id).width; + })); + + trace(Lua_helper.add_callback(lua,"getActorHeight", function (id:String) { + return getActorByName(id).height; + })); + + trace(Lua_helper.add_callback(lua,"getActorAlpha", function(id:String) { + return getActorByName(id).alpha; + })); + + trace(Lua_helper.add_callback(lua,"getActorAngle", function(id:String) { + return getActorByName(id).angle; + })); + + trace(Lua_helper.add_callback(lua,"getActorX", function (id:String) { + return getActorByName(id).x; + })); + + trace(Lua_helper.add_callback(lua,"getActorY", function (id:String) { + return getActorByName(id).y; + })); + + + // tweens + + Lua_helper.add_callback(lua,"tweenCameraPos", function(toX:Int, toY:Int, time:Float, onComplete:String) { + FlxTween.tween(FlxG.camera, {x: toX, y: toY}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenCameraAngle", function(toAngle:Float, time:Float, onComplete:String) { + FlxTween.tween(FlxG.camera, {angle:toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenCameraZoom", function(toZoom:Float, time:Float, onComplete:String) { + FlxTween.tween(FlxG.camera, {zoom:toZoom}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenHudPos", function(toX:Int, toY:Int, time:Float, onComplete:String) { + FlxTween.tween(PlayState.instance.camHUD, {x: toX, y: toY}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenHudAngle", function(toAngle:Float, time:Float, onComplete:String) { + FlxTween.tween(PlayState.instance.camHUD, {angle:toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenHudZoom", function(toZoom:Float, time:Float, onComplete:String) { + FlxTween.tween(PlayState.instance.camHUD, {zoom:toZoom}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenPos", function(id:String, toX:Int, toY:Int, time:Float, onComplete:String) { + FlxTween.tween(getActorByName(id), {x: toX, y: toY}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenPosXAngle", function(id:String, toX:Int, toAngle:Float, time:Float, onComplete:String) { + FlxTween.tween(getActorByName(id), {x: toX, angle: toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenPosYAngle", function(id:String, toY:Int, toAngle:Float, time:Float, onComplete:String) { + FlxTween.tween(getActorByName(id), {y: toY, angle: toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenAngle", function(id:String, toAngle:Int, time:Float, onComplete:String) { + FlxTween.tween(getActorByName(id), {angle: toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenFadeIn", function(id:String, toAlpha:Int, time:Float, onComplete:String) { + FlxTween.tween(getActorByName(id), {alpha: toAlpha}, time, {ease: FlxEase.circIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); + }); + + Lua_helper.add_callback(lua,"tweenFadeOut", function(id:String, toAlpha:Int, time:Float, onComplete:String) { + FlxTween.tween(getActorByName(id), {alpha: toAlpha}, time, {ease: FlxEase.circOut, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); + }); + + // shader + + /*Lua_helper.add_callback(lua,"setRenderedNoteWiggle", function(id:Int, effectType:String, waveSpeed:Int, waveFrequency:Int) { + trace('call'); + var wiggleEffect = new WiggleEffect(); + switch(effectType.toLowerCase()) + { + case 'dreamy': + wiggleEffect.effectType = WiggleEffectType.DREAMY; + case 'wavy': + wiggleEffect.effectType = WiggleEffectType.WAVY; + case 'heat_wave_horizontal': + wiggleEffect.effectType = WiggleEffectType.HEAT_WAVE_HORIZONTAL; + case 'heat_wave_vertical': + wiggleEffect.effectType = WiggleEffectType.HEAT_WAVE_VERTICAL; + case 'flag': + wiggleEffect.effectType = WiggleEffectType.FLAG; + } + wiggleEffect.waveFrequency = waveFrequency; + wiggleEffect.waveSpeed = waveSpeed; + wiggleEffect.shader.uTime.value = [(strumLine.y - Note.swagWidth * 4) / FlxG.height]; // from 4mbr0s3 2 + notes.members[id].shader = wiggleEffect.shader; + luaWiggles.push(wiggleEffect); + }); + + Lua_helper.add_callback(lua,"setActorWiggle", function(id:String, effectType:String, waveSpeed:Int, waveFrequency:Int) { + trace('call'); + var wiggleEffect = new WiggleEffect(); + switch(effectType.toLowerCase()) + { + case 'dreamy': + wiggleEffect.effectType = WiggleEffectType.DREAMY; + case 'wavy': + wiggleEffect.effectType = WiggleEffectType.WAVY; + case 'heat_wave_horizontal': + wiggleEffect.effectType = WiggleEffectType.HEAT_WAVE_HORIZONTAL; + case 'heat_wave_vertical': + wiggleEffect.effectType = WiggleEffectType.HEAT_WAVE_VERTICAL; + case 'flag': + wiggleEffect.effectType = WiggleEffectType.FLAG; + } + wiggleEffect.waveFrequency = waveFrequency; + wiggleEffect.waveSpeed = waveSpeed; + wiggleEffect.shader.uTime.value = [(strumLine.y - Note.swagWidth * 4) / FlxG.height]; // from 4mbr0s3 2 + getActorByName(id).shader = wiggleEffect.shader; + luaWiggles.push(wiggleEffect); + });*/ + for (i in 0...PlayState.strumLineNotes.length) { + var member = PlayState.strumLineNotes.members[i]; + trace(PlayState.strumLineNotes.members[i].x + " " + PlayState.strumLineNotes.members[i].y + " " + PlayState.strumLineNotes.members[i].angle + " | strum" + i); + //setVar("strum" + i + "X", Math.floor(member.x)); + setVar("defaultStrum" + i + "X", Math.floor(member.x)); + //setVar("strum" + i + "Y", Math.floor(member.y)); + setVar("defaultStrum" + i + "Y", Math.floor(member.y)); + //setVar("strum" + i + "Angle", Math.floor(member.angle)); + setVar("defaultStrum" + i + "Angle", Math.floor(member.angle)); + trace("Adding strum" + i); + } + } + + public function executeState(name,args:Array) + { + return Lua.tostring(lua,callLua(name, args)); + } + + public static function createModchartState():ModchartState + { + return new ModchartState(); + } +} \ No newline at end of file diff --git a/source/PauseSubState.hx b/source/PauseSubState.hx index ba3ea0e..561d9e9 100644 --- a/source/PauseSubState.hx +++ b/source/PauseSubState.hx @@ -183,10 +183,10 @@ class PauseSubState extends MusicBeatSubstate case "Exit to menu": PlayState.loadRep = false; #if windows - if (PlayState.lua != null) + if (PlayState.luaModchart != null) { - Lua.close(PlayState.lua); - PlayState.lua = null; + PlayState.luaModchart.die(); + PlayState.luaModchart = null; } #end FlxG.switchState(new MainMenuState()); diff --git a/source/PlayState.hx b/source/PlayState.hx index 94b1f49..513b9ab 100644 --- a/source/PlayState.hx +++ b/source/PlayState.hx @@ -10,15 +10,6 @@ import openfl.utils.AssetManifest; import openfl.utils.AssetLibrary; import flixel.system.FlxAssets; -// Lua - -#if windows -import llua.Convert; -import llua.Lua; -import llua.State; -import llua.LuaL; -#end - import lime.app.Application; import lime.media.AudioContext; import lime.media.AudioManager; @@ -74,6 +65,8 @@ using StringTools; class PlayState extends MusicBeatState { + public static var instance:PlayState = null; + public static var curStage:String = ''; public static var SONG:SwagSong; public static var isStoryMode:Bool = false; @@ -109,22 +102,22 @@ class PlayState extends MusicBeatState private var vocals:FlxSound; - private var dad:Character; - private var gf:Character; - private var boyfriend:Boyfriend; + public static var dad:Character; + public static var gf:Character; + public static var boyfriend:Boyfriend; - private var notes:FlxTypedGroup; + public var notes:FlxTypedGroup; private var unspawnNotes:Array = []; - private var strumLine:FlxSprite; + public var strumLine:FlxSprite; private var curSection:Int = 0; private var camFollow:FlxObject; private static var prevCamFollow:FlxObject; - private var strumLineNotes:FlxTypedGroup; - private var playerStrums:FlxTypedGroup; + public static var strumLineNotes:FlxTypedGroup = null; + public static var playerStrums:FlxTypedGroup = null; private var camZooming:Bool = false; private var curSong:String = ""; @@ -150,7 +143,7 @@ class PlayState extends MusicBeatState private var iconP1:HealthIcon; private var iconP2:HealthIcon; - private var camHUD:FlxCamera; + public var camHUD:FlxCamera; private var camGame:FlxCamera; public static var offsetTesting:Bool = false; @@ -211,215 +204,15 @@ class PlayState extends MusicBeatState private var executeModchart = false; - // LUA SHIT + // API stuff - #if windows + public function addObject(object:FlxBasic) { add(object); } + public function removeObject(object:FlxBasic) { remove(object); } - public static var lua:State = null; - - function callLua(func_name : String, args : Array, ?type : String) : Dynamic - { - var result : Any = null; - - Lua.getglobal(lua, func_name); - - for( arg in args ) { - Convert.toLua(lua, arg); - } - - result = Lua.pcall(lua, args.length, 1, 0); - var p = Lua.tostring(lua,result); - var e = getLuaErrorMessage(lua); - - if (e != null) - { - if (p != null) - { - Application.current.window.alert("LUA ERROR:\n" + p + "\nhaxe things: " + e,"Kade Engine Modcharts"); - lua = null; - LoadingState.loadAndSwitchState(new MainMenuState()); - } - // trace('err: ' + e); - } - if( result == null) { - return null; - } else { - return convert(result, type); - } - - } - - function getType(l, type):Any - { - return switch Lua.type(l,type) { - case t if (t == Lua.LUA_TNIL): null; - case t if (t == Lua.LUA_TNUMBER): Lua.tonumber(l, type); - case t if (t == Lua.LUA_TSTRING): (Lua.tostring(l, type):String); - case t if (t == Lua.LUA_TBOOLEAN): Lua.toboolean(l, type); - case t: throw 'you don goofed up. lua type error ($t)'; - } - } - - function getReturnValues(l) { - var lua_v:Int; - var v:Any = null; - while((lua_v = Lua.gettop(l)) != 0) { - var type:String = getType(l,lua_v); - v = convert(lua_v, type); - Lua.pop(l, 1); - } - return v; - } - - - private function convert(v : Any, type : String) : Dynamic { // I didn't write this lol - if( Std.is(v, String) && type != null ) { - var v : String = v; - if( type.substr(0, 4) == 'array' ) { - if( type.substr(4) == 'float' ) { - var array : Array = v.split(','); - var array2 : Array = new Array(); - - for( vars in array ) { - array2.push(Std.parseFloat(vars)); - } - - return array2; - } else if( type.substr(4) == 'int' ) { - var array : Array = v.split(','); - var array2 : Array = new Array(); - - for( vars in array ) { - array2.push(Std.parseInt(vars)); - } - - return array2; - } else { - var array : Array = v.split(','); - return array; - } - } else if( type == 'float' ) { - return Std.parseFloat(v); - } else if( type == 'int' ) { - return Std.parseInt(v); - } else if( type == 'bool' ) { - if( v == 'true' ) { - return true; - } else { - return false; - } - } else { - return v; - } - } else { - return v; - } - } - - function getLuaErrorMessage(l) { - var v:String = Lua.tostring(l, -1); - Lua.pop(l, 1); - return v; - } - - public function setVar(var_name : String, object : Dynamic){ - // trace('setting variable ' + var_name + ' to ' + object); - - Lua.pushnumber(lua,object); - Lua.setglobal(lua, var_name); - } - - public function getVar(var_name : String, type : String) : Dynamic { - var result : Any = null; - - // trace('getting variable ' + var_name + ' with a type of ' + type); - - Lua.getglobal(lua, var_name); - result = Convert.fromLua(lua,-1); - Lua.pop(lua,1); - - if( result == null ) { - return null; - } else { - var result = convert(result, type); - //trace(var_name + ' result: ' + result); - return result; - } - } - - function getActorByName(id:String):Dynamic - { - // pre defined names - switch(id) - { - case 'boyfriend': - return boyfriend; - case 'girlfriend': - return gf; - case 'dad': - return dad; - } - // lua objects or what ever - if (luaSprites.get(id) == null) - return strumLineNotes.members[Std.parseInt(id)]; - return luaSprites.get(id); - } - - public static var luaSprites:Map = []; - - - - function makeLuaSprite(spritePath:String,toBeCalled:String, drawBehind:Bool) - { - #if sys - var data:BitmapData = BitmapData.fromFile(Sys.getCwd() + "assets/data/" + PlayState.SONG.song.toLowerCase() + '/' + spritePath + ".png"); - - var sprite:FlxSprite = new FlxSprite(0,0); - var imgWidth:Float = FlxG.width / data.width; - var imgHeight:Float = FlxG.height / data.height; - var scale:Float = imgWidth <= imgHeight ? imgWidth : imgHeight; - - // Cap the scale at x1 - if (scale > 1) - { - scale = 1; - } - - sprite.makeGraphic(Std.int(data.width * scale),Std.int(data.width * scale),FlxColor.TRANSPARENT); - - var data2:BitmapData = sprite.pixels.clone(); - var matrix:Matrix = new Matrix(); - matrix.identity(); - matrix.scale(scale, scale); - data2.fillRect(data2.rect, FlxColor.TRANSPARENT); - data2.draw(data, matrix, null, null, null, true); - sprite.pixels = data2; - - luaSprites.set(toBeCalled,sprite); - // and I quote: - // shitty layering but it works! - if (drawBehind) - { - remove(gf); - remove(boyfriend); - remove(dad); - } - add(sprite); - if (drawBehind) - { - add(gf); - add(boyfriend); - add(dad); - } - #end - return toBeCalled; - } - #end - // LUA SHIT override public function create() { - + instance = this; if (FlxG.sound.music != null) @@ -1291,6 +1084,8 @@ class PlayState extends MusicBeatState var luaWiggles:Array = []; + public static var luaModchart:ModchartState = null; + function startCountdown():Void { inCutscene = false; @@ -1300,369 +1095,13 @@ class PlayState extends MusicBeatState #if windows - if (executeModchart) // dude I hate lua (jkjkjkjk) - { - trace('opening a lua state (because we are cool :))'); - lua = LuaL.newstate(); - LuaL.openlibs(lua); - trace("Lua version: " + Lua.version()); - trace("LuaJIT version: " + Lua.versionJIT()); - Lua.init_callbacks(lua); - - var result = LuaL.dofile(lua, Paths.lua(PlayState.SONG.song.toLowerCase() + "/modchart")); // execute le file - - if (result != 0) - { - Application.current.window.alert("LUA COMPILE ERROR:\n" + Lua.tostring(lua,result),"Kade Engine Modcharts"); - lua = null; - LoadingState.loadAndSwitchState(new MainMenuState()); - } - - // get some fukin globals up in here bois - - setVar("difficulty", storyDifficulty); - setVar("bpm", Conductor.bpm); - setVar("scrollspeed", FlxG.save.data.scrollSpeed != 1 ? FlxG.save.data.scrollSpeed : PlayState.SONG.speed); - setVar("fpsCap", FlxG.save.data.fpsCap); - setVar("downscroll", FlxG.save.data.downscroll); - - setVar("curStep", 0); - setVar("curBeat", 0); - setVar("crochet", Conductor.stepCrochet); - setVar("safeZoneOffset", Conductor.safeZoneOffset); - - setVar("hudZoom", camHUD.zoom); - setVar("cameraZoom", FlxG.camera.zoom); - - setVar("cameraAngle", FlxG.camera.angle); - setVar("camHudAngle", camHUD.angle); - - setVar("followXOffset",0); - setVar("followYOffset",0); - - setVar("showOnlyStrums", false); - setVar("strumLine1Visible", true); - setVar("strumLine2Visible", true); - - setVar("screenWidth",FlxG.width); - setVar("screenHeight",FlxG.height); - setVar("hudWidth", camHUD.width); - setVar("hudHeight", camHUD.height); - - setVar("mustHit", false); - - setVar("strumLineY", strumLine.y); - - // callbacks - - // sprites - - trace(Lua_helper.add_callback(lua,"makeSprite", makeLuaSprite)); - - Lua_helper.add_callback(lua,"destroySprite", function(id:String) { - var sprite = luaSprites.get(id); - if (sprite == null) - return false; - remove(sprite); - return true; - }); - - // hud/camera - - trace(Lua_helper.add_callback(lua,"setHudAngle", function (x:Float) { - camHUD.angle = x; - })); - - trace(Lua_helper.add_callback(lua,"setHudPosition", function (x:Int, y:Int) { - camHUD.x = x; - camHUD.y = y; - })); - - trace(Lua_helper.add_callback(lua,"getHudX", function () { - return camHUD.x; - })); - - trace(Lua_helper.add_callback(lua,"getHudY", function () { - return camHUD.y; - })); - - trace(Lua_helper.add_callback(lua,"setCamPosition", function (x:Int, y:Int) { - FlxG.camera.x = x; - FlxG.camera.y = y; - })); - - trace(Lua_helper.add_callback(lua,"getCameraX", function () { - return FlxG.camera.x; - })); - - trace(Lua_helper.add_callback(lua,"getCameraY", function () { - return FlxG.camera.y; - })); - - trace(Lua_helper.add_callback(lua,"setCamZoom", function(zoomAmount:Int) { - FlxG.camera.zoom = zoomAmount; - })); - - trace(Lua_helper.add_callback(lua,"setHudZoom", function(zoomAmount:Int) { - camHUD.zoom = zoomAmount; - })); - - // actors - - trace(Lua_helper.add_callback(lua,"getRenderedNotes", function() { - return notes.length; - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteX", function(id:Int) { - return notes.members[id].x; - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteY", function(id:Int) { - return notes.members[id].y; - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteType", function(id:Int) { - return notes.members[id].noteData; - })); - - trace(Lua_helper.add_callback(lua,"isSustain", function(id:Int) { - return notes.members[id].isSustainNote; - })); - - trace(Lua_helper.add_callback(lua,"isParentSustain", function(id:Int) { - return notes.members[id].prevNote.isSustainNote; - })); - - - trace(Lua_helper.add_callback(lua,"getRenderedNoteParentX", function(id:Int) { - return notes.members[id].prevNote.x; - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteParentY", function(id:Int) { - return notes.members[id].prevNote.y; - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteHit", function(id:Int) { - return notes.members[id].mustPress; - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteCalcX", function(id:Int) { - if (notes.members[id].mustPress) - return playerStrums.members[Math.floor(Math.abs(notes.members[id].noteData))].x; - return strumLineNotes.members[Math.floor(Math.abs(notes.members[id].noteData))].x; - })); - - trace(Lua_helper.add_callback(lua,"anyNotes", function() { - return notes.members.length != 0; - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteStrumtime", function(id:Int) { - return notes.members[id].strumTime; - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteScaleX", function(id:Int) { - return notes.members[id].scale.x; - })); - - trace(Lua_helper.add_callback(lua,"setRenderedNotePos", function(x:Float,y:Float, id:Int) { - if (notes.members[id] == null) - throw('error! you cannot set a rendered notes position when it doesnt exist! ID: ' + id); - else - { - notes.members[id].modifiedByLua = true; - notes.members[id].x = x; - notes.members[id].y = y; - } - })); - - trace(Lua_helper.add_callback(lua,"setRenderedNoteAlpha", function(alpha:Float, id:Int) { - notes.members[id].modifiedByLua = true; - notes.members[id].alpha = alpha; - })); - - trace(Lua_helper.add_callback(lua,"setRenderedNoteScale", function(scale:Float, id:Int) { - notes.members[id].modifiedByLua = true; - notes.members[id].setGraphicSize(Std.int(notes.members[id].width * scale)); - })); - - trace(Lua_helper.add_callback(lua,"setRenderedNoteScale", function(scaleX:Int, scaleY:Int, id:Int) { - notes.members[id].modifiedByLua = true; - notes.members[id].setGraphicSize(scaleX,scaleY); - })); - - trace(Lua_helper.add_callback(lua,"getRenderedNoteWidth", function(id:Int) { - return notes.members[id].width; - })); - - - trace(Lua_helper.add_callback(lua,"setRenderedNoteAngle", function(angle:Float, id:Int) { - notes.members[id].modifiedByLua = true; - notes.members[id].angle = angle; - })); - - trace(Lua_helper.add_callback(lua,"setActorX", function(x:Int,id:String) { - getActorByName(id).x = x; - })); - - trace(Lua_helper.add_callback(lua,"setActorAlpha", function(alpha:Float,id:String) { - getActorByName(id).alpha = alpha; - })); - - trace(Lua_helper.add_callback(lua,"setActorY", function(y:Int,id:String) { - getActorByName(id).y = y; - })); - - trace(Lua_helper.add_callback(lua,"setActorAngle", function(angle:Int,id:String) { - getActorByName(id).angle = angle; - })); - - trace(Lua_helper.add_callback(lua,"setActorScale", function(scale:Float,id:String) { - getActorByName(id).setGraphicSize(Std.int(getActorByName(id).width * scale)); - })); - - - trace(Lua_helper.add_callback(lua,"getActorWidth", function (id:String) { - return getActorByName(id).width; - })); - - trace(Lua_helper.add_callback(lua,"getActorHeight", function (id:String) { - return getActorByName(id).height; - })); - - trace(Lua_helper.add_callback(lua,"getActorAlpha", function(id:String) { - return getActorByName(id).alpha; - })); - - trace(Lua_helper.add_callback(lua,"getActorAngle", function(id:String) { - return getActorByName(id).angle; - })); - - trace(Lua_helper.add_callback(lua,"getActorX", function (id:String) { - return getActorByName(id).x; - })); - - trace(Lua_helper.add_callback(lua,"getActorY", function (id:String) { - return getActorByName(id).y; - })); - - - // tweens - - Lua_helper.add_callback(lua,"tweenCameraPos", function(toX:Int, toY:Int, time:Float, onComplete:String) { - FlxTween.tween(FlxG.camera, {x: toX, y: toY}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenCameraAngle", function(toAngle:Float, time:Float, onComplete:String) { - FlxTween.tween(FlxG.camera, {angle:toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenCameraZoom", function(toZoom:Float, time:Float, onComplete:String) { - FlxTween.tween(FlxG.camera, {zoom:toZoom}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenHudPos", function(toX:Int, toY:Int, time:Float, onComplete:String) { - FlxTween.tween(camHUD, {x: toX, y: toY}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenHudAngle", function(toAngle:Float, time:Float, onComplete:String) { - FlxTween.tween(camHUD, {angle:toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenHudZoom", function(toZoom:Float, time:Float, onComplete:String) { - FlxTween.tween(camHUD, {zoom:toZoom}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,["camera"]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenPos", function(id:String, toX:Int, toY:Int, time:Float, onComplete:String) { - FlxTween.tween(getActorByName(id), {x: toX, y: toY}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenPosXAngle", function(id:String, toX:Int, toAngle:Float, time:Float, onComplete:String) { - FlxTween.tween(getActorByName(id), {x: toX, angle: toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenPosYAngle", function(id:String, toY:Int, toAngle:Float, time:Float, onComplete:String) { - FlxTween.tween(getActorByName(id), {y: toY, angle: toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenAngle", function(id:String, toAngle:Int, time:Float, onComplete:String) { - FlxTween.tween(getActorByName(id), {angle: toAngle}, time, {ease: FlxEase.cubeIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenFadeIn", function(id:String, toAlpha:Int, time:Float, onComplete:String) { - FlxTween.tween(getActorByName(id), {alpha: toAlpha}, time, {ease: FlxEase.circIn, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); - }); - - Lua_helper.add_callback(lua,"tweenFadeOut", function(id:String, toAlpha:Int, time:Float, onComplete:String) { - FlxTween.tween(getActorByName(id), {alpha: toAlpha}, time, {ease: FlxEase.circOut, onComplete: function(flxTween:FlxTween) { if (onComplete != '' && onComplete != null) {callLua(onComplete,[id]);}}}); - }); - - // shader - - /*Lua_helper.add_callback(lua,"setRenderedNoteWiggle", function(id:Int, effectType:String, waveSpeed:Int, waveFrequency:Int) { - trace('call'); - var wiggleEffect = new WiggleEffect(); - switch(effectType.toLowerCase()) - { - case 'dreamy': - wiggleEffect.effectType = WiggleEffectType.DREAMY; - case 'wavy': - wiggleEffect.effectType = WiggleEffectType.WAVY; - case 'heat_wave_horizontal': - wiggleEffect.effectType = WiggleEffectType.HEAT_WAVE_HORIZONTAL; - case 'heat_wave_vertical': - wiggleEffect.effectType = WiggleEffectType.HEAT_WAVE_VERTICAL; - case 'flag': - wiggleEffect.effectType = WiggleEffectType.FLAG; - } - wiggleEffect.waveFrequency = waveFrequency; - wiggleEffect.waveSpeed = waveSpeed; - wiggleEffect.shader.uTime.value = [(strumLine.y - Note.swagWidth * 4) / FlxG.height]; // from 4mbr0s3 2 - notes.members[id].shader = wiggleEffect.shader; - luaWiggles.push(wiggleEffect); - }); - - Lua_helper.add_callback(lua,"setActorWiggle", function(id:String, effectType:String, waveSpeed:Int, waveFrequency:Int) { - trace('call'); - var wiggleEffect = new WiggleEffect(); - switch(effectType.toLowerCase()) - { - case 'dreamy': - wiggleEffect.effectType = WiggleEffectType.DREAMY; - case 'wavy': - wiggleEffect.effectType = WiggleEffectType.WAVY; - case 'heat_wave_horizontal': - wiggleEffect.effectType = WiggleEffectType.HEAT_WAVE_HORIZONTAL; - case 'heat_wave_vertical': - wiggleEffect.effectType = WiggleEffectType.HEAT_WAVE_VERTICAL; - case 'flag': - wiggleEffect.effectType = WiggleEffectType.FLAG; - } - wiggleEffect.waveFrequency = waveFrequency; - wiggleEffect.waveSpeed = waveSpeed; - wiggleEffect.shader.uTime.value = [(strumLine.y - Note.swagWidth * 4) / FlxG.height]; // from 4mbr0s3 2 - getActorByName(id).shader = wiggleEffect.shader; - luaWiggles.push(wiggleEffect); - });*/ - - for (i in 0...strumLineNotes.length) { - var member = strumLineNotes.members[i]; - trace(strumLineNotes.members[i].x + " " + strumLineNotes.members[i].y + " " + strumLineNotes.members[i].angle + " | strum" + i); - //setVar("strum" + i + "X", Math.floor(member.x)); - setVar("defaultStrum" + i + "X", Math.floor(member.x)); - //setVar("strum" + i + "Y", Math.floor(member.y)); - setVar("defaultStrum" + i + "Y", Math.floor(member.y)); - //setVar("strum" + i + "Angle", Math.floor(member.angle)); - setVar("defaultStrum" + i + "Angle", Math.floor(member.angle)); - trace("Adding strum" + i); - } - - trace('calling start function'); - - trace('return: ' + Lua.tostring(lua,callLua('start', [PlayState.SONG.song]))); - } - - + if (executeModchart) + { + luaModchart = ModchartState.createModchartState(); + luaModchart.executeState('start',[PlayState.SONG.song]); + } #end + talking = false; startedCountdown = true; Conductor.songPosition = 0; @@ -2147,12 +1586,12 @@ class PlayState extends MusicBeatState #end #if windows - if (executeModchart && lua != null && songStarted) + if (executeModchart && luaModchart != null && songStarted) { - setVar('songPos',Conductor.songPosition); - setVar('hudZoom', camHUD.zoom); - setVar('cameraZoom',FlxG.camera.zoom); - callLua('update', [elapsed]); + luaModchart.setVar('songPos',Conductor.songPosition); + luaModchart.setVar('hudZoom', camHUD.zoom); + luaModchart.setVar('cameraZoom',FlxG.camera.zoom); + luaModchart.executeState('update', [elapsed]); for (i in luaWiggles) { @@ -2162,15 +1601,15 @@ class PlayState extends MusicBeatState /*for (i in 0...strumLineNotes.length) { var member = strumLineNotes.members[i]; - member.x = getVar("strum" + i + "X", "float"); - member.y = getVar("strum" + i + "Y", "float"); - member.angle = getVar("strum" + i + "Angle", "float"); + member.x = luaModchart.getVar("strum" + i + "X", "float"); + member.y = luaModchart.getVar("strum" + i + "Y", "float"); + member.angle = luaModchart.getVar("strum" + i + "Angle", "float"); }*/ - FlxG.camera.angle = getVar('cameraAngle', 'float'); - camHUD.angle = getVar('camHudAngle','float'); + FlxG.camera.angle = luaModchart.getVar('cameraAngle', 'float'); + camHUD.angle = luaModchart.getVar('camHudAngle','float'); - if (getVar("showOnlyStrums",'bool')) + if (luaModchart.getVar("showOnlyStrums",'bool')) { healthBarBG.visible = false; kadeEngineWatermark.visible = false; @@ -2189,8 +1628,8 @@ class PlayState extends MusicBeatState scoreTxt.visible = true; } - var p1 = getVar("strumLine1Visible",'bool'); - var p2 = getVar("strumLine2Visible",'bool'); + var p1 = luaModchart.getVar("strumLine1Visible",'bool'); + var p2 = luaModchart.getVar("strumLine2Visible",'bool'); for (i in 0...4) { @@ -2267,10 +1706,10 @@ class PlayState extends MusicBeatState #end FlxG.switchState(new ChartingState()); #if windows - if (lua != null) + if (luaModchart != null) { - Lua.close(lua); - lua = null; + luaModchart.die(); + luaModchart = null; } #end } @@ -2309,10 +1748,10 @@ class PlayState extends MusicBeatState if (FlxG.keys.justPressed.EIGHT) { FlxG.switchState(new AnimationDebug(SONG.player2)); - if (lua != null) + if (luaModchart != null) { - Lua.close(lua); - lua = null; + luaModchart.die(); + luaModchart = null; } } @@ -2454,8 +1893,8 @@ class PlayState extends MusicBeatState } #if windows - if (lua != null) - setVar("mustHit",PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection); + if (luaModchart != null) + luaModchart.setVar("mustHit",PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection); #end if (camFollow.x != dad.getMidpoint().x + 150 && !PlayState.SONG.notes[Std.int(curStep / 16)].mustHitSection) @@ -2463,16 +1902,16 @@ class PlayState extends MusicBeatState var offsetX = 0; var offsetY = 0; #if windows - if (lua != null) + if (luaModchart != null) { - offsetX = getVar("followXOffset", "float"); - offsetY = getVar("followYOffset", "float"); + offsetX = luaModchart.getVar("followXOffset", "float"); + offsetY = luaModchart.getVar("followYOffset", "float"); } #end camFollow.setPosition(dad.getMidpoint().x + 150 + offsetX, dad.getMidpoint().y - 100 + offsetY); #if windows - if (lua != null) - callLua('playerTwoTurn', []); + if (luaModchart != null) + luaModchart.executeState('playerTwoTurn', []); #end // camFollow.setPosition(lucky.getMidpoint().x - 120, lucky.getMidpoint().y + 210); @@ -2497,17 +1936,17 @@ class PlayState extends MusicBeatState var offsetX = 0; var offsetY = 0; #if windows - if (lua != null) + if (luaModchart != null) { - offsetX = getVar("followXOffset", "float"); - offsetY = getVar("followYOffset", "float"); + offsetX = luaModchart.getVar("followXOffset", "float"); + offsetY = luaModchart.getVar("followYOffset", "float"); } #end camFollow.setPosition(boyfriend.getMidpoint().x - 100 + offsetX, boyfriend.getMidpoint().y - 100 + offsetY); #if windows - if (lua != null) - callLua('playerOneTurn', []); + if (luaModchart != null) + luaModchart.executeState('playerOneTurn', []); #end switch (curStage) @@ -2697,8 +2136,8 @@ class PlayState extends MusicBeatState } #if windows - if (lua != null) - callLua('playerTwoSing', [Math.abs(daNote.noteData), Conductor.songPosition]); + if (luaModchart != null) + luaModchart.executeState('playerTwoSing', [Math.abs(daNote.noteData), Conductor.songPosition]); #end dad.holdTimer = 0; @@ -2783,10 +2222,10 @@ class PlayState extends MusicBeatState rep.SaveReplay(); #if windows - if (executeModchart) + if (luaModchart != null) { - Lua.close(lua); - lua = null; + luaModchart.die(); + luaModchart = null; } #end @@ -2825,10 +2264,10 @@ class PlayState extends MusicBeatState FlxG.switchState(new StoryMenuState()); #if windows - if (lua != null) + if (luaModchart != null) { - Lua.close(lua); - lua = null; + luaModchart.die(); + luaModchart = null; } #end @@ -3372,8 +2811,8 @@ class PlayState extends MusicBeatState } #if windows - if (lua != null) - callLua('playerOneMiss', [direction, Conductor.songPosition]); + if (luaModchart != null) + luaModchart.executeState('playerOneMiss', [direction, Conductor.songPosition]); #end @@ -3523,8 +2962,8 @@ class PlayState extends MusicBeatState } #if windows - if (lua != null) - callLua('playerOneSing', [note.noteData, Conductor.songPosition]); + if (luaModchart != null) + luaModchart.executeState('playerOneSing', [note.noteData, Conductor.songPosition]); #end @@ -3657,10 +3096,10 @@ class PlayState extends MusicBeatState } #if windows - if (executeModchart && lua != null) + if (executeModchart && luaModchart != null) { - setVar('curStep',curStep); - callLua('stepHit',[curStep]); + luaModchart.setVar('curStep',curStep); + luaModchart.executeState('stepHit',[curStep]); } #end @@ -3696,10 +3135,10 @@ class PlayState extends MusicBeatState } #if windows - if (executeModchart && lua != null) + if (executeModchart && luaModchart != null) { - setVar('curBeat',curBeat); - callLua('beatHit',[curBeat]); + luaModchart.setVar('curBeat',curBeat); + luaModchart.executeState('beatHit',[curBeat]); } #end