public UnitCombatState(Unit unit, Combat combat)
 {
     Unit = unit;
     UnitStrength = unit.Strength;
     BaseDamage = null;
     CombatEfficiency = combat.GetCombatEfficiency();
     TotalDamageDealt = 0.0;
     DamageDivisor = 1;
 }
 public void AttackUnit(Unit attacker, Unit defender)
 {
     if (!attacker.Deployed)
         throw new GameException("Tried to attack with an undeployed unit");
     if (!defender.Deployed)
         throw new GameException("Tried to attack an undeployed unit");
     if (!attacker.CanPerformAction)
         throw new GameException("This unit cannot perform any more actions this turn");
     Combat outcome;
     if (attacker.IsAirUnit())
     {
         List<Unit> antiAirUnits = Opponent.GetAntiAirUnits(defender);
         outcome = new Combat(attacker, defender, true, antiAirUnits);
     }
     else
     {
         int distance = attacker.Hex.GetDistance(defender.Hex);
         if (distance > attacker.Stats.Range)
             throw new GameException("The target is out of range");
         outcome = new Combat(attacker, defender, true);
     }
     attacker.CanPerformAction = false;
     // Attacking a unit breaks entrenchment
     attacker.BreakEntrenchment();
     attacker.Strength = outcome.AttackerStrength;
     defender.Strength = outcome.DefenderStrength;
     if (!attacker.IsAlive())
         OnUnitDeath(attacker);
     if (!defender.IsAlive())
         Opponent.OnUnitDeath(defender);
 }