Confirm battle load from slot

This commit is contained in:
2026-07-05 03:46:01 +09:00
parent 7ac636874d
commit 950e8d0171

View File

@@ -1124,7 +1124,7 @@ type MapMenuAction = 'endTurn' | 'threat' | 'save' | 'load' | 'roster' | 'bond'
type EnemyAiBehavior = 'aggressive' | 'guard' | 'hold';
type BattleOutcome = 'victory' | 'defeat';
type SaveSlotMode = 'save' | 'load';
type TurnPromptMode = 'turn-end' | 'post-move';
type TurnPromptMode = 'turn-end' | 'post-move' | 'load-confirm';
const battleSpeedStorageKey = 'heros-web:battle-speed';
const battleSpeedLabels: Record<BattleSpeed, string> = {
@@ -10876,6 +10876,10 @@ export class BattleScene extends Phaser.Scene {
return;
}
if (this.saveSlotPanelObjects.length > 0 || this.turnPromptObjects.length > 0) {
return;
}
if (this.phase === 'deployment') {
if (this.isPointerOnSidePanel(pointer)) {
return;
@@ -11197,13 +11201,14 @@ export class BattleScene extends Phaser.Scene {
if (!disabled) {
const run = () => {
this.suppressNextLeftClick = true;
soundDirector.playSelect();
if (mode === 'save') {
this.saveBattleState(slot);
this.hideSaveSlotPanel();
} else {
this.loadBattleState(slot);
this.showLoadBattleConfirm(slot);
}
this.hideSaveSlotPanel();
};
row.setInteractive({ useHandCursor: true });
row.on('pointerover', () => row.setFillStyle(0x263647, 0.98));
@@ -11225,6 +11230,7 @@ export class BattleScene extends Phaser.Scene {
close.setDepth(depth + 2);
close.setInteractive({ useHandCursor: true });
close.on('pointerdown', () => {
this.suppressNextLeftClick = true;
soundDirector.playSelect();
this.hideSaveSlotPanel();
});
@@ -11236,6 +11242,31 @@ export class BattleScene extends Phaser.Scene {
this.saveSlotPanelObjects = [];
}
private showLoadBattleConfirm(slot: number) {
const state = this.readBattleSaveState(slot);
if (!state) {
this.renderSituationPanel('불러올 저장 데이터가 없습니다.');
return;
}
this.hideSaveSlotPanel();
this.showTurnEndPrompt(undefined, {
mode: 'load-confirm',
title: '전투 불러오기 확인',
body: `슬롯 ${slot}의 전투를 불러올까요?\n현재 진행은 저장하지 않으면 사라집니다.`,
primaryLabel: '불러오기',
secondaryLabel: '취소',
primaryAction: () => {
this.hideTurnEndPrompt();
this.loadBattleState(slot);
},
secondaryAction: () => {
this.hideTurnEndPrompt();
this.showSaveSlotPanel('load');
}
});
}
private battleSaveStorageKeyForSlot(slot: number) {
return `${battleSaveStorageKey}:slot-${Phaser.Math.Clamp(Math.floor(slot), 1, campaignSaveSlotCount)}`;
}
@@ -15723,7 +15754,7 @@ export class BattleScene extends Phaser.Scene {
bg.setInteractive({ useHandCursor: true });
bg.on('pointerover', () => bg.setFillStyle(0x283947, 0.98));
bg.on('pointerout', () => bg.setFillStyle(0x1a2630, 0.95));
bg.on('pointerdown', () => (primary ? this.activateTurnPromptPrimaryAction() : this.activateTurnPromptSecondaryAction()));
bg.on('pointerdown', () => (primary ? this.activateTurnPromptPrimaryAction(true) : this.activateTurnPromptSecondaryAction(true)));
this.turnPromptObjects.push(bg);
const text = this.add.text(x, top + 116, label, {
@@ -15735,24 +15766,30 @@ export class BattleScene extends Phaser.Scene {
text.setOrigin(0.5);
text.setDepth(42);
text.setInteractive({ useHandCursor: true });
text.on('pointerdown', () => (primary ? this.activateTurnPromptPrimaryAction() : this.activateTurnPromptSecondaryAction()));
text.on('pointerdown', () => (primary ? this.activateTurnPromptPrimaryAction(true) : this.activateTurnPromptSecondaryAction(true)));
this.turnPromptObjects.push(text);
});
void message;
}
private activateTurnPromptPrimaryAction() {
private activateTurnPromptPrimaryAction(fromPointer = false) {
if (!this.turnPromptPrimaryAction) {
return;
}
if (fromPointer) {
this.suppressNextLeftClick = true;
}
soundDirector.playSelect();
this.turnPromptPrimaryAction();
}
private activateTurnPromptSecondaryAction() {
private activateTurnPromptSecondaryAction(fromPointer = false) {
const action = this.turnPromptSecondaryAction ?? (() => this.hideTurnEndPrompt());
if (fromPointer) {
this.suppressNextLeftClick = true;
}
soundDirector.playSelect();
action();
}