Пример #1
0
        public OrderInvalidReason CanAttack(
            AttackMethod AttackMethod, bool EnemyArmored, LineOfSight LineOfSight, bool UseSecondaryWeapon)
        {
            var r = CanAttack(AttackMethod);

            if (r != OrderInvalidReason.NONE)
            {
                return(r);
            }

            if (Configuration.GetWeapon(UseSecondaryWeapon).Ammunition > 0 && GetAmmunition(UseSecondaryWeapon) == 0)
            {
                return(OrderInvalidReason.UNIT_NO_AMMUNITION);
            }

            if (AttackMethod == AttackMethod.DIRECT_FIRE)
            {
                return(Configuration.CanDirectFireAt(EnemyArmored, LineOfSight, UseSecondaryWeapon));
            }
            if (AttackMethod == AttackMethod.INDIRECT_FIRE)
            {
                r = Configuration.CanIndirectFireAt(LineOfSight, UseSecondaryWeapon);
                if (r != OrderInvalidReason.NONE)
                {
                    return(r);
                }

                if (Configuration.CanDirectFireAt(
                        EnemyArmored, LineOfSight, UseSecondaryWeapon) != OrderInvalidReason.NONE)
                {
                    if (Army.SightFinder.HasTileSightLevel(LineOfSight.Final, TileSightLevel.SOFT_SPOTTED))
                    {
                        return(OrderInvalidReason.NONE);
                    }
                    return(OrderInvalidReason.ATTACK_NO_SPOTTER);
                }
                return(OrderInvalidReason.NONE);
            }
            if (AttackMethod == AttackMethod.OVERRUN)
            {
                return(Configuration.CanOverrunAt(EnemyArmored));
            }
            if (AttackMethod == AttackMethod.CLOSE_ASSAULT)
            {
                if (!Configuration.CanCloseAssault)
                {
                    return(OrderInvalidReason.UNIT_NO_ATTACK);
                }
            }
            if (AttackMethod == AttackMethod.AIR)
            {
                return(Configuration.CanAirAttackAt(EnemyArmored, UseSecondaryWeapon));
            }
            if (AttackMethod == AttackMethod.ANTI_AIRCRAFT)
            {
                return(Configuration.CanAntiAircraftAt(EnemyArmored, LineOfSight, UseSecondaryWeapon));
            }

            return(OrderInvalidReason.NONE);
        }
 public int PosterizeLineOfSight(
     LineOfSight LineOfSight, Unit Unit, AttackMethod AttackMethod)
 {
     return(Math.Min(
                LineOfSight.Range * HIGHLIGHT_COLORS.Length / (Unit.Configuration.GetRange(AttackMethod, false) + 1),
                HIGHLIGHT_COLORS.Length - 1));
 }
Пример #3
0
        void GetAntiAirAttack(Unit Unit, LineOfSight LineOfSight, bool UseSecondaryWeapon)
        {
            var weapon = Unit.Configuration.GetWeapon(UseSecondaryWeapon);

            Factors = new List <AttackFactorCalculationFactor>();
            Attack  = weapon.Attack;
            if (LineOfSight.Range < weapon.Range / 2)
            {
                Attack *= 2;
                Factors.Add(AttackFactorCalculationFactor.ANTI_AIR_RANGE);
            }
        }
