コード例 #1
0
ファイル: Battle.cs プロジェクト: loudej/civcalc
        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));
                }
            }
        }
コード例 #2
0
ファイル: Combat.cs プロジェクト: loudej/civcalc
 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;
 }