package funkin.options; import flixel.input.keyboard.FlxKey; import flixel.util.FlxSave; import openfl.Lib; /** * The save data of the engine. * Mod save data is stored in `FlxG.save.data`. **/ @:build(funkin.backend.system.macros.OptionsMacro.build()) @:build(funkin.backend.system.macros.FunkinSaveMacro.build("__save", "__flush", "__load")) class Options { @:dox(hide) @:doNotSave public static var __save:FlxSave; @:dox(hide) @:doNotSave private static var __eventAdded = false; /** * SETTINGS */ public static var naughtyness:Bool = true; public static var downscroll:Bool = false; public static var ghostTapping:Bool = true; public static var flashingMenu:Bool = true; public static var camZoomOnBeat:Bool = true; public static var fpsCounter:Bool = true; public static var autoPause:Bool = true; public static var antialiasing:Bool = true; public static var volume:Float = 1; public static var volumeMusic:Float = 1; public static var volumeSFX:Float = 1; public static var week6PixelPerfect:Bool = true; public static var gameplayShaders:Bool = true; public static var colorHealthBar:Bool = true; public static var lowMemoryMode:Bool = false; public static var devMode:Bool = false; public static var betaUpdates:Bool = false; public static var splashesEnabled:Bool = true; @:dox(hide) @:doNotSave public static var hitWindow:Float = 250; // DEPRECATED public static var songOffset:Float = 0; public static var framerate:Int = 120; public static var gpuOnlyBitmaps:Bool = #if (mac || web) false #else true #end; // causes issues on mac and web public static var language = "en"; // default to english, Flags.DEFAULT_LANGUAGE should not modify this public static var streamedMusic:Bool = true; public static var streamedVocals:Bool = false; public static var quality:Int = 1; public static var allowConfigWarning:Bool = true; #if MODCHARTING_FEATURES public static var modchartingHoldSubdivisions:Int = 4; #end public static var lastLoadedMod:String = null; /** * EDITORS SETTINGS */ public static var intensiveBlur:Bool = true; public static var editorSFX:Bool = true; public static var editorCharterPrettyPrint:Bool = false; public static var editorCharacterPrettyPrint:Bool = true; public static var editorStagePrettyPrint:Bool = true; public static var editorsResizable:Bool = true; public static var bypassEditorsResize:Bool = false; public static var maxUndos:Int = 120; public static var songOffsetAffectEditors:Bool = false; /** * QOL FEATURES */ public static var freeplayLastSong:String = null; public static var freeplayLastDifficulty:String = "normal"; public static var freeplayLastVariation:String = null; public static var contributors:Array = []; public static var mainDevs:Array = []; // IDs public static var lastUpdated:Null; /** * CHARTER */ public static var charterMetronomeEnabled:Bool = false; public static var charterShowSections:Bool = true; public static var charterShowBeats:Bool = true; public static var charterEnablePlaytestScripts:Bool = true; public static var charterRainbowWaveforms:Bool = false; public static var charterLowDetailWaveforms:Bool = false; public static var charterAutoSaves:Bool = true; public static var charterAutoSaveTime:Float = 60*5; public static var charterAutoSaveWarningTime:Float = 5; public static var charterAutoSavesSeparateFolder:Bool = false; /** * CHARACTER EDITOR */ public static var stageSelected:String = null; public static var characterHitbox:Bool = true; public static var characterCamera:Bool = true; public static var characterAxis:Bool = true; public static var characterDragging:Bool = true; public static var playAnimOnOffset:Bool = false; /** * PLAYER 1 CONTROLS */ public static var P1_NOTE_LEFT:Array = [A]; public static var P1_NOTE_DOWN:Array = [S]; public static var P1_NOTE_UP:Array = [W]; public static var P1_NOTE_RIGHT:Array = [D]; // Menus public static var P1_LEFT:Array = [A]; public static var P1_DOWN:Array = [S]; public static var P1_UP:Array = [W]; public static var P1_RIGHT:Array = [D]; public static var P1_ACCEPT:Array = [ENTER]; public static var P1_BACK:Array = [BACKSPACE]; public static var P1_PAUSE:Array = [ENTER]; public static var P1_CHANGE_MODE:Array = [TAB]; // Misc public static var P1_RESET:Array = [R]; public static var P1_SWITCHMOD:Array = [TAB]; public static var P1_VOLUME_UP:Array = [PLUS]; public static var P1_VOLUME_DOWN:Array = [MINUS]; public static var P1_VOLUME_MUTE:Array = [ZERO]; public static var P1_FPS_COUNTER:Array = [#if web THREE #else F3 #end]; // 3 on web or F3 on windows, linux and other things that runs code // Debugs public static var P1_DEV_ACCESS:Array = [SEVEN]; public static var P1_DEV_CONSOLE:Array = [F2]; public static var P1_DEV_RELOAD:Array = [F5]; /** * PLAYER 2 CONTROLS (ALT) */ // Notes public static var P2_NOTE_LEFT:Array = [LEFT]; public static var P2_NOTE_DOWN:Array = [DOWN]; public static var P2_NOTE_UP:Array = [UP]; public static var P2_NOTE_RIGHT:Array = [RIGHT]; // Menus public static var P2_LEFT:Array = [LEFT]; public static var P2_DOWN:Array = [DOWN]; public static var P2_UP:Array = [UP]; public static var P2_RIGHT:Array = [RIGHT]; public static var P2_ACCEPT:Array = [SPACE]; public static var P2_BACK:Array = [ESCAPE]; public static var P2_PAUSE:Array = [ESCAPE]; public static var P2_CHANGE_MODE:Array = []; // Misc public static var P2_RESET:Array = []; public static var P2_SWITCHMOD:Array = []; public static var P2_VOLUME_UP:Array = [NUMPADPLUS]; public static var P2_VOLUME_DOWN:Array = [NUMPADMINUS]; public static var P2_VOLUME_MUTE:Array = [NUMPADZERO]; public static var P2_FPS_COUNTER:Array = []; // Debugs public static var P2_DEV_ACCESS:Array = []; public static var P2_DEV_CONSOLE:Array = []; public static var P2_DEV_RELOAD:Array = []; /** * SOLO GETTERS */ // Notes public static var SOLO_NOTE_LEFT(get, null):Array; public static var SOLO_NOTE_DOWN(get, null):Array; public static var SOLO_NOTE_UP(get, null):Array; public static var SOLO_NOTE_RIGHT(get, null):Array; // Menus public static var SOLO_LEFT(get, null):Array; public static var SOLO_DOWN(get, null):Array; public static var SOLO_UP(get, null):Array; public static var SOLO_RIGHT(get, null):Array; public static var SOLO_ACCEPT(get, null):Array; public static var SOLO_BACK(get, null):Array; public static var SOLO_PAUSE(get, null):Array; public static var SOLO_CHANGE_MODE(get, null):Array; // Misc public static var SOLO_RESET(get, null):Array; public static var SOLO_SWITCHMOD(get, null):Array; public static var SOLO_VOLUME_UP(get, null):Array; public static var SOLO_VOLUME_DOWN(get, null):Array; public static var SOLO_VOLUME_MUTE(get, null):Array; public static var SOLO_FPS_COUNTER(get, null):Array; // Debugs public static var SOLO_DEV_ACCESS(get, null):Array; public static var SOLO_DEV_CONSOLE(get, null):Array; public static var SOLO_DEV_RELOAD(get, null):Array; public static function load() { var path = haxe.macro.Compiler.getDefine("SAVE_OPTIONS_PATH"), name = haxe.macro.Compiler.getDefine("SAVE_OPTIONS_NAME"); if (path == null) path = 'CodenameEngine'; if (name == null) name = 'options'; if (__save == null) __save = new FlxSave(); __save.bind(name, path); __load(); if (!__eventAdded) { Lib.application.onExit.add(function(i:Int) { Logs.traceColored([ Logs.getPrefix("Options"), Logs.logText("Saving "), Logs.logText("settings", GREEN), Logs.logText("...") ], VERBOSE); save(); }); __eventAdded = true; } FlxG.sound.volume = volume; applySettings(); } public static function applySettings() { applyKeybinds(); applyQuality(); FlxG.sound.defaultMusicGroup.volume = volumeMusic; FlxG.autoPause = autoPause; if (FlxG.updateFramerate < framerate) FlxG.drawFramerate = FlxG.updateFramerate = framerate; else FlxG.updateFramerate = FlxG.drawFramerate = framerate; } public static function applyQuality() { switch (quality) { case 0: antialiasing = false; lowMemoryMode = true; gameplayShaders = false; case 1: antialiasing = true; lowMemoryMode = false; gameplayShaders = true; } FlxG.game.stage.quality = (FlxG.enableAntialiasing = antialiasing) ? BEST : LOW; } public static function applyKeybinds() { PlayerSettings.solo.setKeyboardScheme(Solo); PlayerSettings.player1.setKeyboardScheme(Duo(true)); PlayerSettings.player2.setKeyboardScheme(Duo(false)); FlxG.sound.volumeUpKeys = SOLO_VOLUME_UP; FlxG.sound.volumeDownKeys = SOLO_VOLUME_DOWN; FlxG.sound.muteKeys = SOLO_VOLUME_MUTE; } public static function save() { volume = FlxG.sound.volume; __flush(); } }