diff --git a/app/game-engine/test/monthlyNationLevelPersistence.integration.test.ts b/app/game-engine/test/monthlyNationLevelPersistence.integration.test.ts index f6a7633..16bce53 100644 --- a/app/game-engine/test/monthlyNationLevelPersistence.integration.test.ts +++ b/app/game-engine/test/monthlyNationLevelPersistence.integration.test.ts @@ -5,6 +5,7 @@ import type { City, ItemModule, Nation } from '@sammo-ts/logic'; import { createDatabaseTurnHooks } from '../src/turn/databaseHooks.js'; import { InMemoryTurnWorld } from '../src/turn/inMemoryWorld.js'; import { createUpdateNationLevelHandler } from '../src/turn/monthlyNationLevelAction.js'; +import { createMonthlyEventHandler } from '../src/turn/monthlyEventHandler.js'; import { InMemoryReservedTurnStore } from '../src/turn/reservedTurnStore.js'; import type { TurnEvent, TurnGeneral, TurnWorldSnapshot, TurnWorldState } from '../src/turn/types.js'; @@ -216,7 +217,7 @@ integration('monthly nation level database persistence', () => { data: { scenarioCode: 'monthly-nation-level-persistence', currentYear: 193, - currentMonth: 2, + currentMonth: 1, tickSeconds: 600, config: {}, meta: { hiddenSeed: 'nation-level-persistence', killturn: 1_000 }, @@ -225,7 +226,7 @@ integration('monthly nation level database persistence', () => { const state: TurnWorldState = { id: stateRow.id, currentYear: 193, - currentMonth: 2, + currentMonth: 1, tickSeconds: 600, lastTurnTime: new Date('2026-07-25T00:20:00.000Z'), meta: { hiddenSeed: 'nation-level-persistence', killturn: 1_000 }, @@ -252,24 +253,26 @@ integration('monthly nation level database persistence', () => { events: [event], initialEvents: [], }; - const world = new InMemoryTurnWorld(state, snapshot, { - schedule: { entries: [{ startMinute: 0, tickMinutes: 10 }] }, - }); const reservedTurns = new InMemoryReservedTurnStore(db, { maxGeneralTurns: 30, maxNationTurns: 12 }); await reservedTurns.loadAll(); + let world: InMemoryTurnWorld | null = null; const handler = createUpdateNationLevelHandler({ getWorld: () => world, reservedTurns, itemModules: [uniqueHorse], }); + world = new InMemoryTurnWorld(state, snapshot, { + schedule: { entries: [{ startMinute: 0, tickMinutes: 10 }] }, + calendarHandler: createMonthlyEventHandler({ + getWorld: () => world, + startYear: 190, + actions: new Map([['UpdateNationLevel', handler]]), + }), + }); const dbHooks = await createDatabaseTurnHooks(databaseUrl!, world, { reservedTurns }); try { - await handler( - [], - { year: 193, month: 2, startyear: 190, currentEventID: 1, turnTime: state.lastTurnTime }, - event - ); + await world.advanceMonth(new Date('0193-02-01T00:00:00.000Z')); await dbHooks.hooks.flushChanges?.({ lastTurnTime: state.lastTurnTime.toISOString(), processedGenerals: 0, diff --git a/app/game-engine/test/monthlySemiAnnualPersistence.integration.test.ts b/app/game-engine/test/monthlySemiAnnualPersistence.integration.test.ts index 8179d98..5769686 100644 --- a/app/game-engine/test/monthlySemiAnnualPersistence.integration.test.ts +++ b/app/game-engine/test/monthlySemiAnnualPersistence.integration.test.ts @@ -5,6 +5,7 @@ import { createGamePostgresConnector, type GamePrismaClient } from '@sammo-ts/in import { createDatabaseTurnHooks } from '../src/turn/databaseHooks.js'; import { InMemoryTurnWorld } from '../src/turn/inMemoryWorld.js'; import { createProcessSemiAnnualHandler } from '../src/turn/monthlySemiAnnualAction.js'; +import { createMonthlyEventHandler } from '../src/turn/monthlyEventHandler.js'; import type { TurnGeneral, TurnWorldSnapshot, TurnWorldState } from '../src/turn/types.js'; const databaseUrl = process.env.INPUT_EVENT_DATABASE_URL; @@ -169,8 +170,8 @@ integration('monthly semi-annual database persistence', () => { const row = await db.worldState.create({ data: { scenarioCode: 'monthly-semi-annual-persistence', - currentYear: 193, - currentMonth: 1, + currentYear: 192, + currentMonth: 12, tickSeconds: 600, config: {}, meta: {}, @@ -178,8 +179,8 @@ integration('monthly semi-annual database persistence', () => { }); const state: TurnWorldState = { id: row.id, - currentYear: 193, - currentMonth: 1, + currentYear: 192, + currentMonth: 12, tickSeconds: 600, lastTurnTime: new Date('2026-07-25T00:10:00.000Z'), meta: {}, @@ -203,27 +204,32 @@ integration('monthly semi-annual database persistence', () => { nations: [nation], troops: [], diplomacy: [], - events: [], + events: [ + { + id: 1, + targetCode: 'month', + priority: 0, + condition: true, + action: [['ProcessSemiAnnual', 'gold']], + meta: {}, + }, + ], initialEvents: [], }; - const world = new InMemoryTurnWorld(state, snapshot, { + let world: InMemoryTurnWorld | null = null; + const actions = new Map([['ProcessSemiAnnual', createProcessSemiAnnualHandler({ getWorld: () => world })]]); + world = new InMemoryTurnWorld(state, snapshot, { schedule: { entries: [{ startMinute: 0, tickMinutes: 10 }] }, + calendarHandler: createMonthlyEventHandler({ + getWorld: () => world, + startYear: 190, + actions, + }), }); const dbHooks = await createDatabaseTurnHooks(databaseUrl!, world); try { - const handler = createProcessSemiAnnualHandler({ getWorld: () => world }); - await handler( - ['gold'], - { - year: 193, - month: 1, - startyear: 190, - currentEventID: 1, - turnTime: state.lastTurnTime, - }, - { id: 1, targetCode: 'month', priority: 0, condition: true, action: [], meta: {} } - ); + await world.advanceMonth(new Date('0193-01-01T00:00:00.000Z')); await dbHooks.hooks.flushChanges?.({ lastTurnTime: state.lastTurnTime.toISOString(), processedGenerals: 0, diff --git a/app/game-engine/test/monthlyWarIncomePersistence.integration.test.ts b/app/game-engine/test/monthlyWarIncomePersistence.integration.test.ts index a6224bc..8282d69 100644 --- a/app/game-engine/test/monthlyWarIncomePersistence.integration.test.ts +++ b/app/game-engine/test/monthlyWarIncomePersistence.integration.test.ts @@ -5,6 +5,7 @@ import { createGamePostgresConnector, type GamePrismaClient } from '@sammo-ts/in import { createDatabaseTurnHooks } from '../src/turn/databaseHooks.js'; import { InMemoryTurnWorld } from '../src/turn/inMemoryWorld.js'; import { createProcessWarIncomeHandler } from '../src/turn/monthlyWarIncomeAction.js'; +import { createMonthlyEventHandler } from '../src/turn/monthlyEventHandler.js'; import type { TurnWorldSnapshot, TurnWorldState } from '../src/turn/types.js'; const databaseUrl = process.env.INPUT_EVENT_DATABASE_URL; @@ -150,27 +151,32 @@ integration('monthly war income database persistence', () => { nations: [nation], troops: [], diplomacy: [], - events: [], + events: [ + { + id: 1, + targetCode: 'pre_month', + priority: 0, + condition: true, + action: [['ProcessWarIncome']], + meta: {}, + }, + ], initialEvents: [], }; - const world = new InMemoryTurnWorld(state, snapshot, { + let world: InMemoryTurnWorld | null = null; + const actions = new Map([['ProcessWarIncome', createProcessWarIncomeHandler({ getWorld: () => world })]]); + world = new InMemoryTurnWorld(state, snapshot, { schedule: { entries: [{ startMinute: 0, tickMinutes: 10 }] }, + calendarHandler: createMonthlyEventHandler({ + getWorld: () => world, + startYear: 190, + actions, + }), }); const dbHooks = await createDatabaseTurnHooks(databaseUrl!, world); try { - const handler = createProcessWarIncomeHandler({ getWorld: () => world }); - await handler( - [], - { - year: 193, - month: 1, - startyear: 190, - currentEventID: 1, - turnTime: state.lastTurnTime, - }, - { id: 1, targetCode: 'pre_month', priority: 0, condition: true, action: [], meta: {} } - ); + await world.advanceMonth(new Date('0193-02-01T00:00:00.000Z')); await dbHooks.hooks.flushChanges?.({ lastTurnTime: state.lastTurnTime.toISOString(), processedGenerals: 0,