diff --git a/source/funkin/ui/charSelect/CharSelectGF.hx b/source/funkin/ui/charSelect/CharSelectGF.hx index 9c4bab961..c214d54de 100644 --- a/source/funkin/ui/charSelect/CharSelectGF.hx +++ b/source/funkin/ui/charSelect/CharSelectGF.hx @@ -16,8 +16,8 @@ class CharSelectGF extends FlxAtlasSprite implements IBPMSyncedScriptedClass var fadingStatus:FadeStatus = OFF; var fadeAnimIndex:Int = 0; - var animInInfo:FramesJSFLInfo; - var animOutInfo:FramesJSFLInfo; + var animInInfo:Null; + var animOutInfo:Null; var intendedYPos:Float = 0; var intendedAlpha:Float = 0; @@ -113,8 +113,13 @@ class CharSelectGF extends FlxAtlasSprite implements IBPMSyncedScriptedClass * @param animInfo Should not be confused with animInInfo! * This is merely a local var for the function! */ - function doFade(animInfo:FramesJSFLInfo):Void + function doFade(animInfo:Null):Void { + if (animInfo == null) + { + return; + } + fadeTimer += FlxG.elapsed; if (fadeTimer >= 1 / 24) { @@ -181,6 +186,9 @@ class CharSelectGF extends FlxAtlasSprite implements IBPMSyncedScriptedClass animInInfo = FramesJSFLParser.parse(animInfoPath + '/In.txt'); animOutInfo = FramesJSFLParser.parse(animInfoPath + '/Out.txt'); + + if (animInInfo == null) trace("[ERROR] Failed to load data for animInInfo, is the path provided correct?"); + if (animOutInfo == null) trace("[ERROR] Failed to load data for animOutInfo, is the path provided correct?"); } playAnimation("idle", true, false, false); diff --git a/source/funkin/ui/charSelect/CharSelectSubState.hx b/source/funkin/ui/charSelect/CharSelectSubState.hx index 201fb9470..9c26a3984 100644 --- a/source/funkin/ui/charSelect/CharSelectSubState.hx +++ b/source/funkin/ui/charSelect/CharSelectSubState.hx @@ -92,7 +92,7 @@ class CharSelectSubState extends MusicBeatSubState new DropShadowFilter(5, 45, 0x000000, 1, 2, 2, 1, 1, false, false, false) ]; - var bopInfo:FramesJSFLInfo; + var bopInfo:Null; var blackScreen:FunkinSprite; var charHitbox:FlxObject; @@ -137,6 +137,10 @@ class CharSelectSubState extends MusicBeatSubState cutoutSize = FullScreenScaleMode.gameCutoutSize.x / 2; bopInfo = FramesJSFLParser.parse(Paths.file("images/charSelect/iconBopInfo/iconBopInfo.txt")); + if (bopInfo == null) + { + trace("[ERROR] Failed to load data for bopInfo, is the path provided correct?"); + } var bg:FlxSprite = new FlxSprite(cutoutSize + -153, -140); bg.loadGraphic(Paths.image('charSelect/charSelectBG')); @@ -1032,6 +1036,7 @@ class CharSelectSubState extends MusicBeatSubState function doBop(icon:PixelatedIcon, elapsed:Float):Void { + if (bopInfo == null) return; if (bopFr >= bopInfo.frames.length) { bopRefX = 0; diff --git a/source/funkin/util/BezierUtil.hx b/source/funkin/util/BezierUtil.hx index 37d91223b..aef443c01 100644 --- a/source/funkin/util/BezierUtil.hx +++ b/source/funkin/util/BezierUtil.hx @@ -5,6 +5,7 @@ import flixel.math.FlxPoint; /** * Utilities for performing math with bezier curves. */ +@:nullSafety class BezierUtil { /** diff --git a/source/funkin/util/ClipboardUtil.hx b/source/funkin/util/ClipboardUtil.hx index 2796bcad6..5302c2864 100644 --- a/source/funkin/util/ClipboardUtil.hx +++ b/source/funkin/util/ClipboardUtil.hx @@ -5,6 +5,7 @@ package funkin.util; * On platforms that don't support interacting with the clipboard, * an internal clipboard is used (neat!). */ +@:nullSafety class ClipboardUtil { /** @@ -14,7 +15,7 @@ class ClipboardUtil * @param once If true, the callback will only execute once and then be deleted. * @param priority Set the priority at which the callback will be executed. Higher values execute first. */ - public static function addListener(callback:Void->Void, once:Bool = false, ?priority:Int = 0):Void + public static function addListener(callback:Void->Void, once:Bool = false, priority:Int = 0):Void { lime.system.Clipboard.onUpdate.add(callback, once, priority); } diff --git a/source/funkin/util/Constants.hx b/source/funkin/util/Constants.hx index 8de4cc983..6af1d2365 100644 --- a/source/funkin/util/Constants.hx +++ b/source/funkin/util/Constants.hx @@ -8,6 +8,7 @@ import lime.app.Application; /** * A store of unchanging, globally relevant values. */ +@:nullSafety class Constants { /** diff --git a/source/funkin/util/DateUtil.hx b/source/funkin/util/DateUtil.hx index f899ffeb2..2ae378d2e 100644 --- a/source/funkin/util/DateUtil.hx +++ b/source/funkin/util/DateUtil.hx @@ -3,9 +3,10 @@ package funkin.util; /** * Utilities for performing operations on dates. */ +@:nullSafety class DateUtil { - public static function generateTimestamp(?date:Date = null):String + public static function generateTimestamp(?date:Date):String { if (date == null) date = Date.now(); @@ -13,7 +14,7 @@ class DateUtil '${date.getFullYear()}-${Std.string(date.getMonth() + 1).lpad('0', 2)}-${Std.string(date.getDate()).lpad('0', 2)}-${Std.string(date.getHours()).lpad('0', 2)}-${Std.string(date.getMinutes()).lpad('0', 2)}-${Std.string(date.getSeconds()).lpad('0', 2)}'; } - public static function generateCleanTimestamp(?date:Date = null):String + public static function generateCleanTimestamp(?date:Date):String { if (date == null) date = Date.now(); diff --git a/source/funkin/util/EaseUtil.hx b/source/funkin/util/EaseUtil.hx index 200e74d07..c6f817d2c 100644 --- a/source/funkin/util/EaseUtil.hx +++ b/source/funkin/util/EaseUtil.hx @@ -1,5 +1,6 @@ package funkin.util; +@:nullSafety class EaseUtil { /** diff --git a/source/funkin/util/FlxColorUtil.hx b/source/funkin/util/FlxColorUtil.hx index 429d536d8..adca6df24 100644 --- a/source/funkin/util/FlxColorUtil.hx +++ b/source/funkin/util/FlxColorUtil.hx @@ -5,6 +5,7 @@ import flixel.util.FlxColor; /** * Non inline FlxColor functions for use in hscript files */ +@:nullSafety class FlxColorUtil { /** diff --git a/source/funkin/util/FlxGamepadUtil.hx b/source/funkin/util/FlxGamepadUtil.hx index 4fea7500b..738161cd0 100644 --- a/source/funkin/util/FlxGamepadUtil.hx +++ b/source/funkin/util/FlxGamepadUtil.hx @@ -8,6 +8,7 @@ import lime.ui.GamepadButton as LimeGamepadButton; /** * Utilities for working with Flixel gamepads. */ +@:nullSafety class FlxGamepadUtil { public static function getInputID(gamepad:FlxGamepad, button:LimeGamepadButton):FlxGamepadInputID @@ -33,14 +34,14 @@ class FlxGamepadUtil #end } - @:privateAccess public static function getFlxGamepadByLimeGamepad(gamepad:LimeGamepad):FlxGamepad { // Why is this so elaborate? @:privateAccess - var gameInputDevice:openfl.ui.GameInputDevice = openfl.ui.GameInput.__getDevice(gamepad); - @:privateAccess - var gamepadIndex:Int = FlxG.gamepads.findGamepadIndex(gameInputDevice); - return FlxG.gamepads.getByID(gamepadIndex); + { + var gameInputDevice:openfl.ui.GameInputDevice = openfl.ui.GameInput.__getDevice(gamepad); + var gamepadIndex:Int = FlxG.gamepads.findGamepadIndex(gameInputDevice); + return FlxG.gamepads.getByID(gamepadIndex); + } } } diff --git a/source/funkin/util/FlxTweenUtil.hx b/source/funkin/util/FlxTweenUtil.hx index 4a8806bf8..d091b5754 100644 --- a/source/funkin/util/FlxTweenUtil.hx +++ b/source/funkin/util/FlxTweenUtil.hx @@ -2,6 +2,7 @@ package funkin.util; import flixel.tweens.FlxTween; +@:nullSafety class FlxTweenUtil { public static function pauseTween(tween:FlxTween):Void diff --git a/source/funkin/util/FramesJSFLParser.hx b/source/funkin/util/FramesJSFLParser.hx index 3a9ff8d0a..ca3d349e6 100644 --- a/source/funkin/util/FramesJSFLParser.hx +++ b/source/funkin/util/FramesJSFLParser.hx @@ -7,13 +7,17 @@ import openfl.Assets; * Homemade dipshit proprietary format to get simple animation info out of flash! * Pure convienience! */ +@:nullSafety class FramesJSFLParser { - public static function parse(path:String):FramesJSFLInfo + public static function parse(path:String):Null { var text:String = Assets.getText(path); - - // TODO: error handle if text is null + if (text == null) + { + trace('[ERROR] Could not load FramesJSFL data asset from path $path'); + return null; + } var output:FramesJSFLInfo = {frames: []}; diff --git a/source/funkin/util/HaxeUIUtil.hx b/source/funkin/util/HaxeUIUtil.hx index 1ffd9cd40..d063a5b19 100644 --- a/source/funkin/util/HaxeUIUtil.hx +++ b/source/funkin/util/HaxeUIUtil.hx @@ -2,16 +2,17 @@ package funkin.util; import haxe.ui.tooltips.ToolTipRegionOptions; +@:nullSafety class HaxeUIUtil { - public static function buildTooltip(text:String, ?left:Float, ?top:Float, ?width:Float, ?height:Float):ToolTipRegionOptions + public static function buildTooltip(text:String, left:Float = 0.0, top:Float = 0.0, width:Float = 0.0, height:Float = 0.0):ToolTipRegionOptions { return { tipData: {text: text}, - left: left ?? 0.0, - top: top ?? 0.0, - width: width ?? 0.0, - height: height ?? 0.0 + left: left, + top: top, + width: width, + height: height } } } diff --git a/source/funkin/util/InputUtil.hx b/source/funkin/util/InputUtil.hx index 8f4fcc55f..17e9ececa 100644 --- a/source/funkin/util/InputUtil.hx +++ b/source/funkin/util/InputUtil.hx @@ -2,6 +2,7 @@ package funkin.util; import funkin.input.Controls.Device; import flixel.input.gamepad.FlxGamepad; +import flixel.input.gamepad.FlxGamepadInputID; import flixel.input.keyboard.FlxKey; using flixel.util.FlxStringUtil; @@ -9,6 +10,7 @@ using flixel.util.FlxStringUtil; /** * Utilities for working with inputs. */ +@:nullSafety class InputUtil { public static function format(id:Int, device:Device):String @@ -79,7 +81,7 @@ class InputUtil case NUMPADPLUS: "#+"; case NUMPADPERIOD: "#."; case NUMPADMULTIPLY: "#*"; - default: titleCase(FlxKey.toStringMap[id]); + default: titleCase(FlxKey.toStringMap[id] ?? '?'); } } @@ -89,12 +91,12 @@ class InputUtil { return switch (gamepad.getInputLabel(id)) { - // case null | "": shortenButtonName(FlxGamepadInputID.toStringMap[id]); + case null, "": shortenButtonName(FlxGamepadInputID.toStringMap[id]); case label: shortenButtonName(label); } } - static function shortenButtonName(name:String) + static function shortenButtonName(name:Null) { return switch (name == null ? "" : name.toLowerCase()) { @@ -145,6 +147,7 @@ class InputUtil } } +@:nullSafety @:forward enum abstract ControllerName(String) from String to String { @@ -170,7 +173,7 @@ enum abstract ControllerName(String) from String to String } } - static public function getAsset(gamepad:FlxGamepad):String + static public function getAsset(gamepad:Null):String { if (gamepad == null) return 'assets/images/ui/devices/Keys.png'; diff --git a/source/funkin/util/MathUtil.hx b/source/funkin/util/MathUtil.hx index 0ba113a1e..41624fd91 100644 --- a/source/funkin/util/MathUtil.hx +++ b/source/funkin/util/MathUtil.hx @@ -3,6 +3,7 @@ package funkin.util; /** * Utilities for performing mathematical operations. */ +@:nullSafety class MathUtil { /** @@ -56,7 +57,7 @@ class MathUtil return (result == Math.NaN) ? 1.0 : result; } - public static function easeInOutBack(x:Float, ?c:Float = 1.70158):Float + public static function easeInOutBack(x:Float, c:Float = 1.70158):Float { if (x <= 0.0) return 0.0; if (x >= 1.0) return 1.0; @@ -64,14 +65,14 @@ class MathUtil return (result == Math.NaN) ? 1.0 : result; } - public static function easeInBack(x:Float, ?c:Float = 1.70158):Float + public static function easeInBack(x:Float, c:Float = 1.70158):Float { if (x <= 0.0) return 0.0; if (x >= 1.0) return 1.0; return (1 + c) * x * x * x - c * x * x; } - public static function easeOutBack(x:Float, ?c:Float = 1.70158):Float + public static function easeOutBack(x:Float, c:Float = 1.70158):Float { if (x <= 0.0) return 0.0; if (x >= 1.0) return 1.0; diff --git a/source/funkin/util/MemoryUtil.hx b/source/funkin/util/MemoryUtil.hx index 10b38c03a..3e9239bf9 100644 --- a/source/funkin/util/MemoryUtil.hx +++ b/source/funkin/util/MemoryUtil.hx @@ -11,6 +11,7 @@ package funkin.util; * @see https://github.com/HaxeFoundation/hxcpp/blob/master/docs/build_xml/Defines.md * @see cpp.vm.Gc */ +@:nullSafety class MemoryUtil { public static function buildGCInfo():String diff --git a/source/funkin/util/MouseUtil.hx b/source/funkin/util/MouseUtil.hx index fa498a9a5..59bb7eef2 100644 --- a/source/funkin/util/MouseUtil.hx +++ b/source/funkin/util/MouseUtil.hx @@ -5,6 +5,7 @@ import flixel.math.FlxPoint; /** * Utility functions related to the mouse. */ +@:nullSafety class MouseUtil { static var oldCamPos:FlxPoint = new FlxPoint(); diff --git a/source/funkin/util/PlatformUtil.hx b/source/funkin/util/PlatformUtil.hx index ae8c1dcee..f9554406f 100644 --- a/source/funkin/util/PlatformUtil.hx +++ b/source/funkin/util/PlatformUtil.hx @@ -3,6 +3,7 @@ package funkin.util; /** * Utility functions related to specific platforms. */ +@:nullSafety class PlatformUtil { /** diff --git a/source/funkin/util/SerializerUtil.hx b/source/funkin/util/SerializerUtil.hx index b94a1066e..cc7e3b5d1 100644 --- a/source/funkin/util/SerializerUtil.hx +++ b/source/funkin/util/SerializerUtil.hx @@ -14,6 +14,7 @@ typedef ScoreInput = * Functions dedicated to serializing and deserializing data. * NOTE: Use `json2object` wherever possible, it's way more efficient. */ +@:nullSafety class SerializerUtil { static final INDENT_CHAR = "\t"; @@ -48,7 +49,7 @@ class SerializerUtil /** * Convert a JSON byte array to a Haxe object. */ - public static function fromJSONBytes(input:Bytes):Dynamic + public static function fromJSONBytes(input:Bytes):Null { try { diff --git a/source/funkin/util/SortUtil.hx b/source/funkin/util/SortUtil.hx index f6d3721f0..96e7a2028 100644 --- a/source/funkin/util/SortUtil.hx +++ b/source/funkin/util/SortUtil.hx @@ -22,6 +22,7 @@ import funkin.data.song.SongData.SongNoteData; * You may consider using one of the functions in `funkin.util.tools.ArraySortTools` instead. * NOTE: Both sort functions modify the array in-place. You may consider using `Reflect.copy()` to make a copy of the array before sorting. */ +@:nullSafety class SortUtil { /** @@ -97,7 +98,7 @@ class SortUtil * @param b The second string to compare. * @return 1 if `a` comes before `b`, -1 if `b` comes before `a`, 0 if they are equal */ - public static function alphabetically(?a:String, ?b:String):Int + public static function alphabetically(a:String, b:String):Int { a = a.toUpperCase(); b = b.toUpperCase(); diff --git a/source/funkin/util/TrackerToolButtonUtil.hx b/source/funkin/util/TrackerToolButtonUtil.hx index 161d92650..7000a8737 100644 --- a/source/funkin/util/TrackerToolButtonUtil.hx +++ b/source/funkin/util/TrackerToolButtonUtil.hx @@ -9,6 +9,7 @@ import flixel.system.debug.interaction.tools.Tool; * FlxDebugger Interaction window, which when pressed will open a * tracking window corresponding to whatever currently selected objects are */ +@:nullSafety class TrackerToolButtonUtil extends Tool { override function init(brain:Interaction):Tool diff --git a/source/funkin/util/TrackerUtil.hx b/source/funkin/util/TrackerUtil.hx index a2552f63e..e6a1e953d 100644 --- a/source/funkin/util/TrackerUtil.hx +++ b/source/funkin/util/TrackerUtil.hx @@ -7,6 +7,7 @@ import flixel.FlxG; /** * Utility class that helps manage adding profiles to the flixel debugger tracker */ +@:nullSafety class TrackerUtil { /** diff --git a/source/funkin/util/VersionUtil.hx b/source/funkin/util/VersionUtil.hx index 475275cb3..f8ee61377 100644 --- a/source/funkin/util/VersionUtil.hx +++ b/source/funkin/util/VersionUtil.hx @@ -9,6 +9,7 @@ import thx.semver.Version.Identifier.StringId; * increment the minor version (1.x.0) if you make a new feature (but previous content is still compatible), * and increment the major version (x.0.0) if you make a breaking change (e.g. new API or reorganized file format). */ +@:nullSafety class VersionUtil { /** @@ -32,6 +33,7 @@ class VersionUtil } } + @:nullSafety(Off) public static function repairVersion(version:thx.semver.Version):thx.semver.Version { var versionData:thx.semver.Version.SemVer = version; @@ -109,7 +111,7 @@ class VersionUtil * @param input The JSON string to parse. * @return The semantic version, or null if it could not be parsed. */ - public static function parseVersion(input:Dynamic):Null + public static function parseVersion(input:Null):Null { if (input == null) return null; diff --git a/source/funkin/util/WindowUtil.hx b/source/funkin/util/WindowUtil.hx index 38076c5bd..85734c6fc 100644 --- a/source/funkin/util/WindowUtil.hx +++ b/source/funkin/util/WindowUtil.hx @@ -14,6 +14,7 @@ using StringTools; #include ') #end +@:nullSafety class WindowUtil { /** diff --git a/source/funkin/util/assets/DataAssets.hx b/source/funkin/util/assets/DataAssets.hx index b38c993fe..8f827ad06 100644 --- a/source/funkin/util/assets/DataAssets.hx +++ b/source/funkin/util/assets/DataAssets.hx @@ -1,5 +1,6 @@ package funkin.util.assets; +@:nullSafety class DataAssets { static function buildDataPath(path:String):String @@ -7,7 +8,7 @@ class DataAssets return 'assets/data/${path}'; } - public static function listDataFilesInPath(path:String, ?suffix:String = '.json'):Array + public static function listDataFilesInPath(path:String, suffix:String = '.json'):Array { var textAssets = openfl.utils.Assets.list(TEXT); diff --git a/source/funkin/util/assets/FlxAnimationUtil.hx b/source/funkin/util/assets/FlxAnimationUtil.hx index ee5b0edec..cf435cdff 100644 --- a/source/funkin/util/assets/FlxAnimationUtil.hx +++ b/source/funkin/util/assets/FlxAnimationUtil.hx @@ -4,6 +4,7 @@ import flixel.FlxSprite; import flixel.graphics.frames.FlxFramesCollection; import funkin.data.animation.AnimationData; +@:nullSafety class FlxAnimationUtil { /** @@ -11,6 +12,7 @@ class FlxAnimationUtil */ public static function addAtlasAnimation(target:FlxSprite, anim:AnimationData):Void { + if (anim.prefix == null) return; var frameRate = anim.frameRate == null ? 24 : anim.frameRate; var looped = anim.looped == null ? false : anim.looped; var flipX = anim.flipX == null ? false : anim.flipX; @@ -49,6 +51,7 @@ class FlxAnimationUtil */ public static function combineFramesCollections(a:FlxFramesCollection, b:FlxFramesCollection):FlxFramesCollection { + @:nullSafety(Off) var result:FlxFramesCollection = new FlxFramesCollection(null, ATLAS, null); for (frame in a.frames) diff --git a/source/funkin/util/assets/SoundUtil.hx b/source/funkin/util/assets/SoundUtil.hx index 0b932cd0c..8af62e4d9 100644 --- a/source/funkin/util/assets/SoundUtil.hx +++ b/source/funkin/util/assets/SoundUtil.hx @@ -5,6 +5,7 @@ import openfl.media.Sound as OpenFLSound; import funkin.audio.FunkinSound; import lime.media.AudioBuffer; +@:nullSafety class SoundUtil { /** @@ -18,7 +19,7 @@ class SoundUtil if (input == null) return null; var openflSound:OpenFLSound = OpenFLSound.fromAudioBuffer(AudioBuffer.fromBytes(input)); - var output:FunkinSound = FunkinSound.load(openflSound, 1.0, false); - return output; + if (openflSound == null) return null; + return FunkinSound.load(openflSound, 1.0, false); } } diff --git a/source/funkin/util/logging/AnsiTrace.hx b/source/funkin/util/logging/AnsiTrace.hx index 552489327..e59561489 100644 --- a/source/funkin/util/logging/AnsiTrace.hx +++ b/source/funkin/util/logging/AnsiTrace.hx @@ -1,5 +1,6 @@ package funkin.util.logging; +@:nullSafety class AnsiTrace { /** @@ -41,7 +42,7 @@ class AnsiTrace * Format the output to use ANSI colors. * Edited from the standard `trace()` implementation. */ - public static function formatOutput(v:Dynamic, infos:haxe.PosInfos):String + public static function formatOutput(v:Dynamic, ?infos:haxe.PosInfos):String { var str = Std.string(v); if (infos == null) return str; diff --git a/source/funkin/util/logging/Perf.hx b/source/funkin/util/logging/Perf.hx index 83da7a32f..2940985d4 100644 --- a/source/funkin/util/logging/Perf.hx +++ b/source/funkin/util/logging/Perf.hx @@ -12,6 +12,7 @@ package funkin.util.logging; * perf.print(); * ``` */ +@:nullSafety class Perf { final startTime:Float; diff --git a/source/funkin/util/macro/ClassMacro.hx b/source/funkin/util/macro/ClassMacro.hx index 0918d4085..9d15508ce 100644 --- a/source/funkin/util/macro/ClassMacro.hx +++ b/source/funkin/util/macro/ClassMacro.hx @@ -10,6 +10,7 @@ import haxe.macro.Type.ClassType; * This code is a bitch glad Jason figured it out. * Based on code from CompileTime: https://github.com/jasononeil/compiletime */ +@:nullSafety class ClassMacro { /** diff --git a/source/funkin/util/macro/CompiledClassList.hx b/source/funkin/util/macro/CompiledClassList.hx index 68415b1be..e7ad721ac 100644 --- a/source/funkin/util/macro/CompiledClassList.hx +++ b/source/funkin/util/macro/CompiledClassList.hx @@ -5,9 +5,11 @@ import haxe.rtti.Meta; /** * A complement to `ClassMacro`. See `ClassMacro` for more information. */ +@:nullSafety class CompiledClassList { - static var classLists:Map>>; + static var classLists:Map>> = []; + static var initialized:Bool = false; /** * Class lists are injected into this class's metadata during the typing phase. @@ -15,7 +17,7 @@ class CompiledClassList */ static function init():Void { - classLists = []; + initialized = true; // Meta.getType returns Dynamic>. var metaData = Meta.getType(CompiledClassList); @@ -48,9 +50,9 @@ class CompiledClassList } } - public static function get(request:String):List> + public static function get(request:String):Null>> { - if (classLists == null) init(); + if (!initialized) init(); if (!classLists.exists(request)) { diff --git a/source/funkin/util/macro/FlxMacro.hx b/source/funkin/util/macro/FlxMacro.hx index cec6b72ec..b31a0a03a 100644 --- a/source/funkin/util/macro/FlxMacro.hx +++ b/source/funkin/util/macro/FlxMacro.hx @@ -2,6 +2,7 @@ package funkin.util.macro; #if !display #if macro +@:nullSafety class FlxMacro { /** diff --git a/source/funkin/util/macro/GitCommit.hx b/source/funkin/util/macro/GitCommit.hx index 9e3305c41..04f173c56 100644 --- a/source/funkin/util/macro/GitCommit.hx +++ b/source/funkin/util/macro/GitCommit.hx @@ -1,6 +1,7 @@ package funkin.util.macro; #if !display +@:nullSafety class GitCommit { /** diff --git a/source/funkin/util/macro/HaxelibVersions.hx b/source/funkin/util/macro/HaxelibVersions.hx index 63cfb2bc7..76f987bfa 100644 --- a/source/funkin/util/macro/HaxelibVersions.hx +++ b/source/funkin/util/macro/HaxelibVersions.hx @@ -2,6 +2,7 @@ package funkin.util.macro; import haxe.io.Path; +@:nullSafety class HaxelibVersions { public static macro function getLibraryVersions():haxe.macro.Expr.ExprOf> diff --git a/source/funkin/util/macro/InlineMacro.hx b/source/funkin/util/macro/InlineMacro.hx index c40257409..0ec6d572a 100644 --- a/source/funkin/util/macro/InlineMacro.hx +++ b/source/funkin/util/macro/InlineMacro.hx @@ -7,6 +7,7 @@ using funkin.util.tools.ArrayTools; /** * A macro to make fields inline. */ +@:nullSafety class InlineMacro { /** diff --git a/source/funkin/util/macro/MacroUtil.hx b/source/funkin/util/macro/MacroUtil.hx index bbe6e71af..d9e644194 100644 --- a/source/funkin/util/macro/MacroUtil.hx +++ b/source/funkin/util/macro/MacroUtil.hx @@ -7,6 +7,7 @@ import haxe.macro.Type; /** * A collection of utility functions for Haxe macros. */ +@:nullSafety class MacroUtil { /** diff --git a/source/funkin/util/plugins/EvacuateDebugPlugin.hx b/source/funkin/util/plugins/EvacuateDebugPlugin.hx index eb292b852..54e12300e 100644 --- a/source/funkin/util/plugins/EvacuateDebugPlugin.hx +++ b/source/funkin/util/plugins/EvacuateDebugPlugin.hx @@ -6,6 +6,7 @@ import flixel.FlxBasic; * A plugin which adds functionality to press `F4` to immediately transition to the main menu. * This is useful for debugging or if you get softlocked or something. */ +@:nullSafety class EvacuateDebugPlugin extends FlxBasic { public function new() diff --git a/source/funkin/util/plugins/ForceCrashPlugin.hx b/source/funkin/util/plugins/ForceCrashPlugin.hx index 6f402c4e0..faa2cb2e9 100644 --- a/source/funkin/util/plugins/ForceCrashPlugin.hx +++ b/source/funkin/util/plugins/ForceCrashPlugin.hx @@ -6,6 +6,7 @@ import flixel.FlxBasic; * A plugin which forcibly crashes the application. * TODO: Should we disable this in release builds? */ +@:nullSafety class ForceCrashPlugin extends FlxBasic { public function new() diff --git a/source/funkin/util/plugins/MemoryGCPlugin.hx b/source/funkin/util/plugins/MemoryGCPlugin.hx index d6fb632da..44dc486d1 100644 --- a/source/funkin/util/plugins/MemoryGCPlugin.hx +++ b/source/funkin/util/plugins/MemoryGCPlugin.hx @@ -5,6 +5,7 @@ import flixel.FlxBasic; /** * A plugin which adds functionality to press `Ins` to immediately perform memory garbage collection. */ +@:nullSafety class MemoryGCPlugin extends FlxBasic { public function new() diff --git a/source/funkin/util/plugins/NewgroundsMedalPlugin.hx b/source/funkin/util/plugins/NewgroundsMedalPlugin.hx index eb34a4940..4aa21980b 100644 --- a/source/funkin/util/plugins/NewgroundsMedalPlugin.hx +++ b/source/funkin/util/plugins/NewgroundsMedalPlugin.hx @@ -10,13 +10,14 @@ import funkin.graphics.adobeanimate.FlxAtlasSprite; import flixel.math.FlxRect; import funkin.api.newgrounds.Medals; +@:nullSafety class NewgroundsMedalPlugin extends FlxTypedContainer { - var medal:FlxAtlasSprite = null; - var points:FlxText = null; - var name:FlxText = null; + var medal:FlxAtlasSprite; + var points:FlxText; + var name:FlxText; - public static var instance:NewgroundsMedalPlugin = null; + public static var instance:Null = null; var tween:Bool = false; @@ -65,7 +66,7 @@ class NewgroundsMedalPlugin extends FlxTypedContainer medal.visible = false; var fr = medal.anim.curSymbol.timeline.get(0).get(0); - fr.name = "START"; // woerkaround + if (fr != null) fr.name = "START"; // woerkaround // fr.add(() -> FunkinSound.playOnce(Paths.sound('NGFadeIn'), 1.)); medal.anim.getFrameLabel("show").add(function() { @@ -73,6 +74,8 @@ class NewgroundsMedalPlugin extends FlxTypedContainer name.visible = true; if (name.width > name.clipRect.width) { + // TODO: Remove this once FlxText.get_size deals with TextFormat's nullable size properly + @:nullSafety(Off) am = (name.text.length * (name.size + 2) * 1.25) / name.clipRect.width * 10; tween = true; // FlxTimer.wait(0.3, () -> tween = true); @@ -115,7 +118,9 @@ class NewgroundsMedalPlugin extends FlxTypedContainer instance = new NewgroundsMedalPlugin(); FlxG.plugins.addPlugin(instance); - instance.medal.anim.onComplete.add(function() { + // instance is defined above so there's no need to worry about null safety here + @:nullSafety(Off) + instance.medal.anim?.onComplete.add(function() { if (instance.funcs.length > 0) { instance.funcs.shift()(); @@ -123,8 +128,9 @@ class NewgroundsMedalPlugin extends FlxTypedContainer }); } - public static function play(points:Int = 100, name:String = "I LOVE CUM I LOVE CUM I LOVE CUM I LOVE CUM", graphic:FlxGraphic = null) + public static function play(points:Int = 100, name:String = "I LOVE CUM I LOVE CUM I LOVE CUM I LOVE CUM", ?graphic:FlxGraphic) { + if (instance == null) return; var func = function() { instance.points.visible = false; instance.name.visible = false; diff --git a/source/funkin/util/plugins/ReloadAssetsDebugPlugin.hx b/source/funkin/util/plugins/ReloadAssetsDebugPlugin.hx index 0e1e238ac..b4a3d8a90 100644 --- a/source/funkin/util/plugins/ReloadAssetsDebugPlugin.hx +++ b/source/funkin/util/plugins/ReloadAssetsDebugPlugin.hx @@ -9,6 +9,7 @@ import funkin.ui.MusicBeatSubState; * A plugin which adds functionality to press `F5` to reload all game assets, then reload the current state. * This is useful for hot reloading assets during development. */ +@:nullSafety class ReloadAssetsDebugPlugin extends FlxBasic { public function new() diff --git a/source/funkin/util/plugins/VolumePlugin.hx b/source/funkin/util/plugins/VolumePlugin.hx index 9fdb65558..83ad9ae3e 100644 --- a/source/funkin/util/plugins/VolumePlugin.hx +++ b/source/funkin/util/plugins/VolumePlugin.hx @@ -5,6 +5,7 @@ import flixel.FlxBasic; /** * Handles volume control in a way that is compatible with alternate control schemes. */ +@:nullSafety class VolumePlugin extends FlxBasic { public function new() diff --git a/source/funkin/util/tools/ArraySortTools.hx b/source/funkin/util/tools/ArraySortTools.hx index 9a3f8b349..37800136a 100644 --- a/source/funkin/util/tools/ArraySortTools.hx +++ b/source/funkin/util/tools/ArraySortTools.hx @@ -4,6 +4,7 @@ package funkin.util.tools; * Contains code for sorting arrays using various algorithms. * @see https://algs4.cs.princeton.edu/20sorting/ */ +@:nullSafety class ArraySortTools { /** diff --git a/source/funkin/util/tools/ArrayTools.hx b/source/funkin/util/tools/ArrayTools.hx index ffad260a5..92ba82e7e 100644 --- a/source/funkin/util/tools/ArrayTools.hx +++ b/source/funkin/util/tools/ArrayTools.hx @@ -3,6 +3,7 @@ package funkin.util.tools; /** * A static extension which provides utility functions for Arrays. */ +@:nullSafety class ArrayTools { /* diff --git a/source/funkin/util/tools/FloatTools.hx b/source/funkin/util/tools/FloatTools.hx index e34110490..168b2605b 100644 --- a/source/funkin/util/tools/FloatTools.hx +++ b/source/funkin/util/tools/FloatTools.hx @@ -3,6 +3,7 @@ package funkin.util.tools; /** * Utilities for performing common math operations. */ +@:nullSafety class FloatTools { /** @@ -16,7 +17,7 @@ class FloatTools /** Round a float to a certain number of decimal places. **/ - public static function round(number:Float, ?precision = 2):Float + public static function round(number:Float, precision:Int = 2):Float { number *= Math.pow(10, precision); return Math.round(number) / Math.pow(10, precision); diff --git a/source/funkin/util/tools/ICloneable.hx b/source/funkin/util/tools/ICloneable.hx index 33f19f167..49679fd0b 100644 --- a/source/funkin/util/tools/ICloneable.hx +++ b/source/funkin/util/tools/ICloneable.hx @@ -4,6 +4,7 @@ package funkin.util.tools; * Implement this on a class to enable `Array.deepClone()` to work on it. * NOTE: T should be the type of the class that implements this interface. */ +@:nullSafety interface ICloneable { public function clone():T; diff --git a/source/funkin/util/tools/Int64Tools.hx b/source/funkin/util/tools/Int64Tools.hx index b6ac84ade..a63f708e0 100644 --- a/source/funkin/util/tools/Int64Tools.hx +++ b/source/funkin/util/tools/Int64Tools.hx @@ -5,6 +5,7 @@ import haxe.Int64; /** * Why `haxe.Int64` doesn't have a built-in `toFloat` function is beyond me. */ +@:nullSafety class Int64Tools { private inline static var MAX_32_PRECISION:Float = 4294967296.0; diff --git a/source/funkin/util/tools/IntTools.hx b/source/funkin/util/tools/IntTools.hx index 1d660ad1b..5e61aac69 100644 --- a/source/funkin/util/tools/IntTools.hx +++ b/source/funkin/util/tools/IntTools.hx @@ -3,6 +3,7 @@ package funkin.util.tools; /** * Utilities for performing common math operations. */ +@:nullSafety class IntTools { /** diff --git a/source/funkin/util/tools/IteratorTools.hx b/source/funkin/util/tools/IteratorTools.hx index 49d9477f6..2297eedf7 100644 --- a/source/funkin/util/tools/IteratorTools.hx +++ b/source/funkin/util/tools/IteratorTools.hx @@ -7,6 +7,7 @@ package funkin.util.tools; * * @see https://haxe.org/manual/lf-static-extension.html */ +@:nullSafety class IteratorTools { public static function array(iterator:Iterator):Array diff --git a/source/funkin/util/tools/MapTools.hx b/source/funkin/util/tools/MapTools.hx index 807f0aebd..65ae23b67 100644 --- a/source/funkin/util/tools/MapTools.hx +++ b/source/funkin/util/tools/MapTools.hx @@ -7,12 +7,13 @@ package funkin.util.tools; * * @see https://haxe.org/manual/lf-static-extension.html */ +@:nullSafety class MapTools { /** * Return the quantity of keys in the map. */ - public static function size(map:Map):Int + public static function size(map:Null>):Int { if (map == null) return 0; return map.keys().array().length; @@ -21,7 +22,7 @@ class MapTools /** * Return a list of values from the map, as an array. */ - public static function values(map:Map):Array + public static function values(map:Null>):Array { if (map == null) return []; return [for (i in map.iterator()) i]; @@ -30,7 +31,7 @@ class MapTools /** * Create a new array with all elements of the given array, to prevent modifying the original. */ - public static function clone(map:Map):Map + public static function clone(map:Null>):Null> { if (map == null) return null; return map.copy(); @@ -77,7 +78,7 @@ class MapTools * Return a list of keys from the map (as an array, rather than an iterator). * TODO: Rename this? */ - public static function keyValues(map:Map):Array + public static function keyValues(map:Null>):Array { if (map == null) return []; return map.keys().array(); diff --git a/source/funkin/util/tools/SongEventDataArrayTools.hx b/source/funkin/util/tools/SongEventDataArrayTools.hx index 38e298dde..5ecb151a6 100644 --- a/source/funkin/util/tools/SongEventDataArrayTools.hx +++ b/source/funkin/util/tools/SongEventDataArrayTools.hx @@ -5,6 +5,7 @@ import funkin.data.song.SongData.SongEventData; /** * A static extension which provides utility functions for `Array`s. */ +@:nullSafety class SongEventDataArrayTools { /** diff --git a/source/funkin/util/tools/SongNoteDataArrayTools.hx b/source/funkin/util/tools/SongNoteDataArrayTools.hx index b93303b81..28e1e90e9 100644 --- a/source/funkin/util/tools/SongNoteDataArrayTools.hx +++ b/source/funkin/util/tools/SongNoteDataArrayTools.hx @@ -5,6 +5,7 @@ import funkin.data.song.SongData.SongNoteData; /** * A static extension which provides utility functions for `Array`s. */ +@:nullSafety class SongNoteDataArrayTools { /** diff --git a/source/funkin/util/tools/StringTools.hx b/source/funkin/util/tools/StringTools.hx index cb660db05..92fa10d56 100644 --- a/source/funkin/util/tools/StringTools.hx +++ b/source/funkin/util/tools/StringTools.hx @@ -3,6 +3,7 @@ package funkin.util.tools; /** * A static extension which provides utility functions for Strings. */ +@:nullSafety class StringTools { /**