[1.7.4] Shadowstrike reduces crit damage

Make all T-Engine/ToME 4 bug reports here

Moderator: Moderator

Post Reply
Message
Author
Horken
Cornac
Posts: 35
Joined: Wed Aug 19, 2020 10:53 am

[1.7.4] Shadowstrike reduces crit damage

#1 Post by Horken »

For some reason the code for increasing crit damage when unseen form shadowstrike is inside the crit damage reduction code from ignore_direct_crits. This causes the crit damage to go down with unseen_crit. Example:

Base damage 100, crit_power 2 -> dam = 200
unseen_crit = 0.0, ignore_direct_crits = 0.5 -> dam = 200/2 * (1+(2-1)*0.5) = 150 (correct)
unseen_crit = 0.5, ignore_direct_crits = 0.5 -> dam = 200/2.5 * (1+(2.5-1)*0.5) = 140 (not as indended)

Solution:
move bonus crit outside of the ignore_direct_crits code, and replace crit_power = crit_power + unseen_crit with

Code: Select all

dam = dam/crit_power
crit_power = crit_power + unseen_crit
dam = dam*crit_power
Current code:

Code: Select all

local ignore_direct_crits = target:attr 'ignore_direct_crits'
		if crit_power > 1 and ignore_direct_crits then -- Reduce the post crit damage, we have to do this here since most crits are calculated before knowing their target

			-- Add crit bonus power for being unseen (direct damage only, diminished with range)
			local unseen_crit = src.__is_actor and target.__is_actor and not src.__project_source and src.unseen_critical_power
			if unseen_crit and not target:canSee(src) and src:canSee(target) then
				local d, reduc = core.fov.distance(src.x, src.y, x, y), 0
				if d > 3 then
					reduc = math.scale(d, 3, 10, 0, 1)
					unseen_crit = math.max(0, unseen_crit*(1 - reduc))
				end
				if unseen_crit > 0 then
					if target.unseen_crit_defense and target.unseen_crit_defense > 0 then
						unseen_crit = math.max(0, unseen_crit*(1 - target.unseen_crit_defense))
					end
					crit_power = crit_power + unseen_crit
					print("[PROJECTOR] after unseen_critical_power type/dam/range/power", type, dam, d, unseen_crit, "::", crit_power - unseen_crit, "=>", crit_power)
				end
			end	

			dam = dam / crit_power
			local reduce = (crit_power - 1) * (util.bound(ignore_direct_crits, 0, 100) / 100)
			crit_power = math.max(1, crit_power - reduce)
			dam = dam * crit_power
			print("[PROJECTOR] crit power reduce dam", dam)
		end

Post Reply