From d60ddfd6c27889b95f523191b3940a2173cf31dd Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 5 Jul 2026 02:23:23 +0900 Subject: [PATCH] Show completed campaign state on title screen --- src/game/scenes/TitleScene.ts | 51 ++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/src/game/scenes/TitleScene.ts b/src/game/scenes/TitleScene.ts index d073be6..3a97567 100644 --- a/src/game/scenes/TitleScene.ts +++ b/src/game/scenes/TitleScene.ts @@ -199,16 +199,53 @@ export class TitleScene extends Phaser.Scene { const compact = width < 720; const menuX = compact ? width / 2 : width - 318; const menuY = height * (compact ? 0.36 : 0.43); - - const plate = this.add.rectangle(menuX, menuY, 250, 252, 0x111821, 0.66); - plate.setStrokeStyle(1, palette.gold, 0.45); - this.add.rectangle(menuX, menuY - 126, 186, 2, palette.gold, 0.7); - this.add.rectangle(menuX, menuY + 126, 186, 2, palette.gold, 0.36); - const canContinue = hasCampaignSave(); + const campaign = canContinue ? loadCampaignState() : undefined; + const isEndingComplete = campaign?.step === 'ending-complete'; + const plateHeight = isEndingComplete ? 324 : 252; + + const plate = this.add.rectangle(menuX, menuY, 250, plateHeight, 0x111821, 0.66); + plate.setStrokeStyle(1, palette.gold, 0.45); + 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.createMenuButton(menuX, menuY - 70, '새 게임', true, () => this.startGame()); - this.createMenuButton(menuX, menuY, '이어하기', canContinue, () => this.continueGame()); + this.createMenuButton(menuX, menuY, isEndingComplete ? '엔딩 보기' : '이어하기', canContinue, () => this.continueGame()); this.createMenuButton(menuX, menuY + 70, '설정', true, () => this.openSettingsPanel(menuX, menuY)); + + if (isEndingComplete && campaign) { + this.drawCampaignCompleteBadge(menuX, menuY + 132, campaign); + } + } + + private drawCampaignCompleteBadge(x: number, y: number, campaign: ReturnType) { + const completedBattles = Object.keys(campaign.battleHistory).length; + const rosterCount = campaign.roster.length; + const badge = this.add.container(x, y); + const background = this.add.rectangle(0, 0, 210, 58, 0x21180f, 0.92); + background.setStrokeStyle(1, palette.gold, 0.52); + + const title = this.add.text(0, -14, '완결 저장', { + fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif', + fontSize: '18px', + color: '#f6e6bd', + fontStyle: '700', + fixedWidth: 190, + align: 'center', + padding: { top: 3, bottom: 3 } + }); + title.setOrigin(0.5); + + const detail = this.add.text(0, 14, `${completedBattles}전 완수 · ${rosterCount}명 합류`, { + fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif', + fontSize: '14px', + color: '#d8b15f', + fixedWidth: 190, + align: 'center' + }); + detail.setOrigin(0.5); + + badge.add([background, title, detail]); } private createMenuButton(