How are stat-boosting talents applied?

Have a really dumb question? Ask it here to get help from the experts (or those with too much time on their hands)

Moderator: Moderator

Post Reply
Message
Author
Zizzo
Sher'Tul Godslayer
Posts: 2480
Joined: Thu Jan 23, 2003 8:13 pm
Location: A shallow water area south of Bree
Contact:

How are stat-boosting talents applied?

#1 Post 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: ]
"Blessed are the yeeks, for they shall inherit Arda..."

PseudoLoneWolf
Wyrmic
Posts: 257
Joined: Tue Jan 03, 2017 7:12 pm

Re: How are stat-boosting talents applied?

#2 Post 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:
Let slip the toast of war.

Zizzo
Sher'Tul Godslayer
Posts: 2480
Joined: Thu Jan 23, 2003 8:13 pm
Location: A shallow water area south of Bree
Contact:

Re: How are stat-boosting talents applied?

#3 Post 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.
"Blessed are the yeeks, for they shall inherit Arda..."

PseudoLoneWolf
Wyrmic
Posts: 257
Joined: Tue Jan 03, 2017 7:12 pm

Re: How are stat-boosting talents applied?

#4 Post 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....
Let slip the toast of war.

Post Reply