[1.6.7] Crit shrug and crit text don't work in many cases

Make all T-Engine/ToME 4 bug reports here

Moderator: Moderator

Post Reply
Posts: 284
Joined: Fri Sep 07, 2012 1:34 am

[1.6.7] Crit shrug and crit text don't work in many cases

#1 Post by minmay »

Whenever Actor:physicalCrit() (or spellCrit() or mindCrit() etc.) is called, it sets turn_procs.is_crit and turn_procs.crit_power. This information is then used by the damage projector with DamageType.useImplicitCrit() to determine whether to show the damage text in bold, whether to apply crit shrug, and how much to reduce the damage when crit shrug is applied.

When the crit is immediately followed by a single damage projection, such as with Lightning or a melee attack, this works fine, even if you have damage conversion or Elemental Fury or the like. However, there are two common cases where it doesn't work fine:
1. Multiple damage projection calls are made without sharing a state. Example: Twilight Surge. Crit shrug and text highlighting will work on its light damage, but not its darkness damage. This is easily fixed on a case-by-case basis by using dedicated damage types for this sort of thing, like how Dust to Dust has "warp" damage instead of doing both a physical and a temporal projection. Alternatively, have the multiple projections share a state like melee weapons with convert_damage do.

2. The crit is not immediately followed by a damage projection. There are tons of examples of this, and in various forms: basically every projectile, basically every map effect and damage-over-time debuff that crits, things like Surge of Power that crit but don't project damage at all. The most-often-complained-about example of this is when a projectile is fired and crits (such as Blood Grasp, Earthen Missiles, Soul Rot, low level Manathrust, like 200 other talents...), then the actor that fired the projectile acts again before the projectile hits, resetting its turn_procs field, which gets rid of the turn_procs.is_crit and makes it so that crit shrug doesn't work on the projectile's damage.
There are more convoluted things that can happen too: firing a projectile and then doing something else that calls spellCrit() or whatever, which can make the damage projection think that the projectile did crit when it didn't, or vice versa, and/or give the damage projection the wrong critical multiplier so that critical shrug reduces the damage by the wrong amount...

This second type of issue is a lot more troublesome to fix. Surge of Power and the like can be fixed by adding a parameter to spellCrit() that tells it to keep the existing crit state, but for projectiles and such... adding a parameter to every Actor:projectile() and Map:addEffect() call to store crit state?

Alternatively, you can always remove crit shrug to make this a purely cosmetic bug that you can ignore without any players getting mad at you for it :wink:

Post Reply