feat: add walkable Guangzong sortie camp
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user