Files
core2026/packages/logic/src/triggers/officerLevel.ts
T

77 lines
2.9 KiB
TypeScript

import { asRecord } from '@sammo-ts/common';
import type { GeneralTriggerState } from '@sammo-ts/logic/domain/entities.js';
import type { GeneralActionModule } from './general-action.js';
import type { WarActionContext, WarActionModule } from '@sammo-ts/logic/war/actions.js';
const resolveOfficerLevel = (context: {
general: { officerLevel: number; cityId: number; meta: Record<string, unknown> };
}): number => {
const level = context.general.officerLevel;
if (level < 2 || level > 4) {
return level;
}
const meta = asRecord(context.general.meta);
const officerCity = meta.officerCity ?? meta.officer_city;
return officerCity === context.general.cityId ? level : 1;
};
const resolveLeadershipBonus = (officerLevel: number, nationLevel: number): number => {
if (officerLevel === 12) {
return nationLevel * 2;
}
return officerLevel >= 5 ? nationLevel : 0;
};
const officerGeneralModule: GeneralActionModule = {
onCalcDomestic: (context, turnType, varType, value) => {
if (varType !== 'score') {
return value;
}
const level = resolveOfficerLevel(context);
if (
((turnType === '농업' || turnType === '상업') && [12, 11, 9, 7, 5, 3].includes(level)) ||
(turnType === '기술' && [12, 11, 9, 7, 5].includes(level)) ||
((turnType === '민심' || turnType === '인구') && [12, 11, 2].includes(level)) ||
((turnType === '수비' || turnType === '성벽' || turnType === '치안') &&
[12, 11, 10, 8, 6, 4].includes(level))
) {
return value * 1.05;
}
return value;
},
onCalcStat: (context, statName, value) => {
if (statName !== 'leadership') {
return value;
}
return value + resolveLeadershipBonus(resolveOfficerLevel(context), context.nation?.level ?? 0);
},
};
const officerWarModule: WarActionModule = {
onCalcStat: (context: WarActionContext, statName, value) => {
if (statName !== 'leadership' || typeof value !== 'number') {
return value;
}
return value + resolveLeadershipBonus(resolveOfficerLevel(context), context.nation?.level ?? 0);
},
getWarPowerMultiplier: (context: WarActionContext) => {
const level = resolveOfficerLevel(context);
if (level === 12) return [1.07, 0.93];
if (level === 11) return [1.05, 0.95];
if ([10, 8, 6].includes(level)) return [1.1, 1];
if ([9, 7, 5].includes(level)) return [1, 0.9];
if ([4, 3, 2].includes(level)) return [1.05, 0.95];
return [1, 1];
},
};
export const createOfficerLevelActionModules = <
TriggerState extends GeneralTriggerState = GeneralTriggerState,
>(): {
general: GeneralActionModule<TriggerState>;
war: WarActionModule<TriggerState>;
} => ({
general: officerGeneralModule as GeneralActionModule<TriggerState>,
war: officerWarModule as WarActionModule<TriggerState>,
});