refactor: improve war module type safety and reserved turns test data handling

This commit is contained in:
2026-01-05 17:34:36 +00:00
parent 2e45a2d194
commit 44df19b079
10 changed files with 137 additions and 111 deletions
+27 -21
View File
@@ -16,32 +16,38 @@ export interface WarActionContext<TriggerState extends GeneralTriggerState = Gen
}
export interface WarActionModule<TriggerState extends GeneralTriggerState = GeneralTriggerState> {
getName?(): string;
getInfo?(): string;
getName?: (() => string) | undefined;
getInfo?: (() => string) | undefined;
getBattleInitTriggerList?(context: WarActionContext<TriggerState>): WarTriggerCaller | null;
getBattleInitTriggerList?: ((context: WarActionContext<TriggerState>) => WarTriggerCaller | null) | undefined;
getBattlePhaseTriggerList?(context: WarActionContext<TriggerState>): WarTriggerCaller | null;
getBattlePhaseTriggerList?: ((context: WarActionContext<TriggerState>) => WarTriggerCaller | null) | undefined;
onCalcStat?(
context: WarActionContext<TriggerState>,
statName: WarStatName,
value: number | [number, number],
aux?: unknown
): number | [number, number];
onCalcStat?:
| ((
context: WarActionContext<TriggerState>,
statName: WarStatName,
value: number | [number, number],
aux?: unknown
) => number | [number, number])
| undefined;
onCalcOpposeStat?(
context: WarActionContext<TriggerState>,
statName: WarStatName,
value: number | [number, number],
aux?: unknown
): number | [number, number];
onCalcOpposeStat?:
| ((
context: WarActionContext<TriggerState>,
statName: WarStatName,
value: number | [number, number],
aux?: unknown
) => number | [number, number])
| undefined;
getWarPowerMultiplier?(
context: WarActionContext<TriggerState>,
unit: WarUnit<TriggerState>,
oppose: WarUnit<TriggerState>
): [number, number];
getWarPowerMultiplier?:
| ((
context: WarActionContext<TriggerState>,
unit: WarUnit<TriggerState>,
oppose: WarUnit<TriggerState>
) => [number, number])
| undefined;
}
export class WarActionPipeline<TriggerState extends GeneralTriggerState = GeneralTriggerState> {
+9 -3
View File
@@ -110,7 +110,10 @@ const isSupplyCity = (city: City): boolean => {
return city.supplyState > 0;
};
export const computeBattleOrder = (defender: WarUnit, attacker: WarUnitGeneral): number => {
export const computeBattleOrder = <TriggerState extends GeneralTriggerState>(
defender: WarUnit<TriggerState>,
attacker: WarUnitGeneral<TriggerState>
): number => {
if (defender instanceof WarUnitCity) {
const context = attacker.getActionContext();
return attacker.getActionPipeline().onCalcOpposeStat(context, 'cityBattleOrder', -1);
@@ -257,11 +260,14 @@ export const resolveWarBattle = <TriggerState extends GeneralTriggerState = Gene
defenderGenerals.push(unit);
}
if (defenderGenerals.length > 0 && computeBattleOrder(cityUnit, attackerUnit) > 0) {
if (defenderGenerals.length > 0 && computeBattleOrder<TriggerState>(cityUnit, attackerUnit) > 0) {
defenderUnits.push(cityUnit);
}
defenderUnits.sort((lhs, rhs) => computeBattleOrder(rhs, attackerUnit) - computeBattleOrder(lhs, attackerUnit));
defenderUnits.sort(
(lhs, rhs) =>
computeBattleOrder<TriggerState>(rhs, attackerUnit) - computeBattleOrder<TriggerState>(lhs, attackerUnit)
);
const iter = defenderUnits.values();
let defender: WarUnit<TriggerState> | null = null;