From 897cd72829d3921c9dabad9a700aa07a3e4520a7 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Fri, 3 Jul 2026 01:50:46 +0900 Subject: [PATCH] Improve sortie prep readability --- src/game/scenes/CampScene.ts | 44 +++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 5ed7849..116b8c8 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -250,6 +250,7 @@ type SortiePlanSummary = { reserveTrainingBondPreview: number; objectiveLine: string; formationSlots: SortieFormationSlot[]; + warningLine: string; warnings: string[]; }; @@ -11500,18 +11501,20 @@ export class CampScene extends Phaser.Scene { this.add.text(x + width - 18, y + 17, `${plan.selectedCount}/${plan.maxCount}명 · 지형 ${plan.terrainGrade}`, this.textStyle(12, '#d8b15f', true)) ).setOrigin(1, 0).setDepth(depth + 1); - this.renderSortieDeploymentMap(x + 18, y + 46, width - 36, 84, depth + 1); - this.renderSortieRoleSlots(x + 18, y + 136, width - 36, 48, plan, depth + 1); + this.renderSortieDeploymentMap(x + 18, y + 46, width - 36, 76, depth + 1); + this.trackSortie(this.add.text(x + 18, y + 128, '선택 무장 역할 지정', this.textStyle(11, '#d8b15f', true))).setDepth(depth + 1); + this.trackSortie(this.add.text(x + width - 18, y + 128, '슬롯 클릭으로 변경', this.textStyle(10, '#9fb0bf', true))).setOrigin(1, 0).setDepth(depth + 1); + this.renderSortieRoleSlots(x + 18, y + 143, width - 36, 48, plan, depth + 1); this.trackSortie( this.add.text( x + 18, - y + 190, - this.compactText(`${plan.recommendationLine} · 공명 ${plan.activeBondCount}개 · ${plan.objectiveLine}`, 44), - this.textStyle(11, '#d4dce6', true) + y + 196, + this.compactText(plan.warningLine, 42), + this.textStyle(11, plan.warnings.length > 0 ? '#ffdf7b' : '#a8ffd0', true) ) ).setDepth(depth + 1); - this.renderSortieFocusPanel(x + 18, y + 204, width - 36, 74, depth + 1); + this.renderSortieFocusPanel(x + 18, y + 210, width - 36, 68, depth + 1); } private renderSortieRoleSlots(x: number, y: number, width: number, height: number, plan: SortiePlanSummary, depth: number) { @@ -11541,9 +11544,9 @@ export class CampScene extends Phaser.Scene { bg.on('pointerout', () => { bg.setFillStyle(filled ? 0x172a22 : 0x111922, filled ? 0.94 : 0.78); }); - this.renderSortieBattleUiIcon(this.formationRoleIconKey(slot.role), slotX + 13, slotY + slotHeight / 2, 18, depth + 1, filled ? 0.95 : 0.5); - this.trackSortie(this.add.text(slotX + 28, slotY + 3, `${slot.label} ${slot.unitNames.length}`, this.textStyle(10, filled ? '#f2e3bf' : '#9fb0bf', true))).setDepth(depth + 1); - this.trackSortie(this.add.text(slotX + 76, slotY + 3, this.compactText(slot.unitNames.join(', ') || slot.description, 12), this.textStyle(10, filled ? '#c8d2dd' : '#68727e'))).setDepth(depth + 1); + this.renderSortieBattleUiIcon(this.formationRoleIconKey(slot.role), slotX + 14, slotY + slotHeight / 2, 20, depth + 1, filled ? 0.98 : 0.58); + this.trackSortie(this.add.text(slotX + 30, slotY + 2, `${slot.label} ${slot.unitNames.length}`, this.textStyle(11, focusedRole ? '#ffdf7b' : filled ? '#f2e3bf' : '#9fb0bf', true))).setDepth(depth + 1); + this.trackSortie(this.add.text(slotX + 30, slotY + 15, this.compactText(slot.unitNames.join(', ') || slot.description, 17), this.textStyle(9, filled ? '#c8d2dd' : '#7f8994', filled))).setDepth(depth + 1); }); } @@ -11573,7 +11576,9 @@ export class CampScene extends Phaser.Scene { return `${equipmentSlotLabels[slot]} ${item.name} Lv${state.level}`; }) .join(' / '); - const reason = recommendation?.reason ?? (this.isSortieSelected(unit.id) ? '현재 출전 편성에 포함되어 있습니다.' : '대기 훈련으로 성장시키거나 전장 역할에 맞춰 교체할 수 있습니다.'); + const selected = this.isSortieSelected(unit.id); + const roleHint = selected ? `${roleLabel} 배치 · 역할 슬롯 클릭으로 변경` : '대기 중 · 명단 클릭으로 출전 전환'; + const reason = recommendation?.reason ?? roleHint; this.renderSortieBattleUiIcon(this.unitClassIconKey(unit), x + 24, y + 25, 32, depth + 1, 0.98); this.trackSortie(this.add.text(x + 48, y + 6, this.compactText(headline, 24), this.textStyle(13, '#f2e3bf', true))).setDepth(depth + 1); @@ -11586,9 +11591,9 @@ export class CampScene extends Phaser.Scene { this.trackSortie(this.add.text(x + 274, y + 30, `지형 ${terrainGrade} ${terrainScore}`, this.textStyle(10, '#d8b15f', true))).setDepth(depth + 1); this.renderSortieEquipmentIcons(unit, x + 26, y + 52, true, depth + 1, 20, 16, 25); - this.trackSortie(this.add.text(x + 94, y + 47, this.compactText(equipLine, 38), this.textStyle(10, '#c8d2dd', true))).setDepth(depth + 1); + this.trackSortie(this.add.text(x + 94, y + 46, this.compactText(equipLine, 38), this.textStyle(10, '#c8d2dd', true))).setDepth(depth + 1); this.trackSortie( - this.add.text(x + 94, y + 61, this.compactText(reason, 28), this.textStyle(9, recommendation ? '#ffdf7b' : '#9fb0bf', Boolean(recommendation))) + this.add.text(x + 94, y + 58, this.compactText(reason, 32), this.textStyle(10, recommendation ? '#ffdf7b' : selected ? '#a8ffd0' : '#9fb0bf', true)) ).setDepth(depth + 1); } @@ -11898,7 +11903,19 @@ export class CampScene extends Phaser.Scene { dot.setStrokeStyle(1, 0x05070a, 0.82); }); - this.trackSortie(this.add.text(x + 10, y + height - 16, '전열/돌파/후원 배치점 · 붉은색: 적', this.textStyle(10, '#9fb0bf'))).setDepth(depth + 2); + const legend = [ + { label: '전열', color: this.sortieRoleDotColor('front') }, + { label: '돌파', color: this.sortieRoleDotColor('flank') }, + { label: '후원', color: this.sortieRoleDotColor('support') }, + { label: '적', color: 0xd35f4a } + ]; + let legendX = x + 10; + legend.forEach((entry) => { + const dot = this.trackSortie(this.add.circle(legendX + 4, y + height - 10, 3.2, entry.color, 0.96)); + dot.setDepth(depth + 2); + this.trackSortie(this.add.text(legendX + 10, y + height - 16, entry.label, this.textStyle(9, '#c8d2dd', true))).setDepth(depth + 2); + legendX += 45; + }); } private sortieDeploymentPlanForScenario(scenario: BattleScenarioDefinition) { @@ -12013,6 +12030,7 @@ export class CampScene extends Phaser.Scene { reserveTrainingBondPreview: reserveFocus.bondExpGained, objectiveLine: scenario ? `${scenario.title} · ${scenario.victoryConditionLabel}` : `${flow.title} · 군영 의정`, formationSlots, + warningLine: warnings[0] ?? '배치 균형 양호', warnings }; }