Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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());
        }