From 2ea8e11f50b1d5c429e0dcb97b3e658055c0fbc8 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sat, 24 Jan 2026 11:36:01 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20createNoopDaemonTransport=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=86=A0=EB=84=88?= =?UTF-8?q?=EB=A8=BC=ED=8A=B8=20=EC=83=81=ED=83=9C=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0,=20=EC=BA=98=EB=A6=B0=EB=8D=94=20=ED=95=B8?= =?UTF-8?q?=EB=93=A4=EB=9F=AC=20=EB=B0=98=ED=99=98=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/game-api/test/tournamentWorker.test.ts | 12 +++++++-- app/game-engine/src/turn/calendarHandlers.ts | 4 +-- .../src/turn/reservedTurnHandler.ts | 27 +------------------ packages/logic/src/domain/entities.ts | 8 +++++- 4 files changed, 20 insertions(+), 31 deletions(-) diff --git a/app/game-api/test/tournamentWorker.test.ts b/app/game-api/test/tournamentWorker.test.ts index 29b1e49..120114c 100644 --- a/app/game-api/test/tournamentWorker.test.ts +++ b/app/game-api/test/tournamentWorker.test.ts @@ -28,6 +28,12 @@ class MemoryRedis { const isRecord = (value: unknown): value is Record => typeof value === 'object' && value !== null; +const createNoopDaemonTransport = (): TurnDaemonTransport => ({ + sendCommand: async () => 'ok', + requestCommand: async () => null, + requestStatus: async () => null, +}); + const createTournamentState = (overrides: Partial = {}): TournamentState => { const now = new Date().toISOString(); return { @@ -174,6 +180,8 @@ const runTournamentToCompletion = async (options: { throw new Error('토너먼트 상태가 없습니다.'); } + const daemonTransport = createNoopDaemonTransport(); + for (let i = 0; i < 2000; i += 1) { if (state.stage === 0) { return state; @@ -184,7 +192,7 @@ const runTournamentToCompletion = async (options: { await options.store.setState(state); } if (state.stage >= 1 && state.stage <= 6) { - state = await applyPreBattleStage(options.store, options.prisma, state, options.baseSeed); + state = await applyPreBattleStage(options.store, options.prisma, state, options.baseSeed, daemonTransport); continue; } if (state.stage >= 7 && state.stage <= 10) { @@ -337,7 +345,7 @@ describe('tournament worker (in-memory)', () => { const initialState = state ?? createTournamentState({ stage: 1 }); await store.setState(initialState); - const afterJoin = await applyPreBattleStage(store, prisma, initialState, 'seed'); + const afterJoin = await applyPreBattleStage(store, prisma, initialState, 'seed', createNoopDaemonTransport()); const participants = await store.getParticipants(); expect(afterJoin.stage).toBe(2); diff --git a/app/game-engine/src/turn/calendarHandlers.ts b/app/game-engine/src/turn/calendarHandlers.ts index e6ada00..f8a532a 100644 --- a/app/game-engine/src/turn/calendarHandlers.ts +++ b/app/game-engine/src/turn/calendarHandlers.ts @@ -2,10 +2,10 @@ import type { TurnCalendarHandler } from './inMemoryWorld.js'; export const composeCalendarHandlers = ( ...handlers: Array -): TurnCalendarHandler | null => { +): TurnCalendarHandler | undefined => { const resolved = handlers.filter(Boolean) as TurnCalendarHandler[]; if (resolved.length === 0) { - return null; + return undefined; } return { onMonthChanged: (context) => { diff --git a/app/game-engine/src/turn/reservedTurnHandler.ts b/app/game-engine/src/turn/reservedTurnHandler.ts index 526db46..ca232db 100644 --- a/app/game-engine/src/turn/reservedTurnHandler.ts +++ b/app/game-engine/src/turn/reservedTurnHandler.ts @@ -10,6 +10,7 @@ import type { ScenarioMeta, Troop, TurnCommandProfile, + TurnCommandEnv, UnitSetDefinition, } from '@sammo-ts/logic'; import { @@ -353,32 +354,6 @@ const resolveDefinition = ( fallback: GeneralActionDefinition ): GeneralActionDefinition => definitions.get(actionKey) ?? fallback; -const resolveNpcTaxRate = (cities: City[]): number => { - if (cities.length === 0) { - return 15; - } - let pop = 0; - let all = 0; - for (const city of cities) { - const popRatio = city.populationMax > 0 ? city.population / city.populationMax : 0; - pop += popRatio; - all += calcCityDevRatio(city); - } - pop /= cities.length; - all /= cities.length; - const avg = (pop + all) / 2; - if (avg > 0.95) { - return 25; - } - if (avg > 0.7) { - return 20; - } - if (avg > 0.5) { - return 15; - } - return 10; -}; - export const createReservedTurnHandler = async (options: { reservedTurns: InMemoryReservedTurnStore; scenarioConfig: ScenarioConfig; diff --git a/packages/logic/src/domain/entities.ts b/packages/logic/src/domain/entities.ts index 9317fcf..9c138de 100644 --- a/packages/logic/src/domain/entities.ts +++ b/packages/logic/src/domain/entities.ts @@ -13,7 +13,13 @@ export interface StatBlock { intelligence: number; } -export type TriggerValue = boolean | number | string; +export type TriggerValuePrimitive = boolean | number | string; + +export interface TriggerValueObject { + [key: string]: TriggerValuePrimitive | TriggerValueObject; +} + +export type TriggerValue = TriggerValuePrimitive | TriggerValueObject; export interface GeneralTriggerState { // Trigger 시스템에서 사용하는 확장 슬롯.