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)); }
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)); }