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 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); }
private bool IsSafeBlock(Card additionalBlocker) { return(!QuickCombat.CanBlockerBeDealtLeathalCombatDamage(Attacker, additionalBlocker)); }