swap is working + display current assignation on rebinding

pull/685/head
Greenlamp 2024-05-11 15:43:38 +02:00
parent cfa919b46c
commit 5ff09389db
5 changed files with 54 additions and 12 deletions

View File

@ -2,15 +2,21 @@ import {GamepadConfig} from "../inputs-controller";
import {SettingGamepad} from "#app/system/settings-gamepad";
export function getKeyForButtonIndex(config: GamepadConfig, index: integer): String {
export function getKeyForButtonIndex(config: GamepadConfig, index: number): String {
for (const key of Object.keys(config.gamepadMapping)) {
const id = config.gamepadMapping[key];
if (id === index) return key;
}
return null;
}
export function getButtonIndexForKey(config: GamepadConfig, _key: string): number {
for (const key of Object.keys(config.gamepadMapping)) {
if (key === _key) return config.gamepadMapping[key];
}
return null;
}
export function getIconForCustomIndex(config: GamepadConfig, index: integer): String {
export function getIconForCustomIndex(config: GamepadConfig, index: number): String {
const key = getKeyForButtonIndex(config, index);
return config.icons[key];
}
@ -21,4 +27,4 @@ export function getKeyForSettingName(config: GamepadConfig, settingName: Setting
if (name === settingName) return key;
}
return null;
}
}

View File

@ -8,7 +8,12 @@ import {Button} from "./enums/buttons";
import {Mode} from "./ui/ui";
import SettingsGamepadUiHandler from "./ui/settings-gamepad-ui-handler";
import {SettingGamepad} from "./system/settings-gamepad";
import {getIconForCustomIndex, getKeyForButtonIndex} from "#app/configs/gamepad-utils";
import {
getButtonIndexForKey,
getIconForCustomIndex,
getKeyForButtonIndex,
getKeyForSettingName
} from "./configs/gamepad-utils";
export interface GamepadMapping {
[key: string]: number;
@ -33,6 +38,7 @@ export interface GamepadConfig {
icons: IconsMapping;
setting: SettingMapping;
default: DefaultMapping;
custom: DefaultMapping;
}
export interface ActionGamepadMapping {
@ -323,10 +329,6 @@ export class InputsController {
}
}
getButtonLabel(button: Phaser.Input.Gamepad.Button) {
return getIconForCustomIndex(this.configs[this.chosenGamepad], button.index);
}
/**
* Handles the 'down' event for gamepad buttons, emitting appropriate events and updating the interaction state.
*
@ -648,4 +650,24 @@ export class InputsController {
getActiveConfig() :GamepadConfig {
return this.configs[this.chosenGamepad] || pad_generic;
}
getPressedButtonLabel(button: Phaser.Input.Gamepad.Button) {
return [this.configs[this.chosenGamepad].padType, getIconForCustomIndex(this.configs[this.chosenGamepad], button.index)];
}
getCurrentButtonLabel(target: SettingGamepad) {
const key = getKeyForSettingName(this.configs[this.chosenGamepad], target);
const id = getButtonIndexForKey(this.configs[this.chosenGamepad], key);
return getIconForCustomIndex(this.configs[this.chosenGamepad], id);
}
swapBinding(target, newBinding) {
this.deactivatePressedKey();
const keyTarget = getKeyForSettingName(this.configs[this.chosenGamepad], target);
const keyNewBinding = getKeyForButtonIndex(this.configs[this.chosenGamepad], newBinding);
const previousActionForThisNewBinding = this.configs[this.chosenGamepad].custom[keyNewBinding];
const ActionForThisNewBinding = this.configs[this.chosenGamepad].custom[keyTarget];
this.configs[this.chosenGamepad].custom[keyTarget] = previousActionForThisNewBinding;
this.configs[this.chosenGamepad].custom[keyNewBinding] = ActionForThisNewBinding;
}
}

View File

@ -102,9 +102,10 @@ export function setSettingGamepad(scene: BattleScene, setting: SettingGamepad, v
case SettingGamepad.Button_Slow_Down:
if (value) {
if (scene.ui) {
const cancelHandler = () => {
const cancelHandler = (success: boolean = false) => {
scene.ui.revertMode();
return false;
(scene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings();
return success;
};
scene.ui.setOverlayMode(Mode.GAMEPAD_BINDING, {
target: setting,

View File

@ -5,6 +5,7 @@ import {Button} from "../enums/buttons";
import {addWindow} from "./ui-theme";
import {addTextObject, TextStyle} from "#app/ui/text";
import Phaser from "phaser";
import {SettingGamepad} from "../system/settings-gamepad";
export default class GamepadBindingUiHandler extends UiHandler {
@ -24,7 +25,7 @@ export default class GamepadBindingUiHandler extends UiHandler {
private previousIconXbox: Phaser.GameObjects.Sprite;
private iconDualshock: Phaser.GameObjects.Sprite;
private cancelFn;
private target;
private target: SettingGamepad;
constructor(scene: BattleScene, mode: Mode = Mode.GAMEPAD_BINDING) {
super(scene, mode);
@ -104,7 +105,8 @@ export default class GamepadBindingUiHandler extends UiHandler {
const blacklist = [12, 13, 14, 15];
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.getButtonLabel(button);
const [type, buttonIcon] = this.scene.inputController.getPressedButtonLabel(button);
const assignedButtonIcon = this.scene.inputController.getCurrentButtonLabel(this.target);
switch (type) {
case 'dualshock':
this.iconXbox.setVisible(false);
@ -118,6 +120,7 @@ export default class GamepadBindingUiHandler extends UiHandler {
this.iconDualshock.setVisible(false);
this.iconXbox.setFrame(buttonIcon);
this.iconXbox.setVisible(true);
this.previousIconXbox.setFrame(assignedButtonIcon);
this.previousIconXbox.setVisible(true);
this.alreadyAssignedText.setVisible(true);
break
@ -164,6 +167,10 @@ export default class GamepadBindingUiHandler extends UiHandler {
// Reverts UI to its previous state on cancel.
// this.scene.ui.revertMode();
this.cancelFn();
} else {
success = true;
this.scene.inputController.swapBinding(this.target, this.buttonPressed);
this.cancelFn(success);
}
break;
}

View File

@ -139,6 +139,12 @@ export default class SettingsGamepadUiHandler extends UiHandler {
this.settingsContainer.setVisible(false);
}
updateBindings(): void {
// for (const elm of noOptionsCursors) {
// console.log('elm:', elm);
// }
}
show(args: any[]): boolean {
super.show(args);