feat: add walkable Guangzong sortie camp

This commit is contained in:
2026-07-27 22:37:55 +09:00
parent 43e5533515
commit 9d67e0ae1d
17 changed files with 3519 additions and 558 deletions

View File

@@ -2,6 +2,11 @@ import {
resolveThirdBattlePriorityReturnDialogue,
thirdBattleReturnSourceBattleId
} from './thirdBattleReturnDialogue';
import {
completedThirdCampExplorationActivityIds,
thirdCampExplorationVisitId,
type ThirdCampExplorationActivityId
} from './thirdCampExploration';
export const thirdCampPreparationSourceBattleId =
thirdBattleReturnSourceBattleId;
@@ -135,6 +140,24 @@ export const thirdCampPreparationPriorities: readonly
] as const;
export type ThirdCampPreparationEvidence =
| {
kind: 'exploration-activity';
battleId: typeof thirdCampPreparationSourceBattleId;
visitId: typeof thirdCampExplorationVisitId;
activityId: Exclude<
ThirdCampExplorationActivityId,
'companion'
>;
}
| {
kind: 'exploration-activity';
battleId: typeof thirdCampPreparationSourceBattleId;
visitId: typeof thirdCampExplorationVisitId;
activityId: 'companion';
dialogueId: string;
bondId: string;
unitIds: [string, string];
}
| {
kind: 'victory-reward-category';
battleId: typeof thirdCampPreparationSourceBattleId;
@@ -208,6 +231,7 @@ export type ThirdCampPreparationCampaignState = {
>;
firstBattleReport?: ThirdCampPreparationBattleRecord | null;
completedCampDialogues?: readonly unknown[];
completedCampVisits?: readonly unknown[];
thirdCampPreparationSelection?: {
sourceBattleId?: unknown;
targetBattleId?: unknown;
@@ -288,15 +312,19 @@ export function resolveThirdCampPreparationAvailability(
}));
}
const informationEvidence = acknowledgedRewardEvidence(
campaign,
'unlocks'
);
const equipmentEvidence = acknowledgedRewardEvidence(
campaign,
'equipment'
);
const companionEvidence = completedCompanionEvidence(campaign);
const informationEvidence =
completedExplorationEvidence(campaign, 'information') ??
selectedLegacyRewardEvidence(campaign, 'information', 'unlocks');
const equipmentEvidence =
completedExplorationEvidence(campaign, 'equipment') ??
selectedLegacyRewardEvidence(
campaign,
'equipment',
'equipment'
);
const companionEvidence =
completedExplorationEvidence(campaign, 'companion') ??
completedCompanionEvidence(campaign);
const evidenceByPriority: Partial<
Record<ThirdCampPreparationPriorityId, ThirdCampPreparationEvidence>
> = {
@@ -515,6 +543,70 @@ function acknowledgedRewardEvidence(
: undefined;
}
function selectedLegacyRewardEvidence(
campaign: ThirdCampPreparationCampaignState | null | undefined,
priorityId: Extract<
ThirdCampPreparationPriorityId,
'information' | 'equipment'
>,
category: 'unlocks' | 'equipment'
) {
const selection = campaign?.thirdCampPreparationSelection;
if (
selection?.sourceBattleId !==
thirdCampPreparationSourceBattleId ||
selection.targetBattleId !==
thirdCampPreparationTargetBattleId ||
selection.priorityId !== priorityId
) {
return undefined;
}
return acknowledgedRewardEvidence(campaign, category);
}
function completedExplorationEvidence(
campaign: ThirdCampPreparationCampaignState | null | undefined,
activityId: ThirdCampExplorationActivityId
): Extract<
ThirdCampPreparationEvidence,
{ kind: 'exploration-activity' }
> | undefined {
const completedActivityIds =
completedThirdCampExplorationActivityIds(
arrayValue(campaign?.completedCampVisits).filter(
(visitId): visitId is string => typeof visitId === 'string'
)
);
if (!completedActivityIds.includes(activityId)) {
return undefined;
}
if (activityId !== 'companion') {
return {
kind: 'exploration-activity',
battleId: thirdCampPreparationSourceBattleId,
visitId: thirdCampExplorationVisitId,
activityId
};
}
const dialogue =
resolveThirdBattlePriorityReturnDialogue(campaign);
const bond = dialogue
? companionBondByDialogueId[dialogue.targetDialogueId]
: undefined;
return dialogue && bond
? {
kind: 'exploration-activity',
battleId: thirdCampPreparationSourceBattleId,
visitId: thirdCampExplorationVisitId,
activityId: 'companion',
dialogueId: dialogue.targetDialogueId,
bondId: bond.bondId,
unitIds: [...bond.unitIds]
}
: undefined;
}
function completedCompanionEvidence(
campaign?: ThirdCampPreparationCampaignState | null
): Extract<
@@ -548,21 +640,33 @@ function resolveEffect(
): ResolvedThirdCampPreparationEffect | undefined {
if (
effect.kind === 'marked-vanguard-intel' &&
evidence.kind === 'victory-reward-category' &&
evidence.category === 'unlocks'
(
(evidence.kind === 'exploration-activity' &&
evidence.activityId === 'information') ||
(evidence.kind === 'victory-reward-category' &&
evidence.category === 'unlocks')
)
) {
return { ...effect };
}
if (
effect.kind === 'prepared-equipment-guard' &&
evidence.kind === 'victory-reward-category' &&
evidence.category === 'equipment'
(
(evidence.kind === 'exploration-activity' &&
evidence.activityId === 'equipment') ||
(evidence.kind === 'victory-reward-category' &&
evidence.category === 'equipment')
)
) {
return { ...effect };
}
if (
effect.kind === 'return-bond-opening' &&
evidence.kind === 'priority-return-dialogue'
(
evidence.kind === 'priority-return-dialogue' ||
(evidence.kind === 'exploration-activity' &&
evidence.activityId === 'companion')
)
) {
return {
...effect,
@@ -604,7 +708,11 @@ function clonePriority(
function cloneEvidence(
evidence: ThirdCampPreparationEvidence
): ThirdCampPreparationEvidence {
if (evidence.kind === 'priority-return-dialogue') {
if (
evidence.kind === 'priority-return-dialogue' ||
(evidence.kind === 'exploration-activity' &&
evidence.activityId === 'companion')
) {
return {
...evidence,
unitIds: [...evidence.unitIds]