시나리오 기본 시작 연도와 출병 제한 기준 통일
This commit is contained in:
1 parent
581ecd6a7b
commit
d89bdc439f
16 files changed
+393
-34
No files matched your search
@@ -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;
|
||||
@@ -71,6 +71,7 @@ export interface ScenarioGeneral {
|
||||
|
||||
export interface ScenarioDefinition {
|
||||
title: string;
|
||||
/** 원본 등장 연도. null이면 시대에 따른 장수 등장/퇴장 필터를 적용하지 않는다. */
|
||||
startYear: number | null;
|
||||
life: number | null;
|
||||
fiction: number | null;
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user