private void Strike(bool verbose) { Combat selectedCombatSpecial = null; Combat selectedCombat = null; foreach (var attack in Attackers.Units.Where(x => x.Health != 0 && !x.Used)) { Combat selectedByDefense = null; foreach (var defend in Defenders.Units.Where(x => x.Health != 0)) { var potentialCombat = new Combat(attack, defend); if (selectedByDefense == null || Combat.IsFirstBetterForAttack(selectedByDefense, potentialCombat)) { selectedByDefense = potentialCombat; } } if (selectedCombat == null || Combat.IsFirstBetterForAttack(selectedByDefense, selectedCombat)) { selectedCombat = selectedByDefense; } if (attack.Is<CollateralDamage>()) { if (selectedCombatSpecial == null || Combat.IsFirstBetterForAttack(selectedByDefense, selectedCombatSpecial)) { selectedCombatSpecial = selectedByDefense; } } } if (selectedCombatSpecial != null) selectedCombat = selectedCombatSpecial; selectedCombat.Engage(verbose); selectedCombat.Attack.Used = true; if (selectedCombat.Attack.Is<CollateralDamage>()) { var collateralDamageStrength = selectedCombat.Attack.CollateralDamageStrength(0); var targets = Defenders.Units.Where(x => x.Health > 25).Where(x => x != selectedCombat.Defend).ToArray(); var order = new int[targets.Length]; for(var index = 0; index != order.Length; ++index) order[index] = _random.Next(0, 9000); Array.Sort(order, targets); var hits = selectedCombat.Attack.As<CollateralDamage>().Hits; if (verbose) Console.WriteLine("{0} units take collateral damage", targets.Take(hits).Count()); foreach (var collateral in targets.Take(hits)) { collateral.CollateralDamage(collateralDamageStrength, 25, verbose); //var combat = new Combat(selectedCombat.Attack, collateral); //collateral.Damaged(combat.Damage(combat.AttackStrength, combat.DefendStrength)); } } }
public static bool IsFirstBetterForAttack(Combat first, Combat second) { //better // is (a1/d1)*ah > (a2/d2)*dh // is (a1*d2) > (a2*d1) return 1.0 * first.AttackStrength * second.DefendStrength * first.Attack.Health * second.Defend.Health > 1.0 * second.AttackStrength * first.DefendStrength * second.Attack.Health * first.Defend.Health; }