Page 1 of 1

How are stat-boosting talents applied?

Posted: Sat Oct 12, 2024 11:41 pm
by Zizzo
So, Augmentation boosts Dexterity based on Cunning, and Unified Body boosts Constitution based on Dexterity. If I have both, does that mean boosting Cunning will indirectly boost Constitution, or are they applied separately? Could we create an infinite loop by, for instance, having one talent that boosts STR based on DEX and another that boosts DEX based on STR? Could I just go crazy with an Adventurer and take every talent that boosts any stat at all and let them all reinforce and stack on each other?

[My motivation is that I read a couple threads over on the Steam forum about builds designed around wearing Monolith Armor, and I'm starting to get that itch to create Yet Another Character™… :oops: ]

Re: How are stat-boosting talents applied?

Posted: Sun Oct 13, 2024 12:01 am
by PseudoLoneWolf
I hate to say this, Zizzo, but I think that you are by far the most qualified of any of us to go find that out in the code. I have also wondered this but not gotten a satisfying answer through testing or asking.

I figure if this topic was left alone long enough, you'd have gone source diving for the answer anyway, so I may as well save you the waiting :lol:

Re: How are stat-boosting talents applied?

Posted: Tue Oct 15, 2024 12:09 am
by Zizzo
PseudoLoneWolf wrote: Sun Oct 13, 2024 12:01 am I hate to say this, Zizzo, but I think that you are by far the most qualified of any of us to go find that out in the code. I have also wondered this but not gotten a satisfying answer through testing or asking.

I figure if this topic was left alone long enough, you'd have gone source diving for the answer anyway, so I may as well save you the waiting :lol:
So. It has come to this. :twisted: :mrgreen:

So, as is my usual strategy, I whipped up an addon to do some testing and experimentation, and it's straightforward enough that I figured I might as well publish it, on the theory that other people might want to play with it; for lack of a better name, I'm calling it Temporary Stat Watch. Basically, it prints useful information in the log file every time :addTemporaryValue() or :removeTemporaryValue() is called on the "inc_stats" property (search the log file for lines that start with "[TEMP_STAT]"). For instance, here's the output from activating Augmentation at one point:

Code: Select all

[TEMP_STAT] adding temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=0/dex=0/mag=0/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-add[30]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[30]:  inc  str=2/dex=3/mag=0/wil=0/cun=0/con=0/lck=0
Now we put a point in Inner Power, whose CUN boost should ripple through Augmentation to boost DEX:

Code: Select all

[TEMP_STAT] adding temporary stats:  str=2/dex=2/mag=2/cun=2
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=3/mag=0/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-rmv[30]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[30]:  inc  str=4/dex=5/mag=0/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] * post-rmv[30]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[30]:  inc  str=2/dex=2/mag=0/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] adding temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=2/mag=0/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] * post-add[32]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[32]:  inc  str=4/dex=5/mag=0/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] * post-add[31]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[31]:  inc  str=4/dex=5/mag=2/wil=0/cun=2/con=0/lck=0
Hmm, one more point in Inner Power:

Code: Select all

[TEMP_STAT] removing temporary stats:  str=2/dex=2/mag=2/cun=2
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[11]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[11]:  inc  str=4/dex=5/mag=2/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[12]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[12]:  inc  str=2/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-rmv[12]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[12]:  inc  str=0/dex=0/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] adding temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=0/dex=0/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-add[13]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[13]:  inc  str=2/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-rmv[11]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[11]:  inc  str=2/dex=3/mag=0/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] adding temporary stats:  str=3/dex=3/mag=3/cun=3
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=3/mag=0/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[13]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[13]:  inc  str=5/dex=6/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-rmv[13]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[13]:  inc  str=3/dex=3/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] adding temporary stats:  str=2/dex=4
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=3/dex=3/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-add[15]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[15]:  inc  str=5/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-add[14]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[14]:  inc  str=5/dex=7/mag=3/wil=0/cun=3/con=0/lck=0
Ah, that was enough to increase Augmentation's DEX boost from 3 to 4. :mrgreen:

And just for giggles, let's see what that second point in Inner Power looks like with a point in both Augmentation and Unified Body:

