From 463eb723108e6fa599f19d10549de9ef2b81b7fc Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 5 Jul 2026 02:37:59 +0900 Subject: [PATCH] Show save slot metadata on title --- src/game/scenes/TitleScene.ts | 40 +++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/game/scenes/TitleScene.ts b/src/game/scenes/TitleScene.ts index 905239b..2699618 100644 --- a/src/game/scenes/TitleScene.ts +++ b/src/game/scenes/TitleScene.ts @@ -205,7 +205,7 @@ export class TitleScene extends Phaser.Scene { const canContinue = hasCampaignSave(); const campaign = canContinue ? loadCampaignState() : undefined; const isEndingComplete = campaign?.step === 'ending-complete'; - const plateHeight = campaign ? 324 : 252; + const plateHeight = campaign ? 348 : 252; const plate = this.add.rectangle(menuX, menuY, 250, plateHeight, 0x111821, 0.66); plate.setStrokeStyle(1, palette.gold, 0.45); @@ -228,30 +228,39 @@ export class TitleScene extends Phaser.Scene { isEndingComplete: boolean ) { const badge = this.add.container(x, y); - const background = this.add.rectangle(0, 0, 210, 58, 0x21180f, 0.92); + const background = this.add.rectangle(0, 0, 216, 78, 0x21180f, 0.92); background.setStrokeStyle(1, palette.gold, 0.52); - const title = this.add.text(0, -14, isEndingComplete ? '완결 저장' : '진행 저장', { + const title = this.add.text(0, -24, isEndingComplete ? '완결 저장' : '진행 저장', { fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif', fontSize: '18px', color: '#f6e6bd', fontStyle: '700', - fixedWidth: 190, + fixedWidth: 198, align: 'center', padding: { top: 3, bottom: 3 } }); title.setOrigin(0.5); - const detail = this.add.text(0, 14, this.campaignSaveDetail(campaign, isEndingComplete), { + const detail = this.add.text(0, 0, this.campaignSaveDetail(campaign, isEndingComplete), { fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif', fontSize: '14px', color: '#d8b15f', - fixedWidth: 190, + fixedWidth: 198, align: 'center' }); detail.setOrigin(0.5); - badge.add([background, title, detail]); + const meta = this.add.text(0, 24, this.campaignSaveMeta(campaign), { + fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif', + fontSize: '12px', + color: '#9fb0bf', + fixedWidth: 198, + align: 'center' + }); + meta.setOrigin(0.5); + + badge.add([background, title, detail, meta]); } private campaignSaveDetail(campaign: ReturnType, isEndingComplete: boolean) { @@ -284,6 +293,23 @@ export class TitleScene extends Phaser.Scene { return label.length > 19 ? `${label.slice(0, 18)}...` : label; } + private campaignSaveMeta(campaign: ReturnType) { + return `슬롯 ${campaign.activeSaveSlot} · ${this.formatSaveUpdatedAt(campaign.updatedAt)}`; + } + + private formatSaveUpdatedAt(updatedAt: string) { + const date = new Date(updatedAt); + if (Number.isNaN(date.getTime())) { + return '저장 시각 미상'; + } + + const month = date.getMonth() + 1; + const day = date.getDate(); + const hour = String(date.getHours()).padStart(2, '0'); + const minute = String(date.getMinutes()).padStart(2, '0'); + return `${month}/${day} ${hour}:${minute}`; + } + private createMenuButton( x: number, y: number,