From d66c7749e063a1814a48b004362c90cc25d7ec9b Mon Sep 17 00:00:00 2001 From: bctix <51544115+bctix@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:12:42 +0800 Subject: [PATCH] Number type options + Framerate option (#180) --- assets/data/config/options.xml | 1 + source/funkin/options/OptionsMenu.hx | 10 ++++ source/funkin/options/OptionsScreen.hx | 4 ++ .../options/categories/AppearanceOptions.hx | 17 ++++++ source/funkin/options/type/NumOption.hx | 58 +++++++++++++++++++ source/funkin/options/type/OptionType.hx | 4 +- 6 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 source/funkin/options/type/NumOption.hx diff --git a/assets/data/config/options.xml b/assets/data/config/options.xml index 9fd925a7..e14baa09 100644 --- a/assets/data/config/options.xml +++ b/assets/data/config/options.xml @@ -2,6 +2,7 @@ + diff --git a/source/funkin/options/OptionsMenu.hx b/source/funkin/options/OptionsMenu.hx index 9e722c61..b0546bc6 100644 --- a/source/funkin/options/OptionsMenu.hx +++ b/source/funkin/options/OptionsMenu.hx @@ -1,5 +1,6 @@ package funkin.options; +import funkin.backend.system.framerate.Framerate; import funkin.options.type.Checkbox; import haxe.xml.Access; import flixel.tweens.FlxTween; @@ -48,6 +49,8 @@ class OptionsMenu extends TreeMenu { bg.antialiasing = true; add(bg); + Framerate.offset.y = 60; + main = new OptionsScreen("Options", "Select a category to continue.", [for(o in mainOptions) new TextOption(o.name, o.desc, function() { if (o.substate != null) { persistentUpdate = false; @@ -111,6 +114,13 @@ class OptionsMenu extends TreeMenu { continue; } options.push(new Checkbox(name, desc, node.att.id, FlxG.save.data)); + + case "number": + if (!node.has.id) { + Logs.trace("A number option requires an \"id\" for option saving.", WARNING); + continue; + } + options.push(new NumOption(name, desc, Std.parseFloat(node.att.min), Std.parseFloat(node.att.max), Std.parseFloat(node.att.change), node.att.id, null, FlxG.save.data)); case "menu": options.push(new TextOption(name + " >", desc, function() { optionsTree.add(new OptionsScreen(name, desc, parseOptionsFromXML(node))); diff --git a/source/funkin/options/OptionsScreen.hx b/source/funkin/options/OptionsScreen.hx index fa21032e..c642d06a 100644 --- a/source/funkin/options/OptionsScreen.hx +++ b/source/funkin/options/OptionsScreen.hx @@ -45,6 +45,10 @@ class OptionsScreen extends FlxTypedSpriteGroup { members[curSelected].selected = true; if (controls.ACCEPT || FlxG.mouse.justReleased) members[curSelected].onSelect(); + if (controls.LEFT_P) + members[curSelected].onChangeSelection(-1); + if (controls.RIGHT_P) + members[curSelected].onChangeSelection(1); } if (controls.BACK || FlxG.mouse.justReleasedRight) close(); diff --git a/source/funkin/options/categories/AppearanceOptions.hx b/source/funkin/options/categories/AppearanceOptions.hx index ca7d5565..7d4986a9 100644 --- a/source/funkin/options/categories/AppearanceOptions.hx +++ b/source/funkin/options/categories/AppearanceOptions.hx @@ -3,6 +3,14 @@ package funkin.options.categories; class AppearanceOptions extends OptionsScreen { public override function new() { super("Appearance", "Change Appearance options such as Flashing menus..."); + add(new NumOption( + "Framerate", + "Pretty self explanitory isn't it?", + 30, // minimum + 240, // maximum + 10, // change + "framerate", // save name or smth + __changeFPS)); // callback add(new Checkbox( "Antialiasing", "If unchecked, will disable antialiasing on every sprite. Can boost performances at the cost of sharper, more pixely sprites", @@ -32,4 +40,13 @@ class AppearanceOptions extends OptionsScreen { "If checked, switching windows will pause the game", "autoPause")); } + + private function __changeFPS(change:Float) + { + // if statement cause of the flixel warning + if(FlxG.updateFramerate < Std.int(change)) + FlxG.drawFramerate = FlxG.updateFramerate = Std.int(change); + else + FlxG.updateFramerate = FlxG.drawFramerate = Std.int(change); + } } \ No newline at end of file diff --git a/source/funkin/options/type/NumOption.hx b/source/funkin/options/type/NumOption.hx new file mode 100644 index 00000000..fb490f10 --- /dev/null +++ b/source/funkin/options/type/NumOption.hx @@ -0,0 +1,58 @@ +package funkin.options.type; + +import flixel.effects.FlxFlicker; + +class NumOption extends OptionType { + public var selectCallback:Float->Void; + + private var __text:Alphabet; + private var __number:Alphabet; + + public var min:Float; + public var max:Float; + + public var currentSelection:Float; + public var changeVal:Float; + + var optionName:String; + + public var parent:Dynamic; + + public var text(get, set):String; + private function get_text() {return __text.text;} + private function set_text(v:String) {return __text.text = v;} + + public function new(text:String, desc:String, min:Float, max:Float, changeVal:Float, optionName:String, ?selectCallback:Float->Void = null, ?parent:Dynamic) { + super(desc); + this.selectCallback = selectCallback; + this.min = min; + this.max = max; + if (parent == null) + parent = Options; + + this.parent = parent; + + if(Reflect.field(parent, optionName) != null) + this.currentSelection = Reflect.field(parent, optionName); + this.changeVal = changeVal; + this.optionName = optionName; + + add(__text = new Alphabet(100, 20, text, true)); + add(__number = new Alphabet(__text.width + 120, -30, ': $currentSelection', false)); + } + + public override function draw() { + super.draw(); + } + + public override function onChangeSelection(change:Float):Void + { + if(currentSelection <= min && change == -1 || currentSelection >= max && change == 1 ) return; + currentSelection += change*changeVal; + __number.text = ': $currentSelection'; + + Reflect.setField(parent, optionName, currentSelection); + if(selectCallback != null) + selectCallback(currentSelection); + } +} \ No newline at end of file diff --git a/source/funkin/options/type/OptionType.hx b/source/funkin/options/type/OptionType.hx index 7014791b..67b5785c 100644 --- a/source/funkin/options/type/OptionType.hx +++ b/source/funkin/options/type/OptionType.hx @@ -16,9 +16,9 @@ class OptionType extends FlxSpriteGroup { private function get_controls() {return PlayerSettings.solo.controls;} - public function onSelect() { + public function onSelect() {} - } + public function onChangeSelection(change:Float) {} public override function update(elapsed:Float) { super.update(elapsed);