From fc6fa02677fa7d8546b5941b35e58d64c65f9bb6 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 5 Jul 2026 04:29:21 +0900 Subject: [PATCH] Support number keys for campaign save slots --- src/game/scenes/CampScene.ts | 15 +++++++++++++++ src/game/scenes/TitleScene.ts | 27 +++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 95bc04b..e2d9076 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -10755,6 +10755,7 @@ export class CampScene extends Phaser.Scene { this.selectedVisitId = this.availableCampVisits()[0]?.id ?? campVisits[0].id; soundDirector.playMusic('militia-theme'); this.input.keyboard?.on('keydown-ESC', () => this.handleEscapeKey()); + this.input.keyboard?.on('keydown', (event: KeyboardEvent) => this.handleSaveSlotKey(event)); loadBattleUiIcons(this, () => this.ensureCampAssets(() => this.drawCampScene())); } @@ -11980,6 +11981,20 @@ export class CampScene extends Phaser.Scene { this.render(); } + private handleSaveSlotKey(event: KeyboardEvent) { + if (this.saveSlotObjects.length === 0) { + return; + } + + const slot = Number(event.key); + if (!Number.isInteger(slot) || slot < 1 || slot > campaignSaveSlotCount) { + return; + } + + event.preventDefault(); + this.saveCampToSlot(slot); + } + private hideCampSaveSlotPanel() { this.saveSlotObjects.forEach((object) => object.destroy()); this.saveSlotObjects = []; diff --git a/src/game/scenes/TitleScene.ts b/src/game/scenes/TitleScene.ts index d835f89..971cff5 100644 --- a/src/game/scenes/TitleScene.ts +++ b/src/game/scenes/TitleScene.ts @@ -64,6 +64,7 @@ export class TitleScene extends Phaser.Scene { this.input.once('pointerdown', unlockAudio); this.input.keyboard?.once('keydown', unlockAudio); this.input.keyboard?.once('keydown-ENTER', () => this.activateDefaultMenuAction()); + this.input.keyboard?.on('keydown', (event: KeyboardEvent) => this.handleSaveSlotKey(event)); this.input.keyboard?.on('keydown-ESC', () => this.handleEscapeKey()); } @@ -525,14 +526,36 @@ export class TitleScene extends Phaser.Scene { background.setStrokeStyle(1, palette.gold, 0.42); }); background.on('pointerdown', () => { - this.closeSaveSlotPanel(); - this.continueGame(slot.slot); + this.activateSaveSlot(slot.slot); }); } return row; } + private handleSaveSlotKey(event: KeyboardEvent) { + if (!this.saveSlotPanel) { + return; + } + + const slot = Number(event.key); + if (!Number.isInteger(slot)) { + return; + } + + event.preventDefault(); + this.activateSaveSlot(slot); + } + + private activateSaveSlot(slot: number) { + if (!listCampaignSaveSlots().some((summary) => summary.slot === slot && summary.exists)) { + return; + } + + this.closeSaveSlotPanel(); + this.continueGame(slot); + } + private closeSaveSlotPanel() { this.saveSlotPanel?.destroy(); this.saveSlotPanel = undefined;