From bd3b3e23f42719822aa67bf27e51218508ef05af Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 5 Jul 2026 04:23:06 +0900 Subject: [PATCH] Support number keys for battle save slots --- src/game/scenes/BattleScene.ts | 46 ++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/game/scenes/BattleScene.ts b/src/game/scenes/BattleScene.ts index cddc283..907167c 100644 --- a/src/game/scenes/BattleScene.ts +++ b/src/game/scenes/BattleScene.ts @@ -3069,6 +3069,7 @@ export class BattleScene extends Phaser.Scene { private resultAnimationToken = 0; private resultSettlementText?: Phaser.GameObjects.Text; private saveSlotPanelObjects: Phaser.GameObjects.GameObject[] = []; + private saveSlotPanelMode?: SaveSlotMode; private unitViews = new Map(); private actedUnitIds = new Set(); private bondStates = new Map(); @@ -3215,6 +3216,9 @@ export class BattleScene extends Phaser.Scene { this.refreshUnitLegibilityStyles(); } }); + this.input.keyboard?.on('keydown', (event: KeyboardEvent) => { + this.handleSaveSlotPanelKey(event); + }); this.input.keyboard?.on('keydown-SPACE', (event: KeyboardEvent) => { if (this.activeFaction !== 'enemy' || this.fastForwardHeld) { return; @@ -11150,8 +11154,40 @@ export class BattleScene extends Phaser.Scene { return Array.from({ length: campaignSaveSlotCount }, (_, index) => index + 1).some((slot) => Boolean(this.readBattleSaveState(slot))); } + private handleSaveSlotPanelKey(event: KeyboardEvent) { + if (!this.saveSlotPanelMode) { + return false; + } + + const slot = Number(event.key); + if (!Number.isInteger(slot) || slot < 1 || slot > campaignSaveSlotCount) { + return false; + } + + event.preventDefault(); + this.activateSaveSlotPanelSlot(slot); + return true; + } + + private activateSaveSlotPanelSlot(slot: number) { + const mode = this.saveSlotPanelMode; + if (!mode || (mode === 'load' && !this.readBattleSaveState(slot))) { + return; + } + + this.suppressNextLeftClick = true; + soundDirector.playSelect(); + if (mode === 'save') { + this.showSaveBattleConfirm(slot); + return; + } + + this.showLoadBattleConfirm(slot); + } + private showSaveSlotPanel(mode: SaveSlotMode) { this.hideSaveSlotPanel(); + this.saveSlotPanelMode = mode; this.clearPointerFeedback(); const depth = 70; const width = 520; @@ -11226,13 +11262,7 @@ export class BattleScene extends Phaser.Scene { if (!disabled) { const run = () => { - this.suppressNextLeftClick = true; - soundDirector.playSelect(); - if (mode === 'save') { - this.showSaveBattleConfirm(slot); - } else { - this.showLoadBattleConfirm(slot); - } + this.activateSaveSlotPanelSlot(slot); }; row.setInteractive({ useHandCursor: true }); row.on('pointerover', () => row.setFillStyle(0x263647, 0.98)); @@ -11264,6 +11294,7 @@ export class BattleScene extends Phaser.Scene { private hideSaveSlotPanel() { this.saveSlotPanelObjects.forEach((object) => object.destroy()); this.saveSlotPanelObjects = []; + this.saveSlotPanelMode = undefined; } private showSaveBattleConfirm(slot: number) { @@ -17214,6 +17245,7 @@ export class BattleScene extends Phaser.Scene { commandMenuVisible: this.commandMenuObjects.length > 0, mapMenuVisible: this.mapMenuObjects.length > 0, saveSlotPanelVisible: this.saveSlotPanelObjects.length > 0, + saveSlotPanelMode: this.saveSlotPanelMode ?? null, resultVisible: this.resultObjects.length > 0, turnPromptVisible: this.turnPromptObjects.length > 0, turnPromptMode: this.turnPromptMode ?? null,