시나리오 기본 시작 연도와 출병 제한 기준 통일

This commit is contained in:
2026-09-17 00:53:24 +00:00
parent 581ecd6a7b
commit d89bdc439f
16 changed files with 393 additions and 34 deletions
+8
View File
@@ -1,3 +1,11 @@
// Ref GameConstBase::$maxLevel. Scenario `stat.max` is a separate join-time
// allocation rule and must not be used as this runtime fallback.
export const LEGACY_DEFAULT_MAX_LEVEL = 255;
// Ref ResetHelper는 시나리오의 nullable 등장 기준과 게임 달력을 분리한다.
// 원본 startYear=null은 영웅 일괄 등장에 사용하므로 원본을 덮어쓰지 않는다.
export const LEGACY_DEFAULT_START_YEAR = 180;
export const LEGACY_DEFAULT_OPENING_PART_YEAR = 3;
export const resolveScenarioStartYear = (startYear: unknown): number =>
typeof startYear === 'number' && Number.isFinite(startYear) ? startYear : LEGACY_DEFAULT_START_YEAR;
+1
View File
@@ -71,6 +71,7 @@ export interface ScenarioGeneral {
export interface ScenarioDefinition {
title: string;
/** 원본 등장 연도. null이면 시대에 따른 장수 등장/퇴장 필터를 적용하지 않는다. */
startYear: number | null;
life: number | null;
fiction: number | null;
+15 -8
View File
@@ -24,6 +24,7 @@ import type {
WorldSeedPayload,
WorldSnapshot,
} from './types.js';
import { LEGACY_DEFAULT_OPENING_PART_YEAR, resolveScenarioStartYear } from '../scenario/constants.js';
import { simpleSerialize } from '../war/utils.js';
export interface ScenarioBootstrapOptions {
@@ -177,7 +178,7 @@ const resolveScenarioTraits = (
const createScenarioMeta = (scenario: ScenarioDefinition): ScenarioMeta => ({
title: scenario.title,
startYear: scenario.startYear,
startYear: resolveScenarioStartYear(scenario.startYear),
life: scenario.life,
fiction: scenario.fiction,
history: scenario.history,
@@ -198,7 +199,7 @@ const LEGACY_DEFAULT_INITIAL_EVENTS: unknown[] = [
[true, ['NoticeToHistoryLog', '<S>2년간 거병 및 건국이 가능합니다.</>', 6]],
];
const LEGACY_DEFAULT_EVENTS: unknown[] = [
const buildLegacyDefaultEvents = (openingPartYear: number): unknown[] => [
['pre_month', 9_000, true, ['UpdateCitySupply'], ['ProcessWarIncome']],
[
'month',
@@ -229,28 +230,28 @@ const LEGACY_DEFAULT_EVENTS: unknown[] = [
[
'month',
2_000,
['DateRelative', '==', 1, 1],
['DateRelative', '==', openingPartYear - 2, 1],
['NoticeToHistoryLog', '<S>2년 뒤 출병 제한이 풀립니다.</>', 6],
['DeleteEvent'],
],
[
'month',
2_000,
['DateRelative', '==', 2, 1],
['DateRelative', '==', openingPartYear - 1, 1],
['NoticeToHistoryLog', '<S>1년 뒤 출병 제한이 풀립니다.</>', 6],
['DeleteEvent'],
],
[
'month',
2_000,
['DateRelative', '==', 2, 7],
['DateRelative', '==', openingPartYear - 1, 7],
['NoticeToHistoryLog', '<S>6개월 뒤 출병 제한이 풀립니다. 병력을 준비해주세요.</>', 6],
['DeleteEvent'],
],
[
'month',
2_000,
['DateRelative', '==', 3, 1],
['DateRelative', '==', openingPartYear, 1],
['NoticeToHistoryLog', '<S>출병 제한이 풀렸습니다.</>', 6],
['DeleteEvent'],
],
@@ -533,7 +534,7 @@ const buildGeneralSeeds = (
installRng.nextRangeInt(0, turnTermMinutes * 60 - 1) * 1_000_000 + installRng.nextRangeInt(0, 999_999);
const deathMonth = installRng.nextRangeInt(1, 12);
const officerLevel = resolveOfficerLevel(row.officerLevel, nationId);
const initialYear = options?.initialYear ?? scenario.startYear;
const initialYear = options?.initialYear ?? resolveScenarioStartYear(scenario.startYear);
const initialMonth = options?.initialMonth ?? 1;
const age = resolveAge(initialYear, birthYear);
const initialized = initializedValues.get(row);
@@ -1008,7 +1009,13 @@ export const buildScenarioBootstrap = (input: ScenarioBootstrapInput): ScenarioB
...actions,
['DeleteEvent'],
]);
const defaultEvents = scenario.ignoreDefaultEvents ? [] : LEGACY_DEFAULT_EVENTS;
// 출병 판정과 공지는 같은 설치 설정을 사용한다. 다른 상대연도 이벤트는 유지한다.
const configuredOpeningPartYear = scenario.config.const.openingPartYear;
const openingPartYear =
typeof configuredOpeningPartYear === 'number' && Number.isFinite(configuredOpeningPartYear)
? configuredOpeningPartYear
: LEGACY_DEFAULT_OPENING_PART_YEAR;
const defaultEvents = scenario.ignoreDefaultEvents ? [] : buildLegacyDefaultEvents(openingPartYear);
const defaultInitialEvents = scenario.ignoreDefaultEvents ? [] : LEGACY_DEFAULT_INITIAL_EVENTS;
const events = [...defaultEvents, ...scenario.events, ...delayedGeneralEvents];
+1
View File
@@ -3,6 +3,7 @@ import type { ScenarioConfig, ScenarioDiplomacy } from '@sammo-ts/logic/scenario
export interface ScenarioMeta {
title: string;
/** 게임 달력/규칙의 기준 연도. 새 seed는 누락 시 180을 저장하며 null은 이전 저장값 호환용이다. */
startYear: number | null;
life: number | null;
fiction: number | null;