Clarify non-battle sortie copy

This commit is contained in:
2026-07-05 05:41:25 +09:00
parent 284c7fe29d
commit 9223b04d13

View File

@@ -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() {