From 9223b04d136f62ea200b76c808ac3341934273e0 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 5 Jul 2026 05:41:25 +0900 Subject: [PATCH] Clarify non-battle sortie copy --- src/game/scenes/CampScene.ts | 66 +++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 4f6e5b8..702fc06 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -12296,6 +12296,7 @@ export class CampScene extends Phaser.Scene { const selectedNames = selectedUnits.map((unit) => unit.name).join(', '); const recommendedClassLine = this.sortieRecommendedClassLine(); const maxUnits = this.sortieMaxUnits(); + const hasBattle = Boolean(this.nextSortieScenario()); const bg = this.trackSortie(this.add.rectangle(x, y, width, height, 0x0d141c, 0.78)); bg.setOrigin(0); bg.setDepth(depth); @@ -12306,7 +12307,7 @@ export class CampScene extends Phaser.Scene { this.add.text( x + 44, y + 10, - this.compactText(`출전 ${selectedUnits.length}/${maxUnits}: ${selectedNames || '없음'}`, 35), + this.compactText(`${hasBattle ? '출전' : '동행'} ${selectedUnits.length}/${maxUnits}: ${selectedNames || '없음'}`, 35), this.textStyle(13, '#f2e3bf', true) ) ).setDepth(depth + 1); @@ -12315,7 +12316,7 @@ export class CampScene extends Phaser.Scene { this.add.text( x + 44, y + 35, - this.compactText(`추천 ${recommendedClassLine} · 대기 ${reserveUnits.length}명`, 35), + this.compactText(`${hasBattle ? '추천' : '정비'} ${recommendedClassLine} · 대기 ${reserveUnits.length}명`, 35), this.textStyle(12, reserveUnits.length > 0 ? '#c8d2dd' : '#9fb0bf', true) ) ).setDepth(depth + 1); @@ -12331,6 +12332,7 @@ export class CampScene extends Phaser.Scene { const scenario = this.nextSortieScenario(); const objective = scenario ? scenario.victoryConditionLabel : '군영 의정 진행'; const terrain = scenario ? this.sortieTerrainSummary(scenario) : '군영'; + const enemyLabel = scenario ? '적' : '장면'; const enemies = scenario ? this.sortieEnemySummary(scenario) : '전투 없음'; const recommendedClasses = this.sortieRecommendedClassLine(scenario); this.trackSortie(this.add.text(x + 18, y + 12, briefing.eyebrow, this.textStyle(15, '#9fb0bf', true))).setDepth(depth + 1); @@ -12346,7 +12348,7 @@ export class CampScene extends Phaser.Scene { const chipWidth = Math.floor((width - 48) / 4); this.renderSortieInfoChip('목표', objective, x + 18, chipY, chipWidth, depth + 1); this.renderSortieInfoChip('지형', terrain, x + 24 + chipWidth, chipY, chipWidth, depth + 1); - this.renderSortieInfoChip('적', enemies, x + 30 + chipWidth * 2, chipY, chipWidth, depth + 1); + this.renderSortieInfoChip(enemyLabel, enemies, x + 30 + chipWidth * 2, chipY, chipWidth, depth + 1); this.renderSortieInfoChip('추천', recommendedClasses, x + 36 + chipWidth * 3, chipY, chipWidth, depth + 1); } @@ -12560,10 +12562,18 @@ export class CampScene extends Phaser.Scene { bg.setStrokeStyle(1, palette.gold, 0.5); const plan = this.sortiePlanSummary(); - this.trackSortie(this.add.text(x + 18, y + 14, '출전 슬롯', this.textStyle(18, '#f2e3bf', true))).setDepth(depth + 1); - this.renderSortiePanelButton('추천 편성', x + width - 104, y + 10, 86, 22, Boolean(this.nextSortieScenario()), false, () => this.applyRecommendedSortiePlan(), depth + 1); + const hasBattle = Boolean(this.nextSortieScenario()); + this.trackSortie(this.add.text(x + 18, y + 14, hasBattle ? '출전 슬롯' : '동행 명단', this.textStyle(18, '#f2e3bf', true))).setDepth(depth + 1); + this.renderSortiePanelButton(hasBattle ? '추천 편성' : '추천 동행', x + width - 104, y + 10, 86, 22, hasBattle, false, () => this.applyRecommendedSortiePlan(), depth + 1); this.trackSortie( - this.add.text(x + 18, y + 38, `${plan.selectedCount}/${plan.maxCount}명 · 지형 ${plan.terrainGrade} · ${this.sortieRecommendedClassLine()}`, this.textStyle(11, '#d8b15f', true)) + this.add.text( + x + 18, + y + 38, + hasBattle + ? `${plan.selectedCount}/${plan.maxCount}명 · 지형 ${plan.terrainGrade} · ${this.sortieRecommendedClassLine()}` + : `${plan.selectedCount}/${plan.maxCount}명 · 군영 의정 · ${this.sortieRecommendedClassLine()}`, + this.textStyle(11, '#d8b15f', true) + ) ).setDepth(depth + 1); this.renderSortieDeploymentMap(x + 16, y + 58, width - 32, 62, depth + 1); @@ -12584,6 +12594,7 @@ export class CampScene extends Phaser.Scene { private renderSortieSlotCards(x: number, y: number, width: number, height: number, plan: SortiePlanSummary, depth: number) { const selectedUnits = this.selectedSortieUnits(); const maxCount = plan.maxCount; + const hasBattle = Boolean(this.nextSortieScenario()); const columns = 2; const gap = 8; const rows = Math.max(1, Math.ceil(maxCount / columns)); @@ -12604,7 +12615,7 @@ export class CampScene extends Phaser.Scene { bg.setInteractive({ useHandCursor: true }); bg.on('pointerdown', () => { if (!unit) { - this.showCampNotice('왼쪽 명단에서 출전할 무장을 선택하세요.'); + this.showCampNotice(`왼쪽 명단에서 ${hasBattle ? '출전' : '동행'}할 무장을 선택하세요.`); return; } this.sortieFocusedUnitId = unit.id; @@ -12691,6 +12702,7 @@ export class CampScene extends Phaser.Scene { const status = this.unitRosterStatus(unit); const availability = this.sortieUnitAvailability(unit); const recommendation = this.sortieRecommendation(unit.id); + const hasBattle = Boolean(this.nextSortieScenario()); const roleLabel = this.sortieFormationRoleLabel(this.sortieFormationRole(unit)); const terrainScore = this.sortieTerrainScore(unit, this.nextSortieScenario()); const terrainGrade = this.sortieTerrainGrade(terrainScore); @@ -12701,8 +12713,12 @@ export class CampScene extends Phaser.Scene { : recommendation ? this.sortieRecommendationHint(recommendation, unit, 26) : selected - ? `${roleLabel} 배치 중입니다. 역할 버튼으로 시작 위치 성향을 바꿀 수 있습니다.` - : '명단이나 버튼을 눌러 출전 슬롯에 배치할 수 있습니다.'; + ? hasBattle + ? `${roleLabel} 배치 중입니다. 역할 버튼으로 시작 위치 성향을 바꿀 수 있습니다.` + : `${roleLabel} 성향으로 동행 중입니다. 역할 버튼으로 군영 기록 성향을 바꿀 수 있습니다.` + : hasBattle + ? '명단이나 버튼을 눌러 출전 슬롯에 배치할 수 있습니다.' + : '명단이나 버튼을 눌러 다음 장면 동행 명단에 넣을 수 있습니다.'; this.trackSortie(this.add.text(x + 18, y + 14, '선택 무장 상세', this.textStyle(17, '#f2e3bf', true))).setDepth(depth + 1); this.trackSortie(this.add.text(x + width - 16, y + 16, status.label, this.textStyle(11, statusColor, true))).setOrigin(1, 0).setDepth(depth + 1); @@ -13151,7 +13167,8 @@ export class CampScene extends Phaser.Scene { frame.setStrokeStyle(1, palette.blue, 0.48); if (!scenario) { - this.trackSortie(this.add.text(x + 14, y + 34, '다음 전투 배치 정보가 없습니다.', this.textStyle(12, '#9fb0bf'))).setDepth(depth + 1); + this.trackSortie(this.add.text(x + 14, y + 22, '전투 배치 없음', this.textStyle(12, '#d8b15f', true))).setDepth(depth + 1); + this.trackSortie(this.add.text(x + 14, y + 40, '다음 장면에 함께할 동행 명단을 확인합니다.', this.textStyle(11, '#9fb0bf'))).setDepth(depth + 1); return; } @@ -13597,6 +13614,7 @@ export class CampScene extends Phaser.Scene { private sortieChecklist(): SortieChecklistItem[] { const units = this.currentUnits().filter((unit) => unit.faction === 'ally'); const sortieAllies = this.sortieAllies(); + const hasBattle = Boolean(this.nextSortieScenario()); const requiredUnitIds = [...this.requiredSortieUnitIdsFor()].filter((id) => sortieAllies.some((unit) => unit.id === id)); const requiredUnits = requiredUnitIds.map((id) => sortieAllies.find((unit) => unit.id === id)).filter(Boolean) as UnitData[]; const requiredLabel = requiredUnits.length > 0 && !requiredUnitIds.includes('liu-bei') ? '필수 무장 확인' : '유비 생존'; @@ -13642,25 +13660,25 @@ export class CampScene extends Phaser.Scene { priority: 'recommended' }, { - label: '출전 구성', + label: hasBattle ? '출전 구성' : '동행 구성', complete: requiredUnitIds.every((id) => selected.some((unit) => unit.id === id)) && selected.length > 0, - detail: selected.length > 0 ? selected.map((unit) => unit.name).join(', ') : '출전 무장 선택 필요', + detail: selected.length > 0 ? selected.map((unit) => unit.name).join(', ') : hasBattle ? '출전 무장 선택 필요' : '동행 무장 선택 필요', priority: 'required' }, { - label: '추천 병종', + label: hasBattle ? '추천 병종' : '추천 편성', complete: recommendedClassComplete, detail: recommendedClassLine, priority: 'recommended' }, { - label: '전열 역할', + label: hasBattle ? '전열 역할' : '편성 역할', complete: rolesReady, detail: `전열 ${roleCounts.front} · 돌파 ${roleCounts.flank} · 후원 ${roleCounts.support}`, priority: 'recommended' }, { - label: '전투 보급', + label: hasBattle ? '전투 보급' : '보급 배정', complete: supplyCount === 0 || assignedSupplyCount > 0, detail: supplyCount > 0 ? `배정 ${assignedSupplyCount}/${supplyCount}` : '보급 없음', priority: 'recommended' @@ -13705,14 +13723,15 @@ export class CampScene extends Phaser.Scene { private startVictoryStory() { const flow = this.currentSortieFlow(); if (!this.isFinalEpilogueFlow(flow) && !this.ensureSortieSelectionSaved()) { + const hasBattle = Boolean(flow.nextBattleId); const availableIds = new Set(this.sortieAllies().map((unit) => unit.id)); const requiredNames = [...this.requiredSortieUnitIdsFor()] .filter((unitId) => availableIds.has(unitId)) .map((unitId) => this.unitName(unitId)); this.showCampNotice( requiredNames.length > 0 - ? `출전할 무장을 선택하세요. ${requiredNames.join(', ')}는 반드시 포함되어야 합니다.` - : '출전할 무장을 선택하세요.' + ? `${hasBattle ? '출전' : '동행'}할 무장을 선택하세요. ${requiredNames.join(', ')}는 반드시 포함되어야 합니다.` + : `${hasBattle ? '출전' : '동행'}할 무장을 선택하세요.` ); return; } @@ -13864,6 +13883,7 @@ export class CampScene extends Phaser.Scene { private unitRosterStatus(unit: UnitData) { const availability = this.sortieUnitAvailability(unit); + const hasBattle = Boolean(this.nextSortieScenario()); if (!availability.available) { return { label: availability.label, tone: 'disabled' as const }; } @@ -13873,7 +13893,7 @@ export class CampScene extends Phaser.Scene { return { label: '필수', tone: 'recommended' as const }; } if (selected) { - return { label: recommendation ? '추천 출전' : '출전', tone: 'selected' as const }; + return { label: recommendation ? (hasBattle ? '추천 출전' : '추천 동행') : hasBattle ? '출전' : '동행', tone: 'selected' as const }; } if (recommendation) { return { label: '추천 대기', tone: 'recommended' as const }; @@ -14932,6 +14952,7 @@ export class CampScene extends Phaser.Scene { scenario = this.nextSortieScenario(), rule = this.nextSortieRule(scenario) ): SortieUnitAvailability { + const hasBattle = Boolean(scenario); if (unit.faction !== 'ally') { return { available: false, label: '적', reason: '아군 명단에 포함되지 않습니다.', tone: 'disabled' }; } @@ -14949,12 +14970,17 @@ export class CampScene extends Phaser.Scene { return { available: false, label: '후방', reason: '이번 전투의 시작 배치 후보가 아닙니다.', tone: 'disabled' }; } if (this.isSortieSelected(unit.id)) { - return { available: true, label: '출전', reason: '출전 슬롯에 배치되었습니다.', tone: 'selected' }; + return { + available: true, + label: hasBattle ? '출전' : '동행', + reason: hasBattle ? '출전 슬롯에 배치되었습니다.' : '다음 장면 동행 명단에 포함되었습니다.', + tone: 'selected' + }; } if (this.sortieRecommendation(unit.id, scenario)) { return { available: true, label: '추천', reason: this.sortieRecommendation(unit.id, scenario)?.reason ?? '이번 전투 추천 무장입니다.', tone: 'recommended' }; } - return { available: true, label: '대기', reason: '출전 가능한 후보입니다.', tone: 'reserve' }; + return { available: true, label: '대기', reason: hasBattle ? '출전 가능한 후보입니다.' : '동행 가능한 후보입니다.', tone: 'reserve' }; } private selectedSortieUnits() {