Пример #4
0
        public AttackFactorCalculation(
            Unit Unit,
            AttackMethod AttackMethod,
            bool EnemyArmored,
            LineOfSight LineOfSight,
            bool UseSecondaryWeapon)
        {
            if (Unit.CanAttack(AttackMethod, EnemyArmored, LineOfSight, UseSecondaryWeapon) != OrderInvalidReason.NONE)
            {
                Attack  = 0;
                Factors = new List <AttackFactorCalculationFactor> {
                    AttackFactorCalculationFactor.CANNOT_ATTACK
                };
                return;
            }

            switch (AttackMethod)
            {
            case AttackMethod.DIRECT_FIRE:
                GetNormalAttack(Unit, EnemyArmored, LineOfSight, UseSecondaryWeapon, true);
                break;

            case AttackMethod.INDIRECT_FIRE:
                GetNormalAttack(Unit, EnemyArmored, LineOfSight, UseSecondaryWeapon, false);
                Attack /= 4;
                Factors.Add(AttackFactorCalculationFactor.INDIRECT_FIRE);
                break;

            case AttackMethod.AIR:
                GetAirAttack(Unit, EnemyArmored, UseSecondaryWeapon);
                break;

            case AttackMethod.ANTI_AIRCRAFT:
                GetAntiAirAttack(Unit, LineOfSight, UseSecondaryWeapon);
                break;

            default:
                if (Unit.CanAttack(
                        AttackMethod, EnemyArmored, LineOfSight, UseSecondaryWeapon) != OrderInvalidReason.NONE)
                {
                    Attack  = 0;
                    Factors = new List <AttackFactorCalculationFactor>
                    {
                        AttackFactorCalculationFactor.CANNOT_ATTACK
                    };
                }
                Attack  = Unit.Configuration.GetWeapon(UseSecondaryWeapon).Attack;
                Factors = new List <AttackFactorCalculationFactor>();
                break;
            }
        }
Пример #5
0
        void GetNormalAttack(
            Unit Unit, bool EnemyArmored, LineOfSight LineOfSight, bool UseSecondaryWeapon, bool FactorElevation)
        {
            var weapon = Unit.Configuration.GetWeapon(UseSecondaryWeapon);

            Factors = new List <AttackFactorCalculationFactor>();
            Attack  = weapon.Attack;

            if (EnemyArmored)
            {
                int HalfRange = weapon.Range / 2;
                if (weapon.WeaponClass == WeaponClass.HIGH_EXPLOSIVE ||
                    weapon.WeaponClass == WeaponClass.MORTAR)
                {
                    if (LineOfSight.Range > HalfRange)
                    {
                        Attack /= 2;
                        Factors.Add(AttackFactorCalculationFactor.ARMOR_RANGE);
                    }
                }
                else if (weapon.WeaponClass == WeaponClass.ANTI_ARMOR)
                {
                    if (LineOfSight.Range <= HalfRange)
                    {
                        Attack *= 2;
                        Factors.Add(AttackFactorCalculationFactor.ANTI_ARMOR_RANGE);
                    }
                }
            }
            else if (weapon.WeaponClass == WeaponClass.ANTI_ARMOR && !EnemyArmored)
            {
                Attack /= 2;
                Factors.Add(AttackFactorCalculationFactor.NOT_ARMORED);
            }

            if (FactorElevation)
            {
                if (LineOfSight.Initial.Rules.SubTieredElevation
                    < LineOfSight.Final.Rules.SubTieredElevation)
                {
                    Attack /= 2;
                    Factors.Add(AttackFactorCalculationFactor.ELEVATION);
                }
            }

            if (weapon.Range < LineOfSight.Range && weapon.CanDoubleRange)
            {
                Attack /= 2;
                Factors.Add(AttackFactorCalculationFactor.DOUBLE_RANGE);
            }
        }
 public OrderInvalidReason CanAntiAircraftAt(bool EnemyArmored, LineOfSight LineOfSight, bool UseSecondaryWeapon)
 {
     if (!CanAntiAircraft)
     {
         return(OrderInvalidReason.UNIT_NO_ATTACK);
     }
     if (LineOfSight.Range > GetAdjustedRange(UseSecondaryWeapon))
     {
         return(OrderInvalidReason.TARGET_OUT_OF_RANGE);
     }
     if (GetWeapon(UseSecondaryWeapon).WeaponClass == WeaponClass.INFANTRY && EnemyArmored)
     {
         return(OrderInvalidReason.TARGET_ARMORED);
     }
     return(OrderInvalidReason.NONE);
 }
        public OrderInvalidReason CanIndirectFireAt(LineOfSight LineOfSight, bool UseSecondaryWeapon)
        {
            var range = GetAdjustedRange(UseSecondaryWeapon);

            if (LineOfSight.Range > range)
            {
                return(OrderInvalidReason.TARGET_OUT_OF_RANGE);
            }
            if (LineOfSight.Range < MinimumIndirectFireRange)
            {
                return(OrderInvalidReason.TARGET_TOO_CLOSE);
            }
            if (!CanIndirectFire)
            {
                return(OrderInvalidReason.UNIT_NO_ATTACK);
            }
            return(OrderInvalidReason.NONE);
        }
 public OrderInvalidReason CanDirectFireAt(bool EnemyArmored, LineOfSight LineOfSight, bool UseSecondaryWeapon)
 {
     if (!CanDirectFire)
     {
         return(OrderInvalidReason.UNIT_NO_ATTACK);
     }
     if (LineOfSight.Validate() != NoLineOfSightReason.NONE)
     {
         return(OrderInvalidReason.ATTACK_NO_LOS);
     }
     if (LineOfSight.Range > GetAdjustedRange(UseSecondaryWeapon))
     {
         return(OrderInvalidReason.TARGET_OUT_OF_RANGE);
     }
     if (GetWeapon(UseSecondaryWeapon).WeaponClass == WeaponClass.INFANTRY && EnemyArmored)
     {
         return(OrderInvalidReason.TARGET_ARMORED);
     }
     return(OrderInvalidReason.NONE);
 }
