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
@@ -21,16 +21,16 @@ export const itemModule: ItemModule = {
reqSecu: 0,
unique: false,
onCalcStat: function (
_context: GeneralActionContext | WarActionContext,
context: GeneralActionContext | WarActionContext,
statName: GeneralStatName | WarStatName,
value: unknown,
aux?: unknown
): unknown {
if (statName === 'strength') {
const auxObj = aux as Record<string, unknown> | undefined;
const year = resolveNumber(auxObj?.['year']);
const startYear = resolveNumber(auxObj?.['startYear']);
const maxTechLevel = resolveNumber(auxObj?.['maxTechLevel'], 12);
const year = resolveNumber(context.time?.year, resolveNumber(auxObj?.['year']));
const startYear = resolveNumber(context.time?.startYear, resolveNumber(auxObj?.['startYear']));
const maxTechLevel = resolveNumber(context.maxTechLevel, resolveNumber(auxObj?.['maxTechLevel'], 12));
const relYear = Math.max(0, year - startYear);
const bonus = 5 + clamp(Math.floor(relYear / 4), 0, maxTechLevel);
@@ -21,16 +21,16 @@ export const itemModule: ItemModule = {
reqSecu: 0,
unique: false,
onCalcStat: function (
_context: GeneralActionContext | WarActionContext,
context: GeneralActionContext | WarActionContext,
statName: GeneralStatName | WarStatName,
value: unknown,
aux?: unknown
): unknown {
if (statName === 'intelligence') {
const auxObj = aux as Record<string, unknown> | undefined;
const year = resolveNumber(auxObj?.['year']);
const startYear = resolveNumber(auxObj?.['startYear']);
const maxTechLevel = resolveNumber(auxObj?.['maxTechLevel'], 12);
const year = resolveNumber(context.time?.year, resolveNumber(auxObj?.['year']));
const startYear = resolveNumber(context.time?.startYear, resolveNumber(auxObj?.['startYear']));
const maxTechLevel = resolveNumber(context.maxTechLevel, resolveNumber(auxObj?.['maxTechLevel'], 12));
const relYear = Math.max(0, year - startYear);
const bonus = 5 + clamp(Math.floor(relYear / 4), 0, maxTechLevel);
@@ -21,16 +21,16 @@ export const itemModule: ItemModule = {
reqSecu: 0,
unique: false,
onCalcStat: function (
_context: GeneralActionContext | WarActionContext,
context: GeneralActionContext | WarActionContext,
statName: GeneralStatName | WarStatName,
value: unknown,
aux?: unknown
): unknown {
if (statName === 'leadership') {
const auxObj = aux as Record<string, unknown> | undefined;
const year = resolveNumber(auxObj?.['year']);
const startYear = resolveNumber(auxObj?.['startYear']);
const maxTechLevel = resolveNumber(auxObj?.['maxTechLevel'], 12);
const year = resolveNumber(context.time?.year, resolveNumber(auxObj?.['year']));
const startYear = resolveNumber(context.time?.startYear, resolveNumber(auxObj?.['startYear']));
const maxTechLevel = resolveNumber(context.maxTechLevel, resolveNumber(auxObj?.['maxTechLevel'], 12));
const relYear = Math.max(0, year - startYear);
const bonus = 5 + clamp(Math.floor(relYear / 4), 0, maxTechLevel);