Connect battle rewards to campaign equipment

This commit is contained in:
2026-07-03 23:39:27 +09:00
parent 0c4e358284
commit 42a596bd8b
4 changed files with 419 additions and 56 deletions

View File

@@ -287,6 +287,8 @@ export type CampaignBattleSettlement = {
completedAt: string;
};
export type CampaignSortieItemAssignments = Record<string, Record<string, number>>;
export type CampaignState = {
version: 1;
updatedAt: string;
@@ -298,6 +300,7 @@ export type CampaignState = {
inventory: Record<string, number>;
selectedSortieUnitIds: string[];
sortieFormationAssignments: SortieFormationAssignments;
sortieItemAssignments: CampaignSortieItemAssignments;
reserveTrainingFocus: CampaignReserveTrainingFocusId;
completedCampDialogues: string[];
completedCampVisits: string[];
@@ -401,6 +404,7 @@ export function createInitialCampaignState(): CampaignState {
inventory: {},
selectedSortieUnitIds: [],
sortieFormationAssignments: {},
sortieItemAssignments: {},
reserveTrainingFocus: defaultCampaignReserveTrainingFocusId,
completedCampDialogues: [],
completedCampVisits: [],
@@ -690,6 +694,7 @@ function normalizeCampaignState(state: CampaignState): CampaignState {
normalized.inventory = { ...(normalized.inventory ?? {}) };
normalized.selectedSortieUnitIds = [...new Set(normalized.selectedSortieUnitIds ?? [])];
normalized.sortieFormationAssignments = normalizeSortieFormationAssignments(normalized.sortieFormationAssignments);
normalized.sortieItemAssignments = normalizeSortieItemAssignments(normalized.sortieItemAssignments);
normalized.reserveTrainingFocus = normalizeReserveTrainingFocusId(normalized.reserveTrainingFocus);
normalized.battleHistory = normalized.battleHistory ?? {};
if (normalized.firstBattleReport) {
@@ -698,6 +703,23 @@ function normalizeCampaignState(state: CampaignState): CampaignState {
return normalized;
}
function normalizeSortieItemAssignments(assignments?: CampaignSortieItemAssignments) {
return Object.entries(assignments ?? {}).reduce<CampaignSortieItemAssignments>((next, [unitId, stocks]) => {
const unitStocks = Object.entries(stocks ?? {}).reduce<Record<string, number>>((nextStocks, [itemId, amount]) => {
const normalizedAmount = Math.floor(Number(amount));
if (itemId && normalizedAmount > 0) {
nextStocks[itemId] = normalizedAmount;
}
return nextStocks;
}, {});
if (Object.keys(unitStocks).length > 0) {
next[unitId] = unitStocks;
}
return next;
}, {});
}
function normalizeReserveTrainingFocusId(focusId?: string): CampaignReserveTrainingFocusId {
return campaignReserveTrainingFocusDefinitions.some((focus) => focus.id === focusId)
? focusId as CampaignReserveTrainingFocusId