fix conquest front refresh scope

This commit is contained in:
2026-07-26 22:49:35 +00:00
parent 49a9494810
commit 1af6bed3b5
2 changed files with 40 additions and 3 deletions
@@ -1283,14 +1283,21 @@ export const createReservedTurnHandler = async (options: {
}
}
const hasNationChange = (resolution.patches?.cities ?? []).some((patch) => {
const cityNationChanges = (resolution.patches?.cities ?? []).flatMap((patch) => {
if (!Object.prototype.hasOwnProperty.call(patch.patch ?? {}, 'nationId')) {
return false;
return [];
}
const nextNationId = patch.patch.nationId;
const previousNationId = cityNationIdsBeforeExecution.get(patch.id);
return previousNationId === undefined || nextNationId !== previousNationId;
if (
typeof nextNationId !== 'number' ||
(previousNationId !== undefined && nextNationId === previousNationId)
) {
return [];
}
return [{ cityId: patch.id, nextNationId }];
});
const hasNationChange = cityNationChanges.length > 0;
const refreshesFrontForDiplomacyState =
actionKey === 'che_이호경식' &&
resolution.effects.some(
@@ -1309,9 +1316,32 @@ export const createReservedTurnHandler = async (options: {
if ((hasNationChange || refreshesFrontForDiplomacyState) && !preservesImmediateFrontState) {
const worldView = worldOverlay?.view ?? worldRef;
if (worldView && options.map) {
const frontNationIds = new Set<number>();
const cityById = new Map(worldView.listCities().map((city) => [city.id, city] as const));
const mapCityById = new Map(options.map.cities.map((city) => [city.id, city] as const));
for (const change of cityNationChanges) {
frontNationIds.add(change.nextNationId);
const mapCity = mapCityById.get(change.cityId);
for (const cityId of [change.cityId, ...(mapCity?.connections ?? [])]) {
const nationId = cityById.get(cityId)?.nationId;
if (nationId && nationId > 0) {
frontNationIds.add(nationId);
}
}
}
if (refreshesFrontForDiplomacyState) {
for (const effect of resolution.effects) {
if (effect.type !== 'diplomacy:patch') {
continue;
}
frontNationIds.add(effect.srcNationId);
frontNationIds.add(effect.destNationId);
}
}
const frontPatches = buildFrontStatePatches({
worldView,
map: options.map,
nationIds: [...frontNationIds],
});
if (frontPatches.length > 0) {
for (const patch of frontPatches) {
@@ -82,6 +82,7 @@ integration('core ↔ legacy command-boundary differential', () => {
'fixtures/turn-differential/live-sortie-multiple-defenders.json',
],
['live sortie supply retreat', 'fixtures/turn-differential/live-sortie-supply-retreat.json'],
['live sortie noncapital conquest', 'fixtures/turn-differential/live-sortie-noncapital-conquest.json'],
])(
'%s matches command RNG and canonical state delta',
async (_label, fixturePath) => {
@@ -113,6 +114,12 @@ integration('core ↔ legacy command-boundary differential', () => {
expect(retreatLogs.some((log) => String(log.text).includes('병량 부족'))).toBe(true);
expect(reference.after.cities.find((city) => city.id === 70)?.nationId).toBe(1);
}
if (fixturePath.endsWith('live-sortie-noncapital-conquest.json')) {
expect(reference.after.cities.find((city) => city.id === 70)?.nationId).toBe(1);
expect(reference.after.cities.find((city) => city.id === 71)?.nationId).toBe(2);
expect(reference.after.nations.some((nation) => nation.id === 2)).toBe(true);
expect(reference.after.generals.find((general) => general.id === 2)?.nationId).toBe(2);
}
expect(core.execution.outcome).toMatchObject({
requestedAction: request.action,