private void StoreAtom(PredicateAtom atom) { switch (atom.AtomType) { case PredicateAtomType.SubPredicate: var tmp = ((SubPredicateAtom)atom).Predicate; if (tmp.Subpredicates.Count > 0) { Layer = Math.Max(tmp.Subpredicates.Select(s => s.Layer).Max() + 1, Layer); Subpredicates.AddRange(tmp.Subpredicates); } Subpredicates.Add(tmp); break; case PredicateAtomType.Protocol: ProtocolTargets.Add((ProtocolAtom)atom); break; case PredicateAtomType.Filter: FilterTargets.Add((FilterAtom)atom); break; case PredicateAtomType.Not: StoreAtom(((NotAtom)atom).Operand); break; } }
public Delta[] GetDamagingDeltas(Lane l, int oppSide, Damage.Type dmgType, GameManager gm) { int dmgLeft = (dmgType == Damage.Type.RANGED ? RangedAttack : MeleeAttack); List <Delta> deltas = new List <Delta>(); Unit[] targets = { l.Units[oppSide, 0], l.Units[oppSide, 1] }; FilterTargets?.Invoke(targets); for (int pos = 0; dmgLeft > 0 && pos < 2; pos++) { if (targets[pos] != null) { //System.Console.WriteLine($" Found Target at Pos{pos}"); Unit target = targets[pos]; int resistance = target.GetResistance(dmgType); int deal = System.Math.Min(target.HealthPoints + resistance, dmgLeft); //System.Console.WriteLine($" Dealing{deal} to {target.Card.Name} with resist{resistance}"); deltas.AddRange( UnitHealthDelta.GetDamageDeltas( target, this, deal, dmgType, gm ) ); dmgLeft -= deal; target.ModifyDamageLeft?.Invoke(ref dmgLeft); //System.Console.WriteLine($" Damage Left{dmgLeft}"); } } if (dmgLeft > 0) { int towerDamage = 1; ModifyTowerDamage?.Invoke(ref towerDamage); //System.Console.WriteLine($" Hit Tower{towerDamage}"); deltas.AddRange(l.Towers[oppSide].GetDamageDeltas(towerDamage, dmgType)); } return(deltas.ToArray()); }