Using the information contained on the various parts pages, you can calculate the exact stats of your items from scratch.
Base Scaling Formula
Firstly, one of the most important formulas to know is the Base Scaling Formula. A lot of stats get bigger as you level up, all of these are eventually based on some multiple of this formula.
For convience, other pages refer to this formula by β.
All bonuses in the game fit into one of four modifier types:
If you’ve checked out the full part reference, or the definition sections at the bottom of the main part guides, you’ll have seen bonuses colour coded into the different types.
Grade Bonus Formula
Grade bonuses are a little different to the other three, and have to be evaluated first. Weapon and item definitions can define a set of “grade slots”, each of which have a name and a bonus to apply. Parts can add grades to slot names, and, if that name exists on the relevant definition, it increases the bonus’s value.
Shields are the best example of grades - all shield definitions put their special effect under the same “Special[n]” slot names, but with different bonuses, meaning a part which boosts special will correctly boost all the different special effects regardless of shield type.
Grades are defined by three things: their modifier type, their base value, and a per-grade multiplier. These values are listed under the definitions part in each part guide, in the format “±Base ±PerGrade”.
Bonus = Base + (PerGrade × Grades)
Attribute Bonus Formula
Once you’ve converted grades into one of the base modifier types, you can apply the attribute bonus formula. Every attribute in the game uses this formula to apply it’s various bonuses.
Final = [(Base + PreAdd) ×
(1 + Positive Scale)÷(1 − Negative Scale)]
This formula makes a distinction between positive and negative scale values, based on the final value of the bonus. This means that if a scale bonus is based on a formula (e.g. the grade bonus formula), it will be treated differently if the formula resolves to a positive value than if it resolves to a negative.
Once you’ve gathered all the bonuses and put them, through this formula, you have the attribute’s final value. Note that some stats are comprised of multiple attributes, this is not always the final value of the stat your interested in.
Base Value Recompution
So with the above knowlege, you should be able to correctly calculate item stats from their parts. If you try including other bonuses, from skills or other items, you might have noticed you start having issues. This is because the game actually changes the base value of all stats stored on the item during initalization.
At the start of item initalization, each attribute has it’s regular base value, which you can find listed in each of the part guides. The game then applies all bonuses from the parts, finding the value that displays on the item card. Near the end of initalization, it recomputes the base values of these stats. It grabs the calculated final value, sets the base value to it, and removes all the part bonuses so they don’t apply twice. Any bonus applied after item initalization will work off of this new base value instead.
The Fibber is a great example of how this works. The barrel gives many large bonuses, which are incorporated into the new base value that is shown on the card. A BPD then enables extra bonuses after item initalization to give it it’s actual stats.
To make things easy in this example, we’ll look at the mag size on a Crit Fibber, with Maliwan grip and no accessory. In game this gives 1970 mag size on the card, but 15 in reality.
The relevant values here are:
- Hyperion Pistols have 15 base mag size
- Mag size grades on Hyperion Pistols are 0 +0.07
- Blue Hyperion Body gives +5
- The Crit Fibber’s Barrel gives +130
- The Crit Fibber’s BPD gives -128, which is applied after initalization
- Mag size is stored as an integer, so decimals are truncated.
Using these numbers we can calculate both values we observed earlier as follows:
Card = floor((15 + )
× (1 + [130 + (0 + 0.07 × )])
÷ (1 − )
Card = floor(15 × (1 + 130.35))
Card = floor(1970.25) = 1970
Final = floor((1970 + ) × (1 + ) ÷ (1 − [−128]) + )
Final = floor(1970 ÷ (1 − −128))
Final = floor(15.271…) = 15