feat: 로그 수집 기능 개선 및 도시 페널티 적용 로직 추가

This commit is contained in:
2026-01-24 19:10:00 +00:00
parent d8006fdc28
commit c3f4c58f4f
2 changed files with 45 additions and 11 deletions
@@ -185,6 +185,9 @@ export const createTurnTestHarness = async (options: TurnTestHarnessOptions) =>
runOneTick, runOneTick,
runUntil, runUntil,
getCollectedLogs: () => [...collectedLogs], getCollectedLogs: () => [...collectedLogs],
getCollectedLogsCount: () => collectedLogs.length,
getCollectedLogsRange: (start: number, end?: number) =>
collectedLogs.slice(start, end ?? collectedLogs.length),
getAndClearCollectedLogs: () => collectedLogs.splice(0, collectedLogs.length), getAndClearCollectedLogs: () => collectedLogs.splice(0, collectedLogs.length),
}; };
}; };
@@ -83,6 +83,30 @@ const boostNationOneCities = (world: InMemoryTurnWorld) => {
} }
}; };
const applyPost200Penalty = (world: InMemoryTurnWorld) => {
const { currentYear } = world.getState();
if (currentYear < 200) {
return;
}
const cities = world.listCities();
for (const city of cities) {
if (city.nationId === 1) {
continue;
}
const meta = city.meta ?? {};
const trust = typeof meta.trust === 'number' ? Math.floor(meta.trust * 0.9) : undefined;
world.updateCity(city.id, {
population: Math.floor(city.population * 0.9),
agriculture: Math.floor(city.agriculture * 0.9),
commerce: Math.floor(city.commerce * 0.9),
security: Math.floor(city.security * 0.9),
defence: Math.floor(city.defence * 0.9),
wall: Math.floor(city.wall * 0.9),
meta: trust !== undefined ? { ...meta, trust } : meta,
});
}
};
const dumpWorldStatus = (world: InMemoryTurnWorld, label: string) => { const dumpWorldStatus = (world: InMemoryTurnWorld, label: string) => {
const state = world.getState(); const state = world.getState();
const cities = world.listCities(); const cities = world.listCities();
@@ -252,6 +276,7 @@ describe('NPC 건국/통일 장기 시뮬레이션', () => {
return; return;
} }
boostNationOneCities(world); boostNationOneCities(world);
applyPost200Penalty(world);
const meta = world.getState().meta as Record<string, unknown>; const meta = world.getState().meta as Record<string, unknown>;
if (typeof meta.isUnited === 'number' && meta.isUnited !== 0) { if (typeof meta.isUnited === 'number' && meta.isUnited !== 0) {
return; return;
@@ -277,7 +302,7 @@ describe('NPC 건국/통일 장기 시뮬레이션', () => {
const lastNationAiState = new Map<number, unknown>(); const lastNationAiState = new Map<number, unknown>();
let declarationCount = 0; let declarationCount = 0;
const { runUntil, getCollectedLogs, getAndClearCollectedLogs } = await createTurnTestHarness({ const { runUntil, getCollectedLogs, getCollectedLogsCount, getCollectedLogsRange } = await createTurnTestHarness({
snapshot, snapshot,
state, state,
schedule, schedule,
@@ -298,23 +323,29 @@ describe('NPC 건국/통일 장기 시뮬레이션', () => {
}, },
}); });
let monthlyLogCursor = 0;
const maxMonthlyLogEntries = 20;
const dumpMonthlyLogs = (label: string) => { const dumpMonthlyLogs = (label: string) => {
const logs = getAndClearCollectedLogs(); const end = getCollectedLogsCount();
if (end <= monthlyLogCursor) {
return;
}
const logs = getCollectedLogsRange(monthlyLogCursor, end);
monthlyLogCursor = end;
if (logs.length === 0) { if (logs.length === 0) {
return; return;
} }
const globalLogs = logs.filter((log) => log.category === LogCategory.HISTORY); const historyLogs = logs.filter((log) => log.category === LogCategory.HISTORY);
if (globalLogs.length === 0) { if (historyLogs.length === 0) {
return; return;
} }
console.log('[DEBUG] month global logs', { const limitedLogs = historyLogs.slice(0, maxMonthlyLogEntries);
const truncated = historyLogs.length - limitedLogs.length;
console.log('[DEBUG] month history logs', {
label, label,
total: globalLogs.length, total: historyLogs.length,
logs: globalLogs.map((log) => ({ truncated,
category: log.category, logs: limitedLogs.map((log) => log.text),
format: log.format,
text: log.text,
})),
}); });
}; };