Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions modSource/scripts/import.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#if !macro
package scripts;
import funkin.backend.scripting.HardcodedScript;
import funkin.backend.scripting.events.*;
import funkin.backend.scripting.events.character.*;
import funkin.backend.scripting.events.dialogue.*;
import funkin.backend.scripting.events.discord.*;
import funkin.backend.scripting.events.gameover.*;
import funkin.backend.scripting.events.gameplay.*;
import funkin.backend.scripting.events.healthicon.*;
import funkin.backend.scripting.events.menu.*;
import funkin.backend.scripting.events.note.*;
import funkin.backend.scripting.events.shader.*;
import funkin.backend.scripting.events.soundtray.*;
import funkin.backend.scripting.events.splash.*;
import funkin.backend.scripting.events.sprite.*;
import funkin.backend.scripting.events.stage.*;

import StringTools;
import haxe.Json;
import Xml;

import openfl.utils.Assets;
import lime.app.Application;
import funkin.backend.system.Main;

import flixel.FlxG;
import flixel.FlxSprite;
import flixel.FlxBasic;
import flixel.FlxCamera;
import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween;
import flixel.sound.FlxSound;
import flixel.system.FlxAssets;
import flixel.math.FlxMath;
import flixel.group.FlxGroup;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.group.FlxSpriteGroup;
import flixel.addons.text.FlxTypeText;
import flixel.text.FlxText;
import flixel.util.FlxTimer;
import flixel.math.FlxPoint;
import flixel.util.FlxAxes;
import flixel.util.FlxColor;
import funkin.backend.scripting.ModState;
import funkin.backend.scripting.ModSubState;
import funkin.game.PlayState;
import funkin.game.GameOverSubstate;
import funkin.game.HealthIcon;
import funkin.game.HudCamera;
import funkin.game.Note;
import funkin.game.Strum;
import funkin.game.StrumLine;
import funkin.game.Character;
import funkin.menus.PauseSubState;
import funkin.menus.FreeplayState;
import funkin.menus.MainMenuState;
import funkin.menus.PauseSubState;
import funkin.menus.StoryMenuState;
import funkin.menus.TitleState;
import funkin.options.Options;
import funkin.backend.assets.Paths;
import funkin.backend.system.Conductor;
import funkin.backend.shaders.FunkinShader;
import funkin.backend.shaders.CustomShader;
import funkin.backend.FunkinText;
import animate.FlxAnimate;
import funkin.backend.FunkinSprite;
import funkin.menus.ui.Alphabet;
import funkin.backend.system.Flags;

import funkin.backend.utils.CoolUtil;
import funkin.backend.utils.IniUtil;
import funkin.backend.utils.XMLUtil;
#if sys
import funkin.backend.utils.ZipUtil;
#end
import funkin.backend.utils.MarkdownUtil;
import funkin.backend.utils.EngineUtil;
import funkin.backend.utils.ThreadUtil;
import funkin.backend.utils.MemoryUtil;
import funkin.backend.utils.BitmapUtil;
import funkin.backend.utils.TranslationUtil;
#end
4 changes: 4 additions & 0 deletions project.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,9 @@
<!-- Disable a optimization, to allow reflection to use more functions -->
<define name="FLX_NO_GENERIC" />

<!-- Uncomment this to enabled hardcoded scripts. -->
<!-- <define name="HARDCODED_SCRIPTS" /> -->

<!-- _______________________________ Libraries ______________________________ -->

<!-- KEEP BOTH OF THESE AS THERE ARE SOME PARTICULAR CASES! -->
Expand Down Expand Up @@ -150,6 +153,7 @@
<set name="BUILD_DIR" value="latest/" if="beta" />

<source name="source" />
<source name="modSource" if="HARDCODED_SCRIPTS" />

