diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index 35a5b45fff6..42581fccbfd 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -39,10 +39,6 @@ export interface GamepadConfig { custom: MappingLayout; } -export interface ActionGamepadMapping { - [key: string]: Button; -} - const repeatInputDelayMillis = 250; /** diff --git a/src/system/settings-gamepad.ts b/src/system/settings-gamepad.ts index bca9de68980..428d2718103 100644 --- a/src/system/settings-gamepad.ts +++ b/src/system/settings-gamepad.ts @@ -96,7 +96,7 @@ export function setSettingGamepad(scene: BattleScene, setting: SettingGamepad, v case SettingGamepad.Button_Slow_Down: if (value) { if (scene.ui) { - const cancelHandler = (success: boolean = false) => { + const cancelHandler = (success: boolean = false) : boolean => { scene.ui.revertMode(); (scene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); return success; diff --git a/src/ui/gamepad-binding-ui-handler.ts b/src/ui/gamepad-binding-ui-handler.ts index 8d3a93c12c1..864a63cbac6 100644 --- a/src/ui/gamepad-binding-ui-handler.ts +++ b/src/ui/gamepad-binding-ui-handler.ts @@ -9,39 +9,53 @@ import {SettingGamepad} from "../system/settings-gamepad"; export default class GamepadBindingUiHandler extends UiHandler { + // Containers for different segments of the UI. protected optionSelectContainer: Phaser.GameObjects.Container; protected actionsContainer: Phaser.GameObjects.Container; + + // Background elements for titles and action areas. protected titleBg: Phaser.GameObjects.NineSlice; protected actionBg: Phaser.GameObjects.NineSlice; protected optionSelectBg: Phaser.GameObjects.NineSlice; + + // Text elements for displaying instructions and actions. private unlockText: Phaser.GameObjects.Text; private swapText: Phaser.GameObjects.Text; private actionLabel: Phaser.GameObjects.Text; private cancelLabel: Phaser.GameObjects.Text; + private listening: boolean = false; - private buttonPressed = null; + private buttonPressed: number | null = null; + + // Icons for displaying current and new button assignments. private newButtonIcon: Phaser.GameObjects.Sprite; private targetButtonIcon: Phaser.GameObjects.Sprite; - private cancelFn; + + // Function to call on cancel or completion of binding. + private cancelFn: (boolean?) => boolean; + + // The specific setting being modified. private target: SettingGamepad; constructor(scene: BattleScene, mode: Mode = Mode.GAMEPAD_BINDING) { super(scene, mode); + // Listen to gamepad button down events to initiate binding. scene.input.gamepad.on('down', this.gamepadButtonDown, this); } - // const loadSessionBg = this.scene.add.rectangle(this.scene.game.canvas.width / 24, -this.scene.game.canvas.height / 24, this.scene.game.canvas.width / 12, -this.scene.game.canvas.height / 12, 0x006860); - // loadSessionBg.setOrigin(0, 0); - // this.optionSelectContainer.add(loadSessionBg); setup() { const ui = this.getUi(); this.optionSelectContainer = this.scene.add.container(0, 0); this.actionsContainer = this.scene.add.container(0, 0); + // Initially, containers are not visible. this.optionSelectContainer.setVisible(false); this.actionsContainer.setVisible(false); + + // Add containers to the UI. ui.add(this.optionSelectContainer); ui.add(this.actionsContainer); + // Setup backgrounds and text objects for UI. this.titleBg = addWindow(this.scene, (this.scene.game.canvas.width / 6) - this.getWindowWidth(), -(this.scene.game.canvas.height / 6) + 28 + 21, this.getWindowWidth(), 24); this.titleBg.setOrigin(0.5); this.optionSelectContainer.add(this.titleBg); @@ -50,6 +64,7 @@ export default class GamepadBindingUiHandler extends UiHandler { this.actionBg.setOrigin(0.5); this.actionsContainer.add(this.actionBg); + // Text prompts and instructions for the user. this.unlockText = addTextObject(this.scene, 0, 0, 'Press a button...', TextStyle.WINDOW); this.unlockText.setOrigin(0, 0); this.unlockText.setPositionRelative(this.titleBg, 36, 4); @@ -59,6 +74,7 @@ export default class GamepadBindingUiHandler extends UiHandler { this.optionSelectBg.setOrigin(0.5); this.optionSelectContainer.add(this.optionSelectBg); + // New button icon setup. this.newButtonIcon = this.scene.add.sprite(0, 0, 'xbox'); this.newButtonIcon.setScale(0.15); this.newButtonIcon.setPositionRelative(this.optionSelectBg, 78, 16); @@ -84,7 +100,7 @@ export default class GamepadBindingUiHandler extends UiHandler { this.actionLabel.setOrigin(0, 0.5); this.actionLabel.setPositionRelative(this.actionBg, this.actionBg.width - 75, this.actionBg.height / 2); - + // Add swap and cancel labels to the containers. this.optionSelectContainer.add(this.newButtonIcon); this.optionSelectContainer.add(this.swapText); this.optionSelectContainer.add(this.targetButtonIcon); @@ -93,7 +109,8 @@ export default class GamepadBindingUiHandler extends UiHandler { } gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { - const blacklist = [12, 13, 14, 15]; + const blacklist = [12, 13, 14, 15]; // d-pad buttons are blacklisted. + // Check conditions before processing the button press. if (!this.listening || pad.id !== this.scene.inputController?.chosenGamepad || blacklist.includes(button.index) || this.buttonPressed !== null) return; this.buttonPressed = button.index; const [type, buttonIcon] = this.scene.inputController.getPressedButtonLabel(button); @@ -115,6 +132,7 @@ export default class GamepadBindingUiHandler extends UiHandler { this.cancelFn = args[0].cancelHandler; this.target = args[0].target; + // Bring the option and action containers to the front of the UI. this.getUi().bringToTop(this.optionSelectContainer); this.getUi().bringToTop(this.actionsContainer); @@ -138,10 +156,12 @@ export default class GamepadBindingUiHandler extends UiHandler { switch (button) { case Button.LEFT: case Button.RIGHT: + // Toggle between action and cancel options. const cursor = this.cursor ? 0 : 1; success = this.setCursor(cursor); break case Button.ACTION: + // Process actions based on current cursor position. if (this.cursor === 0) { this.cancelFn(); } else {