User:Quetzilla/Spread Formula Test
Formula
The following formula has been derived by testing changes to the game settings via the console and may not be completely accurate. The variables in the formula are explained in the Variables section below.
First, the game calculates a preliminary value based on game settings:
PreliminarySpread = (IronSightFactor * CrouchFactor * (ConditionFactor + SkillFactor) * (WalkFactor + RunFactor)) + ArmPenalty
Second, this value is adjusted by any perks that affect gun spread:
ModifiedSpread = PerkModifiers( PreliminarySpread )
PerkModifiers() represents a complex function, as any number of perks can affect the calculated value in complex ways, which are determined by the priority of the Perk Effects (see Perk Entry). Note that none of the Perks in the base game directly affect gun spread, but Perks added by mods can.
Finally, this value is compaed to the Min Spread value of the equipped Weapon Object, and the higher value is used:
FinalSpread = Max( ModifiedSpread, WeaponMinSpread )
Variables
The variables in the above formula are determined primarily by Game Settings, which come in base/multiplier pairs:
SkillFactor = fGunSpreadSkillBase + (fGunSpreadSkillMult * SkillValue)
- Base Default: 0.5
- Mult Default: -0.005
- SkillValue is the actor's skill value in the weapon's corresponding skill type.
ConditionFactor = fGunSpreadCondBase + (fGunSpreadCondMult * ConditionValue)
- Base Default: 0.0
- Mult Default: 0.0
- Condition Value is the current weapon's condition level.
- The default values mean condition has no effect on gun spread unless these values are altered by mods or the user
IronSightsFactor = fGunSpreadIronSightsBase + (fGunSpreadIronSightsMult * IsUsingIronSights)
- Base Default: 0.1
- Mult Default: -0.65
CrouchFactor = fGunSpreadCrouchBase + (fGunSpreadCrouchMult * IsActorCrouching)
- Base Default: 1.0
- Mult Default: -0.4
WalkFactor = fGunSpreadWalkBase + (fGunSpreadWalkMult * IsActorWalking)
- Base Default: 1.0
- Mult Default: 0.0
RunFactor = fGunSpreadRunBase + (fGunSpreadRunMult * IsActorRunning)
- Base Default: 1.0
- Mult Default: 0.0
CrippledArmPenalty = fGunSpreadArmBase + (fGunSpreadArmMult * ArmCondition)
- Base Default: 0.5
- Mult Default: -0.5
- Arm Condition is 0 when the actor's arm is crippled, and 1 at all other times.
CrippledHeadPenalty = fGunSpreadHeadBase + (fGunSpreadHeadMult * HeadCondition)
- Base Default: 1.0
- Mult Default: -1.0
- Head Condition is 0 when the actor's head is crippled, and 1 at all other times.
- Thought to be either unused, or only used for NPCs.