In lieu of a Battle Bits update this week, here are some tiny changes you might not have noticed from preview footage of TTYD for the Nintendo Switch!
TTYD Battle Bits #021: Regional Delicacies
Zess T. has slightly different cooking recipes available in the Japanese and international versions of TTYD!
Note: Correction regarding the conflicting “Ultra Shroom + Fresh Pasta” recipes; the upper one is correct in that it makes a Zess Special in JP and Zess Deluxe elsewhere. Not listed is that an Ultra Shroom + Peachy Peach makes a Zess Dinner in JP, and a Zess Special elsewhere.
TTYD Battle Bits #020: Built to Fail
Items that inflict immobilizing statuses have a slightly lower than 100% chance to work by default!
TTYD Battle Bits #019: Audience Interaction
A follow-up from the last post, going into more detail on how TTYD’s audience member special events are triggered. Again, for a further deep-dive on audience mechanics, feel free to refer to my Super Mario Files post on the matter.
TTYD Battle Bits #018: Know Your Audience
A brief look at what differentiates TTYD’s types of audience members. For more in-depth info, check out my earlier article on the audience!
Status Pro: A comprehensive overview of TTYD’s status effects
Status effects, ailments, or what-have-you are something that every player of Paper Mario: TTYD will come across at some point in their playthrough, and while the basics of their effects and how they run their course are straightforward enough to grasp, players might not be aware of how certain ones have special interactions if inflicted concurrently, or indeed, might be unaware of some of the rarer ones entirely.
This article will give an overview of every status effect type, describing their effect and all methods of inflicting them (and their chances / parameters), then finish with a look at how statuses in general work in more detail, how certain ones interact, and briefly mention a few other mechanics that aren’t quite treated the same as status effects.
Status Effect Types
Sleep
When asleep, actors will be unable to act or use defensive Action Commands for the status’s duration. Taking damage from an attack will have a 50% chance to wake the actor up early.
Ways of inflicting
- Player:
- Sleepy Stomp (100%, 5t + 2t per stacked copy)
- Enemies:
- Crazee Dayzee (50% / 75% in JP, 5t)
- Amazy Dayzee (75%, 5t)
- Bonetail (30%, 5t)
- Items:
- Sleepy Sheep (95%, 5t)
- Love Pudding / Peach Tart (100%, 2t) ~20% of the time
- Stage:
- Fork (100%, 0t), A-list and up
Stop
When stopped, actors will be unable to act or use defensive Action Commands for the status’s duration.
Ways of inflicting
- Player:
- Clock Out (100%, 1-3t if partially filled; 127%, 3t if full)
- Enemies:
- X-Yux (80%, 3t)
- Atomic Boo (50%, 3t) [circle attack]
- Grodus (30%, 2t)
- Items:
- Stopwatch (or Mystery) (95%, 3t)
Dizzy
When Dizzy, actors will have a 50% chance to miss their target (unless the move is guaranteed to hit, like most healing or support moves / items, and all Special Moves).
Ways of inflicting
- Player:
- Tease (0~100%, 3t)
- Enemies:
- None
- Items:
- Dizzy Dial (100%, 3t)
- Stage:
- Bucket (50%, 3t)
- Basin (50%, 3t), B-list and up
- Meteor (50%, 3t), Superstar only
Confuse
When Confused, actors will have a 50% chance to perform an unintended action (or do nothing, in the case of most boss enemies). See the “Confusion events” section of my previous article on attack events for more information as to what these actions entail.
Ways of inflicting
- Player:
- Head Rattle (100%, 3t + 2t per stacked copy)
- Infatuate (100%, 3t)
- Enemies:
- Wizzerd (50%, 3t)
- Atomic Boo (50%, 3t) [scare attack]
- Shadow Queen (75% / 50% in JP, 3t)
- Bonetail (30%, 3t)
- Items:
- Ruin Powder (100%, 3t)
- Stage:
- Small or large bugs (50%, 3t), A-list and up
- Bowser statue (100%, 3t), Superstar only
Poison
When Poisoned, actors will take damage at the start of every turn. The game has the capability to make the amount of damage vary by means of infliction, but all methods used in the game use 1 damage.
Ways of inflicting
- Enemies:
- Putrid Piranha (50%, 10t, -1)
- Poison Puff (70%, 10t, -1)
- Poison Pokey (60%, 10t, -1) [not segment toss]
- Bowser (30%, 10t, -1)
- Cortez’ Hook (50%, 10t, -1)
- Gloomtail (50%, 10t, -1)
- Beldam (Ch. 8 only) (100%, 10t, -1)
- Shadow Queen (75% / 50% in JP, 10t, -1)
- Items:
- Poison Shroom (100%, 3t, -1)
- Miscellaneous:
- Contact with Poison counter hazard (100%, 3t, -1)
Burn
When Burned, actors will take 1 damage at the start of every turn.
Ways of inflicting
- Player:
- Fire Drive (100%, 3t)
- Shade Fist (100%, 2t)
- Fiery Jinx (100%, 3t)
- Enemies:
- X-Naut PhD (75%, 3t)
- Fire Bro (30%, 3t)
- Lava Bubble family (75%, 3t) [not melee attack]
- Grodus (75% / 20% in JP, 3t)
- Stage:
- Fire jets (100%, 3t per), Superstar only
Freeze
When Frozen, actors will be unable to act or use defensive Action Commands for the status’s duration. If the status expires before the battle ends, the actor will take 1 additional damage when it does so.
Ways of inflicting
- Player:
- Ice Smash (100%, 2t + 2t per stacked copy)
- Enemies:
- Frost Piranha (30%, 2t)
- Ice Puff (30% / 60% JP, 2t)
- Beldam (Ch.8 only) (40%, 2t)
- Grodus (30%, 2t)
- Bonetail (30%, 3t)
- Items:
- Ice Storm (95%, 2t)
- Icicle Pop (20%, 2t)
- Zess Frappe (20%, 2t)
- Snow Bunny (50%, 3t)
- Stage:
- Ice jets (100%, 1t per), B-list and up
Huge
Increases ATK power for attacks that can have their ATK modified by status (see the article on damage calculation on how this factors in). The amount of additional ATK has the capability to vary, but all methods of inflicting it use +2.
Ways of inflicting
- Enemies:
- Magikoopa / R Magikoopa / Kammy Koopa (100%, 3t, +2)
- X-Naut / Elite X-Naut (100%, 3t, +2)
- Wizzerd family (100%, 3t, +2)
- Beldam (100%, 3t, +2)
- Items:
- Power Punch (100%, 3t, +2)
Tiny
Decreases ATK power for attacks that can have their ATK modified by status (see the article on damage calculation on how this factors in). The amount of decreased ATK has the capability to vary, but all methods of inflicting it use +2.
Ways of inflicting
- Player:
- Shrink Stomp (100%, 3t + 2t per stacked copy, -2)
- Mini-Egg (100% per, 3t, -2)
- Enemies:
- X-Naut PhD (75%, 3t, -2)
- Beldam (100%, 3t, -2)
- Bonetail (30%, 3t, -2)
- Items:
- Mini Mr. Mini (100%, 3t, -2)
ATK-Up
Increases ATK power for attacks that can have their ATK modified by status (see the article on damage calculation on how this factors in).
Ways of inflicting
- Player:
- Power Lift (100%, 3t, +Varies)
- Enemies:
- Bulky Bob-omb, Bob-ulk (100%, 3t, +3)
- Grubba (100%, 1t, +3)
- Shadow Queen (100%, 3t, +3)
ATK-Down
Decreases ATK power for attacks that can have their ATK modified by status (see the article on damage calculation on how this factors in).
Ways of inflicting
None; this status is completely unused in-game.
DEF-Up
Increases the actor’s DEF power (see the article on damage calculation on how this factors in).
Ways of inflicting
- Player:
- Power Lift (100%, 3t, +Varies)
- Enemies:
- Magikoopa / R Magikoopa / Kammy Koopa (100%, 3t, +3)
- Wizzerd family (100%, 3t, +3)
- Bulky Bob-omb, Bob-ulk (100%, 3t, +3)
- Grubba (100%, 2t, +3)
- Shadow Queen (100%, 3t, +3)
- Items:
- Courage Shell (100%, 3t, +3)
DEF-Down (Soft)
Decreases the actor’s DEF power (see the article on damage calculation on how this factors in).
Ways of inflicting
- Player:
- Soft Stomp (100%, 3t + 2t per stacked copy, -3)
- Enemies:
- X-Naut PhD (75%, 3t, -3)
- Items:
- Mr. Softener (100%, 3t, -3)
- Heartful Cake (100%, 3t, -1)
- Shroom Broth (100%, 3t, -1)
Charge
Increases the damage of the next chargeable attack. Once an attack has been initiated, the stored Charge power will be expended at the end of the attack even if it fails to connect. Unlike all other statuses, Charge power can be stacked (up to a maximum of +99) if used in succession.
Ways of inflicting
- Player:
- Charge (P) (+2, +1 per stacked copy, max of +9)
- Super Charge (P) (+2, +2 per stacked copy, max of +9) (unused)
- Enemies:
- Hyper Goomba family (+6)
- Hyper Cleft family (+6)
- Koopatrol (+2)
- Dark Koopatrol (+5)
- Dark Lakitu (+5)
- Sky-Blue Spiny (+6)
- Bulky Bob-omb (+3)
- Bob-ulk (+9)
- Marilyn (+2 in Ch.2, +7 in Ch. 8)
- Grubba (+4)
- Cortez (+4)
- Gloomtail (+8)
- Shadow Queen (+7)
- Items:
- Hot Sauce (+1)
- Spicy Pasta (+1)
HP-Regen
Restores HP at the start of every turn. The amount of HP gained has the capability to vary, but all methods used in the game use a value of 2.
Ways of inflicting
- Player:
- Lucky Start (3t, +2)
- Enemies:
- None
- Items:
- Slow Shroom (or Mystery) (10, +2)
- Couple’s Cake (10t, +2)
- Meteor Meal (3t, +2)
FP-Regen
Restores FP at the start of every turn. The amount of FP gained has the capability to vary, but all methods used in the game use a value of 2.
Ways of inflicting
- Player:
- Lucky Start (3t, +2)
- Enemies:
- None
- Items:
- Gradual Syrup (or Mystery) (10, +2)
Electric
Acts as a contact hazard, stopping direct attacks early (but still allowing them to deal damage, aside from leeching attacks like Fuzzy or Swoopula’s). Also protects the actor from enemies with Electric status, or natural electric hazards (i.e. Dark and Ruff Puffs’ charge).
Ways of inflicting
- Player:
- Lucky Start (100%, 3t)
- Enemies:
- Magikoopa / G Magikoopa / Kammy Koopa (100%, 3t)
- Items:
- Volt Shroom (or Mystery) (100%, 5t)
- Electro Pop (100%, 4t)
- Love Pudding / Peach Tart (100%, 2t) ~40% of the time
- Stage:
- Stage light (25%, 3t)
Dodgy
Makes incoming attacks miss 50% of the time (unless the move is guaranteed to hit, like most healing or support moves / items, and all Special Moves).
Ways of inflicting
- Player:
- Lucky Start (100%, 3t)
- Dodgy Fog (100%, 1-4t)
- Enemies:
- X-Naut PhD (100%, 3t)
- Dark / Elite Wizzerd (100%, 3t)
- Grubba (100%, 2t)
- Grodus (100%, 3t)
- Items:
- Repel Cape (or Mystery) (100%, 4t)
- Peach Tart (100%, 2t) ~40% of the time
Invisible
Makes incoming attacks always miss (unless the move is guaranteed to hit, like most healing or support moves / items, and all Special Moves).
Ways of inflicting
- Enemies:
- Magikoopa / G Magikoopa / Kammy Koopa (100%, 3t)
- Boo / Dark Boo (100%, 2t)
- Dark / Elite Wizzerd (100%, 3t)
- Items:
- Boo’s Sheet (100%, 2t)
- Love Pudding (100%, 2t) ~40% of the time
- Stage:
- Boo audience (100%, 2t)
Payback
Acts as a contact hazard, stopping direct attacks early (but still allowing them to deal damage), and dealing back half of the damage taken in return, rounded down (with a minimum of 1).
Ways of inflicting
- Enemies:
- Grodus (3t)
- Items:
- Spite Pouch (3t)
Hold Fast
Acts similarly to Payback, but with slightly different resistances (e.g. shell attacks get stopped by Payback but no other contact hazards). Note that this status can be stacked with Payback, dealing additional damage for attacks that are weak to both hazards.
Ways of inflicting
- Player:
- Hold Fast (100%, 1-4t)
Fast
Allows the actor to take two actions per turn.
Ways of inflicting
- Enemies:
- Grubba (100%, 4t)
- Beldam (Ch. 8 only) (100%, 3t)
Slow
Makes the actor skip their action every other turn (see the “turn structure” article for more details).
Ways of inflicting
- Enemies:
- Beldam (Ch. 8 only) (100%, 3t)
- Items:
- Koopa Curse (100%, 3t) (unused)
Allergic
When Allergic, the actor will be unable to receive any new status effects (including re-inflicting Allergic!) for the status’s duration.
Ways of inflicting
- Enemies:
- Shadow Queen (90% / 60% in JP, 3t)
- Items:
- Space Food (50%, 3t)
Fright
Causes enemies to run away, defeating them instantly (without yielding EXP or coins).
Ways of inflicting
- Player:
- Fright Mask (100%)
Gale Force
Blows enemies away, defeating them instantly (yielding the normal EXP and coins). Note that unlike all other status effects, the final success rate is modified by subtracting the difference in Mario’s and the enemy’s level (See Battle Bits #003).
Ways of inflicting
- Player:
- Gale Force (0~100% + level factor after multiplication)
OHKO
Defeats enemies instantly (yielding the normal EXP and coins).
Ways of inflicting
- Player:
- Showstopper (50~100%)
Non-Status Effects
The following mechanics are not considered the same thing as similar status effects, despite potentially seeming similar on the surface:
- “Defend” command — Handled separately from +DEF status. See Battle Bits #011 or the damage calculation article for how it factors in.
- Rally Wink — Does not literally inflict a status, but behaves similarly to Fast status for the current turn.
- Zap Tap — Behaves identically to an always-active Electric status, aside from having an infinite turn count. Cannot be stacked with Electric status, or removed by Feeling Fine / the water stage effect.
- Return Postage — Behaves identically to Payback status by itself, but is separate from it; if both are active, their damage is stacked. Cannot be removed by the water stage effect.
- Puffs’ electric charge — Behaves differently from Electric status for contact attacks, protecting the Puff entirely from damage and dealing a fixed 1 damage (like spikes); the contact hazard can still be bypassed with Electric status (or Zap Tap), though.
- Puffs’ poison charge — Not the same as Payback status, and has slightly different counter properties (e.g. Koops’ Shell Toss can safely hit it, unlike Payback). The damage dealt on contact stacks with Payback status’s, for attacks weak to both.
Status Mechanics + Interactions
Inflicting status effects
Most status effects are applied by moves, which can apply any number of different statuses simultaneously at different rates and for different turn counts. The chance of a status being applied is (move’s base chance * target’s base vulnerability), rounded down to the nearest percent; Gale Force’s effect is further modified by subtracting the difference in Mario’s and the enemy’s level (See Battle Bits #003).
Mario and his party members always have 100% vulnerability to all statuses, and Charge, Payback, Hold Fast, HP-Regen and FP-Regen do not have a chance / vulnerability check.
Unlike PM64, most status effects can coexist; if an actor doesn’t already have a particular status effect, inflicting it will add it to its active ailments. Re-inflicting the same type of status effect while it’s already active will always override the existing version of the status rather than stacking its effect or turn counts (with the exception of Charge status).
Status effect turn procedure
At the start of every turn, statuses that deal gradual damage or heal HP/FP will be applied, then all active statuses will tick down by 1 turn, being removed if their turn count elapses. See the article on turn structure, or Battle Bits #006 for more detail.
Status cures / prevention
There are a few different methods of clearing statuses before their turn count naturally elapses, or preventing them from being applied in the first place:
- Feeling Fine (P) prevents some negative statuses, as well as Electric status.
- Tasty Tonic (as well as Healthy Salad, Fresh Juice) removes negative and Allergic status.
- Sweet Feast and Sweet Treat remove most negative statuses.
- The water stage hazard clears a mix of negative and positive statuses.
For more details on the exact lists of statuses affected, see Battle Bits #016.
“Conflicting” statuses
Some pairs of statuses are actually implemented as a single status under the hood (Huge/Tiny, +/-ATK, +/-DEF), or otherwise have interactions that prevent them from normally coexisting. If you successfully apply a status from one of these pairs while its opposite is currently active, the following happens:
- Huge / Tiny — Override each other
- ATK-Up / ATK-Down — Override each other (note that the latter is unused)
- DEF-Up / DEF-Down — Cancel each other out, leaving neither active
- Burn / Freeze — Cancel each other out, leaving neither active
- Fast / Slow — Cancel each other out, leaving neither active (Note that Rally Wink does not count as “Fast” status, and will always yield an extra move on the current turn).
“Counter hazard”-like status damage
The following statuses or hazards can all deal damage on contact while still allowing the attack to connect:
- Electric status / Zap Tap — Deals 1 flat damage.
- Payback status — Deals half the damage taken, rounded down.
- Hold Fast status — Deals half the damage taken, rounded down.
- Return Postage — Deals half the damage taken, rounded down.
- Poison counter hazard — Deals half the damage taken, rounded down.
The total damage dealt is the sum of the damage from all the applicable statuses the initial attacker’s attack was weak to, or 1 if the damage would otherwise be 0. Note that the final counter damage is always fixed (i.e. cannot be changed by the attacker’s badges, DEF, etc.; see Battle Bits #013).
Assuming the attacker’s attack is weak to them, all other types of contact hazards (fire, ice charge, electric charge, Bob-ombs’ explosion) deal a fixed 1 damage, and stop the attack before it can connect.
Note that Electric status, Hold Fast, and poison counter hazards can still stop certain attacks (e.g. Fuzzy, Swoopula, Lip Lock) from connecting entirely, unless they are also stacked with Payback or Return Postage.
TTYD Battle Bits #017: Status Unknown
A quick look into some of the rarer status effects you might not be aware even existed in TTYD. For more information on status effects rare and common alike, check out this long-form article that does a deeper dive on status effects in general!
TTYD Battle Bits #016: Status Woe
TTYD’s battle system has several ways to deal with negative status ailments, but a surprising amount of disagreement in what exactly falls under that umbrella!
TTYD Battle Bits #015-Addendum: Single-Player Healthcare
In my last Battle Bits post, I kind of gloss over the ramifications of what would happen if a Magikoopa were to try to use their spread-healing magic when there’s only one valid target and they have full HP, since that can’t happen in normal gameplay (if the Magikoopa’s left alone, they can only attack, single-heal or clone). Here’s the relevant snippet of the multi-heal attack script, for a refresher:
// Determine the move's possible targets + order by weights:
USER_FUNC(btlevtcmd_ChoiceSamplingEnemy, ...)
IF_EQUAL(LW(3), -1) // ... if target is invalid, fail ...
// Select first target:
USER_FUNC(btlevtcmd_GetSelectEnemy, LW(3), LW(4))
5: USER_FUNC(btlevtcmd_GetHp, LW(3), LW(0))
USER_FUNC(btlevtcmd_GetMaxHp, LW(3), LW(1))
IF_SMALL(LW(0), LW(1))
// HP needed! Run healing magic ...
GOTO(8)
END_IF()
// Select next target:
USER_FUNC(btlevtcmd_GetSelectNextEnemy, LW(3), LW(4))
IF_NOT_EQUAL(LW(3), -1) // If target is NOT invalid... (bug!)
SET(LW(0), 0) // Healing failed (try another attack).
RETURN()
END_IF()
GOTO(5)
8: SET(LW(0), 1)
// ... handle healing magic ...
This investigation was especially pertinent to look into because in my Infinite Pit mod, the attack can be used with a single valid target, if all the other enemies are Infatuated (i.e. permanently on the player’s side). I had to check if that’d cause any issues, since a lone, full-HP Magikoopa running the multi-heal attack script with the original bug intact would result in it repeatedly looping and checking the HP of invalid actors, and it seemed pretty possible that that would end up causing some sort of softlock or crash. As it turns out, the script does indeed loop through invalid actors, but through an astonishing series of coincidental implementation choices, there’s pretty much no discernible consequences of the bug, despite multiple possible failure points:
GetHP / GetMaxHP getting passed an invalid actor id
The “GetHp” and “GetMaxHp” functions could theoretically not handle the case of getting passed an invalid actor, either indexing out of range or throwing an assert or such, but both functions specifically check for an actor id of -1, and gracefully exit, leaving the LW(0) and LW(1) output script variables as is (and unchanged from the previous loop). This is actually true of most functions that fetch state from actors.
GetSelectNextEnemy causing an infinite loop
“GetSelectNextEnemy” could have been written such that if you’re already looking at the end of the valid list of targets, it just returns early, which would be idempotent, resulting in an infinite loop / softlock.
Luckily, the core battle work structure has an internal “target list index” value that increments before checking if it’s less than the number of valid targets, so no infinite loop! But even if the loop isn’t technically infinite, that counter would keep going until it overflows, so it might as well be, right? Luckily, it’s a single unsigned byte, so the loop would only run 127 extra times before wrapping around to target list index -128!
Indexing the target list out of bounds causing indeterminate behavior
Since the “target list index” value is signed, that means when it overflows, it could index the target list out of bounds with an offset of -128 bytes, which theoretically could do all sorts of bad stuff depending on what’s immediately before it in memory!
As it turns out, right before the target list is an array of metadata for all the possible targets, which is 74 entries of 36 bytes each. The entire battle work structure, including this array, is zero-initialized at the start of a battle, and is pretty much guaranteed to have not been touched, as no moves in the game are ever going to have more than about 10-20 valid targets at most (and certainly not the 71 required to write anything to the bugged index value).
This results in the negative offset always returning a target index of 0, which is used to fetch the metadata for the first target, which is guaranteed to be valid, or else the attack script would have early-outed at the very top from the IF_EQUAL(LW(3), -1) check. Returning the first target’s actor and part id will cause the IF_NOT_EQUAL(LW(3), -1) condition to fail, allowing the bugged attack script to finally “fail early”, seeing that “all enemies” are full on HP, and the calling script to pick another random attack.
At worst, if the stars align and the Magikoopa rolled the weight for a spread-heal multiple times in a row, maybe you’d notice a slight hitch from the extra time executing the script, but in reality a couple hundred loops through a small bit of script code probably won’t cause any adverse effects!
TTYD Battle Bits #015: Unhealthy Communication
Magikoopas are pickier about using their spread-healing move than intended, ignoring the HP of all but the right-most enemy!