Posted: Tue Jan 23 16:38:06 2018
We recently completed one of the Immortal for a Day days, which was productive and enlightening, and will be the topic of a later blog post. However, one of the topics that arose centered around some observed damage not matching the speculated damage, and possible reasons for it. We spent a few hours debugging and correlating damage sources and damage output, and discovered that while the complaint was accurate, it was based on something expected and described, but which might be currently underappreciated. So the topic of this blog post will be magical damage caps.
We have about 100 spells that qualify as nukes; spells whose primary effect is a one-time burst of damage. Nearly all spells differ in some way in their implementation, but the general shape of them is thus:
All nukes have a base damage amount and a damage type, visible in their help files, like `*Deals flames (3.1 base) damage.`. That base damage receives a generic 'adjustment', which looks like halving damage in pk, reducing damage further in pk-half-damage rooms, increasing the damage on the faerie plane dealt from faeries to non-faeries, etc. There is an additional damage coefficient which multiplies the damage by a lookup based on the caster's level; this coefficient ranges from *2 at level 1, to *80 at level 100, to *180 at 250, to *550 at level 500. In our example spell Fireball, there is an additional 'fireballs' multiplier, which is typically 1 but has a (caster level/350) chance to have 2 fireballs, effectively dealing double damage. Fireball's skillpower is to increase the damage by (skillpower%), so that also modifies the amount of damage. The amount of damage dealt is then fed into saves-against checks, which has a ton of components.
The saves-against checks for fireball takes the product of the spell's damage type and adds the caster's bonuses: (+fire-damage-prcnt). After adding the caster's bonuses, it takes into account all of the victim's bonuses: resistance to fire (-25); vulnerability to fire (+25); global save bonuses; resistance stats (-fire-prcnt); SVS (too complicated for this).
After all of the bonuses are calculated, that is the final damage output from the fireball spell, and similar occurs with all other nukes. However, the 'final damage output' is then subject to additional constraint- for sanity's sake, and to prevent anything really crazy from occurring, skills have individual damage caps. Because one of the first calculations in determining damage places heavy emphasis on caster level, it's totally plausible that a mis-set skill could deal enormous amounts of damage incorrectly, and the caps were presumably meant to prevent that. Unfortunately, while they succeed in that, they were probably mis-tuned, so instead of only coming into play at 150% of the anticipated damage output or something, lots are set at 80% of the damage output, meaning a level 200 would deal the same damage with the spell as an archon. Fixing this is relatively straightforward, but won't be possible for a few months, as it'll take lots of testing and refinement.
We could remove damage caps, but that would have adverse effects on players, as exemplified by a few spot-checks. It turns out that firebolt hurts a lot, but is capped at dealing 5k damage- it turns out without the damage caps, it would deal about 12k damage, a hit which few could survive. Tweaking the values upward would help make the math add up, but that benefit isn't worth the risk of commensurate increased damage, like the aforementioned firebolt. We could determine what, for each spell, the intersection of damage-cap at archon and base-damage would be, but that would lower the damage for lower levels in ways that may not be desirable. We may decide the caps are weird as-is, and simply display messages to players when they hit the caps, the way that imms can see with debug right now. The eventual answer probably lies somewhere in the middle, but requires more study regardless. Because that study will require time, and the implementation moreso, and we're probably a good month+ away from next reboot, the easy answer is to simply publicize the caps, and let everyone determine how to proceed on their own. I'm sure there'll be some feedback on this, which #troll might be the best outlet for.
acid blast: 500 acid breath: 850 abjure: 450
air evocation: 500 acid mist: 2000 airblast: 1500
animate weapon: 3500 backstab: 3500 bash: 5000
battle rage: 1000 burning ember: 2250 bathe: 500
bleakness: 1000 call lightning: 1200 cause light: 200
cause serious: 350 chill touch: 350 cure blindness: 750
cure critical: 750 cure light: 350 cure serious: 550
chain lightning: 1450 circle of thorns: 1000 conjure boulder: 1600
channel faith: 1200 conjure ironbolt: 1750 charge: 1000
cure mutilation: 750 diseased cloud: 2000 deafen: 500
divine calling: 3600 energy drain: 500 earth invocation: 350
earth evocation: 300 extinction: 1250 energy orb: 500
ember carom: 512 flame wind: 1000 frost: 600
fireball: 575 fire breath: 900 frost breath: 950
feeding: 850 fire evocation: 600 firebolt: 5000
famine: 650 flintstrike: 999 fungal growth: 1000
gas breath: 750 geisteblitz: 2000 grapple: 1500
harm: 650 heal: 500 high explosive: 2000
herald death: 3500 harrow: 2000 ice storm: 1900
ice wind: 1000 icebolt: 4500 ice whip: 1400
iceball: 1500 kill: 1400 kick: 750
lightning bolt: 475 lightning breath: 1000 lightning evocation: 2500
lightning shroud: 1750 leech: 650 landslide: 1200
minerals evocation: 350 magic dart: 100 magic bomb: 2040
mutilate: 750 necrotic explosion: 225 one with the forest: 750
paralyze: 150 poison gas: 350 pestilence: 100
pustulate: 1500 psychic rebellion: 3500 quicksilver blast: 4500
refresh: 250 reflective fireball: 1750 spark: 160
shocking grasp: 125 shadow light: 750 soul sacrifice: 5000
sweep: 1500 summon stake: 3600 searing touch: 1000
thunderclap: 400 tremor: 900 telekinetic punch: 1000
telekinetic pierce: 1000 telekinetic explosion: 1250 telekinetic bash: 850
thunderstorm: 1900 telekinetic wave: 1150 tremolo: 1000
water evocation: 700 waterspout: 350 wrath of the bear: 1250