diff --git a/libraries/macro-fixer/macros/HashLinkFixer.hx b/libraries/macro-fixer/macros/HashLinkFixer.hx
index 86c73b0a..cdff3fe4 100644
--- a/libraries/macro-fixer/macros/HashLinkFixer.hx
+++ b/libraries/macro-fixer/macros/HashLinkFixer.hx
@@ -43,26 +43,12 @@ class HashLinkFixer {
var cl = clRef.get();
if (cl.isAbstract || cl.isExtern || cl.isInterface) return fields;
- if (!cl.name.endsWith("_Impl_") && !cl.name.endsWith("_HSX") && !cl.name.endsWith("_HSC") && !cl.name.endsWith("_HLFHelper")) {
- var metas = cl.meta.get();
-
+ if (!cl.name.endsWith("_Impl_") && !cl.name.endsWith("_HSX") && !cl.name.endsWith("_HSC")) {
if(cl.params.length > 0)
return fields;
- if(cl.module == "EReg") return fields; // private typedef in same class
- if(cl.module == "hl.Format") return fields; // enum in same class
-
var definedFields = [];
- var helperClass = macro class {
-
- };
-
- helperClass.pos = cl.pos;
-
- var module = cl.module + "_HLFHelper";
- var hcClassName = cl.name + "_HLFHelper";
-
for(f in fields.copy()) {
if (f == null)
continue;
@@ -71,10 +57,12 @@ class HashLinkFixer {
if(definedFields.contains(f.name)) continue; // no duplicate fields
+ var hlNativeMeta = null;
var hasHlNative = false;
for(m in f.meta)
if (m.name == ":hlNative") {
hasHlNative = true;
+ hlNativeMeta = m;
break;
}
@@ -93,16 +81,39 @@ class HashLinkFixer {
var overrideExpr:Expr;
var returns:Bool = !fun.ret.match(TPath({name: "Void"}));
+ var printer = new haxe.macro.Printer();
+ if(cl.module == "hl.Gc" && fun.ret == null) returns = false; // fix since they dont explicitly set :Void
+ if(cl.module == "hl.Format" && fun.ret == null) returns = false; // fix since they dont explicitly set :Void
+
var name = 'hlf_${f.name}';
var arguments = fun.args == null ? [] : [for(a in fun.args) macro $i{a.name}];
- var funcExpr:Expr = returns ? {
- //macro return $i{name}($a{arguments});
- macro return @:privateAccess $i{hcClassName}.$name($a{arguments});
- } : {
- macro @:privateAccess $i{hcClassName}.$name($a{arguments});
- };
+ var funcExpr:Expr = macro @:privateAccess $i{name}($a{arguments});
+ if(returns) funcExpr = macro return $funcExpr;
+
+ var cleanMeta = f.meta.copy().filter(function(m) return m.name != ":hlNative");
+ var hasBareMeta = hlNativeMeta.params.length == 0;
+
+ var meta = f.meta.copy();
+ switch hlNativeMeta {
+ case {params: []}:
+ meta = [{name: ":hlNative", params: [macro "std", macro $v{f.name}], pos: Context.currentPos()}].concat(cleanMeta);
+ case {params: [_.expr => EConst(CString(name))]}:
+ meta = [{name: ":hlNative", params: [macro "std", macro $v{name}], pos: Context.currentPos()}].concat(cleanMeta);
+ case {params: [_.expr => EConst(CFloat(version))]}:
+ var curVersion = Context.definedValue("hl_ver");
+ if(curVersion == null) curVersion = "";
+ if(version > curVersion) {
+ meta = cleanMeta;
+ if(f.meta.filter((m) -> m.name == ":noExpr").length > 0)
+ Context.error("Missing function body", f.pos);
+ funcExpr = fun.expr; // restore to default behaviour
+ } else {
+ meta = [{name: ":hlNative", params: [macro "std", macro $v{f.name}], pos: Context.currentPos()}].concat(cleanMeta);
+ }
+ default:
+ }
var fiel:Field = {
name: name,
@@ -110,50 +121,32 @@ class HashLinkFixer {
kind: FFun({
ret: fun.ret,
params: fun.params.copy(),
- expr: fun.expr,
+ expr: funcExpr,
args: fun.args.copy()
}),
- access: f.access.copy(),
- meta: f.meta.copy()
+ access: f.access.copy().filter(function(a) return a != APublic && a != APrivate).concat([APrivate]),
+ meta: meta
};
- helperClass.fields.push(fiel);
+ fields.push(fiel);
definedFields.push(f.name);
+ // Remove meta from original function
for(m in f.meta.copy())
if (m.name == ":hlNative") {
f.meta.remove(m);
}
- fun.expr = funcExpr;
default:
}
}
- helperClass.pack = cl.pack.copy();
- helperClass.pos = cl.pos;
- helperClass.name = hcClassName;
+ /*if(definedFields.length > 0) {
+ trace(cl.module);
- if(definedFields.length > 0) {
- //trace(cl.module);
-
- /*for(m in metas.copy()) {
- trace(" " + m.name);
- if(m.name == ":coreApi") {
- metas.remove(m);
- }
- }*/
-
- var imports = Context.getLocalImports().copy();
- Context.defineModule(module, [helperClass], imports);
-
- Context.getLocalImports().push({
- path: [for(m in module.split(".")) {
- name: m,
- pos: Context.currentPos()
- }],
- mode: INormal
- });
- }
+ var printer = new haxe.macro.Printer();
+ for(field in fields) if(field.name.startsWith("hlf_"))
+ Sys.println(printer.printField(field));
+ }*/
}
return fields;
diff --git a/project.xml b/project.xml
index c8bd462f..3d38069a 100644
--- a/project.xml
+++ b/project.xml
@@ -134,7 +134,7 @@
-
+
diff --git a/source/funkin/backend/scripting/events/NoteHitEvent.hx b/source/funkin/backend/scripting/events/NoteHitEvent.hx
index 4bac078e..6b761aed 100644
--- a/source/funkin/backend/scripting/events/NoteHitEvent.hx
+++ b/source/funkin/backend/scripting/events/NoteHitEvent.hx
@@ -123,6 +123,13 @@ final class NoteHitEvent extends CancellableEvent {
@:dox(hide)
public function cancelDeletion() {preventDeletion();}
+ /**
+ * Forces the note to be deleted.
+ **/
+ public function forceDeletion() {
+ deleteNote = true;
+ }
+
/**
* Prevents the vocals volume from being set to 1 after pressing the note.
*/
diff --git a/source/funkin/backend/system/framerate/FlixelInfo.hx b/source/funkin/backend/system/framerate/FlixelInfo.hx
index 259b7f8f..297fcde7 100644
--- a/source/funkin/backend/system/framerate/FlixelInfo.hx
+++ b/source/funkin/backend/system/framerate/FlixelInfo.hx
@@ -1,5 +1,7 @@
package funkin.backend.system.framerate;
+import funkin.backend.scripting.ModState;
+
class FlixelInfo extends FramerateCategory {
public function new() {
super("Flixel Info");
@@ -14,7 +16,12 @@ class FlixelInfo extends FramerateCategory {
for(_ in FlxG.bitmap._cache.keys())
c++;
- _text = 'State: ${Type.getClassName(Type.getClass(FlxG.state))}';
+ if((FlxG.state is ModState)) {
+ var state:ModState = cast FlxG.state;
+ _text = "Mod State: " + state.scriptName;
+ } else {
+ _text = 'State: ${Type.getClassName(Type.getClass(FlxG.state))}';
+ }
_text += '\nObject Count: ${FlxG.state.members.length}';
_text += '\nCamera Count: ${FlxG.cameras.list.length}';
_text += '\nBitmaps Count: ${c}';
@@ -22,9 +29,9 @@ class FlixelInfo extends FramerateCategory {
_text += '\nFlxG.game Childs Count: ${FlxG.game.numChildren}';
// _text += '\nCached objects count: ${cachedObjects}';
#if FLX_POINT_POOL
- var points = flixel.math.FlxPoint.FlxBasePoint.pool;
+ //var points = flixel.math.FlxPoint.FlxBasePoint.pool;
//_text += '\nPoint Count: ${points._count} | +${points.made} | -${points.gotten} | ${points.balance} | >${points.putted}';
- _text += '\nPoint Count: ${points._count}';
+ //_text += '\nPoint Count: ${points._count}';
#end
}
diff --git a/source/funkin/backend/system/github/GitHub.hx b/source/funkin/backend/system/github/GitHub.hx
index 6129a2d9..515e2f63 100644
--- a/source/funkin/backend/system/github/GitHub.hx
+++ b/source/funkin/backend/system/github/GitHub.hx
@@ -4,6 +4,7 @@ import haxe.Exception;
#if GITHUB_API
import haxe.Json;
#end
+import haxe.Exception;
// TODO: Document further and perhaps make this a Haxelib.
class GitHub {
diff --git a/source/funkin/backend/system/updating/AsyncUpdater.hx b/source/funkin/backend/system/updating/AsyncUpdater.hx
index ac31b044..36b79ad4 100644
--- a/source/funkin/backend/system/updating/AsyncUpdater.hx
+++ b/source/funkin/backend/system/updating/AsyncUpdater.hx
@@ -99,7 +99,7 @@ class AsyncUpdater {
progress.files = files.length;
progress.step = DOWNLOADING_ASSETS;
trace('starting assets download');
- doFile([for(e in files) e], fileNames.copy(), function() {
+ doFile(files.copy(), fileNames.copy(), function() {
progress.curFile = -1;
progress.curFileName = null;
progress.files = 1;
diff --git a/source/funkin/backend/utils/DiscordUtil.hx b/source/funkin/backend/utils/DiscordUtil.hx
index dfee8ad7..20b58da2 100644
--- a/source/funkin/backend/utils/DiscordUtil.hx
+++ b/source/funkin/backend/utils/DiscordUtil.hx
@@ -525,7 +525,7 @@ typedef DPresence =
var ?button1Url:String; /* max 512 bytes */
var ?button2Label:String; /* max 32 bytes */
var ?button2Url:String; /* max 512 bytes */
- var ?activityType:ActivityType;
+ var ?activityType:#if DISCORD_RPC ActivityType #else Dynamic #end;
var ?streamUrl:String; /* max 512 bytes */
}
diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx
index be6d13a7..b7f5aa7a 100644
--- a/source/funkin/editors/charter/Charter.hx
+++ b/source/funkin/editors/charter/Charter.hx
@@ -1672,7 +1672,7 @@ class Charter extends UIState {
changeNoteSustain(-1);
function _note_selectall(_) {
- selection = [for (note in notesGroup.members) note];
+ selection = cast notesGroup.members.copy();
}
function _note_selectmeasure(_) {
diff --git a/source/funkin/game/PlayState.hx b/source/funkin/game/PlayState.hx
index 555fba89..d85479cd 100644
--- a/source/funkin/game/PlayState.hx
+++ b/source/funkin/game/PlayState.hx
@@ -1661,9 +1661,11 @@ class PlayState extends MusicBeatState
var event:NoteHitEvent;
if (strumLine != null && !strumLine.cpu)
- event = scripts.event("onPlayerHit", EventManager.get(NoteHitEvent).recycle(false, !note.isSustainNote, !note.isSustainNote, note, strumLine.characters, true, note.noteType, note.animSuffix.getDefault(note.strumID < strumLine.members.length ? strumLine.members[note.strumID].animSuffix : strumLine.animSuffix), "game/score/", "", note.strumID, score, note.isSustainNote ? null : accuracy, 0.023, daRating, Options.splashesEnabled && !note.isSustainNote && daRating == "sick"));
+ event = EventManager.get(NoteHitEvent).recycle(false, !note.isSustainNote, !note.isSustainNote, note, strumLine.characters, true, note.noteType, note.animSuffix.getDefault(note.strumID < strumLine.members.length ? strumLine.members[note.strumID].animSuffix : strumLine.animSuffix), "game/score/", "", note.strumID, score, note.isSustainNote ? null : accuracy, 0.023, daRating, Options.splashesEnabled && !note.isSustainNote && daRating == "sick");
else
- event = scripts.event("onDadHit", EventManager.get(NoteHitEvent).recycle(false, false, false, note, strumLine.characters, false, note.noteType, note.animSuffix.getDefault(note.strumID < strumLine.members.length ? strumLine.members[note.strumID].animSuffix : strumLine.animSuffix), "game/score/", "", note.strumID, 0, null, 0, daRating, false));
+ event = EventManager.get(NoteHitEvent).recycle(false, false, false, note, strumLine.characters, false, note.noteType, note.animSuffix.getDefault(note.strumID < strumLine.members.length ? strumLine.members[note.strumID].animSuffix : strumLine.animSuffix), "game/score/", "", note.strumID, 0, null, 0, daRating, false);
+ event.deleteNote = !note.isSustainNote; // work around, to allow sustain notes to be deleted
+ event = scripts.event(strumLine != null && !strumLine.cpu ? "onPlayerHit" : "onDadHit", event);
strumLine.onHit.dispatch(event);
scripts.event("onNoteHit", event);
@@ -1710,7 +1712,7 @@ class PlayState extends MusicBeatState
}
}
- if (event.deleteNote && !note.isSustainNote) strumLine.deleteNote(note);
+ if (event.deleteNote) strumLine.deleteNote(note);
}
public function displayRating(myRating:String, ?evt:NoteHitEvent = null):Void {