data/claims/ssb64.yamlSuper Smash Bros. (the VetriTheRetri decompilation, VetriTheRetri/ssb-decomp-re)
Game: Super Smash Bros..
In the US version of Super Smash Bros., ftParamGetCommonKnockback computes a hit's knockback as times an attacker and a defender factor from a handicap table. Here d is the target's damage percent plus damage_queue, the damage queued against it, which ftMainProcParams adds to the percent and then clears; h is the hit's damage; w is the target's weight attribute, which the decompilers comment "Or, rather, \"knockback multiplier\""; g and b are the hit's knockback_scale and knockback_base; and r is the battle's damage_ratio. A hit with a nonzero knockback_weight k puts 1 + 0.5k in place of the d term, the value that term takes at d = 10 and h = k (computed), so that launch doesn't grow with the percent. The result is capped at 2500. Of the hits a fighter takes together, ftMainProcessHitCollisionStatsMain keeps the largest knockback, and ftMainProcParams multiplies it by 2/3 while the fighter is crouching (nFTCommonStatusSquat or nFTCommonStatusSquatWait) and subtracts the larger of two knockback-resistance values, down to 0. ssb64/knockback
About: Super Smash Bros. Knockback
Value
{
"percent": 0.1,
"percentTimesDamage": 0.05,
"weight": 1.4,
"add": 18,
"scalePer": 0.01,
"ratioPer": 0.01,
"setKnockbackAt": 10,
"cap": 2500,
"crouch": 0.6666667
}src/ft/ftparam.c#L1451-L1468f32 ftParamGetCommonKnockback(s32 percent_damage, s32 recent_damage, s32 hit_damage, s32 knockback_weight, s32 knockback_scale, s32 knockback_base, f32 weight, s32 attack_handicap, s32 defend_handicap)
…
if (knockback_weight != 0)
{
knockback = ( ( ( ( ( ( 1 + ( 10.0F * knockback_weight * 0.05F ) ) * weight * 1.4F ) + 18.0F ) * ( knockback_scale * 0.01F ) ) + knockback_base ) * ( gSCManagerBattleState->damage_ratio * 0.01F ) * dFTCommonDataHandicapTable[attack_handicap - 1][0] ) * dFTCommonDataHandicapTable[defend_handicap - 1][1];
}
else
{
f32 damage_add = percent_damage + recent_damage;
…
knockback = ( ( ( ( ( ( ( damage_add * 0.1F ) + ( damage_add * hit_damage * 0.05F ) ) * weight * 1.4F ) + 18.0F ) * ( knockback_scale * 0.01F ) ) + knockback_base ) * ( gSCManagerBattleState->damage_ratio * 0.01F ) * dFTCommonDataHandicapTable[attack_handicap - 1][0] ) * dFTCommonDataHandicapTable[defend_handicap - 1][1];
}
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L2699-L2709knockback_temp = ftParamGetCommonKnockback
(
this_fp->percent_damage,
this_fp->damage_queue, ft_attack_coll->damage,
ft_attack_coll->knockback_weight,
ft_attack_coll->knockback_scale,
ft_attack_coll->knockback_base,
attr->weight,
attacker_fp->handicap,
this_fp->handicap
);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L2672FTAttributes *attr = this_fp->attr;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/fttypes.h#L898f32 weight; // Or, rather, "knockback multiplier"ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L2845-L2847if (knockback < knockback_temp)
{
knockback = knockback_temp;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L2990this_fp->damage_knockback = knockback;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L3856-L3878if (fp->damage_knockback != 0.0F)
{
if ((fp->status_id == nFTCommonStatusSquat) || (fp->status_id == nFTCommonStatusSquatWait))
{
fp->damage_knockback *= (2.0F / 3.0F);
…
if (fp->knockback_resist_status < fp->knockback_resist_passive)
{
knockback_resist = fp->knockback_resist_passive;
}
else knockback_resist = fp->knockback_resist_status;
…
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L3816void ftMainProcParams(GObj *fighter_gobj)ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L4007fp->damage_queue = 0;Checked by claude, 2026-10-22 — read ftParamGetCommonKnockback whole, the fighter-hit call in ftMainProcessHitCollisionStatsMain and its weapon, item, and ground calls, the max over hit logs, ftMainProcParams from the crouch multiplier to the damage_queue reset, and the weight and damage_queue fields in fttypes.h; no REGION_ conditional encloses these linesWeapon and item hits pass their staled damage as h; fighter hits pass the hitbox's own damage. Throws and some specials call the same routine with other arguments (for example percent_damage, damage, damage in ftcommonthrown2.c). The handicap table is dFTCommonDataHandicapTable in src/ft/ftcommondata.c; its row for handicap 8 is 1.0 and 1.0. A per-fighter weight value is ROM data (src/relocData, which the atlas doesn't fetch). The same routine ends with the random knockback of ssb64/random-knockback.
Cited by: Damage percent, Knockback, Super Smash Bros.
In the US version of Super Smash Bros., when a saved error flag the decompilers name LBBACKUP_ERROR_RANDOMKNOCKBACK is set, ftParamGetCommonKnockback replaces every knockback it computes with a random value below 200. The VS mode menu sets that flag when the save's boot count is above 21 and gSYMainImemOK is false, which syMainSetImemStatus sets when the word it reads at the start of the RSP's instruction memory (SP_IMEM_START) isn't 6103. ssb64/random-knockback
About: Super Smash Bros. Knockback
Value
{
"range": 200,
"bootsOver": 21,
"imemWord": 6103
}src/ft/ftparam.c#L1469-L1473if (gSCManagerBackupData.error_flags & LBBACKUP_ERROR_RANDOMKNOCKBACK)
{
knockback = syUtilsRandFloat() * 200.0F;
}
return knockback;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/lb/lbdef.h#L168#define LBBACKUP_ERROR_RANDOMKNOCKBACK (1 << nLBBackupErrorRandomKnockback) // 0x1 - Random knockback between 0.1 (?) and 1.0 x 200ussb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/mn/mnvsmode/mnvsmode.c#L1622-L1625if (!(gSCManagerBackupData.error_flags & LBBACKUP_ERROR_RANDOMKNOCKBACK) && (gSCManagerBackupData.boot > 21) && (gSYMainImemOK == FALSE))
{
gSCManagerBackupData.error_flags |= LBBACKUP_ERROR_RANDOMKNOCKBACK;
}ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/sys/main.c#L134-L141void syMainSetImemStatus(void)
{
if (IO_READ(SP_IMEM_START) == 6103)
{
gSYMainImemOK = TRUE;
}
else gSYMainImemOK = FALSE;
}ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/sys/utils.c#L172-L177f32 syUtilsRandFloat(void)
…
return ((step >> 16) & 0xFFFF) / 65536.0F;Checked by claude, 2026-10-22 — read the end of ftParamGetCommonKnockback, the flag's definition and comment, the one place that sets it in mnvsmode.c, and syMainSetImemStatus, and syUtilsRandFloat (at most 65535/65536); no REGION_ conditional encloses these linesThe statement says only what the code does. Why the game checks that word, and what a copy of the game would have to be for the check to fail, isn't stated in the code; the flag's neighbours in lbdef.h (LBBACKUP_ERROR_HALFSTICKRANGE, LBBACKUP_ERROR_1PGAMEMARIO) are other penalties of the same kind. The ground-hazard copy of the routine (ftParamGetGroundHazardKnockback, US only) has the same ending.
Cited by: Super Smash Bros.
In the US version of Super Smash Bros., ftCommonDamageInitDamageVars sets a hit fighter's hitstun_tics, a whole-number count, to its knockback divided by 1.875 (ftParamGetHitStun), and to 1 if that comes to 0. The damage statuses' common update routines take 1 off the count each time they run. Until it reaches 0, their common interrupt routines don't run the standing, falling, or hammer interrupt checks (ftCommonWaitProcInterrupt, ftCommonFallProcInterrupt, and the hammer's), so the fighter can't act, and an airborne fighter gets friction in place of the usual drift and fast-fall. At 0, the status ends once its animation has run out. A knockback of 100 gives 53 counts (computed). ssb64/hitstun
About: Super Smash Bros. Hitstun
Value
{
"divisor": 1.875,
"minimum": 1
}src/ft/ftparam.c#L1505-L1508f32 ftParamGetHitStun(f32 knockback)
{
return knockback / 1.875F;
}ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondamage.c#L482-L496f32 hitstun_tics = ftParamGetHitStun(knockback);
…
this_fp->status_vars.common.damage.hitstun_tics = hitstun_tics;
…
if (this_fp->status_vars.common.damage.hitstun_tics == 0)
{
this_fp->status_vars.common.damage.hitstun_tics = 1;
}ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon.h#L468-L470typedef struct ftCommonDamageStatusVars
{
s32 hitstun_tics;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondamage.c#L662-L674void ftCommonDamageGotoDamageStatus(GObj *fighter_gobj)
…
else ftCommonDamageInitDamageVars(fighter_gobj, -1, fp->damage_queue, fp->damage_knockback, fp->damage_angle, fp->damage_lr, fp->damage_index, fp->damage_element, fp->damage_player_num, FALSE, FALSE, TRUE);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondamage.c#L85-L123void ftCommonDamageDecHitStunSetPublic(GObj *fighter_gobj)
…
if (fp->status_vars.common.damage.hitstun_tics != 0)
{
fp->status_vars.common.damage.hitstun_tics--;
…
void ftCommonDamageCommonProcUpdate(GObj *fighter_gobj)
…
ftCommonDamageDecHitStunSetPublic(fighter_gobj);
…
if ((fighter_gobj->anim_frame <= 0.0F) && (fp->status_vars.common.damage.hitstun_tics == 0))
{
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondamage.c#L166-L199void ftCommonDamageCommonProcInterrupt(GObj *fighter_gobj)
…
if (fp->status_vars.common.damage.hitstun_tics == 0)
{
fp->is_hitstun = FALSE;
…
if (ftHammerCheckHoldHammer(fighter_gobj) != FALSE)
{
ftCommonHammerFallProcInterrupt(fighter_gobj);
}
else ftCommonFallProcInterrupt(fighter_gobj);
}
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondamage.c#L214-L224void ftCommonDamageCommonProcPhysics(GObj *fighter_gobj)
…
if (fp->ga == nMPKineticsAir)
{
if (fp->status_vars.common.damage.hitstun_tics == 0)
{
ftPhysicsApplyAirVelDriftFastFall(fighter_gobj);
}
else ftPhysicsApplyAirVelFriction(fighter_gobj);Checked by claude, 2026-10-22 — read ftParamGetHitStun, ftCommonDamageInitDamageVars to its damage level, ftCommonDamageGotoDamageStatus, the hitstun_tics field's type, and the damage statuses' update, interrupt, and physics routines; no REGION_ conditional in ftcommondamage.c53 is 100 / 1.875 = 53.33, truncated by the store to an s32. Whether a status's update runs once per displayed frame isn't read here, so the count isn't stated in seconds. The same count picks the damage animation's level, against thresholds of 12, 24, and 32 (FTCOMMON_DAMAGE_LEVEL_HITSTUN_* in src/ft/ftcommon.h). Wall bounces (ftcommonwalldamage.c) and Donkey Kong's held throw victim (ftdonkeythrowfdamage.c) set the count the same way.
Cited by: Hitstun, Super Smash Bros.
In the US version of Super Smash Bros., ftParamUpdateDamage adds the damage a fighter takes to its percent_damage and caps it at 999. ftMainProcParams calls it with damage_queue, to which ftMainCheckGetUpdateDamage adds each hit's damage, but only inside a branch taken when the fighter's damage_knockback isn't 0, tested before knockback resistance is subtracted; there, queued damage from hits that gave no knockback isn't added. While the fighter has damage resistance (is_damage_resist), a hit's damage goes against damage_resist first, and only what passes it reaches the queue. ssb64/damage-percent
About: Super Smash Bros. Damage percent
Value: 999 %
Codessb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) ·src/ft/ftparam.c#L1527-L1536void ftParamUpdateDamage(FTStruct *fp, s32 damage)
{
fp->percent_damage += damage;
…
if (fp->percent_damage > 999)
{
fp->percent_damage = 999;
}ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L3856-L3878if (fp->damage_knockback != 0.0F)
{
…
fp->damage_knockback -= knockback_resist;
…
ftParamUpdateDamage(fp, fp->damage_queue);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L2119-L2134sb32 ftMainCheckGetUpdateDamage(FTStruct *fp, s32 *damage)
{
if (fp->is_damage_resist)
{
fp->damage_resist -= *damage;
…
if (fp->damage_resist <= 0)
{
fp->is_damage_resist = FALSE;
…
*damage = -fp->damage_resist;
}
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/fttypes.h#L1000s32 percent_damage; // Fighter's damageChecked by claude, 2026-10-22 — read ftParamUpdateDamage whole, its call in ftMainProcParams and the damage_knockback branch around it, and ftMainCheckGetUpdateDamage to the queue; no REGION_ conditional encloses these linesThe same routine records the total for the results screen and may make a held item drop when the fighter is knocked back. A grabbed fighter takes half damage, rounded up, and every fighter's damage is multiplied by its damage_mul (ftParamGetCapturedDamage). The knockback formula reads the percent before this hit is added, plus the queue (ssb64/knockback).
Cited by: Damage percent, Super Smash Bros.
In the US version of Super Smash Bros., ftCommonDeadCheckInterruptCommon, called from ftMainProcPhysicsMap, checks the fighter's position against the stage's bounds in the order map_bound_bottom, map_bound_right, map_bound_left, map_bound_top, and crossing one starts a Dead status. Below the bottom or past a side, the status calls ftCommonDeadUpdateScore as it starts; above the top, it's DeadUpFall if a random number is below 1/6 and DeadUpStar otherwise, and both call it from their update routines. That routine adds a KO to the score of the player recorded in damage_player, or counts a self-destruct when there is none, and under the stock rule takes one stock. The check skips the boss and fighters flagged is_ignore_dead. A fighter flagged is_limit_map_bounds, ghost or not, is moved 500 units back inside the bound it crossed and its air velocity set to 0. Otherwise ghosts are skipped, and enemy teams in the 1P Game have their own team bounds. ssb64/ring-out
About: Super Smash Bros. Blast zone
Value
{
"upFallChance": 0.1666667,
"limitPushback": 500
}src/ft/ftmain.c#L1739void ftMainProcPhysicsMap(GObj *fighter_gobj)ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L1815ftCommonDeadCheckInterruptCommon(fighter_gobj);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L533-L554sb32 ftCommonDeadCheckInterruptCommon(GObj *fighter_gobj)
…
if (fp->fkind == nFTKindBoss)
{
return FALSE;
}
if (fp->is_ignore_dead)
{
return FALSE;
}
if (fp->is_limit_map_bounds)
{
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L580-L586return FALSE;
}
else if (!(fp->is_ghost))
{
if ((gSCManagerBattleState->game_type == nSCBattleGameType1PGame) && (gSCManagerBattleState->players[fp->player].is_spgame_enemy != FALSE))
{
if (pos->y < gMPCollisionGroundData->map_bound_team_bottom)ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L617-L643else if (pos->y < gMPCollisionGroundData->map_bound_bottom)
{
ftCommonDeadDownSetStatus(fighter_gobj);
…
else if (pos->x > gMPCollisionGroundData->map_bound_right)
{
ftCommonDeadRightSetStatus(fighter_gobj);
…
else if (pos->x < gMPCollisionGroundData->map_bound_left)
{
ftCommonDeadLeftSetStatus(fighter_gobj);
…
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L166-L181void ftCommonDeadInitStatusVars(GObj *fighter_gobj)
…
ftCommonDeadUpdateScore(fp);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L194-L203void ftCommonDeadDownSetStatus(GObj *fighter_gobj)
…
ftCommonDeadInitStatusVars(fighter_gobj);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L235-L244void ftCommonDeadRightSetStatus(GObj *fighter_gobj)
…
ftCommonDeadInitStatusVars(fighter_gobj);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L277-L286void ftCommonDeadLeftSetStatus(GObj *fighter_gobj)
…
ftCommonDeadInitStatusVars(fighter_gobj);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L318-L362void ftCommonDeadUpStarProcUpdate(GObj *fighter_gobj)
…
ftCommonDeadUpdateScore(fp);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L412-L468void ftCommonDeadUpFallProcUpdate(GObj *fighter_gobj)
…
ftCommonDeadUpdateScore(fp);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommondead.c#L48-L78void ftCommonDeadUpdateScore(FTStruct *this_fp)
…
if ((this_fp->damage_player != -1) && (this_fp->damage_player != GMCOMMON_PLAYERS_MAX))
{
gSCManagerBattleState->players[this_fp->damage_player].score++;
…
else gSCManagerBattleState->players[this_fp->player].total_selfdestructs++;
…
if (gSCManagerBattleState->game_rules & SCBATTLE_GAMERULE_STOCK)
{
this_fp->stock_count--;Checked by claude, 2026-10-22 — read ftCommonDeadCheckInterruptCommon whole, its call in ftMainProcPhysicsMap, the four Dead set-status routines and the two up-status update routines to their score calls, ftCommonDeadInitStatusVars, and ftCommonDeadUpdateScore; no REGION_ conditional in ftcommondead.cThe bounds are per-stage data (gMPCollisionGroundData), so their values aren't read here. stock_count runs out at −1, by the decompilers' comment in fttypes.h, and ftCommonDeadCheckRebirth puts a fighter with −1 stocks to sleep rather than respawning it. The 1P Game also takes a stock for each fall.
Cited by: Blast zone, Super Smash Bros.
In the US version of Super Smash Bros., a fighter's shield_health starts at 55. In ftMainProcParams, while the fighter isn't shielding and is below 55, it regains 1 each time a 10-count wait runs out; then the damage of the hits its shield took is subtracted, each hit's damage plus its shield_damage, and at 0 or below the health is set to 30, whatever else that update does. The shield break (ftCommonShieldBreakFlyCommonSetStatus) is called only in the branch taken when the fighter has no knockback to apply (damage_knockback is 0) and its shield_damage isn't 0. While the shield is up, ftCommonGuardUpdateShieldVars takes 1 off every 16 counts (FTCOMMON_GUARD_DECAY_INT). ssb64/shield
About: Super Smash Bros. Blocking
Value
{
"start": 55,
"afterBreak": 30,
"regenEvery": 10,
"decayEvery": 16
}src/ft/ftmanager.c#L431fp->shield_health = (fp->fkind == nFTKindYoshi) ? 55 : 55;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L3837-L3854if (!(fp->is_shield) && (fp->shield_health < 55))
{
fp->shield_heal_wait--;
…
if (fp->shield_heal_wait == 0.0F)
{
fp->shield_health++;
…
fp->shield_heal_wait = 10.0F;
}
}
fp->shield_health -= fp->shield_damage_total;
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L3856if (fp->damage_knockback != 0.0F)ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L3924-L3929}
else if (fp->shield_damage != 0)
{
if (is_shieldbreak != FALSE)
{
ftCommonShieldBreakFlyCommonSetStatus(fighter_gobj);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L2072victim_fp->shield_damage_total += (attack_coll->damage + attack_coll->shield_damage);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L2264fp->shield_damage_total += damage + wp_attack_coll->shield_damage;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L2446fp->shield_damage_total += damage + it_attack_coll->shield_damage;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommonguard1.c#L71-L88void ftCommonGuardUpdateShieldVars(GObj *fighter_gobj)
…
if (fp->is_shield)
{
if (fp->status_vars.common.guard.shield_decay_wait != 0)
{
fp->status_vars.common.guard.shield_decay_wait--;
…
if (fp->status_vars.common.guard.shield_decay_wait == 0)
{
fp->shield_health--;
…
…ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon.h#L234#define FTCOMMON_GUARD_DECAY_INT 16Checked by claude, 2026-10-22 — read the shield lines of ftMainProcParams, the shield-break branch and the damage_knockback test it is the else of, the three places a hit adds to shield_damage_total, the start value in ftmanager.c, and ftCommonGuardUpdateShieldVars; the start line sits before ftmanager.c's BUGFIX_ conditional, and no REGION_ conditional encloses the restBoth the start value and the reset test for Yoshi and give the same number either way, so every fighter gets 55 and 30. The shield's drawn size scales with shield_health / 55 (FTCOMMON_GUARD_SIZE_HEALTH_DIV). Weapon and item hits add their staled damage.
Cited by: Blocking, Super Smash Bros.
In the US version of Super Smash Bros., when a fighter in an air attack lands, ftCommonAttackAirProcMap enters the move's air-landing status only when the motion's flag1 is nonzero and more than 10 counts have passed since Z was last pressed (tics_since_last_z: set to 0 on a Z press, counted up each update, and set to its maximum when the air attack starts, so a press before the attack doesn't count); otherwise it skips that status and enters Wait if the fighter's vertical speed is above −20, or the plain Landing status if not. Reading flag1 as the move's switch for landing lag is the atlas's. ssb64/z-cancel
About: Super Smash Bros. Landing lag
Value
{
"windowCounts": 10,
"waitIfVelYAbove": -20
}src/ft/ftcommon/ftcommonattackair.c#L53-L74void ftCommonAttackAirProcMap(GObj *fighter_gobj)
…
if ((fp->motion_vars.flags.flag1 != 0) && (fp->tics_since_last_z > FTCOMMON_ATTACKAIR_SMOOTHLANDING_TICS_MAX))
…
ftCommonLandingAirSetStatus(fighter_gobj);
…
else if (fp->physics.vel_air.y > FTCOMMON_ATTACKAIR_SKIPLANDING_VEL_Y_MAX)
{
ftCommonWaitSetStatus(fighter_gobj);
}
else ftCommonLandingSetStatus(fighter_gobj);ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon.h#L361-L362#define FTCOMMON_ATTACKAIR_SMOOTHLANDING_TICS_MAX 10
#define FTCOMMON_ATTACKAIR_SKIPLANDING_VEL_Y_MAX (-20.0F)ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftmain.c#L1373-L1380if (this_fp->tics_since_last_z < FTINPUT_ZTRIGLAST_TICS_MAX)
…
this_fp->tics_since_last_z++;
…
if (this_fp->input.pl.button_tap & this_fp->input.button_mask_z)
…
this_fp->tics_since_last_z = 0;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommonattackair.c#L202 — in ftCommonAttackAirCheckInterruptCommon, as the air attack's status is setfp->tics_since_last_z = FTINPUT_ZTRIGLAST_TICS_MAX;Checked by claude, 2026-10-27 — read ftCommonAttackAirProcMap's landing branch, the two defines, and the Z-press counter in ftMainProcParams at the pinned commit; the same lines are cited by melee/l-cancel. In the audit, read the reset to the maximum when an air attack starts (L202); damage statuses reset it too (ftcommondamage.c L642, ftcommondamagefall.c L65)flag1 is also given a percent (F_PCT_TO_DEC) when the move has no air-landing animation, and an air attack's setup clears it (ftcommonattackair.c L190); what sets it nonzero is in the move scripts, not read here.
Cited by: Landing lag