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; }
private bool IncreasesGain(Card additionalBlocker) { // attacker was not killed, but blocker was // check if additional blocker changes things if (_canAllInitialBlockersBeKilled == false) { return(false); } if (additionalBlocker.Score > Attacker.Score) { return(false); } if (QuickCombat.CalculateTrampleDamage(Attacker, _blockers) > 0) { return(true); } return(QuickCombat.CanAttackerBeDealtLeathalDamage( Attacker, _blockers.Concat(additionalBlocker.ToEnumerable()))); }