2025-10-27 06:51:12 -06:00
|
|
|
-----------------------------------
|
|
|
|
|
-- Global, independent functions for counter calculations.
|
|
|
|
|
-----------------------------------
|
|
|
|
|
xi = xi or {}
|
|
|
|
|
xi.combat = xi.combat or {}
|
|
|
|
|
xi.combat.counter = xi.combat.counter or {}
|
|
|
|
|
-----------------------------------
|
|
|
|
|
|
|
|
|
|
xi.combat.counter.checkSeiganCounter = function(attacker, defender)
|
|
|
|
|
-- Early return: Defender lacks Third Eye.
|
|
|
|
|
if not defender:hasStatusEffect(xi.effect.THIRD_EYE) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Early return: Defender lacks Seigan.
|
|
|
|
|
if not defender:hasStatusEffect(xi.effect.SEIGAN) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not defender:isFacing(attacker, 64) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not defender:isEngaged() then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Early return: Defender is a player without the proper weapon type.
|
|
|
|
|
if defender:isPC() and not defender:isWeaponTwoHanded() then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Calculate counter chance.
|
|
|
|
|
local baseCounterRate = 25 + defender:getMod(xi.mod.THIRD_EYE_COUNTER_RATE)
|
2025-11-01 20:02:42 -06:00
|
|
|
local hitRateFactor = xi.combat.physicalHitRate.getPhysicalHitRate(defender, attacker, 0, xi.attackAnimation.RIGHT_ATTACK, false)
|
2025-10-27 06:51:12 -06:00
|
|
|
|
2026-07-05 14:55:22 +01:00
|
|
|
if math.randomInt(1, 100) > baseCounterRate * hitRateFactor then
|
2025-10-27 06:51:12 -06:00
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
end
|