The current formula only takes into consideration the difference between attack and defense. Assuming attack is greater than defense, here's how the code checks for a hit:
Code: Select all
local d = atk - def
hit = math.log10(1 + 5 * d / 50) * 100 + 50
It produces a 50% chance to hit if there's no difference, and a capped chance if the difference is around 20. With inflated numbers in the endgame, this means that changes to attack and defense (and saves, since they use the same sort of formula, if I recall correctly) usually have no effect. For example, boosting your spell save from 10 to 15 would do nothing in the endgame because it's getting checked against numbers that are much more than twenty higher than it. Only values that are already competitive are worth boosting, which is obviously not desirable.
Consider a very different formula, still assuming attack is greater than defense:
Code: Select all
local d = atk - def
hit = math.min(d / def, 0.5) * 100 + 50
This also produces a 50% chance to hit if there's no difference, but only gives a capped chance to hit if the attack is at least 50% more than defense. So against a defense of 60, you would need an attack of 90 to cap your hit chance. This breaks down at low values; against a defense of 2, an attack of 3 caps your hit chance. This is also not desirable.
Why not calculate hit chance using the average of these two values?
Code: Select all
local d = atk - def
hit_1 = math.log10(1 + 5 * d / 50) * 100 + 50
hit_2 = math.min(d / def, .5) * 100 + 50
hit = (hit_1 + hit_2) / 2
This should give sensible hit chances at both extremes, and makes increases to attributes valuable no matter how crappy they are. Somebody with fancy graphing software should draw us a pretty picture to back up my mental math.