Reject stale battle save effects
This commit is contained in:
@@ -163,6 +163,10 @@ export function isValidBattleSaveState(state: unknown, options: BattleSaveValida
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!areEffectsTargetingLiveUnits(state.battleBuffs, state.battleStatuses, units)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (
|
||||
!isOptionalItemStockRecord(state.itemStocks, options) ||
|
||||
!isOptionalBuffArray(state.battleBuffs, options) ||
|
||||
@@ -282,6 +286,21 @@ function areAttackIntentsTargetingLiveUnits(attackIntents: BattleSaveAttackInten
|
||||
return attackIntents.every((intent) => liveUnitIds.has(intent.attackerId) && liveUnitIds.has(intent.targetId));
|
||||
}
|
||||
|
||||
function areEffectsTargetingLiveUnits(
|
||||
battleBuffs: unknown,
|
||||
battleStatuses: unknown,
|
||||
units: SavedBattleUnitState[]
|
||||
) {
|
||||
const liveUnitIds = new Set(units.filter((unit) => unit.hp > 0).map((unit) => unit.id));
|
||||
const buffTargetsAreLive =
|
||||
battleBuffs === undefined ||
|
||||
(Array.isArray(battleBuffs) && battleBuffs.every((buff) => isRecord(buff) && liveUnitIds.has(String(buff.unitId))));
|
||||
const statusTargetsAreLive =
|
||||
battleStatuses === undefined ||
|
||||
(Array.isArray(battleStatuses) && battleStatuses.every((status) => isRecord(status) && liveUnitIds.has(String(status.unitId))));
|
||||
return buffTargetsAreLive && statusTargetsAreLive;
|
||||
}
|
||||
|
||||
function isSavedBattleUnitState(value: unknown, options: BattleSaveValidationOptions): value is SavedBattleUnitState {
|
||||
if (!isRecord(value) || typeof value.id !== 'string' || value.id.length === 0 || !isEquipmentSet(value.equipment, options)) {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user