Code: Select all

[TEMP_STAT] removing temporary stats:  str=2/dex=2/mag=2/cun=2
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[18]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[18]:  inc  str=7/dex=5/mag=2/wil=0/cun=2/con=4/lck=0
[TEMP_STAT] removing temporary stats:  con=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[33]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[33]:  inc  str=7/dex=3/mag=2/wil=0/cun=2/con=4/lck=0
[TEMP_STAT] * post-rmv[33]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[33]:  inc  str=7/dex=3/mag=2/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=3
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[35]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[35]:  inc  str=7/dex=3/mag=2/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] * post-rmv[35]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[35]:  inc  str=4/dex=3/mag=2/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] adding temporary stats:  con=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=4/dex=3/mag=2/wil=0/cun=2/con=0/lck=0
[TEMP_STAT] * post-add[37]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[37]:  inc  str=4/dex=3/mag=2/wil=0/cun=2/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=3
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=4/dex=3/mag=2/wil=0/cun=2/con=4/lck=0
[TEMP_STAT] * post-add[39]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[39]:  inc  str=7/dex=3/mag=2/wil=0/cun=2/con=4/lck=0
[TEMP_STAT] removing temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[27]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[27]:  inc  str=5/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] removing temporary stats:  con=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[37]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[37]:  inc  str=5/dex=0/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-rmv[37]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[37]:  inc  str=5/dex=0/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=3
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[39]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[39]:  inc  str=5/dex=0/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-rmv[39]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[39]:  inc  str=2/dex=0/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] adding temporary stats:  con=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=0/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-add[41]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[41]:  inc  str=2/dex=0/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=3
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=0/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-add[43]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[43]:  inc  str=5/dex=0/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-rmv[27]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[27]:  inc  str=3/dex=0/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=3/dex=0/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] removing temporary stats:  con=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[41]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[41]:  inc  str=3/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-rmv[41]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[41]:  inc  str=3/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=3
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[43]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[43]:  inc  str=3/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-rmv[43]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[43]:  inc  str=0/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] adding temporary stats:  con=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=0/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-add[46]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[46]:  inc  str=0/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=3
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=0/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-add[48]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[48]:  inc  str=3/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-add[44]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[44]:  inc  str=5/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] removing temporary stats:  con=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[46]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[46]:  inc  str=5/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-rmv[46]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[46]:  inc  str=5/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=3
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[48]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[48]:  inc  str=5/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-rmv[48]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[48]:  inc  str=2/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] adding temporary stats:  con=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=3/mag=2/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-add[50]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[50]:  inc  str=2/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=3
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-add[52]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[52]:  inc  str=5/dex=3/mag=2/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-rmv[18]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[18]:  inc  str=5/dex=3/mag=0/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=3/dex=3/mag=3/cun=3
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=5/dex=3/mag=0/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] removing temporary stats:  con=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[50]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[50]:  inc  str=5/dex=6/mag=0/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-rmv[50]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[50]:  inc  str=5/dex=6/mag=0/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=3
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[52]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[52]:  inc  str=5/dex=6/mag=0/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-rmv[52]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[52]:  inc  str=2/dex=6/mag=0/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] adding temporary stats:  con=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=6/mag=0/wil=0/cun=0/con=0/lck=0
[TEMP_STAT] * post-add[55]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[55]:  inc  str=2/dex=6/mag=0/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=3
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=2/dex=6/mag=0/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] * post-add[57]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[57]:  inc  str=5/dex=6/mag=0/wil=0/cun=0/con=4/lck=0
[TEMP_STAT] removing temporary stats:  str=2/dex=3
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[44]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[44]:  inc  str=8/dex=6/mag=0/wil=0/cun=3/con=4/lck=0
[TEMP_STAT] removing temporary stats:  con=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[55]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[55]:  inc  str=8/dex=3/mag=0/wil=0/cun=3/con=4/lck=0
[TEMP_STAT] * post-rmv[55]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[55]:  inc  str=8/dex=3/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=3
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[57]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[57]:  inc  str=8/dex=3/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-rmv[57]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[57]:  inc  str=5/dex=3/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] adding temporary stats:  con=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=5/dex=3/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-add[59]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[59]:  inc  str=5/dex=3/mag=0/wil=0/cun=3/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=5/dex=3/mag=0/wil=0/cun=3/con=4/lck=0
[TEMP_STAT] * post-add[61]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[61]:  inc  str=9/dex=3/mag=0/wil=0/cun=3/con=4/lck=0
[TEMP_STAT] * post-rmv[44]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[44]:  inc  str=7/dex=3/mag=0/wil=0/cun=3/con=4/lck=0
[TEMP_STAT] adding temporary stats:  str=2/dex=4
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=7/dex=3/mag=0/wil=0/cun=3/con=4/lck=0
[TEMP_STAT] removing temporary stats:  con=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[59]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[59]:  inc  str=7/dex=7/mag=0/wil=0/cun=3/con=4/lck=0
[TEMP_STAT] * post-rmv[59]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[59]:  inc  str=7/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[61]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[61]:  inc  str=7/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-rmv[61]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[61]:  inc  str=3/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] adding temporary stats:  con=5
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=3/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-add[64]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[64]:  inc  str=3/dex=7/mag=0/wil=0/cun=3/con=5/lck=0
[TEMP_STAT] adding temporary stats:  str=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from recomputeStats() in Augmentation
[TEMP_STAT] - from callbackOnStatChange(cun, 2) in Augmentation
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=3/dex=7/mag=0/wil=0/cun=3/con=5/lck=0
[TEMP_STAT] * post-add[66]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[66]:  inc  str=7/dex=7/mag=0/wil=0/cun=3/con=5/lck=0
[TEMP_STAT] * post-add[62]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[62]:  inc  str=9/dex=7/mag=0/wil=0/cun=3/con=5/lck=0
[TEMP_STAT] removing temporary stats:  con=5
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[64]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[64]:  inc  str=9/dex=7/mag=0/wil=0/cun=3/con=5/lck=0
[TEMP_STAT] * post-rmv[64]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[64]:  inc  str=9/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] removing temporary stats:  str=4
[TEMP_STAT] - from updateTalentPassives(Unified Body)
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] - from learnTalent(Inner Power)
[TEMP_STAT] * pre-rmv[66]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-rmv[66]:  inc  str=9/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-rmv[66]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-rmv[66]:  inc  str=5/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] adding temporary stats:  con=5
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=5/dex=7/mag=0/wil=0/cun=3/con=0/lck=0
[TEMP_STAT] * post-add[68]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[68]:  inc  str=5/dex=7/mag=0/wil=0/cun=3/con=5/lck=0
[TEMP_STAT] adding temporary stats:  str=4
[TEMP_STAT] - from passives() in Unified Body
[TEMP_STAT] - from callbackOnStatChange(dex, 3) in Unified Body
[TEMP_STAT] - from passives() in Inner Power
[TEMP_STAT] * pre-add:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * pre-add:  inc  str=5/dex=7/mag=0/wil=0/cun=3/con=5/lck=0
[TEMP_STAT] * post-add[70]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[70]:  inc  str=9/dex=7/mag=0/wil=0/cun=3/con=5/lck=0
[TEMP_STAT] * post-add[53]:  base str=12/dex=12/mag=36/wil=12/cun=28/con=12/lck=50
[TEMP_STAT] * post-add[53]:  inc  str=9/dex=7/mag=3/wil=0/cun=3/con=5/lck=0
And that's enough to bump Unified Body's CON boost from 4 up to 5. Given the length of this log and the frequency of callbackOnStatChange() invocations, there are obviously multiple interactions going on. I also note that the stack order matches the order in which I learned the relevant talents, which suggests that this may all be path-dependent.

Re: How are stat-boosting talents applied?

Posted: Sat Oct 19, 2024 1:21 am
by PseudoLoneWolf
Oh dear that is... quite the log.

So if I'm parsing this correctly, it seems like they do all stack on each other but they're stacked by order of talent learned like you said. Which, all things considered, is probably a sensible way to implement this? But it means if you do want to abuse this we're going to need to be careful which talents you take in which order. I don't think I'm good enough at maths to determine that order, though. I'm not even completely sure what all talents increase your stats. I've been playing with too many mods for too long....