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.

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 #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!