diff --git a/data/emulator.js b/data/emulator.js index fa0de55..540cc97 100644 --- a/data/emulator.js +++ b/data/emulator.js @@ -2478,65 +2478,99 @@ class EmulatorJS { defaultControllers = { 0: { 0: { - 'value': 'x' + 'value': 'x', + 'value2': 'BUTTON_2', }, 1: { - 'value': 's' + 'value': 's', + 'value2': 'BUTTON_4', }, 2: { - 'value': 'v' + 'value': 'v', + 'value2': 'SELECT', }, 3: { - 'value': 'enter' + 'value': 'enter', + 'value2': 'START', }, 4: { - 'value': 'arrowup' + 'value': 'arrowup', + 'value2': 'DPAD_UP', }, 5: { - 'value': 'arrowdown' + 'value': 'arrowdown', + 'value2': 'DPAD_DOWN', }, 6: { - 'value': 'arrowleft' + 'value': 'arrowleft', + 'value2': 'DPAD_LEFT', }, 7: { - 'value': 'arrowright' + 'value': 'arrowright', + 'value2': 'DPAD_RIGHT', }, 8: { - 'value': 'z' + 'value': 'z', + 'value2': 'BUTTON_1', }, 9: { - 'value': 'a' + 'value': 'a', + 'value2': 'BUTTON_3', }, 10: { - 'value': 'q' + 'value': 'q', + 'value2': 'LEFT_SHOULDER', }, 11: { - 'value': 'e' + 'value': 'e', + 'value2': 'RIGHT_SHOULDER', }, 12: { - 'value': 'e' + 'value': 'e', + 'value2': 'LEFT_SHOULDER_BOTTOM', }, 13: { - 'value': 'w' + 'value': 'w', + 'value2': 'RIGHT_SHOULDER_BOTTOM', + }, + 14: { + 'value2': 'LEFT_STICK', + }, + 15: { + 'value2': 'RIGHT_STICK', }, - 14: {}, - 15: {}, 16: { - 'value': 'h' + 'value': 'h', + 'value2': 'LEFT_STICK_X:+1', }, 17: { - 'value': 'f' + 'value': 'f', + 'value2': 'LEFT_STICK_X:-1', }, 18: { - 'value': 'g' + 'value': 'g', + 'value2': 'LEFT_STICK_Y:+1', }, 19: { - 'value': 't' + 'value': 't', + 'value2': 'LEFT_STICK_Y:-1', + }, + 20: { + 'value': 'l', + 'value2': 'RIGHT_STICK_X:+1', + }, + 21: { + 'value': 'j', + 'value2': 'RIGHT_STICK_X:-1', + }, + 22: { + 'value': 'k', + 'value2': 'RIGHT_STICK_Y:+1', + }, + 23: { + 'value': 'i', + 'value2': 'RIGHT_STICK_Y:-1', }, - 20: {'value': 'l'}, - 21: {'value': 'j'}, - 22: {'value': 'k'}, - 23: {'value': 'i'}, 24: {}, 25: {}, 26: {}, @@ -2592,7 +2626,7 @@ class EmulatorJS { if (!this.controls[player][num]) { this.controls[player][num] = {}; } - this.controls[player][num].value2 = (e.type === "axischanged" ? e.axis+":"+value : e.index); + this.controls[player][num].value2 = e.label; this.controlPopup.parentElement.parentElement.setAttribute("hidden", ""); this.checkGamepadInputs(); this.saveSettings(); @@ -2603,10 +2637,15 @@ class EmulatorJS { for (let i=0; i<4; i++) { if (e.gamepadIndex !== i) continue; for (let j=0; j<30; j++) { - if (['buttonup', 'buttondown'].includes(e.type) && (this.controls[i][j] && this.controls[i][j].value2 === e.index)) { + if (!this.controls[i][j] || this.controls[i][j].value2 === undefined) { + continue; + } + const controlValue = this.controls[i][j].value2; + + if (['buttonup', 'buttondown'].includes(e.type) && (controlValue === e.label || controlValue === e.index)) { this.gameManager.simulateInput(i, j, (e.type === 'buttonup' ? 0 : (special.includes(j) ? 0x7fff : 1))); } else if (e.type === "axischanged") { - if (this.controls[i][j] && typeof this.controls[i][j].value2 === 'string' && this.controls[i][j].value2.split(":")[0] === e.axis) { + if (typeof controlValue === 'string' && controlValue.split(":")[0] === e.axis) { if (special.includes(j)) { if (e.axis === 'LEFT_STICK_X') { if (e.value > 0) { @@ -2641,7 +2680,7 @@ class EmulatorJS { this.gameManager.simulateInput(i, 22, 0); } } - } else if (this.controls[i][j].value2 === e.axis+":"+value || value === 0) { + } else if (value === 0 || controlValue === e.label || controlValue === `${e.axis}:${value}`) { this.gameManager.simulateInput(i, j, ((value === 0) ? 0 : 1)); } } diff --git a/data/gamepad.js b/data/gamepad.js index 8aea8c3..662dbc4 100644 --- a/data/gamepad.js +++ b/data/gamepad.js @@ -3,6 +3,24 @@ class GamepadHandler { timeout; listeners; constructor() { + this.buttonLabels = { + 0: 'BUTTON_1', + 1: 'BUTTON_2', + 2: 'BUTTON_3', + 3: 'BUTTON_4', + 4: 'LEFT_SHOULDER', + 5: 'RIGHT_SHOULDER', + 6: 'LEFT_SHOULDER_BOTTOM', + 7: 'RIGHT_SHOULDER_BOTTOM', + 8: 'SELECT', + 9: 'START', + 10: 'LEFT_STICK', + 11: 'RIGHT_STICK', + 12: 'DPAD_UP', + 13: 'DPAD_DOWN', + 14: 'DPAD_LEFT', + 15: 'DPAD_RIGHT', + }; this.gamepads = []; this.listeners = {}; this.timeout = null; @@ -39,7 +57,13 @@ class GamepadHandler { if (newVal !== val) { const axis = ['LEFT_STICK_X', 'LEFT_STICK_Y', 'RIGHT_STICK_X', 'RIGHT_STICK_Y'][axisIndex]; if (!axis) return; - this.dispatchEvent('axischanged', {axis: axis, value: newVal, index: gamepad.index, gamepadIndex: gamepad.index}); + this.dispatchEvent('axischanged', { + axis: axis, + value: newVal, + index: gamepad.index, + label: this.getAxisLabel(axis, newVal), + gamepadIndex: gamepad.index, + }); } gamepadToSave.axes[axisIndex] = newVal; }) @@ -56,9 +80,9 @@ class GamepadHandler { gamepadToSave.buttons[buttonIndex] = {pressed:pressed2}; if (pressed !== pressed2) { if (pressed2) { - this.dispatchEvent('buttondown', {index: buttonIndex, gamepadIndex: gamepad.index}); + this.dispatchEvent('buttondown', {index: buttonIndex, label: this.getButtonLabel(buttonIndex), gamepadIndex: gamepad.index}); } else { - this.dispatchEvent('buttonup', {index: buttonIndex, gamepadIndex: gamepad.index}); + this.dispatchEvent('buttonup', {index: buttonIndex, label:this.getButtonLabel(buttonIndex), gamepadIndex: gamepad.index}); } } @@ -97,6 +121,30 @@ class GamepadHandler { on(name, cb) { this.listeners[name.toLowerCase()] = cb; } + + getButtonLabel(index) { + if (index === null || index === undefined) { + return null; + } + if (this.buttonLabels[index] === undefined) { + return `GAMEPAD_${index}`; + } + return this.buttonLabels[index]; + } + getAxisLabel(axis, value) { + let valueLabel = null; + if (value > 0.5 || value < -0.5) { + if (value > 0) { + valueLabel = '+1'; + } else { + valueLabel = '-1'; + } + } + if (!axis || !valueLabel) { + return null; + } + return `${axis}:${valueLabel}`; + } } window.GamepadHandler = GamepadHandler;