diff --git a/packages/logic/src/items/base.ts b/packages/logic/src/items/base.ts index 470233f..f8d96fc 100644 --- a/packages/logic/src/items/base.ts +++ b/packages/logic/src/items/base.ts @@ -1,8 +1,9 @@ import type { GeneralActionContext } from '@sammo-ts/logic/triggers/general.js'; +import type { GeneralStatName, WarStatName } from '@sammo-ts/logic/triggers/types.js'; import type { WarActionContext } from '@sammo-ts/logic/war/actions.js'; import type { ItemModule, ItemSlot } from './types.js'; -const resolveStatLabel = (statName: string): string => { +const resolveStatLabel = (statName: GeneralStatName): string => { switch (statName) { case 'leadership': return '통솔'; @@ -37,19 +38,19 @@ export const createStatItemModule = ( const info = options.extraInfo ? `${baseInfo}
${options.extraInfo}` : baseInfo; function onCalcStat( _context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, _aux?: unknown ): number; function onCalcStat( _context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], _aux?: unknown ): number | [number, number]; function onCalcStat( _context: GeneralActionContext | WarActionContext, - statName: string, + statName: GeneralStatName | WarStatName, value: number | [number, number] ): number | [number, number] { if (statName !== options.statName) { diff --git a/packages/logic/src/items/che_서적_03_변도론.ts b/packages/logic/src/items/che_서적_03_변도론.ts index 41aebec..7a7ab60 100644 --- a/packages/logic/src/items/che_서적_03_변도론.ts +++ b/packages/logic/src/items/che_서적_03_변도론.ts @@ -1,6 +1,7 @@ import { createStatItemModule } from './base.js'; import type { ItemModule } from './types.js'; import type { GeneralActionContext } from '@sammo-ts/logic/triggers/general.js'; +import type { GeneralStatName, WarStatName } from '@sammo-ts/logic/triggers/types.js'; import type { WarActionContext } from '@sammo-ts/logic/war/actions.js'; const STAT_VALUE = 3; @@ -22,19 +23,19 @@ export const itemModule: ItemModule = { onCalcStat: (() => { function onCalcStat( _context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, _aux?: unknown ): number; function onCalcStat( _context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], _aux?: unknown ): number | [number, number]; function onCalcStat( _context: GeneralActionContext | WarActionContext, - statName: string, + statName: GeneralStatName | WarStatName, value: number | [number, number] ): number | [number, number] { let base = value; diff --git a/packages/logic/src/items/che_서적_08_전론.ts b/packages/logic/src/items/che_서적_08_전론.ts index 1d3c2a5..c24af76 100644 --- a/packages/logic/src/items/che_서적_08_전론.ts +++ b/packages/logic/src/items/che_서적_08_전론.ts @@ -1,6 +1,7 @@ import { createStatItemModule } from './base.js'; import type { ItemModule } from './types.js'; import type { GeneralActionContext } from '@sammo-ts/logic/triggers/general.js'; +import type { GeneralStatName, WarStatName } from '@sammo-ts/logic/triggers/types.js'; import type { WarActionContext } from '@sammo-ts/logic/war/actions.js'; const STAT_VALUE = 8; @@ -23,19 +24,19 @@ export const itemModule: ItemModule = { onCalcStat: (() => { function onCalcStat( _context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, _aux?: unknown ): number; function onCalcStat( _context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], _aux?: unknown ): number | [number, number]; function onCalcStat( _context: GeneralActionContext | WarActionContext, - statName: string, + statName: GeneralStatName | WarStatName, value: number | [number, number] ): number | [number, number] { let base = value; diff --git a/packages/logic/src/items/index.ts b/packages/logic/src/items/index.ts index 3a072be..d263fc6 100644 --- a/packages/logic/src/items/index.ts +++ b/packages/logic/src/items/index.ts @@ -4,6 +4,17 @@ import { GeneralTriggerCaller, type GeneralActionContext, } from '@sammo-ts/logic/triggers/general.js'; +import type { + GeneralStatName, + TriggerActionPhase, + TriggerActionType, + TriggerDomesticActionType, + TriggerDomesticVarType, + TriggerNationalIncomeType, + TriggerStrategicActionType, + TriggerStrategicVarType, + WarStatName, +} from '@sammo-ts/logic/triggers/types.js'; import type { WarActionContext, WarActionModule } from '@sammo-ts/logic/war/actions.js'; import { WarTriggerCaller } from '@sammo-ts/logic/war/triggers.js'; import type { WarUnit } from '@sammo-ts/logic/war/units.js'; @@ -138,8 +149,8 @@ class ItemGeneralActionRouter< onCalcDomestic( context: GeneralActionContext, - turnType: string, - varType: string, + turnType: TriggerDomesticActionType, + varType: TriggerDomesticVarType, value: number, aux?: unknown ): number { @@ -155,7 +166,7 @@ class ItemGeneralActionRouter< onCalcStat( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number { @@ -171,7 +182,7 @@ class ItemGeneralActionRouter< onCalcOpposeStat( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number { @@ -187,8 +198,8 @@ class ItemGeneralActionRouter< onCalcStrategic( context: GeneralActionContext, - turnType: string, - varType: string, + turnType: TriggerStrategicActionType, + varType: TriggerStrategicVarType, value: number ): number { let current = value; @@ -203,7 +214,7 @@ class ItemGeneralActionRouter< onCalcNationalIncome( context: GeneralActionContext, - type: string, + type: TriggerNationalIncomeType, amount: number ): number { let current = amount; @@ -218,8 +229,8 @@ class ItemGeneralActionRouter< onArbitraryAction( context: GeneralActionContext, - actionType: string, - phase?: string | null, + actionType: TriggerActionType, + phase?: TriggerActionPhase | null, aux?: Record | null ): Record | null { let current = aux ?? null; @@ -283,7 +294,7 @@ class ItemWarActionRouter< onCalcStat( context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number] { @@ -299,7 +310,7 @@ class ItemWarActionRouter< onCalcOpposeStat( context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number] { diff --git a/packages/logic/src/items/types.ts b/packages/logic/src/items/types.ts index 21c420e..053df56 100644 --- a/packages/logic/src/items/types.ts +++ b/packages/logic/src/items/types.ts @@ -3,6 +3,17 @@ import type { GeneralActionContext, GeneralTriggerCaller, } from '@sammo-ts/logic/triggers/general.js'; +import type { + GeneralStatName, + TriggerActionPhase, + TriggerActionType, + TriggerDomesticActionType, + TriggerDomesticVarType, + TriggerNationalIncomeType, + TriggerStrategicActionType, + TriggerStrategicVarType, + WarStatName, +} from '@sammo-ts/logic/triggers/types.js'; import type { WarActionContext } from '@sammo-ts/logic/war/actions.js'; import type { WarTriggerCaller } from '@sammo-ts/logic/war/triggers.js'; import type { WarUnit } from '@sammo-ts/logic/war/units.js'; @@ -29,8 +40,8 @@ export interface ItemModule< onCalcDomestic?( context: GeneralActionContext, - turnType: string, - varType: string, + turnType: TriggerDomesticActionType, + varType: TriggerDomesticVarType, value: number, aux?: unknown ): number; @@ -38,13 +49,13 @@ export interface ItemModule< onCalcStat?: { ( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number; ( context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number]; @@ -53,13 +64,13 @@ export interface ItemModule< onCalcOpposeStat?: { ( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number; ( context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number]; @@ -67,21 +78,21 @@ export interface ItemModule< onCalcStrategic?( context: GeneralActionContext, - turnType: string, - varType: string, + turnType: TriggerStrategicActionType, + varType: TriggerStrategicVarType, value: number ): number; onCalcNationalIncome?( context: GeneralActionContext, - type: string, + type: TriggerNationalIncomeType, amount: number ): number; onArbitraryAction?( context: GeneralActionContext, - actionType: string, - phase?: string | null, + actionType: TriggerActionType, + phase?: TriggerActionPhase | null, aux?: Record | null ): Record | null; diff --git a/packages/logic/src/triggers/general-action.ts b/packages/logic/src/triggers/general-action.ts index f0839bb..cb8087a 100644 --- a/packages/logic/src/triggers/general-action.ts +++ b/packages/logic/src/triggers/general-action.ts @@ -1,5 +1,15 @@ import type { GeneralTriggerState } from '@sammo-ts/logic/domain/entities.js'; import { type GeneralActionContext, GeneralTriggerCaller } from './general.js'; +import type { + GeneralStatName, + TriggerActionPhase, + TriggerActionType, + TriggerDomesticActionType, + TriggerDomesticVarType, + TriggerNationalIncomeType, + TriggerStrategicActionType, + TriggerStrategicVarType, +} from './types.js'; export interface GeneralActionModule { getName?(): string; @@ -11,43 +21,43 @@ export interface GeneralActionModule, - turnType: string, - varType: string, + turnType: TriggerDomesticActionType, + varType: TriggerDomesticVarType, value: number, aux?: unknown ): number; onCalcStat?( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number; onCalcOpposeStat?( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number; onCalcStrategic?( context: GeneralActionContext, - turnType: string, - varType: string, + turnType: TriggerStrategicActionType, + varType: TriggerStrategicVarType, value: number ): number; onCalcNationalIncome?( context: GeneralActionContext, - type: string, + type: TriggerNationalIncomeType, amount: number ): number; onArbitraryAction?( context: GeneralActionContext, - actionType: string, - phase?: string | null, + actionType: TriggerActionType, + phase?: TriggerActionPhase | null, aux?: Record | null ): Record | null; } @@ -76,8 +86,8 @@ export class GeneralActionPipeline, - turnType: string, - varType: string, + turnType: TriggerDomesticActionType, + varType: TriggerDomesticVarType, value: number, aux?: unknown ): number { @@ -93,7 +103,7 @@ export class GeneralActionPipeline, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number { @@ -109,7 +119,7 @@ export class GeneralActionPipeline, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number { @@ -125,8 +135,8 @@ export class GeneralActionPipeline, - turnType: string, - varType: string, + turnType: TriggerStrategicActionType, + varType: TriggerStrategicVarType, value: number ): number { let current = value; @@ -141,7 +151,7 @@ export class GeneralActionPipeline, - type: string, + type: TriggerNationalIncomeType, amount: number ): number { let current = amount; @@ -156,8 +166,8 @@ export class GeneralActionPipeline, - actionType: string, - phase?: string | null, + actionType: TriggerActionType, + phase?: TriggerActionPhase | null, aux?: Record | null ): Record | null { let current = aux ?? null; diff --git a/packages/logic/src/triggers/special/registry.ts b/packages/logic/src/triggers/special/registry.ts index 8a24e1d..e3d1595 100644 --- a/packages/logic/src/triggers/special/registry.ts +++ b/packages/logic/src/triggers/special/registry.ts @@ -1,6 +1,17 @@ import type { GeneralTriggerState } from '@sammo-ts/logic/domain/entities.js'; import type { GeneralActionContext } from '@sammo-ts/logic/triggers/general.js'; import type { GeneralActionModule } from '@sammo-ts/logic/triggers/general-action.js'; +import type { + GeneralStatName, + TriggerActionPhase, + TriggerActionType, + TriggerDomesticActionType, + TriggerDomesticVarType, + TriggerNationalIncomeType, + TriggerStrategicActionType, + TriggerStrategicVarType, + WarStatName, +} from '@sammo-ts/logic/triggers/types.js'; import type { WarActionContext, WarActionModule } from '@sammo-ts/logic/war/actions.js'; import type { WarUnit } from '@sammo-ts/logic/war/units.js'; import type { WarTriggerCaller } from '@sammo-ts/logic/war/triggers.js'; @@ -57,8 +68,8 @@ export class SpecialGeneralActionRouter< onCalcDomestic( context: GeneralActionContext, - turnType: string, - varType: string, + turnType: TriggerDomesticActionType, + varType: TriggerDomesticVarType, value: number, aux?: unknown ): number { @@ -68,7 +79,7 @@ export class SpecialGeneralActionRouter< onCalcStat( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number { @@ -78,7 +89,7 @@ export class SpecialGeneralActionRouter< onCalcOpposeStat( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number { @@ -90,8 +101,8 @@ export class SpecialGeneralActionRouter< onCalcStrategic( context: GeneralActionContext, - turnType: string, - varType: string, + turnType: TriggerStrategicActionType, + varType: TriggerStrategicVarType, value: number ): number { const module = this.getModule(context); @@ -100,7 +111,7 @@ export class SpecialGeneralActionRouter< onCalcNationalIncome( context: GeneralActionContext, - type: string, + type: TriggerNationalIncomeType, amount: number ): number { const module = this.getModule(context); @@ -109,8 +120,8 @@ export class SpecialGeneralActionRouter< onArbitraryAction( context: GeneralActionContext, - actionType: string, - phase?: string | null, + actionType: TriggerActionType, + phase?: TriggerActionPhase | null, aux?: Record | null ): Record | null { const module = this.getModule(context); @@ -156,7 +167,7 @@ export class SpecialWarActionRouter< onCalcStat( context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number] { @@ -166,7 +177,7 @@ export class SpecialWarActionRouter< onCalcOpposeStat( context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number] { diff --git a/packages/logic/src/triggers/special/war/che_징병.ts b/packages/logic/src/triggers/special/war/che_징병.ts index 0a3518a..954aee6 100644 --- a/packages/logic/src/triggers/special/war/che_징병.ts +++ b/packages/logic/src/triggers/special/war/che_징병.ts @@ -1,4 +1,5 @@ import type { GeneralActionContext } from '@sammo-ts/logic/triggers/general.js'; +import type { GeneralStatName, WarStatName } from '@sammo-ts/logic/triggers/types.js'; import type { WarActionContext } from '@sammo-ts/logic/war/actions.js'; import type { SpecialActionModule } from '@sammo-ts/logic/triggers/special/types.js'; @@ -18,19 +19,19 @@ const resolveLeadershipBonus = ( function onCalcStat( context: GeneralActionContext, - statName: string, + statName: GeneralStatName, value: number, aux?: unknown ): number; function onCalcStat( context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number]; function onCalcStat( context: GeneralActionContext | WarActionContext, - statName: string, + statName: GeneralStatName | WarStatName, value: number | [number, number] ): number | [number, number] { if (statName !== 'leadership') { diff --git a/packages/logic/src/triggers/types.ts b/packages/logic/src/triggers/types.ts new file mode 100644 index 0000000..05936a3 --- /dev/null +++ b/packages/logic/src/triggers/types.ts @@ -0,0 +1,46 @@ +export type TriggerActionType = '장비매매'; + +export type TriggerActionPhase = '판매' | '구매'; + +export type TriggerDomesticActionType = + | '상업' + | '인재탐색' + | '징병' + | '징집인구' + | '계략' + | '민심' + | '인구' + | '기술' + | '모병'; + +export type TriggerDomesticVarType = + | 'cost' + | 'score' + | 'success' + | 'fail' + | 'train' + | 'atmos' + | 'rice' + | 'probability'; + +export type TriggerStrategicActionType = '의병모집'; + +export type TriggerStrategicVarType = 'delay' | 'globalDelay'; + +export type TriggerNationalIncomeType = 'gold' | 'rice'; + +export type GeneralStatName = 'leadership' | 'strength' | 'intelligence'; + +export type WarStatName = + | GeneralStatName + | 'cityBattleOrder' + | 'initWarPhase' + | 'bonusTrain' + | 'bonusAtmos' + | 'warCriticalRatio' + | 'warAvoidRatio' + | 'killRice' + | 'criticalDamageRange' + | 'warMagicSuccessDamage' + | 'warMagicTrialProb' + | `dex${number}`; diff --git a/packages/logic/src/war/actions.ts b/packages/logic/src/war/actions.ts index 26ef09c..2323a7f 100644 --- a/packages/logic/src/war/actions.ts +++ b/packages/logic/src/war/actions.ts @@ -7,6 +7,7 @@ import type { Nation, } from '@sammo-ts/logic/domain/entities.js'; import type { ActionLogger } from '@sammo-ts/logic/logging/actionLogger.js'; +import type { WarStatName } from '@sammo-ts/logic/triggers/types.js'; import type { WarUnit } from './units.js'; import { WarTriggerCaller } from './triggers.js'; @@ -33,14 +34,14 @@ export interface WarActionModule, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number]; onCalcOpposeStat?( context: WarActionContext, - statName: string, + statName: WarStatName, value: number | [number, number], aux?: unknown ): number | [number, number]; @@ -90,7 +91,7 @@ export class WarActionPipeline< onCalcStat( context: WarActionContext, - statName: string, + statName: WarStatName, value: T, aux?: unknown ): T { @@ -106,7 +107,7 @@ export class WarActionPipeline< onCalcOpposeStat( context: WarActionContext, - statName: string, + statName: WarStatName, value: T, aux?: unknown ): T { diff --git a/packages/logic/src/war/units.ts b/packages/logic/src/war/units.ts index 451b4db..b598c51 100644 --- a/packages/logic/src/war/units.ts +++ b/packages/logic/src/war/units.ts @@ -10,6 +10,7 @@ import type { } from '@sammo-ts/logic/domain/entities.js'; import type { ActionLogger } from '@sammo-ts/logic/logging/actionLogger.js'; import { LogFormat } from '@sammo-ts/logic/logging/types.js'; +import type { WarStatName } from '@sammo-ts/logic/triggers/types.js'; import { getTechAbility, getTechCost } from '@sammo-ts/logic/world/unitSet.js'; import { WarActionPipeline, type WarActionContext } from './actions.js'; import type { WarEngineConfig } from './types.js'; @@ -38,6 +39,9 @@ const META_LEADERSHIP_EXP = 'leadershipExp'; const RANK_WARNUM = `${META_RANK_PREFIX}warnum`; const RANK_KILLNUM = `${META_RANK_PREFIX}killnum`; + +const toDexStatName = (armType: number): WarStatName => + `dex${armType}` as WarStatName; const RANK_DEATHNUM = `${META_RANK_PREFIX}deathnum`; const RANK_OCCUPIED = `${META_RANK_PREFIX}occupied`; const RANK_KILLCREW = `${META_RANK_PREFIX}killcrew`; @@ -526,7 +530,7 @@ export class WarUnitGeneral< } private resolveOpposeStatValue( - statName: string, + statName: WarStatName, value: number, aux?: Record ): number { @@ -549,13 +553,14 @@ export class WarUnitGeneral< isAttacker: this.isAttacker(), opposeType: this.oppose?.getCrewType() ?? null, }; + const statName = toDexStatName(armType); let dex = this.actionPipeline.onCalcStat( this.getActionContext(), - `dex${armType}`, + statName, base, aux ); - dex = this.resolveOpposeStatValue(`dex${armType}`, dex, aux); + dex = this.resolveOpposeStatValue(statName, dex, aux); return dex; }