Exemple #1
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;
            }
Exemple #2
0
            private int CalculateBlockersScore(EvaluationParameters p)
            {
                if (p.Blockers.Count == 0)
                {
                    return(0);
                }

                var blockersRanks = p.Blockers.Select(blocker =>
                {
                    var blockerParameters  = GetBlockerParameters(p.Attacker, blocker);
                    var attackerParameters = GetAttackerParamers(p.Attacker, new[] { blocker });

                    return(new
                    {
                        Blocker = blocker,
                        CanBeKilled = QuickCombat.CanBlockerBeDealtLeathalCombatDamage(blockerParameters),
                        CanKill = QuickCombat.CanAttackerBeDealtLeathalDamage(attackerParameters)
                    });
                })
                                    .ToList();

                if (blockersRanks.Any(x => !x.CanBeKilled))
                {
                    return(0);
                }

                var leastValuedBlockerWhoCanKill = blockersRanks.Where(x => x.CanKill)
                                                   .OrderBy(x => x.Blocker.Card.Score)
                                                   .FirstOrDefault();

                if (leastValuedBlockerWhoCanKill != null)
                {
                    return(leastValuedBlockerWhoCanKill.Blocker.Card.Score);
                }

                return(blockersRanks.OrderBy(x => x.Blocker.Card.Score).First().Blocker.Card.Score);
            }
Exemple #3
0
 private bool IsSafeBlock(Card additionalBlocker)
 {
     return(!QuickCombat.CanBlockerBeDealtLeathalCombatDamage(Attacker, additionalBlocker));
 }