From cb04c930b876c5625c1a4e4136876ec8832528e7 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sat, 24 Jan 2026 09:57:13 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20afterExecuteGeneral=20=ED=95=B8?= =?UTF-8?q?=EB=93=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=20=EA=B2=B0=EA=B3=BC=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/turn/inMemoryTurnProcessor.ts | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/app/game-engine/src/turn/inMemoryTurnProcessor.ts b/app/game-engine/src/turn/inMemoryTurnProcessor.ts index c3c7f06..3cababc 100644 --- a/app/game-engine/src/turn/inMemoryTurnProcessor.ts +++ b/app/game-engine/src/turn/inMemoryTurnProcessor.ts @@ -6,8 +6,16 @@ import type { TurnGeneral } from './types.js'; export interface InMemoryTurnProcessorOptions { tickMinutes?: number; beforeExecuteGeneral?: (general: TurnGeneral) => Promise; + afterExecuteGeneral?: (general: TurnGeneral, result: TurnGeneralExecutionResult) => Promise; } +export type TurnGeneralExecutionResult = { + ok: boolean; + executedAt: Date; + nextTurnAt?: Date; + error?: unknown; +}; + const resolveTickMinutes = (world: InMemoryTurnWorld, override?: number): number => { if (override !== undefined) { return Math.max(1, override); @@ -21,11 +29,13 @@ export class InMemoryTurnProcessor implements TurnProcessor { private readonly world: InMemoryTurnWorld; private readonly tickMinutes: number; private readonly beforeExecuteGeneral?: (general: TurnGeneral) => Promise; + private readonly afterExecuteGeneral?: (general: TurnGeneral, result: TurnGeneralExecutionResult) => Promise; constructor(world: InMemoryTurnWorld, options: InMemoryTurnProcessorOptions = {}) { this.world = world; this.tickMinutes = resolveTickMinutes(world, options.tickMinutes); this.beforeExecuteGeneral = options.beforeExecuteGeneral; + this.afterExecuteGeneral = options.afterExecuteGeneral; } async run(targetTime: Date, budget: TurnRunBudget, checkpoint?: TurnCheckpoint): Promise { @@ -52,7 +62,24 @@ export class InMemoryTurnProcessor implements TurnProcessor { if (this.beforeExecuteGeneral) { await this.beforeExecuteGeneral(general); } - this.world.executeGeneralTurn(general); + let nextTurnAt: Date | undefined; + let executionError: unknown; + try { + nextTurnAt = this.world.executeGeneralTurn(general); + } catch (error) { + executionError = error; + } + if (this.afterExecuteGeneral) { + await this.afterExecuteGeneral(general, { + ok: executionError === undefined, + executedAt, + nextTurnAt, + error: executionError, + }); + } + if (executionError !== undefined) { + throw executionError; + } processedGenerals += 1; nextCheckpoint = { turnTime: executedAt.toISOString(),