feat: make third-camp preparation choices explicit

This commit is contained in:
2026-07-28 01:29:20 +09:00
parent 1a81ce5689
commit a41672bd0e
11 changed files with 1608 additions and 143 deletions

View File

@@ -749,6 +749,8 @@ export class CampVisitExplorationScene extends Phaser.Scene {
})) ?? [],
selectedPriorityId:
thirdProgress?.selectedPriorityId ?? null,
selectionConfirmed:
thirdProgress?.selectionConfirmed ?? false,
selectedPriorityLabel:
selectedThirdPriority?.label ?? null,
hudActivityTitle:
@@ -933,8 +935,9 @@ export class CampVisitExplorationScene extends Phaser.Scene {
this.completeThirdCampActivity(
activityId as ThirdCampExplorationActivityId
);
return thirdCampExplorationProgress().selectedPriorityId ===
activityId;
return thirdCampExplorationProgress().completedActivityIds.includes(
activityId as ThirdCampExplorationActivityId
);
}
private isSecondReliefVisit() {
@@ -1061,7 +1064,7 @@ export class CampVisitExplorationScene extends Phaser.Scene {
? getThirdCampPreparationPriority(progress.selectedPriorityId)
: undefined;
return progress.completedActivityCount > 0
? `선택 활동 ${progress.completedActivityCount} / 3 · 현재 우선 ${selected?.label ?? '미정'} · 언제든 출진 가능`
? `준비 활동 ${progress.completedActivityCount} / 3 · 출진 보너스 ${selected?.label ?? '미선택'}${progress.ready ? '' : selected ? ' 확인 필요' : ''} · 군영 장부에서 확정`
: '준비 활동 0 / 3 · 원하는 곳만 살피고 남쪽 출구에서 언제든 출진할 수 있습니다.';
}
@@ -1721,7 +1724,7 @@ export class CampVisitExplorationScene extends Phaser.Scene {
150,
'자유 준비 0 / 3',
'작전판 · 보급 수레 · 먼저 귀환한 동료',
'한 곳만 확인해도 방침이 정해지며, 마지막 활동이 현재 우선 기준이 됩니다.'
'활동을 마치면 보너스 후보가 열립니다. 현재 출진 보너스는 자동으로 바뀌지 않습니다.'
);
this.objectiveCard = activityCard.background;
this.thirdActivityTitleText = activityCard.titleText;
@@ -1736,9 +1739,9 @@ export class CampVisitExplorationScene extends Phaser.Scene {
const priorityCard = this.drawObjectiveCard(
342,
'현재 출진 우선',
'출진 보너스 확정',
'아직 정하지 않음',
'완료한 활동을 다시 확인하면 보상 중복 없이 우선 기준만 바뀝니다.'
'실제로 적용할 하나는 군영 장부에서 따로 선택하고 확정합니다.'
);
this.thirdPriorityLocationText = priorityCard.locationText;
@@ -2913,7 +2916,7 @@ export class CampVisitExplorationScene extends Phaser.Scene {
const newlyCompleted =
!before.completedActivityIds.includes(activityId);
this.inputReadyAt = this.time.now + inputCarryoverGuardMs;
this.lastNotice = `${result.activity.shortLabel} · 현재 출진 우선`;
this.lastNotice = `${result.activity.shortLabel} · 보너스 후보 해금`;
if (newlyCompleted) {
soundDirector.playObjectiveAchieved();
} else {
@@ -2925,8 +2928,8 @@ export class CampVisitExplorationScene extends Phaser.Scene {
this.refreshInteractionPrompt();
this.showCompletionToast(
newlyCompleted
? result.activity.completionLine
: `${result.priority.label}을 현재 출진 우선으로 다시 선택했습니다. 보상은 중복되지 않습니다.`,
? `${result.activity.completionLine} 군영 장부에서 출진 보너스로 선택할 수 있습니다.`
: `${result.priority.label} 후보는 이미 해금되어 있습니다. 현재 출진 보너스는 그대로 유지됩니다.`,
'success',
newlyCompleted ? 2100 : 1750
);
@@ -3572,7 +3575,7 @@ export class CampVisitExplorationScene extends Phaser.Scene {
this.inputReadyAt = this.time.now + inputCarryoverGuardMs;
this.closeChoicePanel();
this.lastNotice = '동료 공명 · 현재 출진 우선';
this.lastNotice = '동료 공명 · 보너스 후보 해금';
if (alreadyCompleted) {
soundDirector.playSelect();
} else {
@@ -3593,8 +3596,8 @@ export class CampVisitExplorationScene extends Phaser.Scene {
{
speaker: '공명 기록',
text: alreadyCompleted
? `${result.memory.label}을 현재 출진 우선으로 다시 선택했습니다. 공명 보상은 중복되지 않습니다.`
: `${result.choice.label} · 공명 +${result.rewardExp} · 다음 본영전 초반 협공 신호에 반영`
? '동료 공명 후보는 이미 해금되어 있습니다. 현재 출진 보너스와 공명 보상은 바뀌지 않습니다.'
: `${result.choice.label} · 공명 +${result.rewardExp} · 군영 장부에서 초반 협공 보너스로 선택 가능`
}
],
() =>
@@ -3657,7 +3660,7 @@ export class CampVisitExplorationScene extends Phaser.Scene {
portraitKey: 'liuBei',
text:
progress.completedActivityCount > 0
? '살핀 준비와 현재 우선 기준은 장부에 남았다. 나머지는 선택이니 군영으로 돌아가 출진 여부를 정하자.'
? '살핀 준비는 장부에 남았다. 실제로 적용할 보너스는 군영 장부에서 따로 정하고 출진하자.'
: '아직 별도 준비를 확인하지 않았지만, 세 활동은 모두 선택이다. 군영 장부로 돌아가 바로 출진해도 된다.'
},
{
@@ -3766,8 +3769,8 @@ export class CampVisitExplorationScene extends Phaser.Scene {
sceneHeight / 2 + 44,
this.isThirdCampVisit()
? this.visitComplete()
? '선택한 출진 우선과 완료한 활동을 장부에 반영합니다.'
: '선택 활동을 남겨 두고 군영 장부로 돌아갑니다.'
? '완료한 활동을 장부에 반영하고, 출진 보너스는 군영에서 따로 확정합니다.'
: '완료한 활동을 저장하고 보너스를 정할 군영 장부로 돌아갑니다.'
: this.visitComplete()
? this.isSecondReliefVisit()
? '현장 수습과 광종 진군 방침을 출진 장부에 올립니다.'
@@ -3826,21 +3829,27 @@ export class CampVisitExplorationScene extends Phaser.Scene {
`자유 준비 ${progress.completedActivityCount} / 3`
);
this.thirdPriorityLocationText?.setText(
selected?.label ?? '아직 정하지 않음'
selected
? `${selected.label}${progress.ready ? ' · 확정됨' : ' · 확인 필요'}`
: '아직 정하지 않음'
);
const activityLines = progress.activities
.map(
(activity) =>
`${activity.completed ? '✓' : '!'} ${activity.shortLabel}${
activity.selected ? ' · 현재 우선' : ''
activity.selected
? progress.ready
? ' · 출진 확정'
: ' · 확인 필요'
: ''
}`
)
.join('\n');
this.progressText?.setText(
`선택 활동 ${progress.completedActivityCount} / 3 · 모두 선택\n` +
`현재 우선 · ${selected?.label ?? '아직 정하지 않음'}\n\n` +
`준비 활동 ${progress.completedActivityCount} / 3 · 모두 선택\n` +
`출진 보너스 · ${selected?.label ?? '미선택'}${selected && !progress.ready ? ' · 군영 확인 필요' : ''}\n\n` +
`${activityLines}\n\n` +
'완료한 곳을 다시 확인하면 보상 중복 없이 우선 기준만 바뀝니다.'
'재방문해도 선택은 바뀌지 않습니다. 군영 장부에서 적용할 하나를 확정하세요.'
);
this.refreshThirdWorldFeedback();
return;