Add reserve drill assignment API

This commit is contained in:
2026-07-09 13:38:20 +09:00
parent 053536fd20
commit 02578e2f28
2 changed files with 42 additions and 0 deletions

View File

@@ -36,6 +36,7 @@ try {
normalizeCampaignSortieItemAssignments,
resetCampaignState,
setCampaignState,
setCampaignReserveTrainingAssignment,
setFirstBattleReport
} = await server.ssrLoadModule('/src/game/state/campaignState.ts');
const { battleScenarios } = await server.ssrLoadModule('/src/game/data/battles.ts');
@@ -134,6 +135,26 @@ try {
cappedReserveDrills['unit-96'] === undefined,
`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();
const firstScenario = battleScenarios['first-battle-zhuo-commandery'];

View File

@@ -628,6 +628,27 @@ export function setCampaignReserveTrainingFocus(focusId: CampaignReserveTraining
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(
assignments?: Record<string, unknown>,
allowedUnitIds?: Set<string>