@Stikyhooves I’ll actually reply to that here as I think it’s more relevant to have this in here now that I made a separate thread for these spreadsheets
Mindless rambling
There actually isn't a table that contains the information inside the devkit in this fashion. There are ~5 potential locations where partial data can be contained, which I'm sure you already discovered. And inside the devkit all of these are calculated via internal functions of the base C++ classes so you can't even see the actual process. So in the devkit they just do something along the lines of a "getstat" function which goes and does these calculations and to be fair I don't even think the devs know these formulas at this point unless they go and look :DWhat I did though is I exported all of these datatables and then tried to recreate the actual formulas used in those internal functions by trial and error to be able to apply them in this blanket fashion, occasionally picking random NPCs to verify them on to see if it adds up to what the game shows.
The actual process of building the stats and their locations are as follows:
You start with the SpawnDataTable as that contains every NPC spawn in the game.
The ones with a ProfessionTemplate are typically the ones that have a thrall system in place and the entry refers to the ProfessionTemplateDataTable. Now aside from that the spawn table also has a reference to a stat template (StatTemplateDataTable) and a stat modifier template (StatModifierDataTable). On top of this… the profession table can also have entries for stat templates and stat modifier templates.
As an example let’s look at the melee damage modifier (Stat type: Float, ID: 4) of a Cimmerian Berserker:
We look him up in the spawntable (Forgotten_Tribe_Berserker), his stat template there is “All thralls base”, stat modifier is Elite_Forgotten_Tribe.
We also look him up in the profession table based on the profession he has in the spawn table (Fighter_Berserker), here he has the stat template of Fighter Base and 2 stat modifier templates: Fighter 5 Mods and Tier 4 Mods as well as a separate “Thrall Stat modifier template” which is Thrall_T4…
Sooooo that’s a lot of templates we look up all those values (for Float / 4 )in their respective table (whether it’s a stat template or a modifier template)
All Thralls Base: 1
Elite_Forgotten_Tribe: 2
Fighter Base: 1
Fighter 5 Mods: 1.4
Tier 4 Mods: -
Thrall_T4: 0.4
As you see in this case that’s 5 separate values as one of the possible locations doesn’t have one… multiply them all and you get 1.12
Depending on the stat or whether we’re talking about the wild, tamed or zombified versions… some of these values may or may not be used, for example zombies ignore the last one (Thrall stat modifier from profession template), that’s why their multipliers are higher since this value is typically below 1 so it reduces it for the regular thralls.
Or health for example (Int / 0), if we look at the same berserker and get the health stats:
All Thralls Base: 20
Elite_Forgotten_Tribe: 43
Fighter Base: 15
Fighter 5 Mods: -
Tier 4 Mods: 1
Thrall_T4: 2.6
If we were to multiply all of these… we’d end up with like 33k health, which is obviously not the case, we know we need to get around 1677 though (base berserker HP minus the amount they gain from starting vitality), so we try to combine them to get that number… We find that if we ignore the first value that’s exactly what we get
So then I try to apply this formula to the rest of the thralls and see if it makes sense… I did that… however I noticed that while it’s okay for most fighters and archers, if I scroll down… there’s a bunch of bearers and dancers with like 20 hp… so that’s not good It turns out one of those values was empty for them based on their templates… so I then adjusted the formula that if said value is empty, then instead of that use the one we ignored for fighters… and sure enough it made sense and I got their HP down as well.
TLDR: it’s essentially trying to guess Funcoms internal formulas till I get the result I see in the game and then apply that en-masse. The amount of available variables that are actually used in those formulas can vary based on stat / thrall type etc. Whenever I or someone else spots a bug then I go and try to figure out why and update the formula accordingly, so there might still be some small inaccuracies here and there but I think it’s pretty close now.
Still, while it’s easy to check for one thrall by just spawning them and checking in admin mode and console commands, to my knowledge we never had a comprehensive list that included every thrall down to the lowly T1 bearers, it was always just the berserkers and relic hunters and dalinsias… so that’s why I made this.