Pascal's Wager Wiki

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.

FieldMeaning for players
StackAddPerBuild-up added per application, in % of the gauge. 100 or more means the status starts at once ("instant").
StackSubPerHow fast an unfinished gauge drains, in % per second.
StackSubDelaySeconds 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).
TimeDuration in seconds once active (999 = rest of the fight, 0 = until removed).
IsRefreshHitting an active status restarts its timer.
OverlayMaximum stacks (0 = does not stack).
StatusTypeThe family. Two statuses of the same family cannot coexist.
IsDebufferCounts as a debuff: blocked by debuff immunity, removed by cleansing.
IsShowWhether the icon is shown at all.
Param1...Param5, AttackType, DefenceTypeThe numbers the kind uses (see Damage over time formula).

The build-up gauge#

  1. The first application creates the status at StackAddPer %. The icon appears with a partial fill.
  2. Each further application adds StackAddPer again.
  3. Starting StackSubDelay seconds after the first application, the gauge drains continuously at StackSubPer % per second. The delay is not restarted by later hits.
  4. 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.
  5. 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:

SourceBuild-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 effectsUsually 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).

StatusBuild-up / drain / delayMinimum hitsWindow for that many hits
Poison (10002), Burn (10008)30 / 7 / 0.2 s4first to fourth hit within about 3.0 s
Poison (DLC, 10113)60 / 7 / 0.2 s2within about 3.0 s
Burn (strong, 10037/10078)40 / 7 / 0.2 s3within about 3.0 s
Bleed (Viola's red bullets, 10034)20 / 7 / none6within about 2.9 s (5 only if they land at the same instant)
Corrosion (10003)25 / 7 / 0.2 s5within about 3.8 s (4 only within 0.2 s)
Thrown knives (Throwables: 10012, 10070, 10071)49 / 7 / 0.2 s3within 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)ArticleMembers
101 BleedBleed10001, 10011, 10030, 10034, 10035, 10036, 10071, 10086, 10087, 10107
102 PoisonPoison10002, 10042, 10070, 10076, 10113
103 CorrosionCorrosion10003, 10073, 10084, 10085
108 BurnBurn10008, 10012, 10037, 10078, 10080 (Fireworks Barrel)
104 WoundedBleed#Related effects10004 (Viola, Abnormal state)
199 Piercing damagePoison#Marcion poison mist10029 (Marcion poison mist)
(other families)Stun, Sanity loss (status), Buffs, Shields and protectionstuns, 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 own Damage, and so does a trap created by a trick (Holy Father's fireball ground, Edith's acid rain). That fixed Damage depends 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#

HowWhat it removesSource
Sour Conifer Leaf (20026)every debuffitem type 207 NoDebuffer
Slightly Sweet Roots (21026) / Slightly Sweet Roots+ (72112)every debuff, then immunity for 30 s / 300 stype 207 plus status 10068 / 10123
Resting at an altar (Altars)every debuffAnimalBase:OnEventTrigger
Killing a bossevery debuff (the party's properties are restored)ControllerStoryMode:RecoveryProperty
Dying / respawningeverything on a full-reset respawn (Reborn(true), the usual case); debuffs only otherwiseHostPlayerDeadFinish, AnimalBase:Reborn
Waitingthe status expires after TimeStatusBase: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 DefenceType 1 (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 uses GetPropertyValue, 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 Damage for 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).
  • Nothing ticks on the hidden or the dying. Statuses are not updated while their bearer is hidden or dying, so no ticks happen. The duration is a clock time, though, so it keeps running: a status that ran out meanwhile is removed as soon as updates resume. (A real pause of statuses, PauseStatusAll, does extend the timers.)
  • 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#

KindClassEffect
101PropertyMaxAddraises a stat's maximum (Buffs)
102PropertyMaxSublowers a stat's maximum (Corrosion)
103PropertyPeriodAddregenerates a stat every second
104PropertyPeriodSubdrains a stat every second (Bleed, Poison, Burn, Sanity loss (status))
105DizzyStun
106SanCrazymarks the Lunatic state
107EnergyDontUsefree stamina
108SubHpToSuckHpdamage taken turns into healing
109PropertySetdamage-absorbing shield
110 / 117NoDeath / NoDeathAdddeath ward (with charges)
111NoLogicmarker read by other code (Blind, tolerance)
112NoDebufferdebuff immunity
113 / 119ExpAdd / MazeExpAddmore experience / maze drops
114ExecuteDamageAddexecutions on the target hit harder
115NoDamageinvincible
116SuckHplifesteal
118 / 121 / 122Maze effectsslower / no sanity loss, Dark Mist farther away
120CallHerosummons a partner
123MoveFastfaster movement
124 / 125DamageOverlay / DamageOverlayClearJerold's Sendril marks and their detonation
126GuardAddunbreakable 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, StatusChange talents), :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 (GetPropertyMax includes status changes), :405-425 (UpdatePropertyMaxDiff), :1812-1820 (direct hits use GetPropertyMax), :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 (RecoveryProperty after 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.lua all rows (StackAddPer, StackSubPer, StackSubDelay, StatusType, GuardEnable = 0 everywhere, SaveEnable); es_itemdata.lua items 20026, 21026, 72112; ES_HeroTalent talents 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.lua 10101-10104 (kinds 124/125, designer label "Jerold's griminess" = Sendril marks); HeroTalent 11302-17304 StoneLevel (levels of the two item talents, see Buffs).
  • Review additions: logic/player/animalbase.lua:5486-5497 (ticks use GetPropertyValue; boss-time-challenge SetNotPerfect), :5432 (no updates while hidden or dying), :6623-6633 (item statuses go through AddStatus, so immunity applies), :7729-7735 (tricks pass trickData.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, NotDeath floor); logic/trick/trick.lua:542 (trick traps have no owner); logic/trap/trapbase.lua:87,144 (trap passes its Damage); 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.lua tricks 10052-10054 (Damage_1..4 125/800/1000/1200); es_statusdata.lua 10057, 10058, 10064, 10065 (IsDebuffer 0), 10084-10087 (IsDebuffer 1), 10068/10123 (logic 112). Recomputed in build/wiki/scripts/refute_status_a/r3.py.
Categories:Status effects