fix: clone item inventory before nation level rewards
This commit is contained in:
@@ -3,8 +3,10 @@ import {
|
|||||||
LogCategory,
|
LogCategory,
|
||||||
LogFormat,
|
LogFormat,
|
||||||
LogScope,
|
LogScope,
|
||||||
|
cloneItemInventory,
|
||||||
countOccupiedUniqueItems,
|
countOccupiedUniqueItems,
|
||||||
createItemModuleRegistry,
|
createItemModuleRegistry,
|
||||||
|
ensureItemInventory,
|
||||||
equipNewItem,
|
equipNewItem,
|
||||||
resolveUniqueConfig,
|
resolveUniqueConfig,
|
||||||
type ItemModule,
|
type ItemModule,
|
||||||
@@ -105,10 +107,15 @@ const giveRandomUniqueItem = (options: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const item = options.rng.choiceUsingWeightPair(available);
|
const item = options.rng.choiceUsingWeightPair(available);
|
||||||
const nextGeneral = options.world.getGeneralById(options.general.id);
|
const currentGeneral = options.world.getGeneralById(options.general.id);
|
||||||
if (!nextGeneral) {
|
if (!currentGeneral) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
const nextGeneral: TurnGeneral = {
|
||||||
|
...currentGeneral,
|
||||||
|
role: { ...currentGeneral.role, items: { ...currentGeneral.role.items } },
|
||||||
|
itemInventory: cloneItemInventory(ensureItemInventory(currentGeneral)),
|
||||||
|
};
|
||||||
equipNewItem(nextGeneral, item.slot, item.key, {
|
equipNewItem(nextGeneral, item.slot, item.key, {
|
||||||
...(item.initialCharges === undefined ? {} : { charges: item.initialCharges }),
|
...(item.initialCharges === undefined ? {} : { charges: item.initialCharges }),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { describe, expect, it, vi } from 'vitest';
|
import { describe, expect, it, vi } from 'vitest';
|
||||||
import {
|
import {
|
||||||
|
createItemInventoryFromSlots,
|
||||||
ITEM_KEYS,
|
ITEM_KEYS,
|
||||||
LogCategory,
|
LogCategory,
|
||||||
LogScope,
|
LogScope,
|
||||||
@@ -246,6 +247,19 @@ describe('UpdateNationLevel monthly action', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('rewards a unique item when the persisted inventory snapshot is frozen', async () => {
|
||||||
|
const { world, handler } = await buildHarness(0, 2);
|
||||||
|
world.updateGeneral(1, {
|
||||||
|
itemInventory: createItemInventoryFromSlots({ horse: null, weapon: null, book: null, item: null }),
|
||||||
|
});
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
handler([], { year: 193, month: 2, startyear: 190, currentEventID: 1, turnTime: new Date() }, event)
|
||||||
|
).resolves.toBeUndefined();
|
||||||
|
|
||||||
|
expect(world.getGeneralById(1)?.role.items.horse).toBe(uniqueHorse.key);
|
||||||
|
});
|
||||||
|
|
||||||
it('does not downgrade or pay rewards when the qualifying city count is below the current level', async () => {
|
it('does not downgrade or pay rewards when the qualifying city count is below the current level', async () => {
|
||||||
const { world, reservedTurns, handler } = await buildHarness(3, 1);
|
const { world, reservedTurns, handler } = await buildHarness(3, 1);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user