<define name="PRELOAD_ALL" unless="web" />
<define name="NO_PRELOAD_ALL" unless="PRELOAD_ALL"/>
Expand Down
17 changes: 17 additions & 0 deletions source/funkin/backend/scripting/HScript.hx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ class HScript extends Script {
//public var folderlessPath:String;
var __importedPaths:Array<String>;

#if HARDCODED_SCRIPTS
public var trackedSets:Array<String> = [];
#end

public static function initParser() {
var parser = new Parser();
parser.allowJSON = parser.allowMetadata = parser.allowTypes = true;
Expand Down Expand Up @@ -146,6 +150,10 @@ class HScript extends Script {
if (expr != null) {
interp.execute(expr);
call("new", []);

#if HARDCODED_SCRIPTS
if (Flags.CONVERT_HSCRIPT_TO_SOURCE) HardcodedScriptPrinter.convertHscript(this);
#end
}

#if GLOBAL_SCRIPT
Expand Down Expand Up @@ -195,6 +203,15 @@ class HScript extends Script {

public override function set(val:String, value:Dynamic) {
interp.variables.set(val, value);
#if HARDCODED_SCRIPTS
if (Flags.CONVERT_HSCRIPT_TO_SOURCE) {
if (!trackedSets.contains(val)) {
if (!(value is Class)) {
trackedSets.push(val);
}
}
}
#end
}

public override function trace(v:Dynamic) {
Expand Down
99 changes: 99 additions & 0 deletions source/funkin/backend/scripting/HardcodedScript.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package funkin.backend.scripting;

#if HARDCODED_SCRIPTS
class HardcodedScript<T> extends Script {
private var parent:T = null;
private var handleErrors:Bool = true;
private var disableAfterError:Bool = false;
private var publicVariables:Map<String, Dynamic> = [];
private var dynamicVariables:Map<String, Dynamic> = [];

public override function get(v:String) {
if (Reflect.getProperty(this, v) != null) return Reflect.getProperty(this, v);
if (Reflect.getProperty(parent, v) != null) return Reflect.getProperty(parent, v);
return dynamicVariables.get(v);
}
public override function set(v:String, v2:Dynamic) {
if (v2 is Class) return;

if (Reflect.getProperty(this, v) != null) {
Reflect.setProperty(this, v, v2);
return;
}
if (Reflect.getProperty(parent, v) != null) {
Reflect.setProperty(parent, v, v2);
return;
}
dynamicVariables.set(v, v2);
}

public function getDynamic(v:String) {
return dynamicVariables.get(v);
}
public function setDynamic(v:String, v2:Dynamic) {
dynamicVariables.set(v, v2);
}
public function getPublic(v:String) {
return publicVariables.get(v);
}
public function setPublic(v:String, v2:Dynamic) {
publicVariables.set(v, v2);
}
public function getStatic(v:String) {
return Script.staticVariables.get(v);
}
public function setStatic(v:String, v2:Dynamic) {
Script.staticVariables.set(v, v2);
}
/*public function importScript(path:String) {
//TODO
}*/

public override function setParent(variable:Dynamic) { parent = variable; }
public override function setPublicMap(map:Map<String, Dynamic>) { this.publicVariables = map; }

public override function onCall(method:String, parameters:Array<Dynamic>):Dynamic {
var func = Reflect.getProperty(this, method);
if (Reflect.isFunction(func)) {
if (handleErrors) {
var ret = null;
try {
ret = (parameters != null && parameters.length > 0) ? Reflect.callMethod(null, func, parameters) : func();
} catch(e) {
_errorHandler(e);
}
return ret;
}
return (parameters != null && parameters.length > 0) ? Reflect.callMethod(null, func, parameters) : func();
}
return null;
}
private function _errorHandler(error:haxe.Exception) {
var fileName = this.fileName;
for (item in error.stack) {
switch(item) {
case FilePos(s, file, line, col):
fileName = file + ":" + line;
default:
}
break;
}

Logs.traceColored([
Logs.logText(fileName + ': ', GREEN),
Logs.logText(error.toString(), RED)
], ERROR);

if (disableAfterError) {
active = false;
}
}

public override function load() {
if (!didLoad) {
onCall("initVars", []); //initVars generated from HardcodedScriptVarMacro.hx
}
super.load();
}
}
#end
Loading