A status effect is a timed effect attached to a hero or an enemy: damage over time such as Bleed, Poison and Burn, stat debuffs such as Corrosion, control effects such as Stun, and every buff from a potion or skill (see Buffs and Shields and protection). The game shows them only as small icons with a fill bar above a health bar. This page explains the shared machinery: how the gauge fills, how long an effect lasts, how two effects of the same type interact, what resistance actually does, and how to get rid of them.
Overview#
Every status is one row of the status table (ES_StatusData, 124 rows). The row picks one of 26 logic kinds (LogicType, a small Lua class Status<kind>.lua) and fills in five parameters, a duration, a build-up rate and some flags. The game has no English names for statuses; the names on this wiki translate the designers' internal labels.
| Field | Meaning for players |
|---|---|
StackAddPer | Build-up added per application, in % of the gauge. 100 or more means the status starts at once ("instant"). |
StackSubPer | How fast an unfinished gauge drains, in % per second. |
StackSubDelay | Seconds after the first application before draining starts (0, 0.1, 0.2 or 0.5; the Poisons, Burns and Corrosion use 0.2, most Bleeds use 0). |
Time | Duration in seconds once active (999 = rest of the fight, 0 = until removed). |
IsRefresh | Hitting an active status restarts its timer. |
Overlay | Maximum stacks (0 = does not stack). |
StatusType | The family. Two statuses of the same family cannot coexist. |
IsDebuffer | Counts as a debuff: blocked by debuff immunity, removed by cleansing. |
IsShow | Whether the icon is shown at all. |
Param1...Param5, AttackType, DefenceType | The numbers the kind uses (see Damage over time formula). |
The build-up gauge#
- The first application creates the status at
StackAddPer%. The icon appears with a partial fill. - Each further application adds
StackAddPeragain. - Starting
StackSubDelayseconds after the first application, the gauge drains continuously atStackSubPer% per second. The delay is not restarted by later hits. - If the gauge reaches 0 the status is deleted. If it reaches 100 the status becomes active, the gauge resets and the duration timer starts.
- While active, further applications do not stack damage. They only restart the timer (
IsRefresh= 1 for every damaging status), so a steady stream of hits keeps a status alive forever.
How often "an application" happens depends on the source:
| Source | Build-up per application |
|---|---|
| A hit from a move, a thrown weapon or a trick (explosion, fireball) | StackAddPer once per hit |
| A continuous area (a move's "period" damage, mud on the ground) | StackAddPer × frame time, i.e. StackAddPer per second |
| A trap (pool, rain, burning ground) | StackAddPer 0.2 s after you enter, then once every 1 s while you stay inside |
| Items and scripted effects | Usually instant (StackAddPer 10000) |
Hits needed#
The table uses the formula hits × build-up − drain × (time between first and last hit − delay) ≥ 100 (inferred from the code above).
| Status | Build-up / drain / delay | Minimum hits | Window for that many hits |
|---|---|---|---|
| Poison (10002), Burn (10008) | 30 / 7 / 0.2 s | 4 | first to fourth hit within about 3.0 s |
| Poison (DLC, 10113) | 60 / 7 / 0.2 s | 2 | within about 3.0 s |
| Burn (strong, 10037/10078) | 40 / 7 / 0.2 s | 3 | within about 3.0 s |
| Bleed (Viola's red bullets, 10034) | 20 / 7 / none | 6 | within about 2.9 s (5 only if they land at the same instant) |
| Corrosion (10003) | 25 / 7 / 0.2 s | 5 | within about 3.8 s (4 only within 0.2 s) |
| Thrown knives (Throwables: 10012, 10070, 10071) | 49 / 7 / 0.2 s | 3 | within about 6.9 s. Two knives give 98%, just short. |
Families and replacement#
StatusType groups variants into a family. When a new status arrives and another status of the same family is already on the target (AnimalBase:AddStatus):
- If it is the same id: an active one is refreshed; a building one gets more build-up.
- If it is a different id: the old one is deleted. Any partial build-up it had carries over into the new one. An already active status has 0 build-up, so its replacement starts from scratch. In other words, a different variant of the same family cancels a running effect and then has to build up again.
- (An active old status that does not refresh would block the newcomer instead, but every damaging status in the game refreshes.)
Family (StatusType) | Article | Members |
|---|---|---|
| 101 Bleed | Bleed | 10001, 10011, 10030, 10034, 10035, 10036, 10071, 10086, 10087, 10107 |
| 102 Poison | Poison | 10002, 10042, 10070, 10076, 10113 |
| 103 Corrosion | Corrosion | 10003, 10073, 10084, 10085 |
| 108 Burn | Burn | 10008, 10012, 10037, 10078, 10080 (Fireworks Barrel) |
| 104 Wounded | Bleed#Related effects | 10004 (Viola, Abnormal state) |
| 199 Piercing damage | Poison#Marcion poison mist | 10029 (Marcion poison mist) |
| (other families) | Stun, Sanity loss (status), Buffs, Shields and protection | stuns, sanity drains, potion and skill buffs, shields |
Damage over time formula#
Every damaging status (kind 104, "PropertyPeriodSub") ticks once per second, starting on the first frame it becomes active. Each tick is:
tick = ceil( (A × P2/1000 + P4) × 100 / (100 + R × P3/1000) + B × P5/1000 )
- A: the attacker's damage of the status's
AttackType(physical, fire, poison, ...). It is read once, when the first build-up lands, and kept for the whole life of the status, even if a different attacker later refreshes it. Statuses with no attacking character use a fixed number instead: a trick (fireball, flame, explosion) passes its ownDamage, and so does a trap created by a trick (Holy Father's fireball ground, Edith's acid rain). That fixedDamagedepends on the New Game Plus journey (Damage_1...Damage_4, one column per journey; in the maze it depends on depth instead). Traps placed by a character's move use that character's damage. - R: the target's base resistance of the status's
DefenceType. Base means level, talents, trophies and equipment. Temporary buffs and debuffs from other statuses are not included. - B: the target's own base value of the stat in
Param1(usually max HP). This is how "% of max HP" bleeds work. - On Casual the result is then × 0.65 when it hurts the player's HP, and × 0.5 while the player carries the Egg of the Bearer (item 10018).
The number of ticks is roughly Time + 1, one on activation and then one per second until Time + 0.1 s has passed (inferred from the timer code).
Stat debuffs (kind 102) use the same formula, but the result lowers the target's maximum of the stat in Param1 for as long as the status is active (see Corrosion).
Resistance and immunity#
- Nothing resists build-up. No stat, boss flag or difficulty setting reduces
StackAddPer. Bosses fill the gauge exactly as fast as common enemies. - Guarding does not stop it. Statuses from a blocked or parried hit are only skipped if the row has
GuardEnable. No row in the game sets it, so blocked hits still build Poison, Burn, Corrosion and Bleed (see Guarding, Parry and counter). - Resistance only lowers DoT damage, using the factor
100 / (100 + R). For the full direct-hit formula see Damage formula and Damage types and resistances. - Debuff immunity (status 10068 from Slightly Sweet Roots for 30 s, 10123 from Slightly Sweet Roots+ for 300 s) blocks any new status with
IsDebuffer= 1. The check happens before build-up. - A few harmful statuses are not flagged as debuffs, so immunity does not block them and cleansing does not remove them: Viola's Abnormal-state "Wounded" (10004), the Marcion poison mist (10029), the sanity drains 10040 and 10074 (Sanity loss (status)) and the defence-down and weakness cut that Treasure Thieves put on themselves (10110, 10111).
- Marcion Puzzle Ball (trophy) zeroes the ticks of piercing-type statuses on the player, in practice only the Marcion poison mist. See also Shields and protection#Other protection.
Cures#
| How | What it removes | Source |
|---|---|---|
| Sour Conifer Leaf (20026) | every debuff | item type 207 NoDebuffer |
| Slightly Sweet Roots (21026) / Slightly Sweet Roots+ (72112) | every debuff, then immunity for 30 s / 300 s | type 207 plus status 10068 / 10123 |
| Resting at an altar (Altars) | every debuff | AnimalBase:OnEventTrigger |
| Killing a boss | every debuff (the party's properties are restored) | ControllerStoryMode:RecoveryProperty |
| Dying / respawning | everything on a full-reset respawn (Reborn(true), the usual case); debuffs only otherwise | HostPlayerDeadFinish, AnimalBase:Reborn |
| Waiting | the status expires after Time | StatusBase:Update |
Damaging statuses are not saved (SaveEnable = 0): quitting to the menu and loading the save also clears them.
Hidden mechanics#
- Resistance buffs do not reduce DoT damage. DoT ticks read base resistance, so Antitoxin Potion (+55 poison resistance) and Elixir of Inertia (+55 fire resistance) only reduce the damage of the poison or fire hit, never the poison or burn ticks. Trophies, talents and attribute levels do count.
- Corrosion does not make DoTs hurt more. It lowers current physical defence, and DoTs read base defence. It does make every direct hit hurt more.
- Burn is mostly reduced by physical resistance, not fire resistance. Burns 10008, 10037 and 10078 deal fire damage but use
DefenceType1 (physical). Only the knife burn (10012) and the Fireworks Barrel burn (10080) use fire resistance. See Burn. - The damage is decided by the first hit. The attacker's damage is read when the gauge first appears. Buffs or debuffs the attacker gets later do not change it, even after many refreshes.
- A different variant cancels a running one. For example Viola's aimed-shot bleed (10001) and her red-bullet bleed (10034) are different ids of the same family: landing one on an enemy that is actively bleeding from the other ends that bleed and restarts build-up. Only 10001 is instant, so it re-applies at once.
- Refreshes never stack damage. A bleeding enemy hit ten more times still takes one tick per second; the hits only push the end time back.
- Item status talents also boost item side effects. The talents "Prolonged Duration" (
ItemStatusTimeAdd) and "Improved Effect" (ItemStatusValueAdd) list Brute Force and Elixir of Epiphany among their items. Their self-inflicted defence-down and bleed therefore last longer, and that bleed hits harder, as the talents level up (the levels differ per hero: Buffs). See Bleed and Corrosion. - Norwood in the Abnormal state takes extra damage from non-physical DoTs: his resistance counts at 50% for the tick formula (
Hero10004_Define.SanResistSubRate= 500). With "Adapt to Abnormality: Inertia" the cut becomes 30% / 10% by the code's arithmetic. The talent text says 40% / 20% (see Norwood talent tree, Abnormal state, Lunatic state). - Invincibility does not stop ticks. Dodge invincibility and "invincible" buffs do not block damage over time. The kind-104 class has a check that would zero ticks while you are invincible, but the function that holds it (
Status104:GetValueByPropertyId) is never called. The tick loop usesGetPropertyValue, which has no such check. - Shields soak ticks first. Each HP tick is taken from a skill shield, then from a trophy shield, before it reaches HP (see Shields and protection).
- Some DoTs cannot kill. Rows with
NotDeath(only the elixir side-effect bleeds 10086/10087) stop at 1 HP. Every other DoT can kill. - Debuff immunity first, elixir second. The side effects of Brute Force (10084/10085, defence down) and Elixir of Epiphany (10086/10087, self-bleed) are flagged as debuffs, but the attack buffs they come with (10057/10058, 10064/10065) are not. Use Slightly Sweet Roots first, then drink the elixir within 30 s (300 s with the + version), and you get the buff with no side effect. This follows from the immunity check in
AnimalBase:AddStatus(not tested in game). - Trick and trap DoTs grow with New Game Plus. Ownerless sources use the trick's or trap's
Damagefor the current journey. For example, the bomb-man poison of tricks 10052-10054 jumps from A = 125 to 800 after journey 1 (worked out in Poison). In the maze the journey value is set by depth: below level 8 journey 1, below 15 journey 2, below 22 journey 3, deeper journey 4. Arcade mode always uses journey 1. - Obsession Challenge: in the boss time challenge, any damage-over-time tick that you did not cause yourself (enemy, trick or trap) costs you the "perfect" result, just like a hit. Your own elixir bleed does not (see Obsession Challenge).
- The hero sanity effects start at the Abnormal state, not at Lunatic. Every hero-specific check used by statuses (
IsHeroSanNotNormal) is true whenever sanity is not normal, i.e. from 70% sanity down (see Abnormal state, Lunatic state). - Benita's drug tolerance (Abnormal state) weakens statuses flagged
DrugFast. No HP-damaging status has that flag. The only damage-over-time status with it is the Elixir of Hallucination's sanity drain (10074), and the effect is a 50% cut (Hero10003_Define.SanItemValueSubRate= 500) that applies while she carries one of three item statuses (10044-10046).
The 26 kinds#
| Kind | Class | Effect |
|---|---|---|
| 101 | PropertyMaxAdd | raises a stat's maximum (Buffs) |
| 102 | PropertyMaxSub | lowers a stat's maximum (Corrosion) |
| 103 | PropertyPeriodAdd | regenerates a stat every second |
| 104 | PropertyPeriodSub | drains a stat every second (Bleed, Poison, Burn, Sanity loss (status)) |
| 105 | Dizzy | Stun |
| 106 | SanCrazy | marks the Lunatic state |
| 107 | EnergyDontUse | free stamina |
| 108 | SubHpToSuckHp | damage taken turns into healing |
| 109 | PropertySet | damage-absorbing shield |
| 110 / 117 | NoDeath / NoDeathAdd | death ward (with charges) |
| 111 | NoLogic | marker read by other code (Blind, tolerance) |
| 112 | NoDebuffer | debuff immunity |
| 113 / 119 | ExpAdd / MazeExpAdd | more experience / maze drops |
| 114 | ExecuteDamageAdd | executions on the target hit harder |
| 115 | NoDamage | invincible |
| 116 | SuckHp | lifesteal |
| 118 / 121 / 122 | Maze effects | slower / no sanity loss, Dark Mist farther away |
| 120 | CallHero | summons a partner |
| 123 | MoveFast | faster movement |
| 124 / 125 | DamageOverlay / DamageOverlayClear | Jerold's Sendril marks and their detonation |
| 126 | GuardAdd | unbreakable guard (Elena) |
Sources#
reference/lua_src/luascript/logic/player/animalbase.lua:5248-5351(AddStatus: immunity check, family replacement, build-up, damage capture),:5425-5516(UpdateStatus: ticks, NotDeath),:5597-5621(ClearStatusAllDebuffer),:6624-6625(cleansing items),:7050-7053(altar rest),:7505-7550(statuses from hits,GuardEnable,StatusChangetalents),:7496-7504(period damage),:13811-13853(Reborn).reference/lua_src/luascript/logic/status/statusbase.lua:5-51(init,StackSubDelay),:81-99(refresh),:209-232(timer, gauge),:270-282(1-second ticks),:284-350(GetCommonPropertyChange: the formula, item talents, Norwood, Benita, PierceMuteki),:461-496(gauge drain and expiry).reference/lua_src/luascript/logic/status/status104.lua:11-54(Casual ×CasualDamageRatio, Egg ×NoobItemDamageRatio, invincibility);status102.lua:11-25.reference/lua_src/luascript/logic/playervalue/animalbase_value.lua:172-232(InitPropertyBase: what "base" includes),:302-333(GetPropertyMaxincludes status changes),:405-425(UpdatePropertyMaxDiff),:1812-1820(direct hits useGetPropertyMax),:932-954(NotDeath floor).reference/lua_src/luascript/logic/trap/trapbase.lua:80-166(trap application:StatusDelay,StatusInterval).reference/lua_src/luascript/controller/controllerstorymode.lua:917-947, 1870-1872, 2428-2435(RecoveryPropertyafter bosses and death).reference/lua_src/gamedata/playerdefine/animalbase_value_define.lua:22,28(0.65, 0.5);hero10004_define.lua:53;luascript/structdata/ms_statusdata.lua:6-18,52-58;ms_itemdata.lua:44,89,112.es_statusdata.luaall rows (StackAddPer, StackSubPer, StackSubDelay, StatusType, GuardEnable = 0 everywhere, SaveEnable);es_itemdata.luaitems 20026, 21026, 72112;ES_HeroTalenttalents 11302/11305 (item lists), 14408; trophy 60028 (Marcion Puzzle Ball).reports/status_effects.md(full list of the 124 statuses).logic/player/animalbase.lua:17214-17224(IsHeroSanNotNormal: any sanity type other than Normal),logic/playervalue/animalbase_value.lua:2475-2482(Brutality uses the same check).- Status-group pass: journey wording for
Damage_1..4(structdata/ms_trickdata.lua:22);es_statusdata.lua10101-10104 (kinds 124/125, designer label "Jerold's griminess" = Sendril marks);HeroTalent11302-17304StoneLevel(levels of the two item talents, see Buffs). - Review additions:
logic/player/animalbase.lua:5486-5497(ticks useGetPropertyValue; boss-time-challengeSetNotPerfect),:5432(no updates while hidden or dying),:6623-6633(item statuses go throughAddStatus, so immunity applies),:7729-7735(tricks passtrickData.Damage);status104.lua:25-27(invincibility check, in a function with no callers);animalbase_value.lua:976-1050(SubPropertyCommon: skill and trophy shields absorb first,NotDeathfloor);logic/trick/trick.lua:542(trick traps have no owner);logic/trap/trapbase.lua:87,144(trap passes itsDamage);structdata/ms_trickdata.lua:22,ms_trapdata.lua:21(Damage_<loop>);controller/controllermain.lua:4864-4882(maze depth → cycle);structdata/fs_savestory.lua:1969-1979(GetLogicLoop, Arcade = 1);es_trickdata.luatricks 10052-10054 (Damage_1..4125/800/1000/1200);es_statusdata.lua10057, 10058, 10064, 10065 (IsDebuffer0), 10084-10087 (IsDebuffer1), 10068/10123 (logic 112). Recomputed inbuild/wiki/scripts/refute_status_a/r3.py.