Ejemplo n.º 1
0
        private float EstimateHitDistance(ISoldier soldier, RangedWeapon weapon, float targetSize, int freeHands)
        {
            float baseTotal = soldier.GetTotalSkillValue(weapon.Template.RelatedSkill);

            if (weapon.Template.Location == EquipLocation.TwoHand && freeHands == 1)
            {
                // unless the soldier is strong enough, the weapon can't be used one-handed
                if (weapon.Template.RequiredStrength * 1.5f > soldier.Strength)
                {
                    return(0);
                }
                if (weapon.Template.RequiredStrength * 2 > soldier.Strength)
                {
                    baseTotal -= (weapon.Template.RequiredStrength * 2) - soldier.Strength;
                }
            }

            // we'd like to get to a range where at least 1 bullet will hit more often than not when we aim
            // +1 for all-out attack, - ROF after the first shot
            // z value of 0.43 is
            baseTotal  = baseTotal + 1 + weapon.Template.Accuracy;
            baseTotal += BattleModifiersUtil.CalculateRateOfFireModifier(weapon.Template.RateOfFire);
            baseTotal += BattleModifiersUtil.CalculateSizeModifier(targetSize);
            // if the total doesn't get to 10.5, there will be no range where there's a good chance of hitting, so just keep getting closer
            if (baseTotal < 10.5)
            {
                return(0);
            }

            return(BattleModifiersUtil.GetRangeForModifier(10.5f - baseTotal));
        }
Ejemplo n.º 2
0
        private Tuple <float, float> EstimateHitAndDamage(BattleSoldier soldier, BattleSoldier target, RangedWeapon weapon, float range, float moveAndAimMod)
        {
            float sizeMod        = BattleModifiersUtil.CalculateSizeModifier(target.Soldier.Size);
            float armor          = target.Armor.Template.ArmorProvided;
            float con            = target.Soldier.Constitution;
            float expectedDamage = CalculateExpectedDamage(weapon, range, armor, con);
            float rangeMod       = BattleModifiersUtil.CalculateRangeModifier(range, target.CurrentSpeed);
            float rofMod         = BattleModifiersUtil.CalculateRateOfFireModifier(weapon.Template.RateOfFire);
            float weaponSkill    = soldier.Soldier.GetTotalSkillValue(weapon.Template.RelatedSkill);
            float total          = weaponSkill + rofMod + rangeMod + sizeMod + moveAndAimMod;

            return(new Tuple <float, float>(total, expectedDamage));
        }
Ejemplo n.º 3
0
        private float CalculateExpectedDamage(RangedWeapon weapon, float range, float armor, float con)
        {
            float effectiveStrength = BattleModifiersUtil.CalculateDamageAtRange(weapon, range);

            return(((effectiveStrength * 4.25f) - armor) / con);
        }