refactor: improve war module type safety and reserved turns test data handling
This commit is contained in:
@@ -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> {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user