Yes I checked the average dmg.
Here is my comparison so far:
Scarecrow: 393/16=24,56
Frog: 784/32=24,5 ( so far it’s ok)
Solara: 262/11= 23,8
Shadow: 164/7,5=21,87
Stonecutter: 4353/172=25,3
Spider: 219/10=21,9
Phoenix: 118/6=19,6
On first to second lvl level the growth rate is between 0,17 and 0,25
This may have to do with iterative calculation and rounding but thats just a guess that’s why I ask.
As a rule of thumb it seems higher base dmg towers have higher growth. But frog and scarecrow are quite close in growth but frog has double the base dmg. So maybe it just hits a a sweet spot in the iterative process. I don’t know...
I checked the code yesterday, basically there's a linear factor that's based on attack speed and range. There is also a 'strength' factor for each tower, but it should still lead to equal growth.
My guess would be rounding issues as you suggested.
If that’s the case then I have one thing that does not fit in my mind.
The dmg gain per level more or less stays the same over all levels.
I made a thorough analysis of stonecutter and spider here (table 2 and 3)
https://docs.google.com/spreadsheets/d/1mN1ljvBcozgOmGtVUDhdNvZ6K0wJCxPj6OMucfDxaZc/edit
You can see spider gets 2 avg dmg per level except for every 7th or 8th level it gains 3
A similar pattern for stonecutter
43 “normally” but every third is 42.
That implies that the process is not iterative but always calculates from some base value and rounds only at the end but the rounded value is not fed into the calculation again.
It just tries to find the nearest fitting integer for the result.
Hopefully it is understandable what I mean.
You are right, that's exactly what's happening. So it's not rounding errors adding up.
Still, the lower damage values are rounded to the nearest integer, and I think this could make the difference you observe, since you're dividing the highest average by the lowest average.
Plus, the min/max damage are rounded as well:
maxBaseDamage = StrictMath.round((1.0 + damageSpread) * baseDamage);
minBaseDamage = StrictMath.round((1.0 - damageSpread) * baseDamage);
Where damageSpread is a float within [0, 1] that determines how far the min/max damage is apart. For instance, damageSpread is 1 for Hitman.
So basically Phoenix was lucky on lvl 1 that his values got rounded up which lets him look stronger than he is? If I subtract 1 from his average dmg on lvl 1 he would have a 23,6 dmg increase on lvl 99 which would be comparable. But that would be a quite extrem case.
Side note your formula given would give hitman min dmg 0. I guess there is some other function to compensate for that.