Пример #9
0
        double GetPotential(Unit Unit, LineOfSight LineOfSight)
        {
            var defenders =
                LineOfSight.Final.Units.Where(
                    i => i.CanBeAttackedBy(Root.Army, AttackMethod.DIRECT_FIRE, true) == OrderInvalidReason.NONE);
            var armoredCount   = defenders.Count(i => i.Configuration.IsArmored);
            var unArmoredCount = defenders.Count(i => !i.Configuration.IsArmored);

            if (armoredCount > unArmoredCount ||
                defenders.Any(i => i.Configuration.UnitClass == UnitClass.FORT) ||
                LineOfSight.Final.Rules.TreatUnitsAsArmored)
            {
                return(GetThreat(Unit, LineOfSight, true));
            }
            if (armoredCount < unArmoredCount)
            {
                return(GetThreat(Unit, LineOfSight, false));
            }
            return(Math.Min(GetThreat(Unit, LineOfSight, true), GetThreat(Unit, LineOfSight, false)));
        }
 public DirectFireSingleAttackOrder(SerializationInputStream Stream, List <GameObject> Objects)
     : base((Unit)Objects[Stream.ReadInt32()], (Unit)Objects[Stream.ReadInt32()], Stream.ReadBoolean())
 {
     LineOfSight = new LineOfSight((Tile)Objects[Stream.ReadInt32()], (Tile)Objects[Stream.ReadInt32()]);
 }
 public DirectFireSingleAttackOrder(Unit Attacker, Unit Defender, bool UseSecondaryWeapon)
     : base(Attacker, Defender, UseSecondaryWeapon)
 {
     LineOfSight = Attacker.GetLineOfSight(Defender.Position);
 }
Пример #12
0
 public IndirectFireSingleAttackOrder(Unit Attacker, Tile AttackTile, bool UseSecondaryWeapon)
     : base(Attacker, null, UseSecondaryWeapon)
 {
     this.AttackTile = AttackTile;
     LineOfSight     = Attacker.GetLineOfSight(AttackTile);
 }
 public Color GetRangeColor(
     LineOfSight LineOfSight, Unit Unit, AttackMethod AttackMethod)
 {
     return(HIGHLIGHT_COLORS[PosterizeLineOfSight(LineOfSight, Unit, AttackMethod)]);
 }
Пример #14
0
 double GetThreat(Unit Unit, LineOfSight LineOfSight, bool EnemyArmored)
 {
     return(Math.Max(
                new AttackFactorCalculation(Unit, AttackMethod.DIRECT_FIRE, EnemyArmored, LineOfSight, true).Attack,
                new AttackFactorCalculation(Unit, AttackMethod.DIRECT_FIRE, EnemyArmored, LineOfSight, false).Attack));
 }