Beispiel #1
0
        public static bool CanAttackerBeDealtLeathalDamage(AttackerEvaluationParameters p)
        {
            var attackerEvaluation = new AttackerEvaluation(p);
            var results            = attackerEvaluation.Evaluate();

            return(results.ReceivesLeathalDamage);
        }
Beispiel #2
0
        public static int CalculateGainAttackerWouldGetIfPowerAndThoughnessWouldIncrease(Card attacker,
                                                                                         IEnumerable <Card> blockers, int powerIncrease, int toughnessIncrease)
        {
            if ((blockers.None() || attacker.Has().Trample) && powerIncrease > 0)
            {
                return(CalculateDefendingPlayerLifeloss(attacker, blockers) > 0 ? 2 : 0);
            }

            if (toughnessIncrease < 1 && !attacker.Has().FirstStrike)
            {
                return(0);
            }

            var p = new AttackerEvaluationParameters(attacker, blockers);

            var canBeDealtLeathalDamageWithoutBoost = CanAttackerBeDealtLeathalDamage(p);

            if (canBeDealtLeathalDamageWithoutBoost == false)
            {
                return(0);
            }

            p.AttackerPowerIncrease     = powerIncrease;
            p.AttackerToughnessIncrease = toughnessIncrease;

            var canBeDealtLeathalDamageWithBoost = CanAttackerBeDealtLeathalDamage(p);

            return(canBeDealtLeathalDamageWithBoost ? 0 : attacker.Score);
        }
Beispiel #3
0
        public static int CalculateGainAttackerWouldGetIfPowerAndThoughnessWouldIncrease(Card attacker,
      IEnumerable<Card> blockers, int powerIncrease, int toughnessIncrease)
        {
            if ((blockers.None() || attacker.Has().Trample) && powerIncrease > 0)
              {
            return CalculateDefendingPlayerLifeloss(attacker, blockers) > 0 ? 2 : 0;
              }

              if (toughnessIncrease < 1 && !attacker.Has().FirstStrike)
            return 0;

              var p = new AttackerEvaluationParameters(attacker, blockers);

              var canBeDealtLeathalDamageWithoutBoost = CanAttackerBeDealtLeathalDamage(p);

              if (canBeDealtLeathalDamageWithoutBoost == false)
            return 0;

              p.AttackerPowerIncrease = powerIncrease;
              p.AttackerToughnessIncrease = toughnessIncrease;

              var canBeDealtLeathalDamageWithBoost = CanAttackerBeDealtLeathalDamage(p);

              return canBeDealtLeathalDamageWithBoost ? 0 : attacker.Score;
        }
Beispiel #4
0
        public static Card GetBlockerThatDealsLeathalDamageToAttacker(Card attacker, IEnumerable <Card> blockers)
        {
            var p = new AttackerEvaluationParameters(attacker, blockers);

            var performance = new AttackerEvaluation(p);
            var results     = performance.Evaluate();

            return(results.LeathalBlocker);
        }
Beispiel #5
0
        public static int CalculateTrampleDamage(AttackerEvaluationParameters p)
        {
            if (p.Attacker.Has().Trample == false)
            {
                return(0);
            }

            var total = p.Attacker.CalculateCombatDamageAmount(singleDamageStep: false, powerIncrease: p.AttackerPowerIncrease);

            total = total - p.Blockers.Sum(x => x.Card.Life + x.ToughnessIncrease);

            return(total > 0 ? total : 0);
        }
Beispiel #6
0
            private void AssignInitialBlockers(Card attacker, IEnumerable <Card> blockers, int defendersLife)
            {
                _canAllInitialBlockersBeKilled = true;
                var attackerAbilities = attacker.GetCombatAbilities();

                var attackerEvaluationParameters = new AttackerEvaluationParameters(attacker,
                                                                                    attackerAbilities.PowerIncrease, attackerAbilities.ToughnessIncrease);

                foreach (var blocker in blockers)
                {
                    var blockerAbilities = blocker.GetCombatAbilities();

                    _blockers.Add(blocker);

                    attackerEvaluationParameters.AddBlocker(blocker, blockerAbilities.PowerIncrease,
                                                            blockerAbilities.ToughnessIncrease);

                    var canBlockerBeDealtLeathalCombatDamage =
                        QuickCombat.CanBlockerBeDealtLeathalCombatDamage(new BlockerEvaluationParameters
                    {
                        Attacker                  = attacker,
                        Blocker                   = blocker,
                        BlockerPowerIncrease      = blockerAbilities.PowerIncrease,
                        BlockerToughnessIncrease  = blockerAbilities.ToughnessIncrease,
                        AttackerPowerIncrease     = attackerAbilities.PowerIncrease,
                        AttackerToughnessIncrease = attackerAbilities.ToughnessIncrease
                    });

                    var blockerScore = canBlockerBeDealtLeathalCombatDamage && !blockerAbilities.CanRegenerate
            ? blocker.Score
            : 0;

                    var lifelossScore = ScoreCalculator.CalculateLifelossScore(
                        defendersLife,
                        attacker.CalculateCombatDamageAmount(singleDamageStep: false));

                    var trampleScore = ScoreCalculator.CalculateLifelossScore(
                        defendersLife, QuickCombat.CalculateTrampleDamage(Attacker, blocker));

                    Gain = lifelossScore - blockerScore - trampleScore;
                    _canAllInitialBlockersBeKilled = _canAllInitialBlockersBeKilled && canBlockerBeDealtLeathalCombatDamage;
                }

                IsAttackerKilled = QuickCombat.CanAttackerBeDealtLeathalDamage(attackerEvaluationParameters);

                var attackerScore = IsAttackerKilled && !attackerAbilities.CanRegenerate
          ? attacker.Score
          : 0;

                Gain += attackerScore;
            }
