Add reserve drill assignment API
This commit is contained in:
@@ -36,6 +36,7 @@ try {
|
|||||||
normalizeCampaignSortieItemAssignments,
|
normalizeCampaignSortieItemAssignments,
|
||||||
resetCampaignState,
|
resetCampaignState,
|
||||||
setCampaignState,
|
setCampaignState,
|
||||||
|
setCampaignReserveTrainingAssignment,
|
||||||
setFirstBattleReport
|
setFirstBattleReport
|
||||||
} = await server.ssrLoadModule('/src/game/state/campaignState.ts');
|
} = await server.ssrLoadModule('/src/game/state/campaignState.ts');
|
||||||
const { battleScenarios } = await server.ssrLoadModule('/src/game/data/battles.ts');
|
const { battleScenarios } = await server.ssrLoadModule('/src/game/data/battles.ts');
|
||||||
@@ -134,6 +135,26 @@ try {
|
|||||||
cappedReserveDrills['unit-96'] === undefined,
|
cappedReserveDrills['unit-96'] === undefined,
|
||||||
`Expected reserve drill assignments without a roster filter to stay capped: ${JSON.stringify(cappedReserveDrills)}`
|
`Expected reserve drill assignments without a roster filter to stay capped: ${JSON.stringify(cappedReserveDrills)}`
|
||||||
);
|
);
|
||||||
|
storage.clear();
|
||||||
|
storage.set(
|
||||||
|
campaignStorageKey,
|
||||||
|
JSON.stringify({
|
||||||
|
version: 1,
|
||||||
|
updatedAt: '2026-07-03T11:30:00.000Z',
|
||||||
|
step: 'third-camp',
|
||||||
|
roster: [{ id: 'liu-bei', name: 'Liu Bei', faction: 'ally' }]
|
||||||
|
})
|
||||||
|
);
|
||||||
|
loadCampaignState();
|
||||||
|
const assignedReserveDrill = setCampaignReserveTrainingAssignment(' liu-bei ', 'class-practice');
|
||||||
|
const ignoredReserveDrill = setCampaignReserveTrainingAssignment('ghost-unit', 'bond-practice');
|
||||||
|
const clearedReserveDrill = setCampaignReserveTrainingAssignment('liu-bei');
|
||||||
|
assert(
|
||||||
|
assignedReserveDrill.reserveTrainingAssignments['liu-bei'] === 'class-practice' &&
|
||||||
|
ignoredReserveDrill.reserveTrainingAssignments['ghost-unit'] === undefined &&
|
||||||
|
clearedReserveDrill.reserveTrainingAssignments['liu-bei'] === undefined,
|
||||||
|
`Expected reserve drill assignment API to trim, filter, and clear per-officer focus ids: ${JSON.stringify({ assignedReserveDrill, ignoredReserveDrill, clearedReserveDrill })}`
|
||||||
|
);
|
||||||
|
|
||||||
resetCampaignState();
|
resetCampaignState();
|
||||||
const firstScenario = battleScenarios['first-battle-zhuo-commandery'];
|
const firstScenario = battleScenarios['first-battle-zhuo-commandery'];
|
||||||
|
|||||||
@@ -628,6 +628,27 @@ export function setCampaignReserveTrainingFocus(focusId: CampaignReserveTraining
|
|||||||
return cloneCampaignState(state);
|
return cloneCampaignState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function setCampaignReserveTrainingAssignment(unitId: string, focusId?: CampaignReserveTrainingFocusId) {
|
||||||
|
const state = ensureCampaignState();
|
||||||
|
const normalizedUnitId = normalizeKeyString(unitId);
|
||||||
|
const rosterUnitIds = normalizedRosterUnitIds(state.roster);
|
||||||
|
const allowedUnitIds = rosterUnitIds.size > 0 ? rosterUnitIds : undefined;
|
||||||
|
if (!normalizedUnitId || (allowedUnitIds && !allowedUnitIds.has(normalizedUnitId))) {
|
||||||
|
return cloneCampaignState(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
const assignments = normalizeCampaignReserveTrainingAssignments(state.reserveTrainingAssignments, allowedUnitIds);
|
||||||
|
if (focusId && isReserveTrainingFocusId(focusId)) {
|
||||||
|
assignments[normalizedUnitId] = focusId;
|
||||||
|
} else {
|
||||||
|
delete assignments[normalizedUnitId];
|
||||||
|
}
|
||||||
|
state.reserveTrainingAssignments = assignments;
|
||||||
|
state.updatedAt = new Date().toISOString();
|
||||||
|
persistCampaignState(state);
|
||||||
|
return cloneCampaignState(state);
|
||||||
|
}
|
||||||
|
|
||||||
export function normalizeCampaignReserveTrainingAssignments(
|
export function normalizeCampaignReserveTrainingAssignments(
|
||||||
assignments?: Record<string, unknown>,
|
assignments?: Record<string, unknown>,
|
||||||
allowedUnitIds?: Set<string>
|
allowedUnitIds?: Set<string>
|
||||||
|
|||||||
Reference in New Issue
Block a user