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) | undefined; getInfo?: (() => string) | undefined; getPreTurnExecuteTriggerList?: | ((context: GeneralActionContext) => GeneralTriggerCaller | null) | undefined; onCalcDomestic?: | (( context: GeneralActionContext, turnType: TriggerDomesticActionType, varType: TriggerDomesticVarType, value: number, aux?: unknown ) => number) | undefined; onCalcStat?: | (( context: GeneralActionContext, statName: GeneralStatName, value: number, aux?: unknown ) => number) | undefined; onCalcOpposeStat?: | (( context: GeneralActionContext, statName: GeneralStatName, value: number, aux?: unknown ) => number) | undefined; onCalcStrategic?: | (( context: GeneralActionContext, turnType: TriggerStrategicActionType, varType: TriggerStrategicVarType, value: number ) => number) | undefined; onCalcNationalIncome?: | ((context: GeneralActionContext, type: TriggerNationalIncomeType, amount: number) => number) | undefined; onArbitraryAction?: | (( context: GeneralActionContext, actionType: TriggerActionType, phase?: TriggerActionPhase | null, aux?: Record | null ) => Record | null) | undefined; } export class GeneralActionPipeline { private readonly modules: GeneralActionModule[]; constructor(modules: Array | null | undefined>) { this.modules = modules.filter(Boolean) as GeneralActionModule[]; } getPreTurnExecuteTriggerList(context: GeneralActionContext): GeneralTriggerCaller { const triggerCaller = new GeneralTriggerCaller(); for (const module of this.modules) { const triggers = module.getPreTurnExecuteTriggerList?.(context); if (triggers) { triggerCaller.merge(triggers); } } return triggerCaller; } onCalcDomestic( context: GeneralActionContext, turnType: TriggerDomesticActionType, varType: TriggerDomesticVarType, value: number, aux?: unknown ): number { let current = value; for (const module of this.modules) { if (!module.onCalcDomestic) { continue; } current = module.onCalcDomestic(context, turnType, varType, current, aux); } return current; } onCalcStat( context: GeneralActionContext, statName: GeneralStatName, value: number, aux?: unknown ): number { let current = value; for (const module of this.modules) { if (!module.onCalcStat) { continue; } current = module.onCalcStat(context, statName, current, aux); } return current; } onCalcOpposeStat( context: GeneralActionContext, statName: GeneralStatName, value: number, aux?: unknown ): number { let current = value; for (const module of this.modules) { if (!module.onCalcOpposeStat) { continue; } current = module.onCalcOpposeStat(context, statName, current, aux); } return current; } onCalcStrategic( context: GeneralActionContext, turnType: TriggerStrategicActionType, varType: TriggerStrategicVarType, value: number ): number { let current = value; for (const module of this.modules) { if (!module.onCalcStrategic) { continue; } current = module.onCalcStrategic(context, turnType, varType, current); } return current; } onCalcNationalIncome( context: GeneralActionContext, type: TriggerNationalIncomeType, amount: number ): number { let current = amount; for (const module of this.modules) { if (!module.onCalcNationalIncome) { continue; } current = module.onCalcNationalIncome(context, type, current); } return current; } onArbitraryAction( context: GeneralActionContext, actionType: TriggerActionType, phase?: TriggerActionPhase | null, aux?: Record | null ): Record | null { let current = aux ?? null; for (const module of this.modules) { if (!module.onArbitraryAction) { continue; } const result = module.onArbitraryAction(context, actionType, phase, current); if (result !== undefined) { current = result; } } return current; } }