2023-11-07 09:04:22 +00:00
|
|
|
package funkin.ui.options;
|
2021-03-27 00:09:04 +00:00
|
|
|
|
2021-04-04 17:17:46 +00:00
|
|
|
import flixel.FlxCamera;
|
|
|
|
import flixel.FlxObject;
|
2021-03-27 01:22:07 +00:00
|
|
|
import flixel.FlxSprite;
|
2023-10-17 04:38:28 +00:00
|
|
|
import flixel.group.FlxSpriteGroup.FlxTypedSpriteGroup;
|
2022-03-08 08:13:53 +00:00
|
|
|
import funkin.ui.AtlasText.AtlasFont;
|
2023-11-07 09:04:22 +00:00
|
|
|
import funkin.ui.options.OptionsState.Page;
|
2024-02-13 06:38:11 +00:00
|
|
|
import funkin.graphics.FunkinCamera;
|
2022-04-18 23:36:09 +00:00
|
|
|
import funkin.ui.TextMenuList.TextMenuItem;
|
2024-07-01 11:42:50 +00:00
|
|
|
import funkin.audio.FunkinSound;
|
|
|
|
import funkin.ui.options.MenuItemEnums;
|
|
|
|
import funkin.ui.options.items.CheckboxPreferenceItem;
|
|
|
|
import funkin.ui.options.items.NumberPreferenceItem;
|
|
|
|
import funkin.ui.options.items.EnumPreferenceItem;
|
2021-03-27 00:09:04 +00:00
|
|
|
|
2022-03-08 08:13:53 +00:00
|
|
|
class PreferencesMenu extends Page
|
2021-03-27 00:09:04 +00:00
|
|
|
{
|
2023-01-23 03:25:45 +00:00
|
|
|
var items:TextMenuList;
|
2023-10-17 04:38:28 +00:00
|
|
|
var preferenceItems:FlxTypedSpriteGroup<FlxSprite>;
|
2023-01-23 03:25:45 +00:00
|
|
|
|
|
|
|
var menuCamera:FlxCamera;
|
|
|
|
var camFollow:FlxObject;
|
|
|
|
|
|
|
|
public function new()
|
|
|
|
{
|
|
|
|
super();
|
|
|
|
|
2024-04-10 18:45:07 +00:00
|
|
|
menuCamera = new FunkinCamera('prefMenu');
|
2023-01-23 03:25:45 +00:00
|
|
|
FlxG.cameras.add(menuCamera, false);
|
|
|
|
menuCamera.bgColor = 0x0;
|
|
|
|
camera = menuCamera;
|
|
|
|
|
|
|
|
add(items = new TextMenuList());
|
2023-10-17 04:38:28 +00:00
|
|
|
add(preferenceItems = new FlxTypedSpriteGroup<FlxSprite>());
|
2023-01-23 03:25:45 +00:00
|
|
|
|
2023-10-17 04:38:28 +00:00
|
|
|
createPrefItems();
|
2023-01-23 03:25:45 +00:00
|
|
|
|
|
|
|
camFollow = new FlxObject(FlxG.width / 2, 0, 140, 70);
|
|
|
|
if (items != null) camFollow.y = items.selectedItem.y;
|
|
|
|
|
|
|
|
menuCamera.follow(camFollow, null, 0.06);
|
|
|
|
var margin = 160;
|
|
|
|
menuCamera.deadzone.set(0, margin, menuCamera.width, 40);
|
|
|
|
menuCamera.minScrollY = 0;
|
|
|
|
|
2023-06-08 20:30:45 +00:00
|
|
|
items.onChange.add(function(selected) {
|
2023-01-23 03:25:45 +00:00
|
|
|
camFollow.y = selected.y;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2023-10-17 04:38:28 +00:00
|
|
|
/**
|
|
|
|
* Create the menu items for each of the preferences.
|
|
|
|
*/
|
|
|
|
function createPrefItems():Void
|
2023-01-23 03:25:45 +00:00
|
|
|
{
|
2023-10-17 04:38:28 +00:00
|
|
|
createPrefItemCheckbox('Naughtyness', 'Toggle displaying raunchy content', function(value:Bool):Void {
|
|
|
|
Preferences.naughtyness = value;
|
|
|
|
}, Preferences.naughtyness);
|
|
|
|
createPrefItemCheckbox('Downscroll', 'Enable to make notes move downwards', function(value:Bool):Void {
|
|
|
|
Preferences.downscroll = value;
|
|
|
|
}, Preferences.downscroll);
|
|
|
|
createPrefItemCheckbox('Flashing Lights', 'Disable to dampen flashing effects', function(value:Bool):Void {
|
|
|
|
Preferences.flashingLights = value;
|
|
|
|
}, Preferences.flashingLights);
|
|
|
|
createPrefItemCheckbox('Camera Zooming on Beat', 'Disable to stop the camera bouncing to the song', function(value:Bool):Void {
|
|
|
|
Preferences.zoomCamera = value;
|
|
|
|
}, Preferences.zoomCamera);
|
|
|
|
createPrefItemCheckbox('Debug Display', 'Enable to show FPS and other debug stats', function(value:Bool):Void {
|
|
|
|
Preferences.debugDisplay = value;
|
|
|
|
}, Preferences.debugDisplay);
|
|
|
|
createPrefItemCheckbox('Auto Pause', 'Automatically pause the game when it loses focus', function(value:Bool):Void {
|
|
|
|
Preferences.autoPause = value;
|
|
|
|
}, Preferences.autoPause);
|
2024-09-12 19:38:44 +00:00
|
|
|
|
|
|
|
#if web
|
|
|
|
createPrefItemCheckbox('Unlocked Framerate', 'Enable to unlock the framerate', function(value:Bool):Void {
|
|
|
|
Preferences.unlockedFramerate = value;
|
|
|
|
}, Preferences.unlockedFramerate);
|
|
|
|
#end
|
2023-01-23 03:25:45 +00:00
|
|
|
}
|
|
|
|
|
2024-07-01 11:42:50 +00:00
|
|
|
override function update(elapsed:Float):Void
|
2023-01-23 03:25:45 +00:00
|
|
|
{
|
|
|
|
super.update(elapsed);
|
|
|
|
|
2023-10-17 04:38:28 +00:00
|
|
|
// Indent the selected item.
|
2023-06-08 20:30:45 +00:00
|
|
|
items.forEach(function(daItem:TextMenuItem) {
|
2024-07-01 11:42:50 +00:00
|
|
|
var thyOffset:Int = 0;
|
|
|
|
|
|
|
|
// Initializing thy text width (if thou text present)
|
|
|
|
var thyTextWidth:Int = 0;
|
|
|
|
if (Std.isOfType(daItem, EnumPreferenceItem)) thyTextWidth = cast(daItem, EnumPreferenceItem).lefthandText.getWidth();
|
|
|
|
else if (Std.isOfType(daItem, NumberPreferenceItem)) thyTextWidth = cast(daItem, NumberPreferenceItem).lefthandText.getWidth();
|
|
|
|
|
|
|
|
if (thyTextWidth != 0)
|
|
|
|
{
|
|
|
|
// Magic number because of the weird offset thats being added by default
|
|
|
|
thyOffset += thyTextWidth - 75;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (items.selectedItem == daItem)
|
|
|
|
{
|
|
|
|
thyOffset += 150;
|
|
|
|
}
|
2023-01-23 03:25:45 +00:00
|
|
|
else
|
2024-07-01 11:42:50 +00:00
|
|
|
{
|
|
|
|
thyOffset += 120;
|
|
|
|
}
|
|
|
|
|
|
|
|
daItem.x = thyOffset;
|
2023-01-23 03:25:45 +00:00
|
|
|
});
|
|
|
|
}
|
2021-03-27 01:22:07 +00:00
|
|
|
|
2024-07-01 11:42:50 +00:00
|
|
|
// - Preference item creation methods -
|
|
|
|
// Should be moved into a separate PreferenceItems class but you can't access PreferencesMenu.items and PreferencesMenu.preferenceItems from outside.
|
2023-01-23 03:25:45 +00:00
|
|
|
|
2024-07-01 11:42:50 +00:00
|
|
|
/**
|
|
|
|
* Creates a pref item that works with booleans
|
|
|
|
* @param onChange Gets called every time the player changes the value; use this to apply the value
|
|
|
|
* @param defaultValue The value that is loaded in when the pref item is created (usually your Preferences.settingVariable)
|
|
|
|
*/
|
|
|
|
function createPrefItemCheckbox(prefName:String, prefDesc:String, onChange:Bool->Void, defaultValue:Bool):Void
|
2023-01-23 03:25:45 +00:00
|
|
|
{
|
2024-07-01 11:42:50 +00:00
|
|
|
var checkbox:CheckboxPreferenceItem = new CheckboxPreferenceItem(0, 120 * (items.length - 1 + 1), defaultValue);
|
2023-01-23 03:25:45 +00:00
|
|
|
|
2024-07-01 11:42:50 +00:00
|
|
|
items.createItem(0, (120 * items.length) + 30, prefName, AtlasFont.BOLD, function() {
|
|
|
|
var value = !checkbox.currentValue;
|
|
|
|
onChange(value);
|
|
|
|
checkbox.currentValue = value;
|
|
|
|
});
|
2023-01-23 03:25:45 +00:00
|
|
|
|
2024-07-01 11:42:50 +00:00
|
|
|
preferenceItems.add(checkbox);
|
2023-01-23 03:25:45 +00:00
|
|
|
}
|
|
|
|
|
2024-07-01 11:42:50 +00:00
|
|
|
/**
|
|
|
|
* Creates a pref item that works with general numbers
|
|
|
|
* @param onChange Gets called every time the player changes the value; use this to apply the value
|
|
|
|
* @param valueFormatter Will get called every time the game needs to display the float value; use this to change how the displayed value looks
|
|
|
|
* @param defaultValue The value that is loaded in when the pref item is created (usually your Preferences.settingVariable)
|
|
|
|
* @param min Minimum value (example: 0)
|
|
|
|
* @param max Maximum value (example: 10)
|
|
|
|
* @param step The value to increment/decrement by (default = 0.1)
|
|
|
|
* @param precision Rounds decimals up to a `precision` amount of digits (ex: 4 -> 0.1234, 2 -> 0.12)
|
|
|
|
*/
|
|
|
|
function createPrefItemNumber(prefName:String, prefDesc:String, onChange:Float->Void, ?valueFormatter:Float->String, defaultValue:Int, min:Int, max:Int,
|
|
|
|
step:Float = 0.1, precision:Int):Void
|
2023-01-23 03:25:45 +00:00
|
|
|
{
|
2024-07-01 11:42:50 +00:00
|
|
|
var item = new NumberPreferenceItem(0, (120 * items.length) + 30, prefName, defaultValue, min, max, step, precision, onChange, valueFormatter);
|
|
|
|
items.addItem(prefName, item);
|
|
|
|
preferenceItems.add(item.lefthandText);
|
|
|
|
}
|
2023-01-23 03:25:45 +00:00
|
|
|
|
2024-07-01 11:42:50 +00:00
|
|
|
/**
|
|
|
|
* Creates a pref item that works with number percentages
|
|
|
|
* @param onChange Gets called every time the player changes the value; use this to apply the value
|
|
|
|
* @param defaultValue The value that is loaded in when the pref item is created (usually your Preferences.settingVariable)
|
|
|
|
* @param min Minimum value (default = 0)
|
|
|
|
* @param max Maximum value (default = 100)
|
|
|
|
*/
|
|
|
|
function createPrefItemPercentage(prefName:String, prefDesc:String, onChange:Int->Void, defaultValue:Int, min:Int = 0, max:Int = 100):Void
|
|
|
|
{
|
|
|
|
var newCallback = function(value:Float) {
|
|
|
|
onChange(Std.int(value));
|
|
|
|
};
|
|
|
|
var formatter = function(value:Float) {
|
|
|
|
return '${value}%';
|
|
|
|
};
|
|
|
|
var item = new NumberPreferenceItem(0, (120 * items.length) + 30, prefName, defaultValue, min, max, 10, 0, newCallback, formatter);
|
|
|
|
items.addItem(prefName, item);
|
|
|
|
preferenceItems.add(item.lefthandText);
|
2023-01-23 03:25:45 +00:00
|
|
|
}
|
|
|
|
|
2024-07-01 11:42:50 +00:00
|
|
|
/**
|
|
|
|
* Creates a pref item that works with enums
|
|
|
|
* @param values Maps enum values to display strings _(ex: `NoteHitSoundType.PingPong => "Ping pong"`)_
|
|
|
|
* @param onChange Gets called every time the player changes the value; use this to apply the value
|
|
|
|
* @param defaultValue The value that is loaded in when the pref item is created (usually your Preferences.settingVariable)
|
|
|
|
*/
|
|
|
|
function createPrefItemEnum(prefName:String, prefDesc:String, values:Map<String, String>, onChange:String->Void, defaultValue:String):Void
|
2023-01-23 03:25:45 +00:00
|
|
|
{
|
2024-07-01 11:42:50 +00:00
|
|
|
var item = new EnumPreferenceItem(0, (120 * items.length) + 30, prefName, values, defaultValue, onChange);
|
|
|
|
items.addItem(prefName, item);
|
|
|
|
preferenceItems.add(item.lefthandText);
|
2023-01-23 03:25:45 +00:00
|
|
|
}
|
2021-03-27 01:22:07 +00:00
|
|
|
}
|