diff --git a/project.xml b/project.xml index 95524498..1acc9bc3 100644 --- a/project.xml +++ b/project.xml @@ -131,7 +131,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/macros/HashLinkFixer.hx b/source/funkin/backend/system/macros/HashLinkFixer.hx index 046929e8..697d3c01 100644 --- a/source/funkin/backend/system/macros/HashLinkFixer.hx +++ b/source/funkin/backend/system/macros/HashLinkFixer.hx @@ -42,26 +42,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; @@ -70,10 +56,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; } @@ -92,16 +80,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, @@ -109,50 +120,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) { + /*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/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/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 5b065029..d2496fdf 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -1661,7 +1661,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 393f499d..d020b4eb 100644 --- a/source/funkin/game/PlayState.hx +++ b/source/funkin/game/PlayState.hx @@ -1655,9 +1655,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); @@ -1704,7 +1706,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 {