Beispiel #7
0
            private static AttackerEvaluationParameters GetAttackerParamers(CardWithCombatAbilities attacker,
                                                                            IEnumerable <CardWithCombatAbilities> blockers)
            {
                var p = new AttackerEvaluationParameters(attacker.Card, attacker.Abilities.PowerIncrease,
                                                         attacker.Abilities.ToughnessIncrease);

                foreach (var blocker in blockers)
                {
                    p.AddBlocker(blocker.Card, blocker.Abilities.PowerIncrease,
                                 blocker.Abilities.ToughnessIncrease);
                }

                return(p);
            }
            private static AttackerEvaluationParameters GetAttackerParamers(CardWithCombatAbilities attacker,
        IEnumerable<CardWithCombatAbilities> blockers)
            {
                var p = new AttackerEvaluationParameters(attacker.Card, attacker.Abilities.PowerIncrease,
                  attacker.Abilities.ToughnessIncrease);

                foreach (var blocker in blockers)
                {
                  p.AddBlocker(blocker.Card, blocker.Abilities.PowerIncrease,
                blocker.Abilities.ToughnessIncrease);
                }

                return p;
            }
Beispiel #9
0
        public static int GetAmountOfDamageThatNeedsToBePreventedToSafeAttackerFromDying(Card attacker,
                                                                                         IEnumerable <Card> blockers)
        {
            var p       = new AttackerEvaluationParameters(attacker, blockers);
            var results = new AttackerEvaluation(p).Evaluate();

            if (!results.ReceivesLeathalDamage)
            {
                return(0);
            }

            if (results.DeathTouchDamage > 0)
            {
                return(results.DeathTouchDamage);
            }

            var prevented = results.TotalDamage - attacker.Life + 1;

            return(prevented);
        }
Beispiel #10
0
        public static int CalculateDefendingPlayerLifeloss(AttackerEvaluationParameters p)
        {
            var total = 0;

              if (p.Blockers.None())
              {
            total = p.Attacker.CalculateCombatDamageAmount(singleDamageStep: false, powerIncrease: p.AttackerPowerIncrease);
              }
              else if (p.Attacker.Has().Trample)
              {
            total = CalculateTrampleDamage(p);
              }

              if (total == 0)
            return 0;

              var prevented = p.Attacker.Controller.Opponent.CalculatePreventedReceivedDamageAmount(total, p.Attacker,
            isCombat: true);

              return total - prevented;
        }
Beispiel #11
0
        public static int CalculateDefendingPlayerLifeloss(AttackerEvaluationParameters p)
        {
            var total = 0;

            if (p.Blockers.None())
            {
                total = p.Attacker.CalculateCombatDamageAmount(singleDamageStep: false, powerIncrease: p.AttackerPowerIncrease);
            }
            else if (p.Attacker.Has().Trample)
            {
                total = CalculateTrampleDamage(p);
            }

            if (total == 0)
            {
                return(0);
            }

            var prevented = p.Attacker.Controller.Opponent.CalculatePreventedReceivedDamageAmount(total, p.Attacker,
                                                                                                  isCombat: true);

            return(total - prevented);
        }
