Confirm before starting a new campaign

This commit is contained in:
2026-07-05 02:34:20 +09:00
parent d7c706852e
commit 4a8d9e960a

View File

@@ -9,6 +9,7 @@ import { startLazyScene } from './lazyScenes';
export class TitleScene extends Phaser.Scene { export class TitleScene extends Phaser.Scene {
private focusedButton?: Phaser.GameObjects.Text; private focusedButton?: Phaser.GameObjects.Text;
private settingsPanel?: Phaser.GameObjects.Container; private settingsPanel?: Phaser.GameObjects.Container;
private newGameConfirmPanel?: Phaser.GameObjects.Container;
private navigating = false; private navigating = false;
constructor() { constructor() {
@@ -18,6 +19,7 @@ export class TitleScene extends Phaser.Scene {
create() { create() {
this.focusedButton = undefined; this.focusedButton = undefined;
this.settingsPanel = undefined; this.settingsPanel = undefined;
this.newGameConfirmPanel = undefined;
this.navigating = false; this.navigating = false;
const debugBattleId = this.debugBattleId(); const debugBattleId = this.debugBattleId();
@@ -53,7 +55,7 @@ export class TitleScene extends Phaser.Scene {
this.input.once('pointerdown', unlockAudio); this.input.once('pointerdown', unlockAudio);
this.input.keyboard?.once('keydown', unlockAudio); this.input.keyboard?.once('keydown', unlockAudio);
this.input.keyboard?.once('keydown-ENTER', () => this.startGame()); this.input.keyboard?.once('keydown-ENTER', () => this.requestStartGame());
} }
private shouldOpenDebugSortiePrep() { private shouldOpenDebugSortiePrep() {
@@ -210,7 +212,7 @@ export class TitleScene extends Phaser.Scene {
this.add.rectangle(menuX, menuY - plateHeight / 2, 186, 2, palette.gold, 0.7); this.add.rectangle(menuX, menuY - plateHeight / 2, 186, 2, palette.gold, 0.7);
this.add.rectangle(menuX, menuY + plateHeight / 2, 186, 2, palette.gold, 0.36); this.add.rectangle(menuX, menuY + plateHeight / 2, 186, 2, palette.gold, 0.36);
this.createMenuButton(menuX, menuY - 70, '새 게임', true, () => this.startGame()); this.createMenuButton(menuX, menuY - 70, '새 게임', true, () => this.requestStartGame());
this.createMenuButton(menuX, menuY, isEndingComplete ? '엔딩 보기' : '이어하기', canContinue, () => this.continueGame()); this.createMenuButton(menuX, menuY, isEndingComplete ? '엔딩 보기' : '이어하기', canContinue, () => this.continueGame());
this.createMenuButton(menuX, menuY + 70, '설정', true, () => this.openSettingsPanel(menuX, menuY)); this.createMenuButton(menuX, menuY + 70, '설정', true, () => this.openSettingsPanel(menuX, menuY));
@@ -340,6 +342,7 @@ export class TitleScene extends Phaser.Scene {
} }
soundDirector.playSelect(); soundDirector.playSelect();
this.closeNewGameConfirmPanel();
const panel = this.add.container(x, y + 238); const panel = this.add.container(x, y + 238);
const backdrop = this.add.rectangle(0, 0, 286, 188, 0x0e151d, 0.9); const backdrop = this.add.rectangle(0, 0, 286, 188, 0x0e151d, 0.9);
@@ -398,6 +401,76 @@ export class TitleScene extends Phaser.Scene {
this.settingsPanel = undefined; this.settingsPanel = undefined;
} }
private requestStartGame() {
if (!hasCampaignSave()) {
this.startGame();
return;
}
const { width, height } = this.scale;
const compact = width < 720;
const menuX = compact ? width / 2 : width - 318;
const menuY = height * (compact ? 0.36 : 0.43);
this.openNewGameConfirmPanel(menuX, menuY);
}
private openNewGameConfirmPanel(x: number, y: number) {
if (this.newGameConfirmPanel) {
this.closeNewGameConfirmPanel();
return;
}
soundDirector.playSelect();
this.closeSettingsPanel();
const panel = this.add.container(x, y + 240);
const backdrop = this.add.rectangle(0, 0, 286, 174, 0x0e151d, 0.94);
backdrop.setStrokeStyle(1, palette.gold, 0.58);
const title = this.add.text(0, -58, '새로 시작', {
fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif',
fontSize: '23px',
color: '#f1e3c2',
fontStyle: '700',
fixedWidth: 220,
align: 'center'
});
title.setOrigin(0.5);
const message = this.add.text(0, -20, '현재 저장을 덮고\n처음부터 시작합니다.', {
fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif',
fontSize: '15px',
color: '#bfc8d3',
fixedWidth: 236,
align: 'center',
lineSpacing: 4
});
message.setOrigin(0.5);
const confirm = this.createSettingsButton(0, 30, '새 게임 시작');
confirm.setColor('#f1e3c2');
confirm.on('pointerdown', () => {
this.closeNewGameConfirmPanel();
this.startGame();
});
const cancel = this.createSettingsButton(0, 74, '취소');
cancel.on('pointerdown', () => {
soundDirector.playSelect();
this.closeNewGameConfirmPanel();
});
panel.add([backdrop, title, message, confirm, cancel]);
panel.setAlpha(0);
this.newGameConfirmPanel = panel;
this.tweens.add({ targets: panel, alpha: 1, y: y + 230, duration: 160, ease: 'Sine.easeOut' });
}
private closeNewGameConfirmPanel() {
this.newGameConfirmPanel?.destroy();
this.newGameConfirmPanel = undefined;
}
private startGame() { private startGame() {
soundDirector.start(); soundDirector.start();
soundDirector.resume(); soundDirector.resume();