The game has four different "answer an attack" systems that players tend to lump together: the Counter Attack (an interrupt that cancels the hit and replaces your move), the Parry (a weapon box that stops the enemy's swing mid-air), projectile reflection (parry boxes bat arrows and spells back) and the beat-back (a perfect-timing dodge or guard that negates the hit). They share one hidden resource: a priority number (CounterAttack in SkillData) that decides who wins a clash. None of this is shown in the UI apart from a small red exclamation mark above your head.
Counter Attack#
A Counter Attack is a move of its own (move 105). You never press it directly. While you are performing certain moves, an incoming hit can swap your current move for move 105 and cancel the damage you would have taken.
Conditions#
The check runs at the moment an enemy hit would otherwise deal damage. All of these must be true (IsSkillCounterAttackedStart):
- You own move 105 and it is unlocked. Terrence needs the Counter Attack talent (move 105 has
SkillTalent1; the talent is not unlocked at the start). Elena's and The First Messenger's move rows also haveSkillTalent1, but Elena's Counter talent starts unlocked. Viola, Norwood and Jerold have no unlock requirement on the move row (Viola's Counter Attack talent starts unlocked as well). - You are in the middle of a move other than the counter itself.
- That move has its counter window open. The animation sets a flag, and while it is on the game shows a red exclamation mark over your head (
ExclamationRed). - The attacker's move is counterable (
skillCounterAttackedEnable). 790 enemy move rows have the flag (the enemy configs list 1,217 rows, most of them idle, alert and other non-attacks), and about 305 hero rows do. Traps use the same rule with their own value (IsTrickCounterAttackedStart, TrickDataCounterAttack), without the distance check. - Priority: your current move's
CounterAttackvalue must be strictly greater than the attacker's move value. Equal does not work. - The attacker must be a legal auto-lock target (
IsPermitAutoLock, range and angle not traced; inferred to be the same lock-on limits as normal attacks).
If all hold, the hit is cancelled completely (the damage calculation is skipped), your move changes to Counter Attack, a flash plays and the counter strike lands on the attacker. A few moves flagged "keep" (11 rows) turn into the counter without restarting.
The priority numbers#
| Attacker | Counter value | Rows that can be countered | Who can answer it |
|---|---|---|---|
| Most enemy attacks | 1 | 376 | any move with value 2 or more |
| Heavy enemy attacks | 3 | 326 | moves with value 4 or more (Norwood, Jerold, Messenger, Elena's charged moves) |
| Very heavy enemy attacks | 5 | 88 | moves with value 6 or more (Norwood's, Jerold's, Messenger's and Elena's top moves) |
| Hero attacks (vs. enemy counters) | 1 (284 rows), 2 (14), 10 (1), 11 (6) | enemy move with a higher value |
Hero moves that open counter windows and their values (Norwood's move names are in Norwood#Interrupt values (counter)):
| Hero | Move (internal name) | Counter value | Window (fraction of the animation) |
|---|---|---|---|
| Terrence | Parry (11 SkillDefence, first part) | 2 | 0.117 to 0.255 |
| Viola | Her stance moves (1 SkillS1 and the special moves 6-11, 17-22), first part | 2 | whole first 0.427 of the animation; second part of the move only 0.024 to 0.051 |
| Norwood | Furious Griminess (left-hand moves): 23 parts 3 and 5 (value 4), 24 and 25 second parts (value 2) | 2 to 4 | 0.038 to 0.098 (measured on move 23) |
| Norwood | Revenge (right-hand move 26, SkillRH, 999 armour) | 10 | from 0.278 to the end |
| Jerold | SkillS21 (move 44) | 10 | 0.091 to 0.168 |
| Elena | Defence stance (16 SkillS1) and the charged moves 6 and 18 | 2 and 11 | 0.117 to 0.255 |
| The First Messenger | SkillH2 (move 12) | 9 | 0.155 to 0.537 |
Terrence's parry has value 2, so he can only counter the 376 "value 1" enemy attacks; he cannot counter a heavy (3) or very heavy (5) attack no matter how well he times it. Norwood, Jerold and the Messenger can counter nearly everything.
What the counter does#
| Hero | Counter strike | Poise dmg | Resilience dmg | Rage on use / on hit |
|---|---|---|---|---|
| Terrence | 2 parts: power 136 and 181, rate 1.6 | 20 | 20 | 10 / 6 |
| Viola | power 78, rate 0.56 | 5 | 5 | 10 / 3 |
| Norwood | part 1: 95, rate 2.5, 84 armour; part 2: 292, rate 2.5 | 50 / 100 | 50 / 120 | 0 / 10 and 0 / 20 |
| Jerold | power 83, rate 0.8 | 5 | 5 | 10 / 3 |
| Elena | 2 parts: 136 and 181, rate 1.6 | 20 | 20 | 10 / 6 |
| The First Messenger | power 114, rate 1.0, 24 armour | 999 | 20 | 10 / 6 |
Damage then follows the normal Damage formula (rate multiplies your attack stat, power is added on top). For scale, Terrence's first light attack has rate 0.8 and power 61, so each part of his counter has twice the multiplier. Norwood's second counter part empties 120 Resilience, more than a typical enemy's whole bar of about 70, so a counter alone Weakens most enemies (Weakness and execution).
Viola's and Jerold's counters are weak (rate 0.56 and 0.8) and their value is mostly that they cancel the hit.
Side effects:
- The attacker is staggered. If the attacker's move has the "counter rebound" flag (704 of the 790 counterable enemy rows; 714 enemy rows carry the flag), it is forced into a hand-break reaction (left or right depending on which hand was swinging). If the attacker's Resilience is already empty, it gets the hand-weak version, which sets its Poise to 0 and flows straight into the Weakened state. A hand-break reaction ends early once the animation reaches the move's
CounterAttackExitthreshold. - No Sanity.
SanAddis 0 on every hero's counter row, so a counter gives no Sanity by itself (any talent adds a per-mille of that, inferred to still be 0). - Rage. The Rage columns above are paid out as normal.
- Enemies counter too. Rosen Cavalier Patrick (20017), the two-faced man (20037), the enemy Elena (20039; see Elena (second duel)) and the Usurper (20044) own move 105 and use the same rules against your attacks. Their counter windows are in the animation data (for example the enemy Elena's moves 15 and 16 hold the window open for the first 0.517 of the animation). Most hero attacks have value 1, so an enemy needs a current move with value 2 or more.
Parry#
A parry box is an invisible collider on a weapon, only active for a short window of a move. When an enemy attack collider overlaps your active parry box, the game checks IsSkillParryCloseSuccess:
- The two fighters must face each other: the angle between their facing directions is over 90 degrees. Attacks from the side or behind slip through.
- The parrier's "close" flag must be in the right part of the window (see below).
- The attacker's move must be
skillParryEnable(674 of the 1,216 enemy move rows; 300 of 615 hero rows). Nine enemy models have no parryable attack at all (names translated from their internal Chinese names): Black Sprite (20003), Wheel Monster (20004), Poison Fiend (20005), Edith (20027), Sunflower (20031), Big Eyeball (20047), Little Black Sprite (20057), Eyeball (90003) and Crow (90007).
On success the attacker's strike is stopped for that frame and the parrier's OnSkillParry runs. If the attacker's move is also skillParryRebound (551 enemy rows, 246 hero rows) and its Resilience is 35 or less (ParryWeaknessMin), its Resilience is set to 0 and it plays a hand-break reaction, which leads into the Weakened state. Above 35 the swing is merely stopped, with no stagger. The First Messenger's attacks are parryable (18 rows) but none can stagger (0 rebound rows), and only 6 of Viola's 42 parryable rows can.
Who has a parry#
| Fighter | How | Needs |
|---|---|---|
| Benita | Her light and heavy attacks, and her four Counter Attack moves | Talent "Long Distance Counterattack" (ParryUse); see note |
| Elena | Defence stance move 16 | Talent "An Eye for an Eye" (ParryUse) |
| Enemy Elena (20039), 20051 (killer), Guderian the Guardian (20054) | Defence moves | Nothing: monsters always have parry boxes |
All other heroes have no active parry box at all: the box only turns on if the talent value ParryUse is above 0, and only talents 80 (Benita) and 197 (Elena) carry it. Terrence's "Parry" talent is something else: a block stance (see below). The game also gates the parry box on the animation curve, as follows.
The hidden timing window#
The skillParry animation curve runs 1, then up to 4. The box turns on at 1 and off at 4, but the "close success" check only passes while the curve value is at least 2 and below 3. If the curve is smoothly interpolated (inferred; the game stores keyframes), only the middle third of the box window works, and the first third is wasted:
| Fighter / move | Box on to off (fraction of animation) | Effective parry (inferred, middle third) |
|---|---|---|
| Benita light attacks (move 1/2, 2nd part; also moves 33 and 34, part 1) | 0.082 to 0.113, then 0.185 to 0.241 (second box window only) | about 0.092 to 0.103 only; the second window has no close-parry (see below) |
| Benita light/heavy attack 3rd part | 0.189 to 0.234 | 0.204 to 0.219 |
| Benita heavy attacks (3, 4, 2nd-4th part) | 0.254 to 0.308 | 0.272 to 0.290 |
| Benita Counter Attack moves 23-26 | curve starts at 2 at 0, ends at 4 at 0.216 | about the first 0.108 of the animation |
| Elena defence stance (move 16) | 0 to 0.418 | about 0.139 to 0.279 |
| Enemy Elena (20039) | 0.075 to 0.6 | about 0.25 to 0.43 |
| Guderian (20054) | 0.061 to 0.913 | about 0.34 to 0.62 |
The curve value is only ever ratcheted upward within an animation loop (the game keeps the highest value it has seen). Curve values wrap every 4 ((value - 1) % 4 + 1), so a curve can switch the box on and off again by continuing past 4: Benita's second-part light attack runs 1 to 4, then 5 to 8. But the close-parry test uses the raw ratcheted value (at least 2 and below 3), so the second window (5 to 8) can never pass it. In that second window the box exists and can reflect projectiles, but a melee swing is not parried. A parry attempted too early or too late is just a normal hit.
Benita's follow-up#
When Benita's parry lands during the first part of Counter Attack (23 SkillLC1, 24 SkillLC2, 25 SkillHC1, 26 SkillHC2, light and heavy variants), her next part starts automatically, aimed at the target. Against a huge enemy the "1" variant is used; against a normal-sized one the "2" variant. The strike (part 2) has rate 1.6, 999 armour (it cannot be interrupted), 30 Poise damage and 20 to 25 Resilience damage. The first part has rate 0.8 and 10 Resilience damage. The hit freezes the screen for 0.06 s.
Oddity: by the code, the parry box only appears if Benita has "Long Distance Counterattack". That talent is a child of the "Counter Attack" talent in the tree, whose moves rely on that parry. Read literally, buying only "Counter Attack" would not make the parry work. This has not been tested in-game.
Projectile reflection#
Projectiles that are straight, parabolic, multi-bounce or homing are parry-enabled by default, except bullets of 20007 and 20045, which disable it. Reflection is easier than a melee parry: the bullet only needs to touch an active parry box. The close-window check is not used.
On reflection:
- The bullet's owner becomes the parrier and it flies back toward the original shooter's aim point for up to 30 m (
BulletReboundRnage). If the shooter is gone it returns along its path. - Parabolic shots return on a 20 degree arc with gravity -15.
- It keeps its original attack data, so the damage figure comes from the shot's own move row (inferred: with the parrier's stats as the new owner).
- The parrier freezes for 0.06 s and plays a flash. Elena's reflection also feeds an achievement counter: 10 reflections within 10 seconds.
Only a bullet whose target list contains the parrier can be reflected, so friendly fire does not bounce.
Terrence's Parry (a block)#
Terrence's talent "Parry" is a block stance (move 11) with a counter window, not a parry box. Its stamina rules are in Guarding; the relevant parts are:
- A block deducts stamina from you. A "parry-grade" block (
blockParamabove 1) is the perfect guard of Guarding#Perfect guard: it can neither fail nor be broken, and the damage that gets through is halved. Normal blocks follow Guarding#How a blocked hit is resolved. (Mapping ofblockParamto the exact timing is inferred.) - Talent "Parry: Enhanced" removes 30 % of the stamina cost of a successful parry (Guarding).
- The counter window is 0.117 to 0.255 of the first part. Enemy attacks of value 3 or 5 skip the counter and only hit the block.
Beat-back (Elena, Jerold, Norwood)#
A fourth system, SkillBeatBack, is a dodge or guard timing window that negates the hit entirely (the damage step is skipped) and triggers a bonus. Norwood's code also has a beat-back handler (hero10004.lua:72-91): when it fires during certain Coffin of Chained Soul swings (SkillHP11 and similar), time freezes briefly, the move chains into its next two parts and he gets a counter-success status. Which talent enables it is not traced (the talent Coffin of Chained Soul: Intercepting is the likely one; inferred). Elena's "Parry" talent text points at it, and the Dodge moves of Elena and Jerold carry it too. On Elena's moves 12, 14 and 15 the window is only the first 0.094 of the animation (the exact identity of those moves was not traced); her Dodge windows run 0 to 0.18-0.35. A successful beat-back slows time, grants Rage via a status, can chain into a follow-up combo part and (with the right talent) puts a stacking Resilience-recovery curse on the attacker. See Dodging#Perfect dodges (Jerold and Elena).
Hidden mechanics#
- Priority beats timing. A perfect counter window is useless against an enemy move with equal or higher value. Terrence and Viola (value 2) can answer only the 376 basic enemy attacks. Norwood's and Jerold's top moves (value 10) answer everything.
- The counter cancels the damage completely. The hit is skipped before damage, status and Sanity are applied.
- Parry needs facing. Both fighters must be facing within 90 degrees of opposite. Flanking attackers cannot be parried.
- The 35 rule. A parry staggers into Weakened only when the enemy's Resilience is at or below 35. This is an absolute value, not a percentage: it is half of a typical 70-point gauge but only about a fifth of a 160-point boss gauge (verified in
animalbase.lua:5980). Chip damage first, parry second. - Reflecting beats parrying. The projectile check ignores the middle-third window. Benita and Elena can swat shots all through their box time.
- Nine enemy types cannot be parried at all (listed above).
- Priority 3 and 5 enemies include the Holy Father (31 value-3 and 6 value-5 counterable rows), Jenny of Exilium (20 and 13), Fused Sprenger (22 and 7), the Usurper (20 and 11), Terror Obsession (18 and 10), Proxy Higgins (7 and 11) and The First Fallen: Handel (69 and 1). These are where Terrence's parry fails. By contrast the enemy Elena (30 counterable rows, all value 1), Guderian the Guardian (35 value-1 rows and one value-5), Rosen Cavalier Patrick (20 value-1, 3 value-3) and Maddened Ascetic (11 value-1, 11 value-3, 1 value-5) are mostly answerable by value-2 moves, and Edith has no counterable rows at all.
- A counter gives no Sanity. Every counter move has
SanAdd0.
Sources#
- Counter:
luascript/logic/player/animalbase.lua:7338-7430(counter trigger in the hit handler),:17392-17470(IsSkillCounterAttackedEnable/Start, Trick, Rebound, Keep),:4894-4912(red exclamation),:7788-7810and:9249-9285(HitCounterAttack, hand-break/weak),:12255-12335(exit via CounterAttackExit),:8676(OnCounterAttack),luascript/logic/player/hero10005.lua:271-281. Constantsgamedata/playerdefine/animalbase_define.lua:82(HitCounterAttackNoHitTime 0.1),:235(ParryWeaknessMin 35),:415(CounterAttack = 105). - Parry:
animalbase.lua:5950-5990(box check),:8698-8770(collider on/off),:3760-3770(parry curve ratchet),:17509-17525;luascript/common/gameai.lua:1312-1325(IsSkillParryCloseSuccess, 90 degrees),:1041-1060(reflect target);luascript/logic/player/hero10003.lua:94-150,hero10007.lua:564-590,hero20051.lua:262-300,hero20054.lua:277-320,hero20039.lua:108-120. - Projectiles:
luascript/logic/bullet/bulletbase.lua:20, 625-675, 1071-1110, 1280-1315;bulletparabola.lua:7-8, 43-55. - Beat-back:
animalbase.lua:7392-7410, 17480-17500;hero10007.lua:115-200. - Block parry-grade:
luascript/logic/playervalue/animalbase_value.lua:2498-2545. - Re-read in
build/wiki/pass/scripts/combat/c3.pyandc5.py: hero CounterAttack values (2: 119 rows, 4: 2, 9: 1, 10: 4, 11: 6) and the move 105 rows (RageAdd, RageAddHit, RageSub 100 on Norwood part 1, SkillTalent 1 for Terrence, Elena and the Messenger);hero10004.lua:72-91(OnBeatBack). - Data: ES_SkillData columns CounterAttack, CounterAttackExit, SanAdd, RageAdd, RageAddHit, ToughnessSub, WeaknessSub, SkillTalent (rows for move 105 of heroes 10001, 10002, 10004-10007; moves 11, 23-26, 44, 12, 16); config flags
skillParryEnable,skillParryRebound,skillCounterAttackedEnable/Rebound/Keepfromgamedata/playerconfig/hero*_config.lua; ES_HeroTalent rows 80 and 197 (Type 101 ParryUse); AnimalAnimator curvesskillParry,skillCounterAttack,skillBeatBack(extracted bybuild/wiki/scripts/poise/anim.py,anim2.py,parry.py,ca2.py). - Talent text:
reports/talent_trees.md(Terrence 201/202/204, Benita 202/203, Elena 213-217).