Beispiel #12
0
            private void AssignInitialBlockers(Card attacker, IEnumerable<Card> blockers, int defendersLife)
            {
                _canAllInitialBlockersBeKilled = true;
                var attackerAbilities = attacker.GetCombatAbilities();

                var attackerEvaluationParameters = new AttackerEvaluationParameters(attacker,
                  attackerAbilities.PowerIncrease, attackerAbilities.ToughnessIncrease);

                foreach (var blocker in blockers)
                {
                  var blockerAbilities = blocker.GetCombatAbilities();

                  _blockers.Add(blocker);

                  attackerEvaluationParameters.AddBlocker(blocker, blockerAbilities.PowerIncrease,
                blockerAbilities.ToughnessIncrease);

                  var canBlockerBeDealtLeathalCombatDamage =
                QuickCombat.CanBlockerBeDealtLeathalCombatDamage(new BlockerEvaluationParameters
                  {
                Attacker = attacker,
                Blocker = blocker,
                BlockerPowerIncrease = blockerAbilities.PowerIncrease,
                BlockerToughnessIncrease = blockerAbilities.ToughnessIncrease,
                AttackerPowerIncrease = attackerAbilities.PowerIncrease,
                AttackerToughnessIncrease = attackerAbilities.ToughnessIncrease
                  });

                  var blockerScore = canBlockerBeDealtLeathalCombatDamage && !blockerAbilities.CanRegenerate
                ? blocker.Score
                : 0;

                  var lifelossScore = ScoreCalculator.CalculateLifelossScore(
                defendersLife,
                attacker.CalculateCombatDamageAmount(singleDamageStep: false));

                  var trampleScore = ScoreCalculator.CalculateLifelossScore(
                defendersLife, QuickCombat.CalculateTrampleDamage(Attacker, blocker));

                  Gain = lifelossScore - blockerScore - trampleScore;
                  _canAllInitialBlockersBeKilled = _canAllInitialBlockersBeKilled && canBlockerBeDealtLeathalCombatDamage;
                }

                IsAttackerKilled = QuickCombat.CanAttackerBeDealtLeathalDamage(attackerEvaluationParameters);

                var attackerScore = IsAttackerKilled && !attackerAbilities.CanRegenerate
                  ? attacker.Score
                  : 0;

                Gain += attackerScore;
            }
Beispiel #13
0
 public AttackerEvaluation(AttackerEvaluationParameters p)
 {
     _p = p;
 }
Beispiel #14
0
 public static int CalculateTrampleDamage(Card attacker, IEnumerable<Card> blockers)
 {
     var p = new AttackerEvaluationParameters(attacker, blockers);
       return CalculateTrampleDamage(p);
 }
Beispiel #15
0
        public static int CalculateTrampleDamage(Card attacker, IEnumerable <Card> blockers)
        {
            var p = new AttackerEvaluationParameters(attacker, blockers);

            return(CalculateTrampleDamage(p));
        }
Beispiel #16
0
        public static int GetAmountOfDamageThatWillBeDealtToAttacker(AttackerEvaluationParameters p)
        {
            var results = new AttackerEvaluation(p).Evaluate();

            return(results.TotalDamage);
        }
Beispiel #17
0
        public static int CalculateTrampleDamage(AttackerEvaluationParameters p)
        {
            if (p.Attacker.Has().Trample == false)
            return 0;

              var total = p.Attacker.CalculateCombatDamageAmount(singleDamageStep: false, powerIncrease: p.AttackerPowerIncrease);
              total = total - p.Blockers.Sum(x => x.Card.Life + x.ToughnessIncrease);

              return total > 0 ? total : 0;
        }
Beispiel #18
0
 public static bool CanAttackerBeDealtLeathalDamage(AttackerEvaluationParameters p)
 {
     var attackerEvaluation = new AttackerEvaluation(p);
       var results = attackerEvaluation.Evaluate();
       return results.ReceivesLeathalDamage;
 }
 public AttackerEvaluation(AttackerEvaluationParameters p)
 {
     _p = p;
 }
Beispiel #20
0
        public static Card GetBlockerThatDealsLeathalDamageToAttacker(Card attacker, IEnumerable<Card> blockers)
        {
            var p = new AttackerEvaluationParameters(attacker, blockers);

              var performance = new AttackerEvaluation(p);
              var results = performance.Evaluate();

              return results.LeathalBlocker;
        }
Beispiel #21
0
 public static int GetAmountOfDamageThatWillBeDealtToAttacker(AttackerEvaluationParameters p)
 {
     var results = new AttackerEvaluation(p).Evaluate();
       return results.TotalDamage;
 }
Beispiel #22
0
        public static int GetAmountOfDamageThatNeedsToBePreventedToSafeAttackerFromDying(Card attacker,
      IEnumerable<Card> blockers)
        {
            var p = new AttackerEvaluationParameters(attacker, blockers);
              var results = new AttackerEvaluation(p).Evaluate();

              if (!results.ReceivesLeathalDamage)
            return 0;

              if (results.DeathTouchDamage > 0)
            return results.DeathTouchDamage;

              var prevented = results.TotalDamage - attacker.Life + 1;
              return prevented;
        }