fix: Ref 게임 로직과 시나리오 풀 호환을 보정

월 경계, 전투 기술 상한, 연감과 베팅·설문·경매 정산 순서를 Ref 계약에 맞춘다.\n\n시나리오 일반 풀을 ENGINE mutation과 logical tick 기반으로 직렬화하고 914·915 catalog 및 조건부 100기 pool 실행 경계를 추가한다.\n\n경매 worker는 세대별 durable event만 만들고 ENGINE이 row lock 후 상태 전이와 정산을 단일 transaction으로 소유한다.
This commit is contained in:
2026-08-23 16:26:14 +00:00
parent bf6b7be7b0
commit 85591c68ad
114 changed files with 13327 additions and 901 deletions
+20 -7
View File
@@ -396,6 +396,7 @@ const buildConstraintEnv = (worldState: WorldStateRow): Record<string, unknown>
relYear,
join_mode: joinMode,
openingPartYear: resolveNumber(constValues, ['openingPartYear'], 0),
maxTechLevel: resolveNumber(constValues, ['maxTechLevel'], 12),
};
};
@@ -515,19 +516,31 @@ export const buildRecruitmentCommandInfo = (options: {
const city = options.city ? mapCityRow(options.city) : undefined;
const nation = options.nation ? mapNationRow(options.nation) : null;
const cities = options.cities.map(mapCityRow);
const context = city ? { general, city, nation } : { general, nation };
const command = new RecruitmentCommandResolver(options.generalActionModules ?? [], {});
const tech = options.nation?.tech ?? 0;
const techAbility = getTechAbility(tech);
const commandEnv = buildCommandEnv(options.worldState);
const constraintEnv = buildConstraintEnv(options.worldState);
const startYear = typeof constraintEnv.startYear === 'number' ? constraintEnv.startYear : undefined;
const configuredStartYear = typeof constraintEnv.startYear === 'number' ? constraintEnv.startYear : undefined;
const startYear = configuredStartYear ?? options.worldState.currentYear;
const context = {
general,
...(city ? { city } : {}),
nation,
time: {
year: options.worldState.currentYear,
month: options.worldState.currentMonth,
startYear,
},
maxTechLevel: commandEnv.maxTechLevel,
};
const command = new RecruitmentCommandResolver(options.generalActionModules ?? [], commandEnv);
const tech = options.nation?.tech ?? 0;
const techAbility = getTechAbility(tech, commandEnv.maxTechLevel);
const availabilityContext = {
general,
nation,
map: options.map,
cities,
currentYear: options.worldState.currentYear,
...(startYear === undefined ? {} : { startYear }),
...(configuredStartYear === undefined ? {} : { startYear: configuredStartYear }),
};
const crewTypes = options.unitSet.crewTypes ?? [];
const armTypes = Object.entries(options.unitSet.armTypes ?? {})
@@ -565,7 +578,7 @@ export const buildRecruitmentCommandInfo = (options: {
const currentCrewTypeName = crewTypes.find((crewType) => crewType.id === general.crewTypeId)?.name ?? '-';
return {
techLevel: getTechLevel(tech),
techLevel: getTechLevel(tech, commandEnv.maxTechLevel),
leadership: command.resolveLeadership(context),
fullLeadership: command.resolveFullLeadership(context),
currentCrewTypeId: general.crewTypeId,