3671 lines
121 KiB
Haxe
3671 lines
121 KiB
Haxe
package;
|
|
|
|
import openfl.display.BitmapData;
|
|
#if LUA_ALLOWED
|
|
import llua.Lua;
|
|
import llua.LuaL;
|
|
import llua.State;
|
|
import llua.Convert;
|
|
#end
|
|
|
|
import animateatlas.AtlasFrameMaker;
|
|
import flixel.FlxG;
|
|
import flixel.addons.effects.FlxTrail;
|
|
import flixel.input.keyboard.FlxKey;
|
|
import flixel.tweens.FlxTween;
|
|
import flixel.tweens.FlxEase;
|
|
import flixel.text.FlxText;
|
|
import flixel.group.FlxGroup.FlxTypedGroup;
|
|
import flixel.math.FlxPoint;
|
|
import flixel.sound.FlxSound;
|
|
import flixel.util.FlxTimer;
|
|
import flixel.FlxSprite;
|
|
import flixel.FlxCamera;
|
|
import flixel.util.FlxColor;
|
|
import flixel.FlxBasic;
|
|
import flixel.FlxObject;
|
|
import flixel.FlxSprite;
|
|
import openfl.Lib;
|
|
import openfl.display.BlendMode;
|
|
import openfl.filters.BitmapFilter;
|
|
import openfl.utils.Assets;
|
|
import flixel.math.FlxMath;
|
|
import flixel.util.FlxSave;
|
|
import flixel.addons.transition.FlxTransitionableState;
|
|
import flixel.system.FlxAssets.FlxShader;
|
|
import Shaders;
|
|
import openfl.filters.ShaderFilter;
|
|
import utils.*;
|
|
|
|
#if (!flash && sys)
|
|
import flixel.addons.display.FlxRuntimeShader;
|
|
#end
|
|
|
|
#if sys
|
|
import sys.FileSystem;
|
|
import sys.io.File;
|
|
#end
|
|
|
|
import Type.ValueType;
|
|
import Controls;
|
|
import DialogueBoxPsych;
|
|
|
|
#if hscript
|
|
import hscript.Parser;
|
|
import hscript.Interp;
|
|
import hscript.Expr;
|
|
#end
|
|
|
|
#if desktop
|
|
import DiscordClient;
|
|
#end
|
|
|
|
using StringTools;
|
|
|
|
class FunkinLua {
|
|
public static var Function_Stop:Dynamic = "##PSYCHLUA_FUNCTIONSTOP";
|
|
public static var Function_Continue:Dynamic = "##PSYCHLUA_FUNCTIONCONTINUE";
|
|
public static var Function_StopLua:Dynamic = "##PSYCHLUA_FUNCTIONSTOPLUA";
|
|
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
private static var storedFilters:Map<String, ShaderFilter> = []; // for a few shader functions
|
|
#end
|
|
|
|
//public var errorHandler:String->Void;
|
|
#if LUA_ALLOWED
|
|
public var lua:State = null;
|
|
#end
|
|
public var camTarget:FlxCamera;
|
|
public var scriptName:String = '';
|
|
public var closed:Bool = false;
|
|
|
|
#if hscript
|
|
public static var hscript:HScript = null;
|
|
#end
|
|
|
|
var ffmpegDuration:Float = 1;
|
|
|
|
public function new(script:String, ?scriptCode:String) {
|
|
#if LUA_ALLOWED
|
|
lua = LuaL.newstate();
|
|
LuaL.openlibs(lua);
|
|
Lua.init_callbacks(lua);
|
|
|
|
//trace('Lua version: ' + Lua.version());
|
|
//trace("LuaJIT version: " + Lua.versionJIT());
|
|
|
|
//LuaL.dostring(lua, CLENSE);
|
|
try{
|
|
var result:Int = scriptCode != null ? LuaL.dostring(lua, scriptCode) : LuaL.dofile(lua, script);
|
|
var resultStr:String = Lua.tostring(lua, result);
|
|
if(resultStr != null && result != 0) {
|
|
trace('Error on lua script! ' + resultStr);
|
|
#if windows
|
|
lime.app.Application.current.window.alert(resultStr, 'Error on lua script!');
|
|
#else
|
|
luaTrace('Error loading lua script: "$script"\n' + resultStr, true, false, FlxColor.RED);
|
|
#end
|
|
lua = null;
|
|
return;
|
|
}
|
|
} catch(e:Dynamic) {
|
|
trace(e);
|
|
return;
|
|
}
|
|
scriptName = script;
|
|
initHaxeModule();
|
|
|
|
trace('lua file loaded succesfully:' + script);
|
|
|
|
// Lua shit
|
|
set('Function_StopLua', Function_StopLua);
|
|
set('Function_Stop', Function_Stop);
|
|
set('Function_Continue', Function_Continue);
|
|
set('luaDebugMode', false);
|
|
set('luaDeprecatedWarnings', true);
|
|
set('inChartEditor', false);
|
|
|
|
// Song/Week shit
|
|
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('songPath', Paths.formatToSongPath(PlayState.SONG.song));
|
|
set('startedCountdown', false);
|
|
set('curStage', PlayState.SONG.stage);
|
|
|
|
set('isStoryMode', PlayState.isStoryMode);
|
|
set('difficulty', PlayState.storyDifficulty);
|
|
|
|
var difficultyName:String = CoolUtil.difficulties[PlayState.storyDifficulty];
|
|
set('difficultyName', difficultyName);
|
|
set('difficultyPath', Paths.formatToSongPath(difficultyName));
|
|
set('weekRaw', PlayState.storyWeek);
|
|
set('week', WeekData.weeksList[PlayState.storyWeek]);
|
|
set('seenCutscene', PlayState.seenCutscene);
|
|
|
|
// Camera poo
|
|
set('cameraX', 0);
|
|
set('cameraY', 0);
|
|
|
|
// Screen stuff
|
|
set('screenWidth', FlxG.width);
|
|
set('screenHeight', FlxG.height);
|
|
|
|
// PlayState cringe ass nae nae bullcrap
|
|
set('curBeat', 0);
|
|
set('curStep', 0);
|
|
set('curDecBeat', 0);
|
|
set('curDecStep', 0);
|
|
|
|
set('score', 0);
|
|
set('misses', 0);
|
|
set('hits', 0);
|
|
|
|
set('rating', 0);
|
|
set('ratingName', '');
|
|
set('ratingFC', '');
|
|
set('version', MainMenuState.psychEngineVersion.trim());
|
|
set('jsVersion', MainMenuState.psychEngineJSVersion.trim());
|
|
|
|
set('inGameOver', false);
|
|
set('mustHitSection', false);
|
|
set('altAnim', false);
|
|
set('gfSection', false);
|
|
|
|
set('npsSpeedMult', PlayState.instance.npsSpeedMult);
|
|
|
|
// these things are useless
|
|
set('polyphonyOppo', PlayState.instance.polyphonyOppo);
|
|
set('polyphonyBF', PlayState.instance.polyphonyBF);
|
|
|
|
// Gameplay settings
|
|
set('healthGainMult', PlayState.instance.healthGain);
|
|
set('healthLossMult', PlayState.instance.healthLoss);
|
|
set('playbackRate', PlayState.instance.playbackRate);
|
|
set('instakillOnMiss', PlayState.instance.instakillOnMiss);
|
|
set('botPlay', PlayState.instance.cpuControlled);
|
|
set('practice', PlayState.instance.practiceMode);
|
|
|
|
for (i in 0...4) {
|
|
set('defaultPlayerStrumX' + i, 0);
|
|
set('defaultPlayerStrumY' + i, 0);
|
|
set('defaultOpponentStrumX' + i, 0);
|
|
set('defaultOpponentStrumY' + i, 0);
|
|
}
|
|
|
|
// Default character positions woooo
|
|
set('defaultBoyfriendX', PlayState.instance.BF_X);
|
|
set('defaultBoyfriendY', PlayState.instance.BF_Y);
|
|
set('defaultOpponentX', PlayState.instance.DAD_X);
|
|
set('defaultOpponentY', PlayState.instance.DAD_Y);
|
|
set('defaultGirlfriendX', PlayState.instance.GF_X);
|
|
set('defaultGirlfriendY', PlayState.instance.GF_Y);
|
|
|
|
// Character shit
|
|
set('boyfriendName', PlayState.SONG.player1);
|
|
set('dadName', PlayState.SONG.player2);
|
|
set('gfName', PlayState.SONG.gfVersion);
|
|
|
|
// Some settings, no jokes
|
|
set('downscroll', ClientPrefs.downScroll);
|
|
set('middlescroll', ClientPrefs.middleScroll);
|
|
set('framerate', ClientPrefs.framerate);
|
|
set('ghostTapping', ClientPrefs.ghostTapping);
|
|
set('hideHud', ClientPrefs.hideHud);
|
|
set('timeBarType', ClientPrefs.timeBarType);
|
|
set('scoreZoom', ClientPrefs.scoreZoom);
|
|
set('cameraZoomOnBeat', ClientPrefs.camZooms);
|
|
set('flashingLights', ClientPrefs.flashing);
|
|
set('noteOffset', ClientPrefs.noteOffset);
|
|
set('healthBarAlpha', ClientPrefs.healthBarAlpha);
|
|
set('noResetButton', ClientPrefs.noReset);
|
|
set('lowQuality', ClientPrefs.lowQuality);
|
|
set('shadersEnabled', ClientPrefs.shaders);
|
|
set('scriptName', scriptName);
|
|
set('currentModDirectory', Paths.currentModDirectory);
|
|
|
|
// If you don't want this to show, you can use the lua script to change it
|
|
set('user_path', CoolSystemStuff.getUserPath());
|
|
set("user_name", CoolSystemStuff.getUsername());
|
|
|
|
#if windows
|
|
set('buildTarget', 'windows');
|
|
#elseif linux
|
|
set('buildTarget', 'linux');
|
|
#elseif mac
|
|
set('buildTarget', 'mac');
|
|
#elseif html5
|
|
set('buildTarget', 'browser');
|
|
#elseif android
|
|
set('buildTarget', 'android');
|
|
#else
|
|
set('buildTarget', 'unknown');
|
|
#end
|
|
|
|
// custom substate
|
|
Lua_helper.add_callback(lua, "openCustomSubstate", function(name:String, pauseGame:Bool = false) {
|
|
if(pauseGame)
|
|
{
|
|
PlayState.instance.persistentUpdate = false;
|
|
PlayState.instance.persistentDraw = true;
|
|
PlayState.instance.paused = true;
|
|
if(FlxG.sound.music != null) {
|
|
FlxG.sound.music.pause();
|
|
PlayState.instance.vocals.pause();
|
|
}
|
|
}
|
|
PlayState.instance.openSubState(new CustomSubstate(name));
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "closeCustomSubstate", function() {
|
|
if(CustomSubstate.instance != null)
|
|
{
|
|
PlayState.instance.closeSubState();
|
|
CustomSubstate.instance = null;
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
// shader shit
|
|
Lua_helper.add_callback(lua, "initLuaShader", function(name:String, glslVersion:Int = 120) {
|
|
if(!ClientPrefs.shaders) return false;
|
|
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
return initLuaShader(name, glslVersion);
|
|
#else
|
|
luaTrace("initLuaShader | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
return false;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "setSpriteShader", function(obj:String, shader:String) {
|
|
if(!ClientPrefs.shaders) return false;
|
|
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
if(!PlayState.instance.runtimeShaders.exists(shader) && !initLuaShader(shader))
|
|
{
|
|
luaTrace('setSpriteShader | Shader $shader is missing! Make sure you\'ve initalized your shader first!', false, false, FlxColor.RED);
|
|
return false;
|
|
}
|
|
|
|
var killMe:Array<String> = obj.split('.');
|
|
var leObj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
leObj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(leObj != null) {
|
|
var arr:Array<String> = PlayState.instance.runtimeShaders.get(shader);
|
|
leObj.shader = new FlxRuntimeShader(arr[0], arr[1]);
|
|
return true;
|
|
}
|
|
#else
|
|
luaTrace("setSpriteShader | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "removeSpriteShader", function(obj:String) {
|
|
var killMe:Array<String> = obj.split('.');
|
|
var leObj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
leObj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(leObj != null) {
|
|
leObj.shader = null;
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
// camera shaders
|
|
Lua_helper.add_callback(lua, "setCameraShader", function(cam:String, shader:String, ?index:String) {
|
|
final funk = PlayState.instance;
|
|
if (!ClientPrefs.shaders) return false;
|
|
|
|
if (index == null || index.length < 1)
|
|
index = shader;
|
|
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
if (!funk.runtimeShaders.exists(shader) && !funk.initLuaShader(shader)) {
|
|
luaTrace('addShaderToCam | Shader $shader is missing! Make sure you\'ve initalized your shader first!', false, false, FlxColor.RED);
|
|
return false;
|
|
}
|
|
|
|
var arr:Array<String> = funk.runtimeShaders.get(shader);
|
|
var camera = getCam(cam);
|
|
@:privateAccess {
|
|
if (camera.filters == null)
|
|
camera.filters = [];
|
|
final filter = new ShaderFilter(new FlxRuntimeShader(arr[0], arr[1]));
|
|
storedFilters.set(index, filter);
|
|
camera.filters.push(filter);
|
|
}
|
|
return true;
|
|
#else
|
|
luaTrace("addShaderToCam | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
return false;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "removeCameraShader", function(cam:String, shader:String) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
final camera = getCam(cam);
|
|
@:privateAccess {
|
|
if(!storedFilters.exists(shader)) {
|
|
luaTrace('removeCamShader | $shader does not exist!', false, false, FlxColor.YELLOW);
|
|
return false;
|
|
}
|
|
|
|
if (camera.filters == null) {
|
|
luaTrace('removeCamShader | camera $cam does not have any shaders!', false, false, FlxColor.YELLOW);
|
|
return false;
|
|
}
|
|
|
|
camera.filters.remove(storedFilters.get(shader));
|
|
storedFilters.remove(shader);
|
|
return true;
|
|
}
|
|
#else
|
|
luaTrace('removeCamShader | Platform unsupported for Runtime Shaders!', false, false, FlxColor.RED);
|
|
#end
|
|
return false;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "getShaderBool", function(obj:String, prop:String) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if (shader == null)
|
|
{
|
|
return null;
|
|
}
|
|
return shader.getBool(prop);
|
|
#else
|
|
luaTrace("getShaderBool | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
return null;
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "getShaderBoolArray", function(obj:String, prop:String) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if (shader == null)
|
|
{
|
|
return null;
|
|
}
|
|
return shader.getBoolArray(prop);
|
|
#else
|
|
luaTrace("getShaderBoolArray | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
return null;
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "getShaderInt", function(obj:String, prop:String) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if (shader == null)
|
|
{
|
|
return null;
|
|
}
|
|
return shader.getInt(prop);
|
|
#else
|
|
luaTrace("getShaderInt | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
return null;
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "getShaderIntArray", function(obj:String, prop:String) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if (shader == null)
|
|
{
|
|
return null;
|
|
}
|
|
return shader.getIntArray(prop);
|
|
#else
|
|
luaTrace("getShaderIntArray | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
return null;
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "getShaderFloat", function(obj:String, prop:String) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if (shader == null)
|
|
{
|
|
return null;
|
|
}
|
|
return shader.getFloat(prop);
|
|
#else
|
|
luaTrace("getShaderFloat | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
return null;
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "getShaderFloatArray", function(obj:String, prop:String) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if (shader == null)
|
|
{
|
|
return null;
|
|
}
|
|
return shader.getFloatArray(prop);
|
|
#else
|
|
luaTrace("getShaderFloatArray | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
return null;
|
|
#end
|
|
});
|
|
|
|
|
|
Lua_helper.add_callback(lua, "setShaderBool", function(obj:String, prop:String, value:Bool) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if(shader == null) return;
|
|
|
|
shader.setBool(prop, value);
|
|
#else
|
|
luaTrace("setShaderBool | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "setShaderBoolArray", function(obj:String, prop:String, values:Dynamic) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if(shader == null) return;
|
|
|
|
shader.setBoolArray(prop, values);
|
|
#else
|
|
luaTrace("setShaderBoolArray | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "setShaderInt", function(obj:String, prop:String, value:Int) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if(shader == null) return;
|
|
|
|
shader.setInt(prop, value);
|
|
#else
|
|
luaTrace("setShaderInt | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "setShaderIntArray", function(obj:String, prop:String, values:Dynamic) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if(shader == null) return;
|
|
|
|
shader.setIntArray(prop, values);
|
|
#else
|
|
luaTrace("setShaderIntArray | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "setShaderFloat", function(obj:String, prop:String, value:Float) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if(shader == null) return;
|
|
|
|
shader.setFloat(prop, value);
|
|
#else
|
|
luaTrace("setShaderFloat | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "setShaderFloatArray", function(obj:String, prop:String, values:Dynamic) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if(shader == null) return;
|
|
|
|
shader.setFloatArray(prop, values);
|
|
#else
|
|
luaTrace("setShaderFloatArray | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "setShaderSampler2D", function(obj:String, prop:String, bitmapdataPath:String) {
|
|
#if (!flash && MODS_ALLOWED && sys)
|
|
var shader:FlxRuntimeShader = getShader(obj);
|
|
if(shader == null) return;
|
|
|
|
// trace('bitmapdatapath: $bitmapdataPath');
|
|
var value = Paths.image(bitmapdataPath);
|
|
if(value != null && value.bitmap != null)
|
|
{
|
|
// trace('Found bitmapdata. Width: ${value.bitmap.width} Height: ${value.bitmap.height}');
|
|
shader.setSampler2D(prop, value.bitmap);
|
|
}
|
|
#else
|
|
luaTrace("setShaderSampler2D | Platform unsupported for Runtime Shaders!", false, false, FlxColor.RED);
|
|
#end
|
|
});
|
|
|
|
|
|
//
|
|
Lua_helper.add_callback(lua, "getRunningScripts", function(){
|
|
var runningScripts:Array<String> = [];
|
|
for (idx in 0...PlayState.instance.luaArray.length)
|
|
runningScripts.push(PlayState.instance.luaArray[idx].scriptName);
|
|
|
|
|
|
return runningScripts;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "callOnLuas", function(?funcName:String, ?args:Array<Dynamic>, ignoreStops=false, ignoreSelf=true, ?exclusions:Array<String>){
|
|
if(funcName==null){
|
|
#if (linc_luajit >= "0.0.6")
|
|
LuaL.error(lua, "bad argument #1 to 'callOnLuas' (string expected, got nil)");
|
|
#end
|
|
return;
|
|
}
|
|
if(args==null)args = [];
|
|
|
|
if(exclusions==null)exclusions=[];
|
|
|
|
Lua.getglobal(lua, 'scriptName');
|
|
final daScriptName = Lua.tostring(lua, -1);
|
|
Lua.pop(lua, 1);
|
|
if(ignoreSelf && !exclusions.contains(daScriptName))exclusions.push(daScriptName);
|
|
PlayState.instance.callOnLuas(funcName, args, ignoreStops, exclusions);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "callScript", function(?luaFile:String, ?funcName:String, ?args:Array<Dynamic>){
|
|
if(luaFile==null){
|
|
#if (linc_luajit >= "0.0.6")
|
|
LuaL.error(lua, "bad argument #1 to 'callScript' (string expected, got nil)");
|
|
#end
|
|
return;
|
|
}
|
|
if(funcName==null){
|
|
#if (linc_luajit >= "0.0.6")
|
|
LuaL.error(lua, "bad argument #2 to 'callScript' (string expected, got nil)");
|
|
#end
|
|
return;
|
|
}
|
|
if(args==null){
|
|
args = [];
|
|
}
|
|
var cervix = luaFile + ".lua";
|
|
if(luaFile.endsWith(".lua"))cervix=luaFile;
|
|
var doPush = false;
|
|
#if MODS_ALLOWED
|
|
if(FileSystem.exists(Paths.modFolders(cervix)))
|
|
{
|
|
cervix = Paths.modFolders(cervix);
|
|
doPush = true;
|
|
}
|
|
else if(FileSystem.exists(cervix))
|
|
{
|
|
doPush = true;
|
|
}
|
|
else {
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(FileSystem.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
}
|
|
#else
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(Assets.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
#end
|
|
if(doPush)
|
|
{
|
|
for (luaInstance in PlayState.instance.luaArray)
|
|
{
|
|
if(luaInstance.scriptName == cervix)
|
|
{
|
|
luaInstance.call(funcName, args);
|
|
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "getGlobalFromScript", function(?luaFile:String, ?global:String){ // returns the global from a script
|
|
if(luaFile==null){
|
|
#if (linc_luajit >= "0.0.6")
|
|
LuaL.error(lua, "bad argument #1 to 'getGlobalFromScript' (string expected, got nil)");
|
|
#end
|
|
return;
|
|
}
|
|
if(global==null){
|
|
#if (linc_luajit >= "0.0.6")
|
|
LuaL.error(lua, "bad argument #2 to 'getGlobalFromScript' (string expected, got nil)");
|
|
#end
|
|
return;
|
|
}
|
|
var cervix = luaFile + ".lua";
|
|
if(luaFile.endsWith(".lua"))cervix=luaFile;
|
|
var doPush = false;
|
|
#if MODS_ALLOWED
|
|
if(FileSystem.exists(Paths.modFolders(cervix)))
|
|
{
|
|
cervix = Paths.modFolders(cervix);
|
|
doPush = true;
|
|
}
|
|
else if(FileSystem.exists(cervix))
|
|
{
|
|
doPush = true;
|
|
}
|
|
else {
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(FileSystem.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
}
|
|
#else
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(Assets.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
#end
|
|
if(doPush)
|
|
{
|
|
for (luaInstance in PlayState.instance.luaArray)
|
|
{
|
|
if(luaInstance.scriptName == cervix)
|
|
{
|
|
Lua.getglobal(luaInstance.lua, global);
|
|
if(Lua.isnumber(luaInstance.lua,-1)){
|
|
Lua.pushnumber(lua, Lua.tonumber(luaInstance.lua, -1));
|
|
}else if(Lua.isstring(luaInstance.lua,-1)){
|
|
Lua.pushstring(lua, Lua.tostring(luaInstance.lua, -1));
|
|
}else if(Lua.isboolean(luaInstance.lua,-1)){
|
|
Lua.pushboolean(lua, Lua.toboolean(luaInstance.lua, -1));
|
|
}else{
|
|
Lua.pushnil(lua);
|
|
}
|
|
// TODO: table
|
|
|
|
Lua.pop(luaInstance.lua,1); // remove the global
|
|
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "loopTheSong", function(startingPoint:Float = 0) { //Hopefully this works!
|
|
Conductor.songPosition = startingPoint;
|
|
FlxG.sound.music.time = startingPoint;
|
|
PlayState.instance.loopCallback(startingPoint);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "setGlobalFromScript", function(luaFile:String, global:String, val:Dynamic){ // returns the global from a script
|
|
var cervix = luaFile + ".lua";
|
|
if(luaFile.endsWith(".lua"))cervix=luaFile;
|
|
var doPush = false;
|
|
#if MODS_ALLOWED
|
|
if(FileSystem.exists(Paths.modFolders(cervix)))
|
|
{
|
|
cervix = Paths.modFolders(cervix);
|
|
doPush = true;
|
|
}
|
|
else if(FileSystem.exists(cervix))
|
|
{
|
|
doPush = true;
|
|
}
|
|
else {
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(FileSystem.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
}
|
|
#else
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(Assets.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
#end
|
|
if(doPush)
|
|
{
|
|
for (luaInstance in PlayState.instance.luaArray)
|
|
{
|
|
if(luaInstance.scriptName == cervix)
|
|
{
|
|
luaInstance.set(global, val);
|
|
}
|
|
|
|
}
|
|
}
|
|
});
|
|
/*Lua_helper.add_callback(lua, "getGlobals", function(luaFile:String){ // returns a copy of the specified file's globals
|
|
var cervix = luaFile + ".lua";
|
|
if(luaFile.endsWith(".lua"))cervix=luaFile;
|
|
var doPush = false;
|
|
#if MODS_ALLOWED
|
|
if(FileSystem.exists(Paths.modFolders(cervix)))
|
|
{
|
|
cervix = Paths.modFolders(cervix);
|
|
doPush = true;
|
|
}
|
|
else if(FileSystem.exists(cervix))
|
|
{
|
|
doPush = true;
|
|
}
|
|
else {
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(FileSystem.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
}
|
|
#else
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(Assets.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
#end
|
|
if(doPush)
|
|
{
|
|
for (luaInstance in PlayState.instance.luaArray)
|
|
{
|
|
if(luaInstance.scriptName == cervix)
|
|
{
|
|
Lua.newtable(lua);
|
|
var tableIdx = Lua.gettop(lua);
|
|
|
|
Lua.pushvalue(luaInstance.lua, Lua.LUA_GLOBALSINDEX);
|
|
while(Lua.next(luaInstance.lua, -2) != 0) {
|
|
// key = -2
|
|
// value = -1
|
|
|
|
var pop:Int = 0;
|
|
|
|
// Manual conversion
|
|
// first we convert the key
|
|
if(Lua.isnumber(luaInstance.lua,-2)){
|
|
Lua.pushnumber(lua, Lua.tonumber(luaInstance.lua, -2));
|
|
pop++;
|
|
}else if(Lua.isstring(luaInstance.lua,-2)){
|
|
Lua.pushstring(lua, Lua.tostring(luaInstance.lua, -2));
|
|
pop++;
|
|
}else if(Lua.isboolean(luaInstance.lua,-2)){
|
|
Lua.pushboolean(lua, Lua.toboolean(luaInstance.lua, -2));
|
|
pop++;
|
|
}
|
|
// TODO: table
|
|
|
|
|
|
// then the value
|
|
if(Lua.isnumber(luaInstance.lua,-1)){
|
|
Lua.pushnumber(lua, Lua.tonumber(luaInstance.lua, -1));
|
|
pop++;
|
|
}else if(Lua.isstring(luaInstance.lua,-1)){
|
|
Lua.pushstring(lua, Lua.tostring(luaInstance.lua, -1));
|
|
pop++;
|
|
}else if(Lua.isboolean(luaInstance.lua,-1)){
|
|
Lua.pushboolean(lua, Lua.toboolean(luaInstance.lua, -1));
|
|
pop++;
|
|
}
|
|
// TODO: table
|
|
|
|
if(pop==2)Lua.rawset(lua, tableIdx); // then set it
|
|
Lua.pop(luaInstance.lua, 1); // for the loop
|
|
}
|
|
Lua.pop(luaInstance.lua,1); // end the loop entirely
|
|
Lua.pushvalue(lua, tableIdx); // push the table onto the stack so it gets returned
|
|
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
});*/
|
|
Lua_helper.add_callback(lua, "isRunning", function(luaFile:String){
|
|
var cervix = luaFile + ".lua";
|
|
if(luaFile.endsWith(".lua"))cervix=luaFile;
|
|
var doPush = false;
|
|
#if MODS_ALLOWED
|
|
if(FileSystem.exists(Paths.modFolders(cervix)))
|
|
{
|
|
cervix = Paths.modFolders(cervix);
|
|
doPush = true;
|
|
}
|
|
else if(FileSystem.exists(cervix))
|
|
{
|
|
doPush = true;
|
|
}
|
|
else {
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(FileSystem.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
}
|
|
#else
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(Assets.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
#end
|
|
|
|
if(doPush)
|
|
{
|
|
for (luaInstance in PlayState.instance.luaArray)
|
|
{
|
|
if(luaInstance.scriptName == cervix)
|
|
return true;
|
|
|
|
}
|
|
}
|
|
return false;
|
|
});
|
|
|
|
|
|
Lua_helper.add_callback(lua, "addLuaScript", function(luaFile:String, ?ignoreAlreadyRunning:Bool = false) { //would be dope asf.
|
|
var cervix = luaFile + ".lua";
|
|
if(luaFile.endsWith(".lua"))cervix=luaFile;
|
|
var doPush = false;
|
|
#if MODS_ALLOWED
|
|
if(FileSystem.exists(Paths.modFolders(cervix)))
|
|
{
|
|
cervix = Paths.modFolders(cervix);
|
|
doPush = true;
|
|
}
|
|
else if(FileSystem.exists(cervix))
|
|
{
|
|
doPush = true;
|
|
}
|
|
else {
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(FileSystem.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
}
|
|
#else
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(Assets.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
#end
|
|
|
|
if(doPush)
|
|
{
|
|
if(!ignoreAlreadyRunning)
|
|
{
|
|
for (luaInstance in PlayState.instance.luaArray)
|
|
{
|
|
if(luaInstance.scriptName == cervix)
|
|
{
|
|
luaTrace('addLuaScript | The script "' + cervix + '" is already running!');
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
PlayState.instance.luaArray.push(new FunkinLua(cervix));
|
|
return;
|
|
}
|
|
luaTrace("addLuaScript | Script doesn't exist!", false, false, FlxColor.RED);
|
|
});
|
|
Lua_helper.add_callback(lua, "removeLuaScript", function(luaFile:String, ?ignoreAlreadyRunning:Bool = false) { //would be dope asf.
|
|
var cervix = luaFile + ".lua";
|
|
if(luaFile.endsWith(".lua"))cervix=luaFile;
|
|
var doPush = false;
|
|
#if MODS_ALLOWED
|
|
if(FileSystem.exists(Paths.modFolders(cervix)))
|
|
{
|
|
cervix = Paths.modFolders(cervix);
|
|
doPush = true;
|
|
}
|
|
else if(FileSystem.exists(cervix))
|
|
{
|
|
doPush = true;
|
|
}
|
|
else {
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(FileSystem.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
}
|
|
#else
|
|
cervix = Paths.getPreloadPath(cervix);
|
|
if(Assets.exists(cervix)) {
|
|
doPush = true;
|
|
}
|
|
#end
|
|
|
|
if(doPush)
|
|
{
|
|
if(!ignoreAlreadyRunning)
|
|
{
|
|
for (luaInstance in PlayState.instance.luaArray)
|
|
{
|
|
if(luaInstance.scriptName == cervix)
|
|
{
|
|
//luaTrace('The script "' + cervix + '" is already running!');
|
|
|
|
PlayState.instance.luaArray.remove(luaInstance);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
luaTrace("removeLuaScript | Script doesn't exist!", false, false, FlxColor.RED);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "runHaxeCode", function(codeToRun:String) {
|
|
var retVal:Dynamic = null;
|
|
|
|
#if hscript
|
|
initHaxeModule();
|
|
try {
|
|
retVal = hscript.execute(codeToRun);
|
|
}
|
|
catch (e:Dynamic) {
|
|
luaTrace(scriptName + ":" + lastCalledFunction + " - " + e, false, false, FlxColor.RED);
|
|
}
|
|
#else
|
|
luaTrace("runHaxeCode: HScript isn't supported on this platform!", false, false, FlxColor.RED);
|
|
#end
|
|
|
|
if(retVal != null && !isOfTypes(retVal, [Bool, Int, Float, String, Array])) retVal = null;
|
|
return retVal;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "addHaxeLibrary", function(libName:String, ?libPackage:String = '') {
|
|
#if hscript
|
|
initHaxeModule();
|
|
try {
|
|
var str:String = '';
|
|
if(libPackage.length > 0)
|
|
str = libPackage + '.';
|
|
|
|
hscript.variables.set(libName, Type.resolveClass(str + libName));
|
|
}
|
|
catch (e:Dynamic) {
|
|
luaTrace(scriptName + ":" + lastCalledFunction + " - " + e, false, false, FlxColor.RED);
|
|
}
|
|
#end
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "loadSong", function(?name:String = null, ?difficultyNum:Int = -1) {
|
|
if(name == null || name.length < 1)
|
|
name = PlayState.SONG.song;
|
|
if (difficultyNum == -1)
|
|
difficultyNum = PlayState.storyDifficulty;
|
|
|
|
var poop = Highscore.formatSong(name, difficultyNum);
|
|
PlayState.SONG = Song.loadFromJson(poop, name);
|
|
PlayState.storyDifficulty = difficultyNum;
|
|
PlayState.instance.persistentUpdate = false;
|
|
LoadingState.loadAndSwitchState(PlayState.new);
|
|
|
|
FlxG.sound.music.pause();
|
|
FlxG.sound.music.volume = 0;
|
|
if(PlayState.instance.vocals != null)
|
|
{
|
|
PlayState.instance.vocals.pause();
|
|
PlayState.instance.vocals.volume = 0;
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "loadGraphic", function(variable:String, image:String, ?gridX:Int = 0, ?gridY:Int = 0) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
var spr:FlxSprite = getObjectDirectly(killMe[0]);
|
|
var animated = gridX != 0 || gridY != 0;
|
|
|
|
if(killMe.length > 1) {
|
|
spr = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(spr != null && image != null && image.length > 0)
|
|
{
|
|
spr.loadGraphic(Paths.image(image), animated, gridX, gridY);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "loadFrames", function(variable:String, image:String, spriteType:String = "sparrow") {
|
|
var killMe:Array<String> = variable.split('.');
|
|
var spr:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
spr = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(spr != null && image != null && image.length > 0)
|
|
{
|
|
loadFrames(spr, image, spriteType);
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "getProperty", function(variable:String) {
|
|
var result:Dynamic = null;
|
|
var killMe:Array<String> = variable.split('.');
|
|
if(killMe.length > 1)
|
|
result = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
else
|
|
result = getVarInArray(getInstance(), variable);
|
|
return result;
|
|
});
|
|
Lua_helper.add_callback(lua, "setProperty", function(variable:String, value:Dynamic) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
if(killMe.length > 1) {
|
|
setVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1], value);
|
|
return true;
|
|
}
|
|
setVarInArray(getInstance(), variable, value);
|
|
return true;
|
|
});
|
|
Lua_helper.add_callback(lua, "getPropertyFromGroup", function(obj:String, index:Int, variable:Dynamic) {
|
|
var shitMyPants:Array<String> = obj.split('.');
|
|
var realObject:Dynamic = Reflect.getProperty(getInstance(), obj);
|
|
if(shitMyPants.length>1)
|
|
realObject = getPropertyLoopThingWhatever(shitMyPants, true, false);
|
|
|
|
|
|
if(Std.isOfType(realObject, FlxTypedGroup))
|
|
{
|
|
var result:Dynamic = getGroupStuff(realObject.members[index], variable);
|
|
return result;
|
|
}
|
|
|
|
|
|
var leArray:Dynamic = realObject[index];
|
|
if(leArray != null) {
|
|
var result:Dynamic = null;
|
|
if(Type.typeof(variable) == ValueType.TInt)
|
|
result = leArray[variable];
|
|
else
|
|
result = getGroupStuff(leArray, variable);
|
|
return result;
|
|
}
|
|
luaTrace("getPropertyFromGroup | Object #" + index + " from group: " + obj + " doesn't exist!", false, false, FlxColor.RED);
|
|
return null;
|
|
});
|
|
Lua_helper.add_callback(lua, "setPropertyFromGroup", function(obj:String, index:Int, variable:Dynamic, value:Dynamic) {
|
|
var shitMyPants:Array<String> = obj.split('.');
|
|
var realObject:Dynamic = Reflect.getProperty(getInstance(), obj);
|
|
if(shitMyPants.length>1)
|
|
realObject = getPropertyLoopThingWhatever(shitMyPants, true, false);
|
|
|
|
if(Std.isOfType(realObject, FlxTypedGroup)) {
|
|
setGroupStuff(realObject.members[index], variable, value);
|
|
return;
|
|
}
|
|
|
|
var leArray:Dynamic = realObject[index];
|
|
if(leArray != null) {
|
|
if(Type.typeof(variable) == ValueType.TInt) {
|
|
leArray[variable] = value;
|
|
return;
|
|
}
|
|
setGroupStuff(leArray, variable, value);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "removeFromGroup", function(obj:String, index:Int, dontDestroy:Bool = false) {
|
|
if(Std.isOfType(Reflect.getProperty(getInstance(), obj), FlxTypedGroup)) {
|
|
var sex = Reflect.getProperty(getInstance(), obj).members[index];
|
|
if(!dontDestroy)
|
|
sex.kill();
|
|
Reflect.getProperty(getInstance(), obj).remove(sex, true);
|
|
if(!dontDestroy)
|
|
sex.destroy();
|
|
return;
|
|
}
|
|
Reflect.getProperty(getInstance(), obj).remove(Reflect.getProperty(getInstance(), obj)[index]);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "getPropertyFromClass", function(classVar:String, variable:String) {
|
|
@:privateAccess
|
|
var killMe:Array<String> = variable.split('.');
|
|
if(killMe.length > 1) {
|
|
var coverMeInPiss:Dynamic = getVarInArray(Type.resolveClass(classVar), killMe[0]);
|
|
for (i in 1...killMe.length-1) {
|
|
coverMeInPiss = getVarInArray(coverMeInPiss, killMe[i]);
|
|
}
|
|
return getVarInArray(coverMeInPiss, killMe[killMe.length-1]);
|
|
}
|
|
return getVarInArray(Type.resolveClass(classVar), variable);
|
|
});
|
|
Lua_helper.add_callback(lua, "setPropertyFromClass", function(classVar:String, variable:String, value:Dynamic) {
|
|
@:privateAccess
|
|
var killMe:Array<String> = variable.split('.');
|
|
if(killMe.length > 1) {
|
|
var coverMeInPiss:Dynamic = getVarInArray(Type.resolveClass(classVar), killMe[0]);
|
|
for (i in 1...killMe.length-1) {
|
|
coverMeInPiss = getVarInArray(coverMeInPiss, killMe[i]);
|
|
}
|
|
setVarInArray(coverMeInPiss, killMe[killMe.length-1], value);
|
|
return true;
|
|
}
|
|
setVarInArray(Type.resolveClass(classVar), variable, value);
|
|
return true;
|
|
});
|
|
|
|
//shitass stuff for epic coders like me B) *image of obama giving himself a medal*
|
|
Lua_helper.add_callback(lua, "getObjectOrder", function(obj:String) {
|
|
var killMe:Array<String> = obj.split('.');
|
|
var leObj:FlxBasic = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
leObj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(leObj != null)
|
|
{
|
|
return getInstance().members.indexOf(leObj);
|
|
}
|
|
luaTrace("getObjectOrder | Object " + obj + " doesn't exist!", false, false, FlxColor.RED);
|
|
return -1;
|
|
});
|
|
Lua_helper.add_callback(lua, "setObjectOrder", function(obj:String, position:Int) {
|
|
var killMe:Array<String> = obj.split('.');
|
|
var leObj:FlxBasic = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
leObj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(leObj != null) {
|
|
getInstance().remove(leObj, true);
|
|
getInstance().insert(position, leObj);
|
|
return;
|
|
}
|
|
luaTrace("setObjectOrder | Object " + obj + " doesn't exist!", false, false, FlxColor.RED);
|
|
});
|
|
|
|
// gay ass tweens
|
|
Lua_helper.add_callback(lua, "doTweenX", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) {
|
|
var penisExam:Dynamic = tweenShit(tag, vars);
|
|
if(penisExam != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(penisExam, {x: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
} else {
|
|
luaTrace('doTweenX | Couldnt find object: ' + vars, false, false, FlxColor.RED);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "doTweenScale", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) {
|
|
var penisExam:Dynamic = tweenShit(tag, vars);
|
|
if(penisExam != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(penisExam, {"scale.x": value,"scale.y": value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
} else {
|
|
luaTrace('doTweenScale | Couldnt find object: ' + vars, false, false, FlxColor.RED);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "doTweenY", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) {
|
|
var penisExam:Dynamic = tweenShit(tag, vars);
|
|
if(penisExam != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(penisExam, {y: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
} else {
|
|
luaTrace('doTweenY | Couldnt find object: ' + vars, false, false, FlxColor.RED);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "doTweenAngle", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) {
|
|
var penisExam:Dynamic = tweenShit(tag, vars);
|
|
if(penisExam != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(penisExam, {angle: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
} else {
|
|
luaTrace('doTweenAngle | Couldnt find object: ' + vars, false, false, FlxColor.RED);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "doTweenAlpha", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) {
|
|
var penisExam:Dynamic = tweenShit(tag, vars);
|
|
if(penisExam != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(penisExam, {alpha: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
} else {
|
|
luaTrace('doTweenAlpha | Couldnt find object: ' + vars, false, false, FlxColor.RED);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "doTweenZoom", function(tag:String, vars:String, value:Dynamic, duration:Float, ease:String) {
|
|
var penisExam:Dynamic = tweenShit(tag, vars);
|
|
if(penisExam != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(penisExam, {zoom: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
} else {
|
|
luaTrace('doTweenZoom | Couldnt find object: ' + vars, false, false, FlxColor.RED);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "doTweenColor", function(tag:String, vars:String, targetColor:String, duration:Float, ease:String) {
|
|
var penisExam:Dynamic = tweenShit(tag, vars);
|
|
if(penisExam != null) {
|
|
var color:Int = Std.parseInt(targetColor);
|
|
if(!targetColor.startsWith('0x')) color = Std.parseInt('0xff' + targetColor);
|
|
|
|
var curColor:FlxColor = penisExam.color;
|
|
curColor.alphaFloat = penisExam.alpha;
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.color(penisExam, duration / PlayState.instance.playbackRate, curColor, color, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
}
|
|
}));
|
|
} else {
|
|
luaTrace('doTweenColor | Couldnt find object: ' + vars, false, false, FlxColor.RED);
|
|
}
|
|
});
|
|
|
|
//Tween shit, but for strums
|
|
Lua_helper.add_callback(lua, "noteTweenX", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) {
|
|
cancelTween(tag);
|
|
if(note < 0) note = 0;
|
|
var testicle:StrumNote = PlayState.instance.strumLineNotes.members[note % PlayState.instance.strumLineNotes.length];
|
|
|
|
if(testicle != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(testicle, {x: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "noteTweenY", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) {
|
|
cancelTween(tag);
|
|
if(note < 0) note = 0;
|
|
var testicle:StrumNote = PlayState.instance.strumLineNotes.members[note % PlayState.instance.strumLineNotes.length];
|
|
|
|
if(testicle != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(testicle, {y: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "noteTweenAngle", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) {
|
|
cancelTween(tag);
|
|
if(note < 0) note = 0;
|
|
var testicle:StrumNote = PlayState.instance.strumLineNotes.members[note % PlayState.instance.strumLineNotes.length];
|
|
|
|
if(testicle != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(testicle, {angle: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "noteTweenDirection", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) {
|
|
cancelTween(tag);
|
|
if(note < 0) note = 0;
|
|
var testicle:StrumNote = PlayState.instance.strumLineNotes.members[note % PlayState.instance.strumLineNotes.length];
|
|
|
|
if(testicle != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(testicle, {direction: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "mouseClicked", function(button:String) {
|
|
var boobs = FlxG.mouse.justPressed;
|
|
switch(button){
|
|
case 'middle':
|
|
boobs = FlxG.mouse.justPressedMiddle;
|
|
case 'right':
|
|
boobs = FlxG.mouse.justPressedRight;
|
|
}
|
|
|
|
|
|
return boobs;
|
|
});
|
|
Lua_helper.add_callback(lua, "mousePressed", function(button:String) {
|
|
var boobs = FlxG.mouse.pressed;
|
|
switch(button){
|
|
case 'middle':
|
|
boobs = FlxG.mouse.pressedMiddle;
|
|
case 'right':
|
|
boobs = FlxG.mouse.pressedRight;
|
|
}
|
|
return boobs;
|
|
});
|
|
Lua_helper.add_callback(lua, "mouseReleased", function(button:String) {
|
|
var boobs = FlxG.mouse.justReleased;
|
|
switch(button){
|
|
case 'middle':
|
|
boobs = FlxG.mouse.justReleasedMiddle;
|
|
case 'right':
|
|
boobs = FlxG.mouse.justReleasedRight;
|
|
}
|
|
return boobs;
|
|
});
|
|
Lua_helper.add_callback(lua, "noteTweenAngle", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) {
|
|
cancelTween(tag);
|
|
if(note < 0) note = 0;
|
|
var testicle:StrumNote = PlayState.instance.strumLineNotes.members[note % PlayState.instance.strumLineNotes.length];
|
|
|
|
if(testicle != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(testicle, {angle: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "noteTweenAlpha", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) {
|
|
cancelTween(tag);
|
|
if(note < 0) note = 0;
|
|
var testicle:StrumNote = PlayState.instance.strumLineNotes.members[note % PlayState.instance.strumLineNotes.length];
|
|
|
|
if(testicle != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(testicle, {alpha: value}, duration / PlayState.instance.playbackRate, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "noteTweenScaleX", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) {
|
|
cancelTween(tag);
|
|
if(note < 0) note = 0;
|
|
var testicle:StrumNote = PlayState.instance.strumLineNotes.members[note % PlayState.instance.strumLineNotes.length];
|
|
|
|
if(testicle != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(testicle, {"scale.x": value - 0.3}, duration, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "noteTweenScaleY", function(tag:String, note:Int, value:Dynamic, duration:Float, ease:String) {
|
|
cancelTween(tag);
|
|
if(note < 0) note = 0;
|
|
var testicle:StrumNote = PlayState.instance.strumLineNotes.members[note % PlayState.instance.strumLineNotes.length];
|
|
|
|
if(testicle != null) {
|
|
PlayState.instance.modchartTweens.set(tag, FlxTween.tween(testicle, {"scale.y": value - 0.3}, duration, {ease: getFlxEaseByString(ease),
|
|
onComplete: function(twn:FlxTween) {
|
|
PlayState.instance.callOnLuas('onTweenCompleted', [tag]);
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}));
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "cancelTween", function(tag:String) {
|
|
cancelTween(tag);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "runTimer", function(tag:String, time:Float = 1, loops:Int = 1) {
|
|
cancelTimer(tag);
|
|
PlayState.instance.modchartTimers.set(tag, new FlxTimer().start(time, function(tmr:FlxTimer) {
|
|
if(tmr.finished) {
|
|
PlayState.instance.modchartTimers.remove(tag);
|
|
}
|
|
PlayState.instance.callOnLuas('onTimerCompleted', [tag, tmr.loops, tmr.loopsLeft]);
|
|
//trace('Timer Completed: ' + tag);
|
|
}, loops));
|
|
});
|
|
Lua_helper.add_callback(lua, "cancelTimer", function(tag:String) {
|
|
cancelTimer(tag);
|
|
});
|
|
|
|
/*Lua_helper.add_callback(lua, "getPropertyAdvanced", function(varsStr:String) {
|
|
var variables:Array<String> = varsStr.replace(' ', '').split(',');
|
|
var leClass:Class<Dynamic> = Type.resolveClass(variables[0]);
|
|
if(variables.length > 2) {
|
|
var curProp:Dynamic = Reflect.getProperty(leClass, variables[1]);
|
|
if(variables.length > 3) {
|
|
for (i in 2...variables.length-1) {
|
|
curProp = Reflect.getProperty(curProp, variables[i]);
|
|
}
|
|
}
|
|
return Reflect.getProperty(curProp, variables[variables.length-1]);
|
|
} else if(variables.length == 2) {
|
|
return Reflect.getProperty(leClass, variables[variables.length-1]);
|
|
}
|
|
return null;
|
|
});
|
|
Lua_helper.add_callback(lua, "setPropertyAdvanced", function(varsStr:String, value:Dynamic) {
|
|
var variables:Array<String> = varsStr.replace(' ', '').split(',');
|
|
var leClass:Class<Dynamic> = Type.resolveClass(variables[0]);
|
|
if(variables.length > 2) {
|
|
var curProp:Dynamic = Reflect.getProperty(leClass, variables[1]);
|
|
if(variables.length > 3) {
|
|
for (i in 2...variables.length-1) {
|
|
curProp = Reflect.getProperty(curProp, variables[i]);
|
|
}
|
|
}
|
|
return Reflect.setProperty(curProp, variables[variables.length-1], value);
|
|
} else if(variables.length == 2) {
|
|
return Reflect.setProperty(leClass, variables[variables.length-1], value);
|
|
}
|
|
});*/
|
|
|
|
//stupid bietch ass functions
|
|
Lua_helper.add_callback(lua, "addScore", function(value:Float = 0) {
|
|
PlayState.instance.songScore += value;
|
|
PlayState.instance.RecalculateRating();
|
|
});
|
|
Lua_helper.add_callback(lua, "addMisses", function(value:Int = 0) {
|
|
PlayState.instance.songMisses += value;
|
|
PlayState.instance.RecalculateRating();
|
|
});
|
|
Lua_helper.add_callback(lua, "addHits", function(value:Int = 0) {
|
|
PlayState.instance.songHits += value;
|
|
PlayState.instance.RecalculateRating();
|
|
});
|
|
Lua_helper.add_callback(lua, "addCombo", function(value:Int = 0) {
|
|
PlayState.instance.combo += value;
|
|
PlayState.instance.RecalculateRating();
|
|
});
|
|
Lua_helper.add_callback(lua, "addNPS", function(value:Int = 0) {
|
|
PlayState.instance.nps += value;
|
|
});
|
|
Lua_helper.add_callback(lua, "setScore", function(value:Float = 0) {
|
|
var newScore:Float = value;
|
|
PlayState.instance.songScore = newScore;
|
|
PlayState.instance.RecalculateRating();
|
|
});
|
|
Lua_helper.add_callback(lua, "setMisses", function(value:Int = 0) {
|
|
PlayState.instance.songMisses = value;
|
|
PlayState.instance.RecalculateRating();
|
|
});
|
|
Lua_helper.add_callback(lua, "setHits", function(value:Int = 0) {
|
|
PlayState.instance.songHits = value;
|
|
PlayState.instance.RecalculateRating();
|
|
});
|
|
Lua_helper.add_callback(lua, "getScore", function() {
|
|
return PlayState.instance.songScore;
|
|
});
|
|
Lua_helper.add_callback(lua, "getMisses", function() {
|
|
return PlayState.instance.songMisses;
|
|
});
|
|
Lua_helper.add_callback(lua, "getHits", function() {
|
|
return PlayState.instance.songHits;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "setHealth", function(value:Float = 0) {
|
|
PlayState.instance.health = value;
|
|
});
|
|
Lua_helper.add_callback(lua, "addHealth", function(value:Float = 0) {
|
|
PlayState.instance.health += value;
|
|
});
|
|
Lua_helper.add_callback(lua, "addPlaybackSpeed", function(value:Float = 0) {
|
|
PlayState.instance.playbackRate += value;
|
|
});
|
|
Lua_helper.add_callback(lua, "getHealth", function() {
|
|
return PlayState.instance.health;
|
|
});
|
|
Lua_helper.add_callback(lua, "getPlaybackSpeed", function() {
|
|
return PlayState.instance.playbackRate;
|
|
});
|
|
Lua_helper.add_callback(lua, "setPlaybackSpeed", function(value:Float = 0) {
|
|
PlayState.instance.playbackRate = value;
|
|
});
|
|
Lua_helper.add_callback(lua, "changeMaxHealth", function(value:Float = 0) {
|
|
{
|
|
var bar = PlayState.instance.healthBar;
|
|
PlayState.instance.maxHealth = value;
|
|
bar.setRange(0, value);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "getMaxHealth", function() {
|
|
return PlayState.instance.maxHealth;
|
|
});
|
|
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, "keyboardJustPressed", function(name:String)
|
|
{
|
|
return Reflect.getProperty(FlxG.keys.justPressed, name);
|
|
});
|
|
Lua_helper.add_callback(lua, "keyboardPressed", function(name:String)
|
|
{
|
|
return Reflect.getProperty(FlxG.keys.pressed, name);
|
|
});
|
|
Lua_helper.add_callback(lua, "keyboardReleased", function(name:String)
|
|
{
|
|
return Reflect.getProperty(FlxG.keys.justReleased, name);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "anyGamepadJustPressed", function(name:String)
|
|
{
|
|
return FlxG.gamepads.anyJustPressed(name);
|
|
});
|
|
Lua_helper.add_callback(lua, "anyGamepadPressed", function(name:String)
|
|
{
|
|
return FlxG.gamepads.anyPressed(name);
|
|
});
|
|
Lua_helper.add_callback(lua, "anyGamepadReleased", function(name:String)
|
|
{
|
|
return FlxG.gamepads.anyJustReleased(name);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "gamepadAnalogX", function(id:Int, ?leftStick:Bool = true)
|
|
{
|
|
var controller = FlxG.gamepads.getByID(id);
|
|
if (controller == null)
|
|
{
|
|
return 0.0;
|
|
}
|
|
return controller.getXAxis(leftStick ? LEFT_ANALOG_STICK : RIGHT_ANALOG_STICK);
|
|
});
|
|
Lua_helper.add_callback(lua, "gamepadAnalogY", function(id:Int, ?leftStick:Bool = true)
|
|
{
|
|
var controller = FlxG.gamepads.getByID(id);
|
|
if (controller == null)
|
|
{
|
|
return 0.0;
|
|
}
|
|
return controller.getYAxis(leftStick ? LEFT_ANALOG_STICK : RIGHT_ANALOG_STICK);
|
|
});
|
|
Lua_helper.add_callback(lua, "gamepadJustPressed", function(id:Int, name:String)
|
|
{
|
|
var controller = FlxG.gamepads.getByID(id);
|
|
if (controller == null)
|
|
{
|
|
return false;
|
|
}
|
|
return Reflect.getProperty(controller.justPressed, name) == true;
|
|
});
|
|
Lua_helper.add_callback(lua, "gamepadPressed", function(id:Int, name:String)
|
|
{
|
|
var controller = FlxG.gamepads.getByID(id);
|
|
if (controller == null)
|
|
{
|
|
return false;
|
|
}
|
|
return Reflect.getProperty(controller.pressed, name) == true;
|
|
});
|
|
Lua_helper.add_callback(lua, "gamepadReleased", function(id:Int, name:String)
|
|
{
|
|
var controller = FlxG.gamepads.getByID(id);
|
|
if (controller == null)
|
|
{
|
|
return false;
|
|
}
|
|
return Reflect.getProperty(controller.justReleased, name) == true;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "keyJustPressed", function(name:String) {
|
|
var key:Bool = false;
|
|
switch(name) {
|
|
case 'left': key = PlayState.instance.getControl('NOTE_LEFT_P');
|
|
case 'down': key = PlayState.instance.getControl('NOTE_DOWN_P');
|
|
case 'up': key = PlayState.instance.getControl('NOTE_UP_P');
|
|
case 'right': key = PlayState.instance.getControl('NOTE_RIGHT_P');
|
|
case 'accept': key = PlayState.instance.getControl('ACCEPT');
|
|
case 'back': key = PlayState.instance.getControl('BACK');
|
|
case 'pause': key = PlayState.instance.getControl('PAUSE');
|
|
case 'reset': key = PlayState.instance.getControl('RESET');
|
|
case 'space': key = FlxG.keys.justPressed.SPACE;//an extra key for convinience
|
|
}
|
|
return key;
|
|
});
|
|
Lua_helper.add_callback(lua, "keyPressed", function(name:String) {
|
|
var key:Bool = false;
|
|
switch(name) {
|
|
case 'left': key = PlayState.instance.getControl('NOTE_LEFT');
|
|
case 'down': key = PlayState.instance.getControl('NOTE_DOWN');
|
|
case 'up': key = PlayState.instance.getControl('NOTE_UP');
|
|
case 'right': key = PlayState.instance.getControl('NOTE_RIGHT');
|
|
case 'space': key = FlxG.keys.pressed.SPACE;//an extra key for convinience
|
|
}
|
|
return key;
|
|
});
|
|
Lua_helper.add_callback(lua, "keyReleased", function(name:String) {
|
|
var key:Bool = false;
|
|
switch(name) {
|
|
case 'left': key = PlayState.instance.getControl('NOTE_LEFT_R');
|
|
case 'down': key = PlayState.instance.getControl('NOTE_DOWN_R');
|
|
case 'up': key = PlayState.instance.getControl('NOTE_UP_R');
|
|
case 'right': key = PlayState.instance.getControl('NOTE_RIGHT_R');
|
|
case 'space': key = FlxG.keys.justReleased.SPACE;//an extra key for convinience
|
|
}
|
|
return key;
|
|
});
|
|
Lua_helper.add_callback(lua, "addCharacterToList", function(name:String, type:String) {
|
|
var charType:Int = 0;
|
|
switch(type.toLowerCase()) {
|
|
case 'dad': charType = 1;
|
|
case 'gf' | 'girlfriend': charType = 2;
|
|
}
|
|
PlayState.instance.addCharacterToList(name, charType);
|
|
});
|
|
Lua_helper.add_callback(lua, "precacheImage", function(name:String) {
|
|
Paths.image(name);
|
|
});
|
|
Lua_helper.add_callback(lua, "precacheSound", function(name:String) {
|
|
Paths.sound(name);
|
|
});
|
|
Lua_helper.add_callback(lua, "precacheMusic", function(name:String) {
|
|
Paths.music(name);
|
|
});
|
|
Lua_helper.add_callback(lua, "triggerEvent", function(name:String, arg1:Dynamic, arg2:Dynamic, strumTime:Float) {
|
|
var value1:String = arg1;
|
|
var value2:String = arg2;
|
|
PlayState.instance.triggerEventNote(name, value1, value2, strumTime);
|
|
//trace('Triggered event: ' + name + ', ' + value1 + ', ' + value2);
|
|
return true;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "startCountdown", function() {
|
|
PlayState.instance.startCountdown();
|
|
return true;
|
|
});
|
|
Lua_helper.add_callback(lua, "endSong", function() {
|
|
PlayState.instance.KillNotes();
|
|
PlayState.instance.endSong();
|
|
return true;
|
|
});
|
|
Lua_helper.add_callback(lua, "restartSong", function(?skipTransition:Bool = false) {
|
|
PlayState.instance.persistentUpdate = false;
|
|
PauseSubState.restartSong(skipTransition);
|
|
return true;
|
|
});
|
|
Lua_helper.add_callback(lua, "exitSong", function(?skipTransition:Bool = false) {
|
|
if(skipTransition)
|
|
{
|
|
FlxTransitionableState.skipNextTransIn = true;
|
|
FlxTransitionableState.skipNextTransOut = true;
|
|
}
|
|
|
|
if(FlxG.sound.music != null) FlxG.sound.music.stop();
|
|
|
|
if(PlayState.isStoryMode)
|
|
FlxG.switchState(StoryMenuState.new);
|
|
else
|
|
FlxG.switchState(FreeplayState.new);
|
|
|
|
FlxG.sound.playMusic(Paths.music('freakyMenu'));
|
|
PlayState.changedDifficulty = false;
|
|
PlayState.chartingMode = false;
|
|
PlayState.instance.transitioning = true;
|
|
WeekData.loadTheFirstEnabledMod();
|
|
return true;
|
|
});
|
|
Lua_helper.add_callback(lua, "getSongPosition", function() {
|
|
return Conductor.songPosition;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "getCharacterX", function(type:String) {
|
|
switch(type.toLowerCase()) {
|
|
case 'dad' | 'opponent':
|
|
return PlayState.instance.dadGroup.x;
|
|
case 'gf' | 'girlfriend':
|
|
return PlayState.instance.gfGroup.x;
|
|
default:
|
|
return PlayState.instance.boyfriendGroup.x;
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "setCharacterX", function(type:String, value:Float) {
|
|
switch(type.toLowerCase()) {
|
|
case 'dad' | 'opponent':
|
|
PlayState.instance.dadGroup.x = value;
|
|
case 'gf' | 'girlfriend':
|
|
PlayState.instance.gfGroup.x = value;
|
|
default:
|
|
PlayState.instance.boyfriendGroup.x = value;
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "getCharacterY", function(type:String) {
|
|
switch(type.toLowerCase()) {
|
|
case 'dad' | 'opponent':
|
|
return PlayState.instance.dadGroup.y;
|
|
case 'gf' | 'girlfriend':
|
|
return PlayState.instance.gfGroup.y;
|
|
default:
|
|
return PlayState.instance.boyfriendGroup.y;
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "setCharacterY", function(type:String, value:Float) {
|
|
switch(type.toLowerCase()) {
|
|
case 'dad' | 'opponent':
|
|
PlayState.instance.dadGroup.y = value;
|
|
case 'gf' | 'girlfriend':
|
|
PlayState.instance.gfGroup.y = value;
|
|
default:
|
|
PlayState.instance.boyfriendGroup.y = value;
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "cameraSetTarget", function(target:String) {
|
|
var isDad:Bool = false;
|
|
if(target == 'dad') {
|
|
isDad = true;
|
|
}
|
|
PlayState.instance.moveCamera(isDad);
|
|
return isDad;
|
|
});
|
|
Lua_helper.add_callback(lua, "cameraShake", function(camera:String, intensity:Float, duration:Float) {
|
|
cameraFromString(camera).shake(intensity, duration / PlayState.instance.playbackRate);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "cameraFlash", function(camera:String, color:String, duration:Float,forced:Bool) {
|
|
var colorNum:Int = Std.parseInt(color);
|
|
if(!color.startsWith('0x')) colorNum = Std.parseInt('0xff' + color);
|
|
cameraFromString(camera).flash(colorNum, duration / PlayState.instance.playbackRate,null,forced);
|
|
});
|
|
Lua_helper.add_callback(lua, "cameraFade", function(camera:String, color:String, duration:Float, forced:Bool, ?fadeOut:Bool = false) {
|
|
var colorNum:Int = Std.parseInt(color);
|
|
if(!color.startsWith('0x')) colorNum = Std.parseInt('0xff' + color);
|
|
cameraFromString(camera).fade(colorNum, duration / PlayState.instance.playbackRate, fadeOut, null, forced);
|
|
});
|
|
Lua_helper.add_callback(lua, "setRatingPercent", function(value:Float) {
|
|
PlayState.instance.ratingPercent = value;
|
|
});
|
|
Lua_helper.add_callback(lua, "setRatingName", function(value:String) {
|
|
PlayState.instance.ratingName = value;
|
|
});
|
|
Lua_helper.add_callback(lua, "setRatingFC", function(value:String) {
|
|
PlayState.instance.ratingFC = value;
|
|
});
|
|
Lua_helper.add_callback(lua, "getMouseX", function(camera:String) {
|
|
var cam:FlxCamera = cameraFromString(camera);
|
|
return FlxG.mouse.getScreenPosition(cam).x;
|
|
});
|
|
Lua_helper.add_callback(lua, "getMouseY", function(camera:String) {
|
|
var cam:FlxCamera = cameraFromString(camera);
|
|
return FlxG.mouse.getScreenPosition(cam).y;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "getMidpointX", function(variable:String) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
var obj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
obj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
if(obj != null) return obj.getMidpoint().x;
|
|
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "getMidpointY", function(variable:String) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
var obj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
obj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
if(obj != null) return obj.getMidpoint().y;
|
|
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "getGraphicMidpointX", function(variable:String) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
var obj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
obj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
if(obj != null) return obj.getGraphicMidpoint().x;
|
|
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "getGraphicMidpointY", function(variable:String) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
var obj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
obj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
if(obj != null) return obj.getGraphicMidpoint().y;
|
|
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "getScreenPositionX", function(variable:String) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
var obj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
obj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
if(obj != null) return obj.getScreenPosition().x;
|
|
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "getScreenPositionY", function(variable:String) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
var obj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
obj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
if(obj != null) return obj.getScreenPosition().y;
|
|
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "characterDance", function(character:String) {
|
|
switch(character.toLowerCase()) {
|
|
case 'dad': PlayState.instance.dad.dance();
|
|
case 'gf' | 'girlfriend': if(PlayState.instance.gf != null) PlayState.instance.gf.dance();
|
|
default: PlayState.instance.boyfriend.dance();
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "makeLuaSprite", function(tag:String, image:String, x:Float, y:Float) {
|
|
tag = tag.replace('.', '');
|
|
resetSpriteTag(tag);
|
|
var leSprite:ModchartSprite = new ModchartSprite(x, y);
|
|
if(image != null && image.length > 0)
|
|
{
|
|
leSprite.loadGraphic(Paths.image(image));
|
|
}
|
|
leSprite.antialiasing = ClientPrefs.globalAntialiasing;
|
|
PlayState.instance.modchartSprites.set(tag, leSprite);
|
|
leSprite.active = true;
|
|
});
|
|
Lua_helper.add_callback(lua, "makeAnimatedLuaSprite", function(tag:String, image:String, x:Float, y:Float, ?spriteType:String = "sparrow") {
|
|
tag = tag.replace('.', '');
|
|
resetSpriteTag(tag);
|
|
var leSprite:ModchartSprite = new ModchartSprite(x, y);
|
|
|
|
loadFrames(leSprite, image, spriteType);
|
|
leSprite.antialiasing = ClientPrefs.globalAntialiasing;
|
|
PlayState.instance.modchartSprites.set(tag, leSprite);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "makeGraphic", function(obj:String, width:Int, height:Int, color:String) {
|
|
var colorNum:Int = Std.parseInt(color);
|
|
if(!color.startsWith('0x')) colorNum = Std.parseInt('0xff' + color);
|
|
|
|
var spr:FlxSprite = PlayState.instance.getLuaObject(obj,false);
|
|
if(spr!=null) {
|
|
PlayState.instance.getLuaObject(obj,false).makeGraphic(width, height, colorNum);
|
|
return;
|
|
}
|
|
|
|
var object:FlxSprite = Reflect.getProperty(getInstance(), obj);
|
|
if(object != null) {
|
|
object.makeGraphic(width, height, colorNum);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "addAnimationByPrefix", function(obj:String, name:String, prefix:String, framerate:Int = 24, loop:Bool = true) {
|
|
if(PlayState.instance.getLuaObject(obj,false)!=null) {
|
|
var cock:FlxSprite = PlayState.instance.getLuaObject(obj,false);
|
|
cock.animation.addByPrefix(name, prefix, framerate, loop);
|
|
if(cock.animation.curAnim == null) {
|
|
cock.animation.play(name, true);
|
|
}
|
|
return;
|
|
}
|
|
|
|
var cock:FlxSprite = Reflect.getProperty(getInstance(), obj);
|
|
if(cock != null) {
|
|
cock.animation.addByPrefix(name, prefix, framerate, loop);
|
|
if(cock.animation.curAnim == null) {
|
|
cock.animation.play(name, true);
|
|
}
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "addAnimation", function(obj:String, name:String, frames:Array<Int>, framerate:Int = 24, loop:Bool = true) {
|
|
if(PlayState.instance.getLuaObject(obj,false)!=null) {
|
|
var cock:FlxSprite = PlayState.instance.getLuaObject(obj,false);
|
|
cock.animation.add(name, frames, framerate, loop);
|
|
if(cock.animation.curAnim == null) {
|
|
cock.animation.play(name, true);
|
|
}
|
|
return;
|
|
}
|
|
|
|
var cock:FlxSprite = Reflect.getProperty(getInstance(), obj);
|
|
if(cock != null) {
|
|
cock.animation.add(name, frames, framerate, loop);
|
|
if(cock.animation.curAnim == null) {
|
|
cock.animation.play(name, true);
|
|
}
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "addAnimationByIndices", function(obj:String, name:String, prefix:String, indices:String, framerate:Int = 24) {
|
|
return addAnimByIndices(obj, name, prefix, indices, framerate, false);
|
|
});
|
|
Lua_helper.add_callback(lua, "addAnimationByIndicesLoop", function(obj:String, name:String, prefix:String, indices:String, framerate:Int = 24) {
|
|
return addAnimByIndices(obj, name, prefix, indices, framerate, true);
|
|
});
|
|
|
|
|
|
Lua_helper.add_callback(lua, "playAnim", function(obj:String, name:String, forced:Bool = false, ?reverse:Bool = false, ?startFrame:Int = 0)
|
|
{
|
|
if(PlayState.instance.getLuaObject(obj, false) != null) {
|
|
var luaObj:FlxSprite = PlayState.instance.getLuaObject(obj,false);
|
|
if(luaObj.animation.getByName(name) != null)
|
|
{
|
|
luaObj.animation.play(name, forced, reverse, startFrame);
|
|
if(Std.isOfType(luaObj, ModchartSprite))
|
|
{
|
|
//convert luaObj to ModchartSprite
|
|
var obj:Dynamic = luaObj;
|
|
var luaObj:ModchartSprite = obj;
|
|
|
|
var daOffset = luaObj.animOffsets.get(name);
|
|
if (luaObj.animOffsets.exists(name))
|
|
{
|
|
luaObj.offset.set(daOffset[0], daOffset[1]);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
var spr:FlxSprite = Reflect.getProperty(getInstance(), obj);
|
|
if(spr != null) {
|
|
if(spr.animation.getByName(name) != null)
|
|
{
|
|
if(Std.isOfType(spr, Character))
|
|
{
|
|
//convert spr to Character
|
|
var obj:Dynamic = spr;
|
|
var spr:Character = obj;
|
|
spr.playAnim(name, forced, reverse, startFrame);
|
|
}
|
|
else
|
|
spr.animation.play(name, forced, reverse, startFrame);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "addOffset", function(obj:String, anim:String, x:Float, y:Float) {
|
|
if(PlayState.instance.modchartSprites.exists(obj)) {
|
|
PlayState.instance.modchartSprites.get(obj).animOffsets.set(anim, [x, y]);
|
|
return true;
|
|
}
|
|
|
|
var char:Character = Reflect.getProperty(getInstance(), obj);
|
|
if(char != null) {
|
|
char.addOffset(anim, x, y);
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "setScrollFactor", function(obj:String, scrollX:Float, scrollY:Float) {
|
|
if(PlayState.instance.getLuaObject(obj,false)!=null) {
|
|
PlayState.instance.getLuaObject(obj,false).scrollFactor.set(scrollX, scrollY);
|
|
return;
|
|
}
|
|
|
|
var object:FlxObject = Reflect.getProperty(getInstance(), obj);
|
|
if(object != null) {
|
|
object.scrollFactor.set(scrollX, scrollY);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "addLuaSprite", function(tag:String, front:Bool = false) {
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
var shit:ModchartSprite = PlayState.instance.modchartSprites.get(tag);
|
|
if(!shit.wasAdded) {
|
|
if(front)
|
|
{
|
|
getInstance().add(shit);
|
|
}
|
|
else
|
|
{
|
|
if(PlayState.instance.isDead)
|
|
{
|
|
GameOverSubstate.instance.insert(GameOverSubstate.instance.members.indexOf(GameOverSubstate.instance.boyfriend), shit);
|
|
}
|
|
else
|
|
{
|
|
var position:Int = PlayState.instance.members.indexOf(PlayState.instance.gfGroup);
|
|
if(PlayState.instance.members.indexOf(PlayState.instance.boyfriendGroup) < position) {
|
|
position = PlayState.instance.members.indexOf(PlayState.instance.boyfriendGroup);
|
|
} else if(PlayState.instance.members.indexOf(PlayState.instance.dadGroup) < position) {
|
|
position = PlayState.instance.members.indexOf(PlayState.instance.dadGroup);
|
|
}
|
|
PlayState.instance.insert(position, shit);
|
|
}
|
|
}
|
|
shit.wasAdded = true;
|
|
//trace('added a thing: ' + tag);
|
|
}
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "setGraphicSize", function(obj:String, x:Int, y:Int = 0, updateHitbox:Bool = true) {
|
|
if(PlayState.instance.getLuaObject(obj)!=null) {
|
|
var shit:FlxSprite = PlayState.instance.getLuaObject(obj);
|
|
shit.setGraphicSize(x, y);
|
|
if(updateHitbox) shit.updateHitbox();
|
|
return;
|
|
}
|
|
|
|
var killMe:Array<String> = obj.split('.');
|
|
var poop:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
poop = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(poop != null) {
|
|
poop.setGraphicSize(x, y);
|
|
if(updateHitbox) poop.updateHitbox();
|
|
return;
|
|
}
|
|
luaTrace('setGraphicSize | Couldnt find object: ' + obj, false, false, FlxColor.RED);
|
|
});
|
|
Lua_helper.add_callback(lua, "scaleObject", function(obj:String, x:Float, y:Float, updateHitbox:Bool = true) {
|
|
if(PlayState.instance.getLuaObject(obj)!=null) {
|
|
var shit:FlxSprite = PlayState.instance.getLuaObject(obj);
|
|
shit.scale.set(x, y);
|
|
if(updateHitbox) shit.updateHitbox();
|
|
return;
|
|
}
|
|
|
|
var killMe:Array<String> = obj.split('.');
|
|
var poop:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
poop = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(poop != null) {
|
|
poop.scale.set(x, y);
|
|
if(updateHitbox) poop.updateHitbox();
|
|
return;
|
|
}
|
|
luaTrace('scaleObject | Couldnt find object: ' + obj, false, false, FlxColor.RED);
|
|
});
|
|
Lua_helper.add_callback(lua, "updateHitbox", function(obj:String) {
|
|
if(PlayState.instance.getLuaObject(obj)!=null) {
|
|
var shit:FlxSprite = PlayState.instance.getLuaObject(obj);
|
|
shit.updateHitbox();
|
|
return;
|
|
}
|
|
|
|
var poop:FlxSprite = Reflect.getProperty(getInstance(), obj);
|
|
if(poop != null) {
|
|
poop.updateHitbox();
|
|
return;
|
|
}
|
|
luaTrace('updateHitbox | Couldnt find object: ' + obj, false, false, FlxColor.RED);
|
|
});
|
|
Lua_helper.add_callback(lua, "updateHitboxFromGroup", function(group:String, index:Int) {
|
|
if(Std.isOfType(Reflect.getProperty(getInstance(), group), FlxTypedGroup)) {
|
|
Reflect.getProperty(getInstance(), group).members[index].updateHitbox();
|
|
return;
|
|
}
|
|
Reflect.getProperty(getInstance(), group)[index].updateHitbox();
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "removeLuaSprite", function(tag:String, destroy:Bool = true) {
|
|
if(!PlayState.instance.modchartSprites.exists(tag)) {
|
|
return;
|
|
}
|
|
|
|
var pee:ModchartSprite = PlayState.instance.modchartSprites.get(tag);
|
|
if(destroy) {
|
|
pee.kill();
|
|
}
|
|
|
|
if(pee.wasAdded) {
|
|
getInstance().remove(pee, true);
|
|
pee.wasAdded = false;
|
|
}
|
|
|
|
if(destroy) {
|
|
pee.destroy();
|
|
PlayState.instance.modchartSprites.remove(tag);
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "luaSpriteExists", function(tag:String) {
|
|
return PlayState.instance.modchartSprites.exists(tag);
|
|
});
|
|
Lua_helper.add_callback(lua, "luaTextExists", function(tag:String) {
|
|
return PlayState.instance.modchartTexts.exists(tag);
|
|
});
|
|
Lua_helper.add_callback(lua, "luaSoundExists", function(tag:String) {
|
|
return PlayState.instance.modchartSounds.exists(tag);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "setHealthBarColors", function(leftHex:String, rightHex:String) {
|
|
var left:FlxColor = Std.parseInt(leftHex);
|
|
if(!leftHex.startsWith('0x')) left = Std.parseInt('0xff' + leftHex);
|
|
var right:FlxColor = Std.parseInt(rightHex);
|
|
if(!rightHex.startsWith('0x')) right = Std.parseInt('0xff' + rightHex);
|
|
|
|
PlayState.instance.healthBar.createFilledBar(left, right);
|
|
PlayState.instance.healthBar.updateBar();
|
|
});
|
|
Lua_helper.add_callback(lua, "setTimeBarColors", function(leftHex:String, rightHex:String) {
|
|
var left:FlxColor = Std.parseInt(leftHex);
|
|
if(!leftHex.startsWith('0x')) left = Std.parseInt('0xff' + leftHex);
|
|
var right:FlxColor = Std.parseInt(rightHex);
|
|
if(!rightHex.startsWith('0x')) right = Std.parseInt('0xff' + rightHex);
|
|
|
|
PlayState.instance.timeBar.createFilledBar(right, left);
|
|
PlayState.instance.timeBar.updateBar();
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "setObjectCamera", function(obj:String, camera:String = '') {
|
|
/*if(PlayState.instance.modchartSprites.exists(obj)) {
|
|
PlayState.instance.modchartSprites.get(obj).cameras = [cameraFromString(camera)];
|
|
return true;
|
|
}
|
|
else if(PlayState.instance.modchartTexts.exists(obj)) {
|
|
PlayState.instance.modchartTexts.get(obj).cameras = [cameraFromString(camera)];
|
|
return true;
|
|
}*/
|
|
var real = PlayState.instance.getLuaObject(obj);
|
|
if(real!=null){
|
|
real.cameras = [cameraFromString(camera)];
|
|
return true;
|
|
}
|
|
|
|
var killMe:Array<String> = obj.split('.');
|
|
var object:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
object = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(object != null) {
|
|
object.cameras = [cameraFromString(camera)];
|
|
return true;
|
|
}
|
|
luaTrace("setObjectCamera | Object " + obj + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setBlendMode", function(obj:String, blend:String = '') {
|
|
var real = PlayState.instance.getLuaObject(obj);
|
|
if(real!=null) {
|
|
real.blend = blendModeFromString(blend);
|
|
return true;
|
|
}
|
|
|
|
var killMe:Array<String> = obj.split('.');
|
|
var spr:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
spr = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(spr != null) {
|
|
spr.blend = blendModeFromString(blend);
|
|
return true;
|
|
}
|
|
luaTrace("setBlendMode | Object " + obj + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "screenCenter", function(obj:String, pos:String = 'xy') {
|
|
var spr:FlxSprite = PlayState.instance.getLuaObject(obj);
|
|
|
|
if(spr==null){
|
|
var killMe:Array<String> = obj.split('.');
|
|
spr = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
spr = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
}
|
|
|
|
if(spr != null)
|
|
{
|
|
switch(pos.trim().toLowerCase())
|
|
{
|
|
case 'x':
|
|
spr.screenCenter(X);
|
|
return;
|
|
case 'y':
|
|
spr.screenCenter(Y);
|
|
return;
|
|
default:
|
|
spr.screenCenter(XY);
|
|
return;
|
|
}
|
|
}
|
|
luaTrace("screenCenter | Object " + obj + " doesn't exist!", false, false, FlxColor.RED);
|
|
});
|
|
Lua_helper.add_callback(lua, "objectsOverlap", function(obj1:String, obj2:String) {
|
|
var namesArray:Array<String> = [obj1, obj2];
|
|
var objectsArray:Array<FlxSprite> = [];
|
|
for (i in 0...namesArray.length)
|
|
{
|
|
var real = PlayState.instance.getLuaObject(namesArray[i]);
|
|
if(real!=null) {
|
|
objectsArray.push(real);
|
|
} else {
|
|
objectsArray.push(Reflect.getProperty(getInstance(), namesArray[i]));
|
|
}
|
|
}
|
|
|
|
if(!objectsArray.contains(null) && FlxG.overlap(objectsArray[0], objectsArray[1]))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "getPixelColor", function(obj:String, x:Int, y:Int) {
|
|
var killMe:Array<String> = obj.split('.');
|
|
var spr:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
spr = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(spr != null)
|
|
{
|
|
if(spr.framePixels != null) spr.framePixels.getPixel32(x, y);
|
|
return spr.pixels.getPixel32(x, y);
|
|
}
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "getRandomInt", function(min:Int, max:Int = FlxMath.MAX_VALUE_INT, exclude:String = '') {
|
|
var excludeArray:Array<String> = exclude.split(',');
|
|
var toExclude:Array<Int> = [];
|
|
for (i in 0...excludeArray.length)
|
|
{
|
|
toExclude.push(Std.parseInt(excludeArray[i].trim()));
|
|
}
|
|
return FlxG.random.int(min, max, toExclude);
|
|
});
|
|
Lua_helper.add_callback(lua, "getRandomFloat", function(min:Float, max:Float = 1, exclude:String = '') {
|
|
var excludeArray:Array<String> = exclude.split(',');
|
|
var toExclude:Array<Float> = [];
|
|
for (i in 0...excludeArray.length)
|
|
{
|
|
toExclude.push(Std.parseFloat(excludeArray[i].trim()));
|
|
}
|
|
return FlxG.random.float(min, max, toExclude);
|
|
});
|
|
Lua_helper.add_callback(lua, "getRandomBool", function(chance:Float = 50) {
|
|
return FlxG.random.bool(chance);
|
|
});
|
|
Lua_helper.add_callback(lua, "startDialogue", function(dialogueFile:String, music:String = null) {
|
|
var path:String;
|
|
#if MODS_ALLOWED
|
|
path = Paths.modsJson(Paths.formatToSongPath(PlayState.SONG.song) + '/' + dialogueFile);
|
|
if(!FileSystem.exists(path))
|
|
#end
|
|
path = Paths.json(Paths.formatToSongPath(PlayState.SONG.song) + '/' + dialogueFile);
|
|
|
|
luaTrace('startDialogue | Trying to load dialogue: ' + path);
|
|
|
|
#if MODS_ALLOWED
|
|
if(FileSystem.exists(path))
|
|
#else
|
|
if(Assets.exists(path))
|
|
#end
|
|
{
|
|
var shit:DialogueFile = DialogueBoxPsych.parseDialogue(path);
|
|
if(shit.dialogue.length > 0) {
|
|
PlayState.instance.startDialogue(shit, music);
|
|
luaTrace('startDialogue | Successfully loaded dialogue', false, false, FlxColor.GREEN);
|
|
return true;
|
|
} else {
|
|
luaTrace('startDialogue | Your dialogue file is badly formatted!', false, false, FlxColor.RED);
|
|
}
|
|
} else {
|
|
luaTrace('startDialogue | Dialogue file not found', false, false, FlxColor.RED);
|
|
if(PlayState.instance.endingSong) {
|
|
PlayState.instance.endSong();
|
|
} else {
|
|
PlayState.instance.startCountdown();
|
|
}
|
|
}
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "startVideo", function(videoFile:String) {
|
|
#if VIDEOS_ALLOWED
|
|
if(FileSystem.exists(Paths.video(videoFile))) {
|
|
PlayState.instance.startVideo(videoFile);
|
|
return true;
|
|
} else {
|
|
luaTrace('startVideo | Video file not found: ' + videoFile, false, false, FlxColor.RED);
|
|
}
|
|
return false;
|
|
|
|
#else
|
|
if(PlayState.instance.endingSong) {
|
|
PlayState.instance.endSong();
|
|
} else {
|
|
PlayState.instance.startCountdown();
|
|
}
|
|
return true;
|
|
#end
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "playMusic", function(sound:String, volume:Float = 1, loop:Bool = false) {
|
|
FlxG.sound.playMusic(Paths.music(sound), volume, loop);
|
|
});
|
|
Lua_helper.add_callback(lua, "playSound", function(sound:String, volume:Float = 1, ?tag:String = null) {
|
|
if(tag != null && tag.length > 0) {
|
|
tag = tag.replace('.', '');
|
|
if(PlayState.instance.modchartSounds.exists(tag)) {
|
|
PlayState.instance.modchartSounds.get(tag).stop();
|
|
}
|
|
PlayState.instance.modchartSounds.set(tag, FlxG.sound.play(Paths.sound(sound), volume, false, function() {
|
|
PlayState.instance.modchartSounds.remove(tag);
|
|
PlayState.instance.callOnLuas('onSoundFinished', [tag]);
|
|
}));
|
|
return;
|
|
}
|
|
FlxG.sound.play(Paths.sound(sound), volume);
|
|
});
|
|
Lua_helper.add_callback(lua, "stopSound", function(tag:String) {
|
|
if(tag != null && tag.length > 1 && PlayState.instance.modchartSounds.exists(tag)) {
|
|
PlayState.instance.modchartSounds.get(tag).stop();
|
|
PlayState.instance.modchartSounds.remove(tag);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "pauseSound", function(tag:String) {
|
|
if(tag != null && tag.length > 1 && PlayState.instance.modchartSounds.exists(tag)) {
|
|
PlayState.instance.modchartSounds.get(tag).pause();
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "resumeSound", function(tag:String) {
|
|
if(tag != null && tag.length > 1 && PlayState.instance.modchartSounds.exists(tag)) {
|
|
PlayState.instance.modchartSounds.get(tag).play();
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "soundFadeIn", function(tag:String, duration:Float, fromValue:Float = 0, toValue:Float = 1) {
|
|
if(tag == null || tag.length < 1) {
|
|
FlxG.sound.music.fadeIn(duration / PlayState.instance.playbackRate, fromValue, toValue);
|
|
} else if(PlayState.instance.modchartSounds.exists(tag)) {
|
|
PlayState.instance.modchartSounds.get(tag).fadeIn(duration / PlayState.instance.playbackRate, fromValue, toValue);
|
|
}
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "soundFadeOut", function(tag:String, duration:Float, toValue:Float = 0) {
|
|
if(tag == null || tag.length < 1) {
|
|
FlxG.sound.music.fadeOut(duration / PlayState.instance.playbackRate, toValue);
|
|
} else if(PlayState.instance.modchartSounds.exists(tag)) {
|
|
PlayState.instance.modchartSounds.get(tag).fadeOut(duration / PlayState.instance.playbackRate, toValue);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "soundFadeCancel", function(tag:String) {
|
|
if(tag == null || tag.length < 1) {
|
|
if(FlxG.sound.music.fadeTween != null) {
|
|
FlxG.sound.music.fadeTween.cancel();
|
|
}
|
|
} else if(PlayState.instance.modchartSounds.exists(tag)) {
|
|
var theSound:FlxSound = PlayState.instance.modchartSounds.get(tag);
|
|
if(theSound.fadeTween != null) {
|
|
theSound.fadeTween.cancel();
|
|
PlayState.instance.modchartSounds.remove(tag);
|
|
}
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "getSoundVolume", function(tag:String) {
|
|
if(tag == null || tag.length < 1) {
|
|
if(FlxG.sound.music != null) {
|
|
return FlxG.sound.music.volume;
|
|
}
|
|
} else if(PlayState.instance.modchartSounds.exists(tag)) {
|
|
return PlayState.instance.modchartSounds.get(tag).volume;
|
|
}
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "setSoundVolume", function(tag:String, value:Float) {
|
|
if(tag == null || tag.length < 1) {
|
|
if(FlxG.sound.music != null) {
|
|
FlxG.sound.music.volume = value;
|
|
}
|
|
} else if(PlayState.instance.modchartSounds.exists(tag)) {
|
|
PlayState.instance.modchartSounds.get(tag).volume = value;
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "getSoundTime", function(tag:String) {
|
|
if(tag != null && tag.length > 0 && PlayState.instance.modchartSounds.exists(tag)) {
|
|
return PlayState.instance.modchartSounds.get(tag).time;
|
|
}
|
|
return 0;
|
|
});
|
|
Lua_helper.add_callback(lua, "setSoundTime", function(tag:String, value:Float) {
|
|
if(tag != null && tag.length > 0 && PlayState.instance.modchartSounds.exists(tag)) {
|
|
var theSound:FlxSound = PlayState.instance.modchartSounds.get(tag);
|
|
if(theSound != null) {
|
|
var wasResumed:Bool = theSound.playing;
|
|
theSound.pause();
|
|
theSound.time = value;
|
|
if(wasResumed) theSound.play();
|
|
}
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "debugPrint", function(text1:Dynamic = '', text2:Dynamic = '', text3:Dynamic = '', text4:Dynamic = '', text5:Dynamic = '') {
|
|
if (text1 == null) text1 = '';
|
|
if (text2 == null) text2 = '';
|
|
if (text3 == null) text3 = '';
|
|
if (text4 == null) text4 = '';
|
|
if (text5 == null) text5 = '';
|
|
luaTrace('' + text1 + text2 + text3 + text4 + text5, true, false);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "close", function() {
|
|
closed = true;
|
|
return closed;
|
|
});
|
|
|
|
#if ACHIEVEMENTS_ALLOWED Achievements.addLuaCallbacks(lua); #end
|
|
|
|
Lua_helper.add_callback(lua, "changePresence", function(details:String, state:Null<String>, ?smallImageKey:String, ?hasStartTimestamp:Bool, ?endTimestamp:Float) {
|
|
#if DISCORD_ALLOWED
|
|
DiscordClient.changePresence(details, state, smallImageKey, hasStartTimestamp, endTimestamp);
|
|
#end
|
|
});
|
|
|
|
|
|
// LUA TEXTS
|
|
Lua_helper.add_callback(lua, "makeLuaText", function(tag:String, text:String, width:Int, x:Float, y:Float) {
|
|
tag = tag.replace('.', '');
|
|
resetTextTag(tag);
|
|
var leText:FlxText = new FlxText(x, y, width, text, 16);
|
|
leText.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
|
|
leText.cameras = [PlayState.instance.camHUD];
|
|
PlayState.instance.modchartTexts.set(tag, leText);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "setTextString", function(tag:String, text:String) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
obj.text = text;
|
|
return true;
|
|
}
|
|
luaTrace("setTextString | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setTextSize", function(tag:String, size:Int) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
obj.size = size;
|
|
return true;
|
|
}
|
|
luaTrace("setTextSize | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setTextWidth", function(tag:String, width:Float) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
obj.fieldWidth = width;
|
|
return true;
|
|
}
|
|
luaTrace("setTextWidth | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setTextBorder", function(tag:String, size:Int, color:String) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
var colorNum:Int = Std.parseInt(color);
|
|
if(!color.startsWith('0x')) colorNum = Std.parseInt('0xff' + color);
|
|
|
|
obj.borderSize = size;
|
|
obj.borderColor = colorNum;
|
|
return true;
|
|
}
|
|
luaTrace("setTextBorder | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setTextColor", function(tag:String, color:String) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
var colorNum:Int = Std.parseInt(color);
|
|
if(!color.startsWith('0x')) colorNum = Std.parseInt('0xff' + color);
|
|
|
|
obj.color = colorNum;
|
|
return true;
|
|
}
|
|
luaTrace("setTextColor | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setTextFont", function(tag:String, newFont:String) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
obj.font = Paths.font(newFont);
|
|
return true;
|
|
}
|
|
luaTrace("setTextFont | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setTextItalic", function(tag:String, italic:Bool) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
obj.italic = italic;
|
|
return true;
|
|
}
|
|
luaTrace("setTextItalic | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setTextAlignment", function(tag:String, alignment:String = 'left') {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
obj.alignment = LEFT;
|
|
switch(alignment.trim().toLowerCase())
|
|
{
|
|
case 'right':
|
|
obj.alignment = RIGHT;
|
|
case 'center':
|
|
obj.alignment = CENTER;
|
|
}
|
|
return true;
|
|
}
|
|
luaTrace("setTextAlignment | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return false;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "getTextString", function(tag:String) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null && obj.text != null)
|
|
{
|
|
return obj.text;
|
|
}
|
|
luaTrace("getTextString | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return null;
|
|
});
|
|
Lua_helper.add_callback(lua, "getTextSize", function(tag:String) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
return obj.size;
|
|
}
|
|
luaTrace("getTextSize | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return -1;
|
|
});
|
|
Lua_helper.add_callback(lua, "getTextFont", function(tag:String) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
return obj.font;
|
|
}
|
|
luaTrace("getTextFont | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return null;
|
|
});
|
|
Lua_helper.add_callback(lua, "getTextWidth", function(tag:String) {
|
|
var obj:FlxText = getTextObject(tag);
|
|
if(obj != null)
|
|
{
|
|
return obj.fieldWidth;
|
|
}
|
|
luaTrace("getTextWidth | Object " + tag + " doesn't exist!", false, false, FlxColor.RED);
|
|
return 0;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "addLuaText", function(tag:String) {
|
|
if(PlayState.instance.modchartTexts.exists(tag)) {
|
|
var shit:FlxText = PlayState.instance.modchartTexts.get(tag);
|
|
if(shit != null) getInstance().add(shit);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "removeLuaText", function(tag:String, destroy:Bool = true) {
|
|
if(!PlayState.instance.modchartTexts.exists(tag)) {
|
|
return;
|
|
}
|
|
|
|
var pee:FlxText = PlayState.instance.modchartTexts.get(tag);
|
|
|
|
if(pee != null)
|
|
getInstance().remove(pee, true);
|
|
|
|
if(destroy) {
|
|
pee.destroy();
|
|
PlayState.instance.modchartTexts.remove(tag);
|
|
}
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "initSaveData", function(name:String, ?folder:String = 'psychenginemods') {
|
|
if(!PlayState.instance.modchartSaves.exists(name))
|
|
{
|
|
var save:FlxSave = new FlxSave();
|
|
// folder goes unused for flixel 5 users. @BeastlyGhost
|
|
save.bind(name, CoolUtil.getSavePath() + "/" + folder);
|
|
PlayState.instance.modchartSaves.set(name, save);
|
|
return;
|
|
}
|
|
luaTrace('initSaveData | Save file already initialized: ' + name);
|
|
});
|
|
Lua_helper.add_callback(lua, "flushSaveData", function(name:String) {
|
|
if(PlayState.instance.modchartSaves.exists(name))
|
|
{
|
|
PlayState.instance.modchartSaves.get(name).flush();
|
|
return;
|
|
}
|
|
luaTrace('flushSaveData | Save file not initialized: ' + name, false, false, FlxColor.RED);
|
|
});
|
|
Lua_helper.add_callback(lua, "getDataFromSave", function(name:String, field:String, ?defaultValue:Dynamic = null) {
|
|
if(PlayState.instance.modchartSaves.exists(name))
|
|
{
|
|
var retVal:Dynamic = Reflect.field(PlayState.instance.modchartSaves.get(name).data, field);
|
|
return retVal;
|
|
}
|
|
luaTrace('getDataFromSave | Save file not initialized: ' + name, false, false, FlxColor.RED);
|
|
return defaultValue;
|
|
});
|
|
Lua_helper.add_callback(lua, "setDataFromSave", function(name:String, field:String, value:Dynamic) {
|
|
if(PlayState.instance.modchartSaves.exists(name))
|
|
{
|
|
Reflect.setField(PlayState.instance.modchartSaves.get(name).data, field, value);
|
|
return;
|
|
}
|
|
luaTrace('setDataFromSave | Save file not initialized: ' + name, false, false, FlxColor.RED);
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "checkFileExists", function(filename:String, ?absolute:Bool = false) {
|
|
#if MODS_ALLOWED
|
|
if(absolute)
|
|
{
|
|
return FileSystem.exists(filename);
|
|
}
|
|
|
|
var path:String = Paths.modFolders(filename);
|
|
if(FileSystem.exists(path))
|
|
{
|
|
return true;
|
|
}
|
|
return FileSystem.exists(Paths.getPath('assets/$filename', TEXT));
|
|
#else
|
|
if(absolute)
|
|
{
|
|
return Assets.exists(filename);
|
|
}
|
|
return Assets.exists(Paths.getPath('assets/$filename', TEXT));
|
|
#end
|
|
});
|
|
Lua_helper.add_callback(lua, "saveFile", function(path:String, content:String, ?absolute:Bool = false)
|
|
{
|
|
try {
|
|
if(!absolute)
|
|
File.saveContent(Paths.mods(path), content);
|
|
else
|
|
File.saveContent(path, content);
|
|
|
|
return true;
|
|
} catch (e:Dynamic) {
|
|
luaTrace("saveFile | Error trying to save " + path + ": " + e, false, false, FlxColor.RED);
|
|
}
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "deleteFile", function(path:String, ?ignoreModFolders:Bool = false)
|
|
{
|
|
try {
|
|
#if MODS_ALLOWED
|
|
if(!ignoreModFolders)
|
|
{
|
|
var lePath:String = Paths.modFolders(path);
|
|
if(FileSystem.exists(lePath))
|
|
{
|
|
FileSystem.deleteFile(lePath);
|
|
return true;
|
|
}
|
|
}
|
|
#end
|
|
|
|
var lePath:String = Paths.getPath(path, TEXT);
|
|
if(Assets.exists(lePath))
|
|
{
|
|
FileSystem.deleteFile(lePath);
|
|
return true;
|
|
}
|
|
} catch (e:Dynamic) {
|
|
luaTrace("deleteFile | Error trying to delete " + path + ": " + e, false, false, FlxColor.RED);
|
|
}
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "getTextFromFile", function(path:String, ?ignoreModFolders:Bool = false) {
|
|
return Paths.getTextFromFile(path, ignoreModFolders);
|
|
});
|
|
|
|
// DEPRECATED, DONT MESS WITH THESE SHITS, ITS JUST THERE FOR BACKWARD COMPATIBILITY
|
|
Lua_helper.add_callback(lua, "objectPlayAnimation", function(obj:String, name:String, forced:Bool = false, ?startFrame:Int = 0) {
|
|
luaTrace("objectPlayAnimation is deprecated! Use playAnim instead", false, true);
|
|
if(PlayState.instance.getLuaObject(obj,false) != null) {
|
|
PlayState.instance.getLuaObject(obj,false).animation.play(name, forced, false, startFrame);
|
|
return true;
|
|
}
|
|
|
|
var spr:FlxSprite = Reflect.getProperty(getInstance(), obj);
|
|
if(spr != null) {
|
|
spr.animation.play(name, forced, false, startFrame);
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "characterPlayAnim", function(character:String, anim:String, ?forced:Bool = false) {
|
|
luaTrace("characterPlayAnim is deprecated! Use playAnim instead", false, true);
|
|
switch(character.toLowerCase()) {
|
|
case 'dad':
|
|
if(PlayState.instance.dad.animOffsets.exists(anim))
|
|
PlayState.instance.dad.playAnim(anim, forced);
|
|
case 'gf' | 'girlfriend':
|
|
if(PlayState.instance.gf != null && PlayState.instance.gf.animOffsets.exists(anim))
|
|
PlayState.instance.gf.playAnim(anim, forced);
|
|
default:
|
|
if(PlayState.instance.boyfriend.animOffsets.exists(anim))
|
|
PlayState.instance.boyfriend.playAnim(anim, forced);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "luaSpriteMakeGraphic", function(tag:String, width:Int, height:Int, color:String) {
|
|
luaTrace("luaSpriteMakeGraphic is deprecated! Use makeGraphic instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
var colorNum:Int = Std.parseInt(color);
|
|
if(!color.startsWith('0x')) colorNum = Std.parseInt('0xff' + color);
|
|
|
|
PlayState.instance.modchartSprites.get(tag).makeGraphic(width, height, colorNum);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "luaSpriteAddAnimationByPrefix", function(tag:String, name:String, prefix:String, framerate:Int = 24, loop:Bool = true) {
|
|
luaTrace("luaSpriteAddAnimationByPrefix is deprecated! Use addAnimationByPrefix instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
var cock:ModchartSprite = PlayState.instance.modchartSprites.get(tag);
|
|
cock.animation.addByPrefix(name, prefix, framerate, loop);
|
|
if(cock.animation.curAnim == null) {
|
|
cock.animation.play(name, true);
|
|
}
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "luaSpriteAddAnimationByIndices", function(tag:String, name:String, prefix:String, indices:String, framerate:Int = 24) {
|
|
luaTrace("luaSpriteAddAnimationByIndices is deprecated! Use addAnimationByIndices instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
var strIndices:Array<String> = indices.trim().split(',');
|
|
var die:Array<Int> = [];
|
|
for (i in 0...strIndices.length) {
|
|
die.push(Std.parseInt(strIndices[i]));
|
|
}
|
|
var pussy:ModchartSprite = PlayState.instance.modchartSprites.get(tag);
|
|
pussy.animation.addByIndices(name, prefix, die, '', framerate, false);
|
|
if(pussy.animation.curAnim == null) {
|
|
pussy.animation.play(name, true);
|
|
}
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "luaSpritePlayAnimation", function(tag:String, name:String, forced:Bool = false) {
|
|
luaTrace("luaSpritePlayAnimation is deprecated! Use playAnim instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
PlayState.instance.modchartSprites.get(tag).animation.play(name, forced);
|
|
}
|
|
});
|
|
Lua_helper.add_callback(lua, "setLuaSpriteCamera", function(tag:String, camera:String = '') {
|
|
luaTrace("setLuaSpriteCamera is deprecated! Use setObjectCamera instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
PlayState.instance.modchartSprites.get(tag).cameras = [cameraFromString(camera)];
|
|
return true;
|
|
}
|
|
luaTrace("Lua sprite with tag | " + tag + " doesn't exist!");
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "setLuaSpriteScrollFactor", function(tag:String, scrollX:Float, scrollY:Float) {
|
|
luaTrace("setLuaSpriteScrollFactor is deprecated! Use setScrollFactor instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
PlayState.instance.modchartSprites.get(tag).scrollFactor.set(scrollX, scrollY);
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "scaleLuaSprite", function(tag:String, x:Float, y:Float) {
|
|
luaTrace("scaleLuaSprite is deprecated! Use scaleObject instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
var shit:ModchartSprite = PlayState.instance.modchartSprites.get(tag);
|
|
shit.scale.set(x, y);
|
|
shit.updateHitbox();
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "getPropertyLuaSprite", function(tag:String, variable:String) {
|
|
luaTrace("getPropertyLuaSprite is deprecated! Use getProperty instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
if(killMe.length > 1) {
|
|
var coverMeInPiss:Dynamic = Reflect.getProperty(PlayState.instance.modchartSprites.get(tag), 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(PlayState.instance.modchartSprites.get(tag), variable);
|
|
}
|
|
return null;
|
|
});
|
|
Lua_helper.add_callback(lua, "setPropertyLuaSprite", function(tag:String, variable:String, value:Dynamic) {
|
|
luaTrace("setPropertyLuaSprite is deprecated! Use setProperty instead", false, true);
|
|
if(PlayState.instance.modchartSprites.exists(tag)) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
if(killMe.length > 1) {
|
|
var coverMeInPiss:Dynamic = Reflect.getProperty(PlayState.instance.modchartSprites.get(tag), killMe[0]);
|
|
for (i in 1...killMe.length-1) {
|
|
coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]);
|
|
}
|
|
Reflect.setProperty(coverMeInPiss, killMe[killMe.length-1], value);
|
|
return true;
|
|
}
|
|
Reflect.setProperty(PlayState.instance.modchartSprites.get(tag), variable, value);
|
|
return true;
|
|
}
|
|
luaTrace("setPropertyLuaSprite | Lua sprite with tag: " + tag + " doesn't exist!");
|
|
return false;
|
|
});
|
|
Lua_helper.add_callback(lua, "musicFadeIn", function(duration:Float, fromValue:Float = 0, toValue:Float = 1) {
|
|
FlxG.sound.music.fadeIn(duration / PlayState.instance.playbackRate, fromValue, toValue);
|
|
luaTrace('musicFadeIn is deprecated! Use soundFadeIn instead.', false, true);
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "musicFadeOut", function(duration:Float, toValue:Float = 0) {
|
|
FlxG.sound.music.fadeOut(duration / PlayState.instance.playbackRate, toValue);
|
|
luaTrace('musicFadeOut is deprecated! Use soundFadeOut instead.', false, true);
|
|
});
|
|
|
|
//SHADER SHIT
|
|
if (ClientPrefs.shaders) {
|
|
Lua_helper.add_callback(lua, "addChromaticAbberationEffect", function(camera:String,chromeOffset:Float = 0.005) {
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new ChromaticAberrationEffect(chromeOffset));
|
|
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "addScanlineEffect", function(camera:String,lockAlpha:Bool=false) {
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new ScanlineEffect(lockAlpha));
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "addGrainEffect", function(camera:String,grainSize:Float,lumAmount:Float,lockAlpha:Bool=false) {
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new GrainEffect(grainSize,lumAmount,lockAlpha));
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "addTiltshiftEffect", function(camera:String,blurAmount:Float,center:Float) {
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new TiltshiftEffect(blurAmount,center));
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "addVCREffect", function(camera:String,glitchFactor:Float = 0.0,distortion:Bool=true,perspectiveOn:Bool=true,vignetteMoving:Bool=true) {
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new VCRDistortionEffect(glitchFactor,distortion,perspectiveOn,vignetteMoving));
|
|
|
|
});
|
|
|
|
// shader clear
|
|
|
|
Lua_helper.add_callback(lua, "clearShadersFromCamera", function(cameraName)
|
|
{
|
|
cameraFromString(cameraName).filters = [];
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "addWiggleEffect", function(camera:String, effectType:String, waveSpeed:Float = 0.1,waveFrq:Float = 0.1,waveAmp:Float = 0.1, ?verticalStrength:Float = 1, ?horizontalStrength:Float = 1) {
|
|
PlayState.instance.addShaderToCamera(camera, new WiggleEffectLua(effectType, waveSpeed, waveFrq, waveAmp,
|
|
verticalStrength, horizontalStrength));
|
|
});
|
|
Lua_helper.add_callback(lua, "addGlitchEffect", function(camera:String,waveSpeed:Float = 0.1,waveFrq:Float = 0.1,waveAmp:Float = 0.1) {
|
|
PlayState.instance.addShaderToCamera(camera, new GlitchEffect(waveSpeed,waveFrq,waveAmp));
|
|
});
|
|
Lua_helper.add_callback(lua, "addGlitchShader", function(camera:String,waveAmp:Float = 0.1,waveFrq:Float = 0.1,waveSpeed:Float = 0.1) {
|
|
PlayState.instance.addShaderToCamera(camera, new GlitchEffect(waveSpeed,waveFrq,waveAmp));
|
|
});
|
|
Lua_helper.add_callback(lua, "addPulseEffect", function(camera:String,waveSpeed:Float = 0.1,waveFrq:Float = 0.1,waveAmp:Float = 0.1) {
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new PulseEffect(waveSpeed,waveFrq,waveAmp));
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "addDistortionEffect", function(camera:String,waveSpeed:Float = 0.1,waveFrq:Float = 0.1,waveAmp:Float = 0.1) {
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new DistortBGEffect(waveSpeed,waveFrq,waveAmp));
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "addInvertEffect", function(camera:String,lockAlpha:Bool=false) {
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new InvertColorsEffect(lockAlpha));
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "addGreyscaleEffect", function(camera:String) { //for dem funkies
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new GreyscaleEffect());
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "addGrayscaleEffect", function(camera:String) { //for dem funkies
|
|
|
|
PlayState.instance.addShaderToCamera(camera, new GreyscaleEffect());
|
|
|
|
});
|
|
Lua_helper.add_callback(lua, "add3DEffect", function(camera:String,xrotation:Float=0,yrotation:Float=0,zrotation:Float=0,depth:Float=0) { //for dem funkies
|
|
PlayState.instance.addShaderToCamera(camera, new ThreeDEffect(xrotation,yrotation,zrotation,depth));
|
|
});
|
|
Lua_helper.add_callback(lua, "addBloomEffect", function(camera:String,intensity:Float = 0.35,blurSize:Float=1.0) {
|
|
PlayState.instance.addShaderToCamera(camera, new BloomEffect(blurSize/512.0,intensity));
|
|
});
|
|
Lua_helper.add_callback(lua, "addBlockedGlitchEffect", function(camera:String, res:Float = 1280, time:Float = 1, colorMult:Float = 1, colorTransform:Bool = true) {
|
|
if (colorTransform) PlayState.instance.addShaderToCamera(camera, new BlockedGlitchEffect(res, time, colorMult, colorTransform));
|
|
});
|
|
Lua_helper.add_callback(lua, "clearEffects", function(camera:String) {
|
|
PlayState.instance.clearShaderFromCamera(camera);
|
|
});
|
|
}
|
|
// Other stuff
|
|
Lua_helper.add_callback(lua, "stringStartsWith", function(str:String, start:String) {
|
|
return str.startsWith(start);
|
|
});
|
|
Lua_helper.add_callback(lua, "stringEndsWith", function(str:String, end:String) {
|
|
return str.endsWith(end);
|
|
});
|
|
Lua_helper.add_callback(lua, "stringSplit", function(str:String, split:String) {
|
|
return str.split(split);
|
|
});
|
|
Lua_helper.add_callback(lua, "stringTrim", function(str:String) {
|
|
return str.trim();
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "directoryFileList", function(folder:String) {
|
|
var list:Array<String> = [];
|
|
#if sys
|
|
if(FileSystem.exists(folder)) {
|
|
for (folder in FileSystem.readDirectory(folder)) {
|
|
if (!list.contains(folder)) {
|
|
list.push(folder);
|
|
}
|
|
}
|
|
}
|
|
#end
|
|
return list;
|
|
});
|
|
|
|
Lua_helper.add_callback(lua, "changeCursor", function(path:String, visible:Bool = true, ?loadDefault:Bool = false, scale:Float = 1, xOffset:Int = 0, yOffset:Int = 0) {
|
|
if (Paths.image(path) != null){
|
|
FlxG.mouse.visible = visible;
|
|
FlxG.mouse.unload();
|
|
FlxG.mouse.load(Paths.image(path).bitmap, scale, xOffset, yOffset);
|
|
luaTrace('Changed Cursor in $path');
|
|
}
|
|
else if (loadDefault || path == null || path.length <= 0)
|
|
{
|
|
FlxG.mouse.unload();
|
|
FlxG.mouse.visible = visible;
|
|
luaTrace('Loading default cursor');
|
|
}
|
|
else
|
|
{
|
|
luaTrace('Cursor in $path does not exist!', true, false, FlxColor.RED);
|
|
FlxG.mouse.unload();
|
|
FlxG.mouse.visible = visible;
|
|
// return;
|
|
}
|
|
});
|
|
|
|
call('onCreate', []);
|
|
#end
|
|
}
|
|
|
|
public static function isOfTypes(value:Any, types:Array<Dynamic>)
|
|
{
|
|
for (type in types)
|
|
{
|
|
if(Std.isOfType(value, type)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#if hscript
|
|
public function initHaxeModule()
|
|
{
|
|
if(hscript == null)
|
|
{
|
|
trace('initializing haxe interp for: $scriptName');
|
|
hscript = new HScript(); //TO DO: Fix issue with 2 scripts not being able to use the same variable names
|
|
}
|
|
}
|
|
#end
|
|
|
|
public static function setVarInArray(instance:Dynamic, variable:String, value:Dynamic):Any
|
|
{
|
|
var shit:Array<String> = variable.split('[');
|
|
if(shit.length > 1)
|
|
{
|
|
var blah:Dynamic = null;
|
|
if(PlayState.instance.variables.exists(shit[0]))
|
|
{
|
|
var retVal:Dynamic = PlayState.instance.variables.get(shit[0]);
|
|
if(retVal != null)
|
|
blah = retVal;
|
|
}
|
|
else
|
|
blah = Reflect.getProperty(instance, shit[0]);
|
|
|
|
for (i in 1...shit.length)
|
|
{
|
|
var leNum:Dynamic = shit[i].substr(0, shit[i].length - 1);
|
|
if(i >= shit.length-1) //Last array
|
|
blah[leNum] = value;
|
|
else //Anything else
|
|
blah = blah[leNum];
|
|
}
|
|
return blah;
|
|
}
|
|
/*if(Std.isOfType(instance, Map))
|
|
instance.set(variable,value);
|
|
else*/
|
|
|
|
if(PlayState.instance.variables.exists(variable))
|
|
{
|
|
PlayState.instance.variables.set(variable, value);
|
|
return true;
|
|
}
|
|
|
|
Reflect.setProperty(instance, variable, value);
|
|
return true;
|
|
}
|
|
public static function getVarInArray(instance:Dynamic, variable:String):Any
|
|
{
|
|
var shit:Array<String> = variable.split('[');
|
|
if(shit.length > 1)
|
|
{
|
|
var blah:Dynamic = null;
|
|
if(PlayState.instance.variables.exists(shit[0]))
|
|
{
|
|
var retVal:Dynamic = PlayState.instance.variables.get(shit[0]);
|
|
if(retVal != null)
|
|
blah = retVal;
|
|
}
|
|
else
|
|
blah = Reflect.getProperty(instance, shit[0]);
|
|
|
|
for (i in 1...shit.length)
|
|
{
|
|
var leNum:Dynamic = shit[i].substr(0, shit[i].length - 1);
|
|
blah = blah[leNum];
|
|
}
|
|
return blah;
|
|
}
|
|
|
|
if(PlayState.instance.variables.exists(variable))
|
|
{
|
|
var retVal:Dynamic = PlayState.instance.variables.get(variable);
|
|
if(retVal != null)
|
|
return retVal;
|
|
}
|
|
|
|
return Reflect.getProperty(instance, variable);
|
|
}
|
|
|
|
inline static function getTextObject(name:String):FlxText
|
|
{
|
|
return PlayState.instance.modchartTexts.exists(name) ? PlayState.instance.modchartTexts.get(name) : Reflect.getProperty(PlayState.instance, name);
|
|
}
|
|
|
|
#if (!flash && sys)
|
|
public function getShader(obj:String):FlxRuntimeShader
|
|
{
|
|
var killMe:Array<String> = obj.split('.');
|
|
var leObj:FlxSprite = getObjectDirectly(killMe[0]);
|
|
if(killMe.length > 1) {
|
|
leObj = getVarInArray(getPropertyLoopThingWhatever(killMe), killMe[killMe.length-1]);
|
|
}
|
|
|
|
if(leObj != null) {
|
|
var shader:Dynamic = leObj.shader;
|
|
var shader:FlxRuntimeShader = shader;
|
|
return shader;
|
|
}
|
|
return null;
|
|
}
|
|
#end
|
|
|
|
function initLuaShader(name:String, ?glslVersion:Int = 120)
|
|
{
|
|
if(!ClientPrefs.shaders) return false;
|
|
|
|
#if (!flash && sys)
|
|
if(PlayState.instance.runtimeShaders.exists(name))
|
|
{
|
|
luaTrace('Shader $name was already initialized!');
|
|
return true;
|
|
}
|
|
|
|
var foldersToCheck:Array<String> = [Paths.mods('shaders/')];
|
|
if(Paths.currentModDirectory != null && Paths.currentModDirectory.length > 0)
|
|
foldersToCheck.insert(0, Paths.mods(Paths.currentModDirectory + '/shaders/'));
|
|
|
|
for(mod in Paths.getGlobalMods())
|
|
foldersToCheck.insert(0, Paths.mods(mod + '/shaders/'));
|
|
|
|
for (folder in foldersToCheck)
|
|
{
|
|
if(FileSystem.exists(folder))
|
|
{
|
|
var frag:String = folder + name + '.frag';
|
|
var vert:String = folder + name + '.vert';
|
|
var found:Bool = false;
|
|
if(FileSystem.exists(frag))
|
|
{
|
|
frag = File.getContent(frag);
|
|
found = true;
|
|
}
|
|
else frag = null;
|
|
|
|
if(FileSystem.exists(vert))
|
|
{
|
|
vert = File.getContent(vert);
|
|
found = true;
|
|
}
|
|
else vert = null;
|
|
|
|
if(found)
|
|
{
|
|
PlayState.instance.runtimeShaders.set(name, [frag, vert]);
|
|
//trace('Found shader $name!');
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
luaTrace('Missing shader $name .frag AND .vert files!', false, false, FlxColor.RED);
|
|
#else
|
|
luaTrace('This platform doesn\'t support Runtime Shaders!', false, false, FlxColor.RED);
|
|
#end
|
|
return false;
|
|
}
|
|
|
|
function getGroupStuff(leArray:Dynamic, variable:String) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
if(killMe.length > 1) {
|
|
var coverMeInPiss:Dynamic = Reflect.getProperty(leArray, killMe[0]);
|
|
for (i in 1...killMe.length-1) {
|
|
coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]);
|
|
}
|
|
switch(Type.typeof(coverMeInPiss)){
|
|
case ValueType.TClass(haxe.ds.StringMap) | ValueType.TClass(haxe.ds.ObjectMap) | ValueType.TClass(haxe.ds.IntMap) | ValueType.TClass(haxe.ds.EnumValueMap):
|
|
return coverMeInPiss.get(killMe[killMe.length-1]);
|
|
default:
|
|
return Reflect.getProperty(coverMeInPiss, killMe[killMe.length-1]);
|
|
};
|
|
}
|
|
switch(Type.typeof(leArray)){
|
|
case ValueType.TClass(haxe.ds.StringMap) | ValueType.TClass(haxe.ds.ObjectMap) | ValueType.TClass(haxe.ds.IntMap) | ValueType.TClass(haxe.ds.EnumValueMap):
|
|
return leArray.get(variable);
|
|
default:
|
|
return Reflect.getProperty(leArray, variable);
|
|
};
|
|
}
|
|
|
|
function loadFrames(spr:FlxSprite, image:String, spriteType:String)
|
|
{
|
|
switch(spriteType.toLowerCase().trim())
|
|
{
|
|
case "texture" | "textureatlas" | "tex":
|
|
spr.frames = AtlasFrameMaker.construct(image);
|
|
|
|
case "texture_noaa" | "textureatlas_noaa" | "tex_noaa":
|
|
spr.frames = AtlasFrameMaker.construct(image, null, true);
|
|
|
|
case "packer" | "packeratlas" | "pac":
|
|
spr.frames = Paths.getPackerAtlas(image);
|
|
|
|
default:
|
|
spr.frames = Paths.getSparrowAtlas(image);
|
|
}
|
|
}
|
|
|
|
function setGroupStuff(leArray:Dynamic, variable:String, value:Dynamic) {
|
|
var killMe:Array<String> = variable.split('.');
|
|
if(killMe.length > 1) {
|
|
var coverMeInPiss:Dynamic = Reflect.getProperty(leArray, killMe[0]);
|
|
for (i in 1...killMe.length-1) {
|
|
coverMeInPiss = Reflect.getProperty(coverMeInPiss, killMe[i]);
|
|
}
|
|
Reflect.setProperty(coverMeInPiss, killMe[killMe.length-1], value);
|
|
return;
|
|
}
|
|
Reflect.setProperty(leArray, variable, value);
|
|
}
|
|
|
|
function resetTextTag(tag:String) {
|
|
if(!PlayState.instance.modchartTexts.exists(tag)) {
|
|
return;
|
|
}
|
|
|
|
var pee:FlxText = PlayState.instance.modchartTexts.get(tag);
|
|
if(pee != null)
|
|
PlayState.instance.remove(pee, true);
|
|
|
|
pee.destroy();
|
|
PlayState.instance.modchartTexts.remove(tag);
|
|
}
|
|
|
|
function resetSpriteTag(tag:String) {
|
|
if(!PlayState.instance.modchartSprites.exists(tag)) {
|
|
return;
|
|
}
|
|
|
|
var pee:ModchartSprite = PlayState.instance.modchartSprites.get(tag);
|
|
pee.kill();
|
|
if(pee.wasAdded) {
|
|
PlayState.instance.remove(pee, true);
|
|
}
|
|
pee.destroy();
|
|
PlayState.instance.modchartSprites.remove(tag);
|
|
}
|
|
|
|
function cancelTween(tag:String) {
|
|
if(PlayState.instance.modchartTweens.exists(tag)) {
|
|
PlayState.instance.modchartTweens.get(tag).cancel();
|
|
PlayState.instance.modchartTweens.get(tag).destroy();
|
|
PlayState.instance.modchartTweens.remove(tag);
|
|
}
|
|
}
|
|
|
|
function tweenShit(tag:String, vars:String) {
|
|
cancelTween(tag);
|
|
var variables:Array<String> = vars.split('.');
|
|
var sexyProp:Dynamic = getObjectDirectly(variables[0]);
|
|
if(variables.length > 1) {
|
|
sexyProp = getVarInArray(getPropertyLoopThingWhatever(variables), variables[variables.length-1]);
|
|
}
|
|
return sexyProp;
|
|
}
|
|
|
|
function cancelTimer(tag:String) {
|
|
if(PlayState.instance.modchartTimers.exists(tag)) {
|
|
var theTimer:FlxTimer = PlayState.instance.modchartTimers.get(tag);
|
|
theTimer.cancel();
|
|
theTimer.destroy();
|
|
PlayState.instance.modchartTimers.remove(tag);
|
|
}
|
|
}
|
|
|
|
//Better optimized than using some getProperty shit or idk
|
|
function getFlxEaseByString(?ease:String = '') {
|
|
switch(ease.toLowerCase().trim()) {
|
|
case 'backin': return FlxEase.backIn;
|
|
case 'backinout': return FlxEase.backInOut;
|
|
case 'backout': return FlxEase.backOut;
|
|
case 'bouncein': return FlxEase.bounceIn;
|
|
case 'bounceinout': return FlxEase.bounceInOut;
|
|
case 'bounceout': return FlxEase.bounceOut;
|
|
case 'circin': return FlxEase.circIn;
|
|
case 'circinout': return FlxEase.circInOut;
|
|
case 'circout': return FlxEase.circOut;
|
|
case 'cubein': return FlxEase.cubeIn;
|
|
case 'cubeinout': return FlxEase.cubeInOut;
|
|
case 'cubeout': return FlxEase.cubeOut;
|
|
case 'elasticin': return FlxEase.elasticIn;
|
|
case 'elasticinout': return FlxEase.elasticInOut;
|
|
case 'elasticout': return FlxEase.elasticOut;
|
|
case 'expoin': return FlxEase.expoIn;
|
|
case 'expoinout': return FlxEase.expoInOut;
|
|
case 'expoout': return FlxEase.expoOut;
|
|
case 'quadin': return FlxEase.quadIn;
|
|
case 'quadinout': return FlxEase.quadInOut;
|
|
case 'quadout': return FlxEase.quadOut;
|
|
case 'quartin': return FlxEase.quartIn;
|
|
case 'quartinout': return FlxEase.quartInOut;
|
|
case 'quartout': return FlxEase.quartOut;
|
|
case 'quintin': return FlxEase.quintIn;
|
|
case 'quintinout': return FlxEase.quintInOut;
|
|
case 'quintout': return FlxEase.quintOut;
|
|
case 'sinein': return FlxEase.sineIn;
|
|
case 'sineinout': return FlxEase.sineInOut;
|
|
case 'sineout': return FlxEase.sineOut;
|
|
case 'smoothstepin': return FlxEase.smoothStepIn;
|
|
case 'smoothstepinout': return FlxEase.smoothStepInOut;
|
|
case 'smoothstepout': return FlxEase.smoothStepInOut;
|
|
case 'smootherstepin': return FlxEase.smootherStepIn;
|
|
case 'smootherstepinout': return FlxEase.smootherStepInOut;
|
|
case 'smootherstepout': return FlxEase.smootherStepOut;
|
|
}
|
|
return FlxEase.linear;
|
|
}
|
|
|
|
function blendModeFromString(blend:String):BlendMode {
|
|
switch(blend.toLowerCase().trim()) {
|
|
case 'add': return ADD;
|
|
case 'alpha': return ALPHA;
|
|
case 'darken': return DARKEN;
|
|
case 'difference': return DIFFERENCE;
|
|
case 'erase': return ERASE;
|
|
case 'hardlight': return HARDLIGHT;
|
|
case 'invert': return INVERT;
|
|
case 'layer': return LAYER;
|
|
case 'lighten': return LIGHTEN;
|
|
case 'multiply': return MULTIPLY;
|
|
case 'overlay': return OVERLAY;
|
|
case 'screen': return SCREEN;
|
|
case 'shader': return SHADER;
|
|
case 'subtract': return SUBTRACT;
|
|
}
|
|
return NORMAL;
|
|
}
|
|
|
|
static function cameraFromString(cam:String):FlxCamera {
|
|
switch(cam.toLowerCase()) {
|
|
case 'camhud' | 'hud': return PlayState.instance.camHUD;
|
|
case 'camother' | 'other': return PlayState.instance.camOther;
|
|
}
|
|
return PlayState.instance.camGame;
|
|
}
|
|
|
|
// alias for above, helper function basically
|
|
public static function getCam(obj:String):Dynamic {
|
|
if (obj.toLowerCase().trim() == "global")
|
|
return FlxG.game;
|
|
return cameraFromString(obj);
|
|
}
|
|
|
|
public static function luaTrace(text:String, ignoreCheck:Bool = false, deprecated:Bool = false, color:FlxColor = FlxColor.WHITE) {
|
|
#if LUA_ALLOWED
|
|
if(ignoreCheck || getBool('luaDebugMode')) {
|
|
if(deprecated && !getBool('luaDeprecatedWarnings')) {
|
|
return;
|
|
}
|
|
PlayState.instance.addTextToDebug(text, color);
|
|
trace(text);
|
|
}
|
|
#end
|
|
}
|
|
|
|
function getErrorMessage(status:Int):String {
|
|
#if LUA_ALLOWED
|
|
var v:String = Lua.tostring(lua, -1);
|
|
Lua.pop(lua, 1);
|
|
|
|
if (v != null) v = v.trim();
|
|
if (v == null || v == "") {
|
|
switch(status) {
|
|
case Lua.LUA_ERRRUN: return "Runtime Error";
|
|
case Lua.LUA_ERRMEM: return "Memory Allocation Error";
|
|
case Lua.LUA_ERRERR: return "Critical Error";
|
|
}
|
|
return "Unknown Error";
|
|
}
|
|
|
|
return v;
|
|
#end
|
|
return null;
|
|
}
|
|
|
|
var lastCalledFunction:String = '';
|
|
public static var lastCalledScript:FunkinLua = null;
|
|
public function call(func:String, args:Array<Dynamic>):Dynamic {
|
|
#if LUA_ALLOWED
|
|
if(closed) return Function_Continue;
|
|
|
|
lastCalledFunction = func;
|
|
lastCalledScript = this;
|
|
try {
|
|
if(lua == null) return Function_Continue;
|
|
|
|
Lua.getglobal(lua, func);
|
|
var type:Int = Lua.type(lua, -1);
|
|
|
|
if (type != Lua.LUA_TFUNCTION) {
|
|
if (type > Lua.LUA_TNIL)
|
|
luaTrace("ERROR (" + func + "): attempt to call a " + typeToString(type) + " value", false, false, FlxColor.RED);
|
|
|
|
Lua.pop(lua, 1);
|
|
return Function_Continue;
|
|
}
|
|
|
|
for (arg in args) Convert.toLua(lua, arg);
|
|
var status:Int = Lua.pcall(lua, args.length, 1, 0);
|
|
|
|
// Checks if it's not successful, then show a error.
|
|
if (status != Lua.LUA_OK) {
|
|
var error:String = getErrorMessage(status);
|
|
luaTrace("ERROR (" + func + "): " + error, false, false, FlxColor.RED);
|
|
return Function_Continue;
|
|
}
|
|
|
|
// If successful, pass and then return the result.
|
|
var result:Dynamic = cast Convert.fromLua(lua, -1);
|
|
if (result == null) result = Function_Continue;
|
|
|
|
Lua.pop(lua, 1);
|
|
return result;
|
|
}
|
|
catch (e:Dynamic) {
|
|
trace(e);
|
|
}
|
|
#end
|
|
return Function_Continue;
|
|
}
|
|
|
|
static function addAnimByIndices(obj:String, name:String, prefix:String, indices:String, framerate:Int = 24, loop:Bool = false)
|
|
{
|
|
var strIndices:Array<String> = indices.trim().split(',');
|
|
var die:Array<Int> = [];
|
|
for (i in 0...strIndices.length) {
|
|
die.push(Std.parseInt(strIndices[i]));
|
|
}
|
|
|
|
if(PlayState.instance.getLuaObject(obj, false)!=null) {
|
|
var pussy:FlxSprite = PlayState.instance.getLuaObject(obj, false);
|
|
pussy.animation.addByIndices(name, prefix, die, '', framerate, loop);
|
|
if(pussy.animation.curAnim == null) {
|
|
pussy.animation.play(name, true);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
var pussy:FlxSprite = Reflect.getProperty(getInstance(), obj);
|
|
if(pussy != null) {
|
|
pussy.animation.addByIndices(name, prefix, die, '', framerate, loop);
|
|
if(pussy.animation.curAnim == null) {
|
|
pussy.animation.play(name, true);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static function getPropertyLoopThingWhatever(killMe:Array<String>, ?checkForTextsToo:Bool = true, ?getProperty:Bool=true):Dynamic
|
|
{
|
|
var coverMeInPiss:Dynamic = getObjectDirectly(killMe[0], checkForTextsToo);
|
|
var end = killMe.length;
|
|
if(getProperty)end=killMe.length-1;
|
|
|
|
for (i in 1...end) {
|
|
coverMeInPiss = getVarInArray(coverMeInPiss, killMe[i]);
|
|
}
|
|
return coverMeInPiss;
|
|
}
|
|
|
|
public static function getObjectDirectly(objectName:String, ?checkForTextsToo:Bool = true):Dynamic
|
|
{
|
|
var coverMeInPiss:Dynamic = PlayState.instance.getLuaObject(objectName, checkForTextsToo);
|
|
if(coverMeInPiss==null)
|
|
coverMeInPiss = getVarInArray(getInstance(), objectName);
|
|
|
|
return coverMeInPiss;
|
|
}
|
|
|
|
function typeToString(type:Int):String {
|
|
#if LUA_ALLOWED
|
|
switch(type) {
|
|
case Lua.LUA_TBOOLEAN: return "boolean";
|
|
case Lua.LUA_TNUMBER: return "number";
|
|
case Lua.LUA_TSTRING: return "string";
|
|
case Lua.LUA_TTABLE: return "table";
|
|
case Lua.LUA_TFUNCTION: return "function";
|
|
}
|
|
if (type <= Lua.LUA_TNIL) return "nil";
|
|
#end
|
|
return "unknown";
|
|
}
|
|
|
|
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 static function getBool(variable:String) {
|
|
if(lastCalledScript == null) return false;
|
|
|
|
var lua:State = lastCalledScript.lua;
|
|
if(lua == null) return false;
|
|
|
|
var result:String = null;
|
|
Lua.getglobal(lua, variable);
|
|
result = Convert.fromLua(lua, -1);
|
|
Lua.pop(lua, 1);
|
|
|
|
if(result == null) {
|
|
return false;
|
|
}
|
|
return (result == 'true');
|
|
}
|
|
#end
|
|
|
|
public function stop() {
|
|
#if LUA_ALLOWED
|
|
if(lua == null) {
|
|
return;
|
|
}
|
|
|
|
Lua.close(lua);
|
|
lua = null;
|
|
#end
|
|
}
|
|
|
|
public static inline function getInstance()
|
|
{
|
|
return PlayState.instance.isDead ? GameOverSubstate.instance : PlayState.instance;
|
|
}
|
|
}
|
|
|
|
class ModchartSprite extends FlxSprite
|
|
{
|
|
public var wasAdded:Bool = false;
|
|
public var animOffsets:Map<String, Array<Float>> = new Map<String, Array<Float>>();
|
|
//public var isInFront:Bool = false;
|
|
|
|
public function new(?x:Float = 0, ?y:Float = 0)
|
|
{
|
|
super(x, y);
|
|
antialiasing = ClientPrefs.globalAntialiasing;
|
|
}
|
|
}
|
|
|
|
class DebugLuaText extends FlxText
|
|
{
|
|
public var disableTime:Float = 6;
|
|
public var parentGroup:FlxTypedGroup<DebugLuaText>;
|
|
public function new(text:String, parentGroup:FlxTypedGroup<DebugLuaText>, color:FlxColor) {
|
|
this.parentGroup = parentGroup;
|
|
super(10, 10, 0, text, 16);
|
|
setFormat(Paths.font("vcr.ttf"), 16, color, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
|
|
scrollFactor.set();
|
|
borderSize = 1;
|
|
}
|
|
|
|
override function update(elapsed:Float) {
|
|
super.update(elapsed);
|
|
disableTime -= elapsed;
|
|
if(disableTime < 0) disableTime = 0;
|
|
if(disableTime < 1) alpha = disableTime;
|
|
}
|
|
}
|
|
|
|
class CustomSubstate extends MusicBeatSubstate
|
|
{
|
|
public static var name:String = 'unnamed';
|
|
public static var instance:CustomSubstate;
|
|
|
|
override function create()
|
|
{
|
|
instance = this;
|
|
|
|
PlayState.instance.callOnLuas('onCustomSubstateCreate', [name]);
|
|
super.create();
|
|
PlayState.instance.callOnLuas('onCustomSubstateCreatePost', [name]);
|
|
}
|
|
|
|
public function new(name:String)
|
|
{
|
|
CustomSubstate.name = name;
|
|
super();
|
|
cameras = [FlxG.cameras.list[FlxG.cameras.list.length - 1]];
|
|
}
|
|
|
|
override function update(elapsed:Float)
|
|
{
|
|
PlayState.instance.callOnLuas('onCustomSubstateUpdate', [name, elapsed]);
|
|
super.update(elapsed);
|
|
PlayState.instance.callOnLuas('onCustomSubstateUpdatePost', [name, elapsed]);
|
|
}
|
|
|
|
override function destroy()
|
|
{
|
|
PlayState.instance.callOnLuas('onCustomSubstateDestroy', [name]);
|
|
super.destroy();
|
|
}
|
|
}
|
|
|
|
#if hscript
|
|
class HScript
|
|
{
|
|
public static var parser:Parser = new Parser();
|
|
public var interp:Interp;
|
|
|
|
public var variables(get, never):Map<String, Dynamic>;
|
|
|
|
public function get_variables()
|
|
{
|
|
return interp.variables;
|
|
}
|
|
|
|
public function new()
|
|
{
|
|
interp = new Interp();
|
|
interp.variables.set('FlxG', FlxG);
|
|
interp.variables.set('FlxSprite', FlxSprite);
|
|
interp.variables.set('FlxCamera', FlxCamera);
|
|
interp.variables.set('FlxTimer', FlxTimer);
|
|
interp.variables.set('FlxTween', FlxTween);
|
|
interp.variables.set('FlxEase', FlxEase);
|
|
interp.variables.set('PlayState', PlayState);
|
|
interp.variables.set('game', PlayState.instance);
|
|
interp.variables.set('Paths', Paths);
|
|
interp.variables.set('Conductor', Conductor);
|
|
interp.variables.set('ClientPrefs', ClientPrefs);
|
|
interp.variables.set('Character', Character);
|
|
interp.variables.set('Alphabet', Alphabet);
|
|
interp.variables.set('CustomSubstate', CustomSubstate);
|
|
#if (!flash && sys)
|
|
interp.variables.set('FlxRuntimeShader', FlxRuntimeShader);
|
|
#end
|
|
interp.variables.set('ShaderFilter', ShaderFilter);
|
|
interp.variables.set('StringTools', StringTools);
|
|
|
|
interp.variables.set('setVar', function(name:String, value:Dynamic)
|
|
{
|
|
PlayState.instance.variables.set(name, value);
|
|
});
|
|
interp.variables.set('getVar', function(name:String)
|
|
{
|
|
var result:Dynamic = null;
|
|
if(PlayState.instance.variables.exists(name)) result = PlayState.instance.variables.get(name);
|
|
return result;
|
|
});
|
|
interp.variables.set('removeVar', function(name:String)
|
|
{
|
|
if(PlayState.instance.variables.exists(name))
|
|
{
|
|
PlayState.instance.variables.remove(name);
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
public function execute(codeToRun:String):Dynamic
|
|
{
|
|
@:privateAccess
|
|
HScript.parser.line = 1;
|
|
HScript.parser.allowTypes = true;
|
|
return interp.execute(HScript.parser.parseString(codeToRun));
|
|
}
|
|
}
|
|
#end
|
|
// hi guys, my name is "secret"!
|