From 1e4e0d013eb38887a97e906b7b8a88930e7d54ab Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Mon, 25 Dec 2023 15:48:16 -0500 Subject: [PATCH] Add experimental vibration touch feedback on mobile --- src/battle-scene.ts | 28 +++++++++++++++++++--------- src/system/settings.ts | 15 +++++++++++---- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a43c60069..c78cc8b1d 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -77,6 +77,8 @@ export default class BattleScene extends Phaser.Scene { public gameSpeed: integer = 1; public showLevelUpStats: boolean = true; public windowType: integer = 1; + public enableTouchControls: boolean = false; + public enableVibration: boolean = false; public quickStart: boolean = quickStart; public finalWave: integer = 200; @@ -910,19 +912,24 @@ export default class BattleScene extends Phaser.Scene { if (this.blockInput) return; let inputSuccess = false; - if (this.isButtonPressed(Button.UP)) + let vibrationLength = 0; + if (this.isButtonPressed(Button.UP)) { inputSuccess = this.ui.processInput(Button.UP); - else if (this.isButtonPressed(Button.DOWN)) + vibrationLength = 5; + } else if (this.isButtonPressed(Button.DOWN)) { inputSuccess = this.ui.processInput(Button.DOWN); - else if (this.isButtonPressed(Button.LEFT)) + vibrationLength = 5; + } else if (this.isButtonPressed(Button.LEFT)) { inputSuccess = this.ui.processInput(Button.LEFT); - else if (this.isButtonPressed(Button.RIGHT)) + vibrationLength = 5; + } else if (this.isButtonPressed(Button.RIGHT)) { inputSuccess = this.ui.processInput(Button.RIGHT); - else if (this.isButtonPressed(Button.ACTION)) + vibrationLength = 5; + } else if (this.isButtonPressed(Button.ACTION)) inputSuccess = this.ui.processInput(Button.ACTION); - else if (this.isButtonPressed(Button.CANCEL)) + else if (this.isButtonPressed(Button.CANCEL)) { inputSuccess = this.ui.processInput(Button.CANCEL); - else if (this.isButtonPressed(Button.MENU)) { + } else if (this.isButtonPressed(Button.MENU)) { switch (this.ui.getMode()) { case Mode.MESSAGE: if (!(this.ui.getHandler() as MessageUiHandler).pendingPrompt) @@ -938,12 +945,14 @@ export default class BattleScene extends Phaser.Scene { case Mode.CONFIRM: case Mode.GAME_MODE_SELECT: this.ui.setOverlayMode(Mode.MENU); + inputSuccess = true; break; case Mode.MENU: case Mode.SETTINGS: case Mode.ACHIEVEMENTS: this.ui.revertMode(); this.playSound('select'); + inputSuccess = true; break; default: return; @@ -959,8 +968,7 @@ export default class BattleScene extends Phaser.Scene { inputSuccess = this.ui.processInput(Button.CYCLE_ABILITY); else return; - } - else if (this.isButtonPressed(Button.SPEED_UP)) { + } else if (this.isButtonPressed(Button.SPEED_UP)) { if (this.gameSpeed < 5) { this.gameData.saveSetting(Setting.Game_Speed, settingOptions[Setting.Game_Speed].indexOf(`${this.gameSpeed}x`) + 1); if (this.ui.getMode() === Mode.SETTINGS) @@ -983,6 +991,8 @@ export default class BattleScene extends Phaser.Scene { return; } else return; + if (inputSuccess && this.enableVibration) + navigator.vibrate(vibrationLength || 10); this.blockInput = true; this.time.delayedCall(Utils.fixedInt(250), () => this.blockInput = false); } diff --git a/src/system/settings.ts b/src/system/settings.ts index 448ffe24c..5aa791d29 100644 --- a/src/system/settings.ts +++ b/src/system/settings.ts @@ -8,7 +8,8 @@ export enum Setting { SE_Volume = "SE_VOLUME", Show_Stats_on_Level_Up = "SHOW_LEVEL_UP_STATS", Window_Type = "WINDOW_TYPE", - Touch_Controls = "TOUCH_CONTROLS" + Touch_Controls = "TOUCH_CONTROLS", + Vibration = "VIBRATION" } export interface SettingOptions { @@ -26,7 +27,8 @@ export const settingOptions: SettingOptions = { [Setting.SE_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'), [Setting.Show_Stats_on_Level_Up]: [ 'Off', 'On' ], [Setting.Window_Type]: new Array(4).fill(null).map((_, i) => (i + 1).toString()), - [Setting.Touch_Controls]: [ 'Auto', 'Disabled' ] + [Setting.Touch_Controls]: [ 'Auto', 'Disabled' ], + [Setting.Vibration]: [ 'Auto', 'Disabled' ] }; export const settingDefaults: SettingDefaults = { @@ -36,7 +38,8 @@ export const settingDefaults: SettingDefaults = { [Setting.SE_Volume]: 10, [Setting.Show_Stats_on_Level_Up]: 1, [Setting.Window_Type]: 0, - [Setting.Touch_Controls]: 0 + [Setting.Touch_Controls]: 0, + [Setting.Vibration]: 0 }; export function setSetting(scene: BattleScene, setting: Setting, value: integer): boolean { @@ -63,9 +66,13 @@ export function setSetting(scene: BattleScene, setting: Setting, value: integer) updateWindowType(scene, parseInt(settingOptions[setting][value])); break; case Setting.Touch_Controls: + scene.enableTouchControls = settingOptions[setting][value] !== 'Disabled' && hasTouchscreen(); const touchControls = document.getElementById('touchControls'); if (touchControls) - touchControls.classList.toggle('visible', settingOptions[setting][value] !== 'Disabled' && hasTouchscreen()); + touchControls.classList.toggle('visible', scene.enableTouchControls); + break; + case Setting.Vibration: + scene.enableVibration = settingOptions[setting][value] !== 'Disabled' && hasTouchscreen(); break; }