129 lines
3.9 KiB
Haxe
129 lines
3.9 KiB
Haxe
package funkin.options;
|
|
|
|
import funkin.options.OptionsScreen;
|
|
import funkin.menus.MainMenuState;
|
|
import funkin.options.type.TextOption;
|
|
import flixel.util.typeLimit.OneOfTwo;
|
|
import funkin.options.type.OptionType;
|
|
import funkin.options.categories.*;
|
|
|
|
class OptionsMenu extends MusicBeatState {
|
|
|
|
public static var mainOptions:Array<OptionCategory> = [
|
|
{
|
|
name: 'Controls',
|
|
desc: 'Change Controls for Player 1 and Player 2!',
|
|
state: null,
|
|
substate: funkin.options.keybinds.KeybindsOptions
|
|
},
|
|
{
|
|
name: 'Gameplay',
|
|
desc: 'Change Gameplay options such as Downscroll, Scroll Speed, Naughtyness...',
|
|
state: GameplayOptions
|
|
},
|
|
{
|
|
name: 'Appearance',
|
|
desc: 'Change Appearance options such as Flashing menus...',
|
|
state: AppearanceOptions
|
|
},
|
|
{
|
|
name: 'Miscellaneous',
|
|
desc: 'Use this menu to reset save data or engine settings.',
|
|
state: MiscOptions
|
|
},
|
|
{
|
|
name: 'Debug Options',
|
|
desc: 'Use this menu to change debug options.',
|
|
state: DebugOptions
|
|
}
|
|
];
|
|
|
|
public var options:Array<OptionTypeDef>;
|
|
public var optionsTree:OptionsTree;
|
|
public function new(?options:Array<OptionTypeDef>) {
|
|
super();
|
|
}
|
|
|
|
public override function create() {
|
|
super.create();
|
|
|
|
var optionSprites:Array<OptionType> = [];
|
|
if (options == null) {
|
|
optionSprites = [for(o in mainOptions) new TextOption(o.name, o.desc, function() {
|
|
if (o.substate != null) {
|
|
persistentUpdate = false;
|
|
persistentDraw = true;
|
|
if (o.substate is MusicBeatSubstate) {
|
|
openSubState(o.substate);
|
|
} else {
|
|
openSubState(Type.createInstance(o.substate, []));
|
|
}
|
|
} else {
|
|
if (o.state is OptionsScreen) {
|
|
optionsTree.add(o.state);
|
|
} else {
|
|
optionsTree.add(Type.createInstance(o.state, []));
|
|
}
|
|
}
|
|
})];
|
|
} else {
|
|
optionSprites = [for(o in options) Type.createInstance(o.type, o.args)];
|
|
}
|
|
|
|
var bg:FlxSprite = new FlxSprite(-80).loadAnimatedGraphic(Paths.image('menus/menuBGBlue'));
|
|
// bg.scrollFactor.set();
|
|
bg.scale.set(1.15, 1.15);
|
|
bg.updateHitbox();
|
|
bg.screenCenter();
|
|
bg.scrollFactor.set();
|
|
bg.antialiasing = true;
|
|
add(bg);
|
|
|
|
optionsTree = new OptionsTree();
|
|
optionsTree.onMenuChange = onMenuChange;
|
|
optionsTree.onMenuClose = onMenuClose;
|
|
var mainOptionScreen:OptionsScreen = new OptionsScreen();
|
|
for(o in optionSprites)
|
|
mainOptionScreen.add(o);
|
|
optionsTree.add(mainOptionScreen);
|
|
add(optionsTree);
|
|
|
|
FlxG.camera.scroll.set(-FlxG.width, 0);
|
|
}
|
|
|
|
public function onMenuChange() {
|
|
if (optionsTree.members.length <= 0) {
|
|
exit();
|
|
} else {
|
|
// TODO: update top info
|
|
}
|
|
}
|
|
|
|
public function exit() {
|
|
Options.save();
|
|
Options.applySettings();
|
|
FlxG.switchState(new MainMenuState());
|
|
}
|
|
|
|
public function onMenuClose(m:OptionsScreen) {
|
|
CoolUtil.playMenuSFX(CANCEL);
|
|
}
|
|
|
|
public override function update(elapsed:Float) {
|
|
super.update(elapsed);
|
|
|
|
FlxG.camera.scroll.x = lerp(FlxG.camera.scroll.x, FlxG.width * Math.max(0, (optionsTree.members.length-1)), 0.2);
|
|
}
|
|
}
|
|
|
|
typedef OptionCategory = {
|
|
var name:String;
|
|
var desc:String;
|
|
var state:OneOfTwo<OptionsScreen, Class<OptionsScreen>>;
|
|
var ?substate:OneOfTwo<MusicBeatSubstate, Class<MusicBeatSubstate>>;
|
|
}
|
|
|
|
typedef OptionTypeDef = {
|
|
var type:Class<OptionType>;
|
|
var args:Array<Dynamic>;
|
|
} |