Claim set · data/claims/melee.yaml

Super Smash Bros. Melee (the doldecomp decompilation, doldecomp/melee)

Game: Super Smash Bros. Melee.

In the NTSC 1.02 version of Super Smash Bros. Melee, ftColl_80079AB0 computes a hit's knockback as D⋅A⋅r⋅(0.01g⋅(c11C⋅(cF8−cF8w1+w)⋅(c110d+c114nd)+c120)+b) capped at c_108. Every c is an unnamed field of p_ftCommonData, which Fighter_LoadCommonData loads from the disc file PlCo.dat, so the constants aren't in the code. Here d is the target's x1830_percent plus x1838_percentTemp, or, while the unnamed flag x2225_b7 is set, c_6D4 (c_6D8 if stamina_dead) plus x1838_percentTemp; n is the hit capsule's unk_count; w is the target's weight attribute times c_F4; g and b are the capsule's unnamed x24 and x2C; r is gm_8016B248(), the match rules' x30, which the VS setup in gm_1601.c sets to 0.1 × the rules' damage_ratio; and A and D are Player_GetAttackRatio for the attacker and Player_GetDefenseRatio for the target. A capsule whose unnamed x28 (k) isn't 0 uses c_118·c_110 + c_114·c_118·k in place of the percent term. The terms sit where Super Smash Bros.'s 0.1, 0.05, 1.4, 18, and its set-knockback 10 and cap 2500 do (ssb64/knockback), and the atlas reads g as the growth and b as the base by that position. Where Super Smash Bros. multiplies by its weight attribute, Melee's weight term equals c_F8 / (1 + w) (computed), so the weight divides. Of the hits a fighter logs in one update, ftColl_8007A06C keeps the largest knockback and writes it to kb_applied; ftCo_Damage_CalcKnockback then multiplies it by kb_squat_mul in ftCo_MS_Squat or ftCo_MS_SquatWait, by kb_ice_mul in ftCo_MS_DamageIce, and by kb_smashcharge_mul while a smash attack charges, rescales it with ftCo_CalcYScaledKnockback when the fighter's vertical scale isn't 1, subtracts the larger of armor0 and armor1 (plus metal_armor for a metal fighter), and raises it to kb_min if it falls below. melee/knockback

About: Super Smash Bros. Melee Knockback

Value
{
 "scalePer": 0.01,
 "weightOne": 1,
 "percent": "PlCo x110",
 "percentTimesDamage": "PlCo x114",
 "weightScale": "PlCo xF4",
 "weightTerm": "PlCo xF8",
 "mul": "PlCo x11C",
 "add": "PlCo x120",
 "setKnockbackAt": "PlCo x118",
 "cap": "PlCo x108"
}
Codemelee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2061-L2069static inline s32 ftColl_GetDamageCount(Fighter* fp, ftCommonData* ftd) { if (fp->x2225_b7) { if (fp->stamina_dead) { return ftd->x6D8; } return ftd->x6D4; } return (s32) fp->dmg.x1830_percent;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2075-L2118#define KNOCKBACK(defense, attack, arg3, one, ftd, hit, w, inner) \ ((defense) * \ ((attack) * \ ((arg3) * ((0.01F * (hit)->x24 * \ ((ftd)->x11C * \ (((ftd)->xF8 - (((w) * (ftd)->xF8) / ((one) + (w)))) * \ (inner)) + \ (ftd)->x120)) + \ (hit)->x2C)))) … float w = weight; w *= ftd->xF4; …melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2120-L2126float ftColl_80079C70(Fighter* fp, Fighter* attacker, HitCapsule* hit, int unk_count) { ftCo_DatAttrs* co = &fp->co_attrs; return ftColl_80079AB0(fp, hit, unk_count, gm_8016B248(), Player_GetAttackRatio(attacker->player_idx), Player_GetDefenseRatio(fp->player_idx), co->weight);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/lb/types.h#L37-L44/* +8 */ u32 unk_count; … /* +24 */ u32 x24; /* +28 */ u32 x28; /* +2C */ u32 x2C;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/types.h#L918/* +088 fp+198 */ float weight;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L182-L189lbArchive_LoadSymbols("PlCo.dat", &data, "ftLoadCommonData", 0); … p_ftCommonData = data->common; // p_ftCommonDatamelee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/gm/gmvs.c#L263-L266f32 gm_8016B248(void) { return gm_GetStartMeleeRules()->x30; }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/gm/gm_1601.c#L3810vs_data->start.rules.x30 = 0.1f * rules->damage_ratio;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2253kb = ftColl_80079C70(fp, attacker_fp, hit, unk_count);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2298-L2307if (kb > best_kb.v) { … best_kb.v = kb; best_idx = i;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2194-L2198struct DmgResult { /* 0x00 */ float dir; /* 0x04 */ int angle; /* 0x08 */ int hurt_height; /* 0x0C */ float kb;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2389out->kb = best_kb.v;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2452ftColl_8007A06C(gobj, &fp->dmg.facing_dir_1, dmg_log0, dmg_log0_idx, 1);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/types.h#L1660-L1663/* fp+1844 */ float facing_dir_1; /* fp+1848 */ int x1848_kb_angle; /* fp+184C */ int x184c_damaged_hurtbox; /* fp+1850 */ float kb_applied;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L2852-L2859forceAppliedOnHit = fp->dmg.kb_applied; … ftCo_Damage_CalcKnockback(fp);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L118-L146void ftCo_Damage_CalcKnockback(Fighter* fp) { if (!fp->dmg.kb_applied) { return; } if (fp->motion_id == ftCo_MS_Squat || fp->motion_id == ftCo_MS_SquatWait) { fp->dmg.kb_applied *= p_ftCommonData->kb_squat_mul; } if (fp->motion_id == ftCo_MS_DamageIce) { fp->dmg.kb_applied *= p_ftCommonData->kb_ice_mul; } if (fp->smash_attrs.state == SmashState_Charging) { …ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · 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) … 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]; … 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]; } if (knockback >= 2500.0F) { knockback = 2500.0F;Checked by claude, 2026-10-22 — read ftColl_80079AB0 and its KNOCKBACK macro whole, ftColl_GetDamageCount, the fighter-hit wrapper ftColl_80079C70, gm_8016B248 and the line in gm_1601.c that fills x30, the best-hit loop and its store through DmgResult into dmg.kb_applied, Fighter_procCollResolve's call to ftCo_Damage_CalcKnockback, and that routine whole; configure.py marks ftcoll.c, fighter.c, ftCo_Damage.c, gmvs.c, and gm_1601.c Matching; set the SSB64 routine beside it

Item hits call the same routine with the item owner's attack ratio (1.0 when the owner isn't a fighter), and environment hits with 1.0 (ftColl_8007A06C cases 2 and 3); ftColl_80079EA8 is a copy with all three ratios at 1. The 0.1 in gm_1601.c is the VS path; gmtoulib.c fills x30 through fn_801653E8. The atlas doesn't fetch PlCo.dat, so no knockback has been worked out for a real hit. That the capsule's unk_count holds the hit's damage, as SSB64's h does, is the atlas's reading by position.

Cited by: Knockback, Super Smash Bros. Melee

In the NTSC 1.02 version of Super Smash Bros. Melee, ftCo_8008DCE0, the routine that puts a hit fighter into a Damage status, sets the unnamed count mv.co.damage.x0 to the knockback (kb_applied) times p_ftCommonData->x154, a value from the disc file PlCo.dat, truncated to a whole number, and to 1 if that comes to 0. It also sets the flag x221C_b6, which ftLib_IsInHitstun returns. Where Super Smash Bros. divides the knockback by 1.875 (ssb64/hitstun), Melee multiplies it by a value the code doesn't hold. The animation routines of the Damage statuses (75 to 86) and the DamageFly statuses (87 to 90) take 1 off the count while it's above 0 (ftCo_8008F744) and clear the flag once it's 0 or below; the status ends when its animation has run out with the flag clear. While the flag is set, their interrupt routines run only doIasa, as the decompilers name it, in place of the wait, fall, or hammer checks, so the fighter can't act, with one exception: after a hit whose angle ftColl_8007AC68 accepts (between unk_kb_angle_min and unk_kb_angle_max), once an unnamed countdown from c_7F0 runs out, an airborne fighter moving down can leave through an air up special (ftCo_800D69C4) or an air jump (ftCo_800CB8E0), which the atlas reads as the meteor cancel. A jump pressed in hitstun otherwise only records the count left. While the flag is set an airborne fighter gets gravity and aerial_friction (ft_80084EEC) in place of fast-fall and drift (ft_80084DB0). A change of motion state clears the flag unless the new state is entered with Ft_MF_SkipHitStun. The DamageFlyRoll status's own routines aren't read here. melee/hitstun

About: Super Smash Bros. Melee Hitstun

Value
{
 "multiplier": "PlCo x154",
 "minimum": 1
}
Codemelee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L263void ftCo_8008DCE0(Fighter_GObj* gobj, int arg1, float facing_dir)melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L282-L291float kb_applied = fp->dmg.kb_applied; … scaled_kb_154 = kb_applied * p_ftCommonData->x154; fp->mv.co.damage.x0 = (int) scaled_kb_154; if (!fp->mv.co.damage.x0) { fp->mv.co.damage.x0 = 1; }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L60-L73int ftCo_803C5520[2][4][3] = { { { 81, 78, 75 }, { 82, 79, 76 }, { 83, 80, 77 }, { 89, 88, 87 }, }, { { 84, 84, 84 }, { 85, 85, 85 }, { 86, 86, 86 }, { 89, 88, 87 },melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L405Fighter_ChangeMotionState(gobj, msid, 0x40U, 0, 1, 0, NULL);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L423fp->x221C_b6 = true;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftlib.c#L665-L669bool ftLib_IsInHitstun(HSD_GObj* gobj) { Fighter* fp = GET_FIGHTER(gobj); return fp->x221C_b6; }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L843-L852void ftCo_8008F744(Fighter_GObj* gobj) { Fighter* fp = GET_FIGHTER(gobj); if (fp->mv.co.damage.x0 > 0) { fp->mv.co.damage.x0 -= 1; } if (fp->x221C_b6) { if (fp->mv.co.damage.x0 <= 0) { fp->x221C_b6 = false;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L872-L876void ftCo_Damage_Anim(Fighter_GObj* gobj) { Fighter* fp = GET_FIGHTER(gobj); ftCo_8008F744(gobj); if (!ftAnim_IsFramesRemaining(gobj) && !fp->x221C_b6) {melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L890-L914bool doIasa(Fighter_GObj* gobj) { Fighter* fp = gobj->user_data; if (fp->mv.co.damage.x1A) { if (fp->mv.co.damage.x1B) { --fp->mv.co.damage.x1B; } if (!fp->mv.co.damage.x1B && fp->ground_or_air == GA_Air && fp->x8c_kb_vel.y < 0 && (ftCo_800D69C4(gobj) || ftCo_800CB8E0(gobj))) … if (ftCo_Jump_GetInput(gobj)) { …melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L916-L941void ftCo_Damage_IASA(Fighter_GObj* gobj) { Fighter* fp = gobj->user_data; if (!fp->x221C_b6) { if (ftCo_800C5240(gobj)) { if (fp->ground_or_air == GA_Air) { ftCo_HammerFall_IASA(gobj); } else { ftCo_HammerWait_IASA(gobj); } } else { … …melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L79-L85float ftCo_Damage_CalcAngle(Fighter* fp, float f) { if (fp->dmg.x1848_kb_angle != 361) { if (ftColl_8007AC68(fp->dmg.x1848_kb_angle)) { fp->mv.co.damage.x1A = 1; fp->mv.co.damage.x1B = p_ftCommonData->x7F0; }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L312-L314fp->mv.co.damage.x1A = 0; fp->mv.co.damage.x14 = 0; kb_angle = ftCo_Damage_CalcAngle(fp, kb_applied);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2481-L2489bool ftColl_8007AC68(u32 kb_angle) { if (kb_angle != 361 && p_ftCommonData->unk_kb_angle_min <= kb_angle && kb_angle <= p_ftCommonData->unk_kb_angle_max) { return true; } return false; }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Attack100.c#L103-L111bool ftCo_800D69C4(Fighter_GObj* gobj) … ftData_SpecialAirHi[fp->kind](gobj); return true;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_JumpAerial.c#L73-L83bool ftCo_800CB8E0(Fighter_GObj* gobj) … return ftCo_JumpAerial_CheckInput(gobj, true);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L943-L951void ftCo_Damage_Phys(Fighter_GObj* gobj) { Fighter* fp = gobj->user_data; if (fp->ground_or_air == GA_Air) { if (!fp->x221C_b6) { ft_80084DB0(gobj); } else { ft_80084EEC(gobj); }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ft_084E.c#L34-L41void ft_80084EEC(Fighter_GObj* gobj) … ftCommon_Fall(fp, co_attrs->gravity, co_attrs->terminal_velocity); ftCommon_CalcSelfAccel_Deaccel(fp, co_attrs->aerial_friction);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ft_081B.c#L1371-L1382void ft_80084DB0(Fighter_GObj* gobj) … ftCommon_CheckFallFast(fp); if (fp->fall_fast) { ftCommon_FallFast(fp); … ftCommon_CalcSelfAccel_Drift(fp);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L1032-L1050void ftCo_DamageFly_Anim(Fighter_GObj* gobj) … ftCo_8008F744(gobj); if (!ftAnim_IsFramesRemaining(gobj) && !fp->x221C_b6) { … void ftCo_DamageFly_IASA(Fighter_GObj* gobj) { if (!GET_FIGHTER(gobj)->x221C_b6) { ftCo_DamageFall_IASA(gobj); } else { RETURN_IF(doIasa(gobj)); }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Damage.c#L1062-L1070static void inlineE0(Fighter_GObj* gobj) { Fighter* fp = GET_FIGHTER(gobj); if (!fp->x221C_b6) { ft_80084DB0(gobj); } else { ft_80084EEC(gobj); }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftmotionstates.c#L960-L966// ftCo_MS_DamageHi1 = 75 ftCo_SM_DamageHi1, ftCo_MF_Damage, FtMoveId_Default << 24, ftCo_Damage_Anim, ftCo_Damage_IASA, ftCo_Damage_Phys,melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftmotionstates.c#L1092-L1098// ftCo_MS_DamageFlyHi = 87 … ftCo_DamageFly_Anim, ftCo_DamageFly_IASA, ftCo_DamageFly_Phys,melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L1035-L1037if (((flags & Ft_MF_SkipHitStun) == 0) && (fp->x221C_b6 != 0U)) { fp->x221C_b6 = 0;ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftparam.c#L1505-L1508f32 ftParamGetHitStun(f32 knockback) { return knockback / 1.875F; }Checked by claude, 2026-10-22 — read ftCo_8008DCE0 from its knockback read to the motion change and the flag, the status table it picks from, ftLib_IsInHitstun, ftCo_8008F744, the Damage and DamageFly anim, IASA, and physics routines, doIasa and the angle check that arms it, the two cancel routines it calls, the two air-physics routines, the motion-table rows for statuses 75 to 90, and the flag clear in Fighter_ChangeMotionState; every file is Matching in configure.py; set ftParamGetHitStun from the SSB64 decompilation beside it

The count is stored as an int from a float product, so it truncates. The same product picks the damage animation's level against PlCo's x158, x15C, and x160 and the camera shake against x170 and x174. Whether a status's animation routine runs once per displayed frame isn't read here, so the count isn't stated in seconds. Rows 76 to 86 and 88 to 90 of the motion table (ftmotionstates.c) name the same routines as the two cited; 91 is DamageFlyRoll.

Cited by: Hitstun, Super Smash Bros. Melee

In the NTSC 1.02 version of Super Smash Bros. Melee, a fighter's shield_health is a float that starts at x260_startShieldHealth. Each time Fighter_procCollResolve runs for a fighter that isn't asleep (is_sleeping), a fighter whose unnamed flag x221A_b7 is clear regains c_27C, up to the start value. That flag is set when the guard statuses switch on the shield's collision (ftColl_8007B1B8), and the atlas reads it as "shield up". While it's set, the fighter instead loses c_284 × s × (1 − (l·(c_2E0 − c_2DC) + c_2DC)) + c_288, where s is x19A0_shieldDamageTaken, each shield hit's damage plus its unnamed x34 (a fighter's hit counts only while the flag x221C_b2, set on entering ftCo_MS_GuardReflect, is clear), and l is lightshield_amount. Below 0, the health is set to x280_unkShieldHealth, and on the hit path the shield break (ftCo_80098B20, which enters ftCo_MS_ShieldBreakFly) starts only in the branch taken when the fighter has no knockback to apply (kb_applied is 0), the unnamed x18a0 is 0, and a shield hit is recorded (x19A4). While the fighter holds the shield, the animation routines of ftCo_MS_GuardOn and ftCo_MS_Guard call ftCo_800925A4, which, while x221B_b0 is set, sets l from the analog trigger past its deadzone, (trigger − deadzone) / (1 − deadzone), keeping the old value when that's negative, and takes c_278 × (l·(c_2F0 − c_2EC) + c_2EC) off the health; below 0 it sets the health to 0 and starts the shield break. Every c is a field of p_ftCommonData, from the disc file PlCo.dat, so the numbers aren't in the code. Where Super Smash Bros. counts whole points from a fixed 55 and resets to 30, with no say for how hard the button is pressed (ssb64/shield), Melee's wear while held and its damage from hits both depend on l. melee/shield

About: Super Smash Bros. Melee Blocking

Value
{
 "start": "PlCo x260",
 "afterBreak": "PlCo x280",
 "regenPerUpdate": "PlCo x27C",
 "heldWear": "PlCo x278, x2EC, x2F0",
 "hitScale": "PlCo x284, x288, x2DC, x2E0"
}
Codemelee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L420fp->shield_health = p_ftCommonData->x260_startShieldHealth;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/types.h#L1741-L1743/* fp+1998 */ float shield_health; /* fp+199C */ float lightshield_amount; /* fp+19A0 */ s32 x19A0_shieldDamageTaken;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L2806-L2842void Fighter_procCollResolve(Fighter_GObj* gobj) … if (!fp->is_sleeping) { if (!fp->x221A_b7) { if (fp->shield_health < p_ftCommonData->x260_startShieldHealth) { fp->shield_health += p_ftCommonData->x27C; if (fp->shield_health > p_ftCommonData->x260_startShieldHealth) { fp->shield_health = p_ftCommonData->x260_startShieldHealth; } } } …melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L2853if (forceAppliedOnHit) {melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L2907-L2912} else if (fp->dmg.x18a0) { … } else if (fp->x19A4) { if (bool3) { ftCo_80098B20(gobj);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_ShieldBreakFly.c#L21-L26void ftCo_80098B20(Fighter_GObj* gobj) … Fighter_ChangeMotionState(gobj, ftCo_MS_ShieldBreakFly, Ft_MF_Unk06, 0, 1,melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L301-L304if (!fp1->x221C_b2) { int tmp_dmg = int_dmg + hit0->x34; PAD_STACK(4); fp1->x19A0_shieldDamageTaken += tmp_dmg < 0 ? 0 : tmp_dmg;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L763-L770int total = dmg + hurt->x34; … fp->x19A0_shieldDamageTaken += clamped_total;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Guard.c#L899-L910void ftCo_8009388C(HSD_GObj* gobj) … Fighter_ChangeMotionState(gobj, ftCo_MS_GuardReflect, … fp->x221C_b2 = true;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Guard.c#L507-L526void ftCo_80092908(Fighter_GObj* gobj) … Fighter_ChangeMotionState(gobj, ftCo_MS_Guard, Ft_MF_SkipAnim, 0, 1, 0, … ftColl_8007B1B8(gobj, (ShieldDesc*) &absorb, ftCo_80092E50); fp2->x221A_b7 = true;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftcoll.c#L2651-L2654void ftColl_8007B1B8(Fighter_GObj* gobj, ShieldDesc* shield, HSD_GObjEvent cb) { Fighter* fp = GET_FIGHTER(gobj); fp->x221B.x221B_b0 = true;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Guard.c#L400-L427bool ftCo_800925A4(HSD_GObj* gobj) … if (fp->x221B.x221B_b0) { fp->mv.co.guard.x2C = fp->lightshield_amount; { fp->lightshield_amount = (fp->input.triggers[0] - p_ftCommonData->analog_shoulder_deadzone) / (1 - p_ftCommonData->analog_shoulder_deadzone) < 0 ? fp->mv.co.guard.x2C : (fp->input.triggers[0] - …melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Guard.c#L440-L444void ftCo_GuardOn_Anim(Fighter_GObj* gobj) { Fighter* fp = gobj->user_data; fp->mv.co.guard.x0 += 1; if (ftCo_800925A4(gobj) == 0) {melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_Guard.c#L530-L535void ftCo_Guard_Anim(Fighter_GObj* gobj) … if (!ftCo_800925A4(gobj)) {melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftmotionstates.c#L2093-L2108// ftCo_MS_GuardOn = 178 … ftCo_GuardOn_Anim, … // ftCo_MS_Guard = 179 … ftCo_Guard_Anim,ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · 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_health -= fp->shield_damage_total; … if (fp->shield_health <= 0) { fp->shield_health = (fp->fkind == nFTKindYoshi) ? 30 : 30;Checked by claude, 2026-10-22 — read the start value in fighter.c, the shield block of Fighter_procCollResolve and the branch chain that reaches the break, ftCo_80098B20, the two places a hit adds to x19A0_shieldDamageTaken, ftCo_8009388C, ftCo_80092908 and ftColl_8007B1B8 for the two flags, ftCo_800925A4 to its break, and the GuardOn and Guard anim routines and their motion-table rows; every file is Matching in configure.py; set the SSB64 start, regeneration, and break lines beside it

Fighter_ChangeMotionState clears x221A_b7 (fighter.c L1050), so the shield counts as down in any status that doesn't set it again. The shield's drawn size scales with shield_health / x260_startShieldHealth (ftCo_Guard.c L183). A digital L or R press sets the trigger to 1.0 (fighter.c L1887-L1889), so l is 1 at a full press. Yoshi's guard (ftyoshiguard.c) is its own code and isn't read here. The decompilers' comment on PlCo's powershield_input_window names the reflect status's input as "a powershield".

Cited by: Blocking, Super Smash Bros. Melee

In the NTSC 1.02 version of Super Smash Bros. Melee, an aerial attack (statuses ftCo_MS_AttackAirN to ftCo_MS_AttackAirLw) that touches down calls ftCo_LandingAir_EnterWithLag from its collision routine ftCo_AttackAir_Coll, through ft_80082C74, which calls it when the unnamed ft_80081D0C returns true. If the move's command script has set cmd_vars[0], which entering the aerial clears, the fighter enters that aerial's LandingAir status with the fighter's landing-lag attribute for it (landingairn_lag and the four like it), and the animation plays at a rate of (ftAnim_8006F484 + 0.1) / lag, where ftAnim_8006F484 returns the animation's end frame. If the unnamed count x67F is below c_E4 at that moment, the lag is first divided by c_E8, truncated to a whole number, and raised to 1 if that's 0; c_E4 and c_E8 are p_ftCommonData fields from PlCo.dat, so the window and divisor aren't in the code. Fighter_procInput sets x67F to 0 on an update where the HSD_PAD_LR bit is newly pressed and otherwise adds 1, up to 255. That bit is on while L or R is held, while the analog trigger is past its deadzone, or while Z is held unless gm_GetDbPauseFlag(0) is true, and it's off while the unnamed gm_8016B0FC is true. Without cmd_vars[0], the fighter takes the basic landing (ftCo_Landing_Enter_Basic). Super Smash Bros. reads the same moment differently (ftCommonAttackAirProcMap): when the aerial's flag1 is clear or Z was pressed no more than 10 counts before (tics_since_last_z ≤ 10), it skips the aerial's landing lag outright, landing in Wait if the air speed is above −20 and in Landing otherwise, where Melee divides the lag. melee/l-cancel

About: Super Smash Bros. Melee Landing lag

Value
{
 "window": "PlCo xE4",
 "divisor": "PlCo xE8",
 "minimum": 1,
 "rateAdd": 0.1,
 "counterMax": 255,
 "ssb64ZWindow": 10,
 "ssb64SkipVelY": -20
}
Codemelee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_LandingAir.c#L14-L56void ftCo_LandingAir_EnterWithLag(Fighter_GObj* gobj) … if (fp->cmd_vars[0]) { switch (fp->motion_id) { case ftCo_MS_AttackAirN: lag = fp->co_attrs.landingairn_lag; msid = ftCo_MS_LandingAirN; break; … if (msid != ftCo_MS_None && fp->x67F < p_ftCommonData->xE4) { float div_lag = lag / p_ftCommonData->xE8; int int_lag = div_lag; …melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_LandingAir.c#L59-L65void ftCo_LandingAir_EnterWithMsidLag(Fighter_GObj* gobj, FtMotionId msid, float lag) … Fighter_ChangeMotionState(gobj, msid, Ft_MF_None, 0, 1, 0, NULL); ftAnim_SetAnimRate(gobj, (ftAnim_8006F484(gobj) + 0.1f) / lag);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftanim.c#L575-L582float ftAnim_8006F484(Fighter_GObj* fighter_gobj) … return lbGetJObjEndFrame(jobj); } return lbGetJObjEndFrame(fp->x8AC_animSkeleton);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_AttackAir.c#L125-L129void ftCo_AttackAir_EnterFromMsid(Fighter_GObj* gobj, FtMotionId msid) … fp->cmd_vars[0] = 0;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/kinds/ftCommon/ftCo_AttackAir.c#L189-L191void ftCo_AttackAir_Coll(Fighter_GObj* gobj) { ft_80082C74(gobj, ftCo_LandingAir_EnterWithLag);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftmotionstates.c#L850-L857// ftCo_MS_AttackAirN = 65 … ftCo_AttackAir_Coll,melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ft_081B.c#L548-L554void ft_80082C74(Fighter_GObj* gobj, HSD_GObjEvent cb) { bool var_r0 = ft_80081D0C(gobj); PAD_STACK(8); if (var_r0) { cb(gobj); }melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/ftaction.c#L456-L462void ftAction_80071820(Fighter_GObj* gobj, CommandInfo* cmd) … switch (cmd->x8.u->set_cmd_var.idx) { case 0: fp->cmd_vars[0] = cmd->x8.u->set_cmd_var.value;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/types.h#L947-L951/* +0E8 fp+1F8 */ float landingairn_lag; /* +0EC fp+1FC */ float landingairf_lag; /* +0F0 fp+200 */ float landingairb_lag; /* +0F4 fp+204 */ float landingairhi_lag; /* +0F8 fp+208 */ float landingairlw_lag;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L1879-L1898if (gm_8016B0FC()) { fp->input.triggers[0] = 0.0f; if (ftCo_IsCpuControlled(fp)) { fp->input.held_buttons[0] &= HSD_PAD_A | HSD_PAD_XY; } else { fp->input.held_buttons[0] &= HSD_PAD_A; } } else { if (fp->input.held_buttons[0] & (HSD_PAD_L | HSD_PAD_R)) { fp->input.held_buttons[0] |= HSD_PAD_LR; fp->input.triggers[0] = 1.0f; } else if (fp->input.triggers[0]) { …melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L1866-L1869if (fp->input.triggers[0] <= p_ftCommonData->analog_shoulder_deadzone) { fp->input.triggers[0] = 0.0f;melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L1759-L1765static void Fighter_procInput_Inner1(Fighter* fp) … temp0_loc_0 = (fp->input.held_buttons[0] & (fp->input.held_buttons[1] ^ fp->input.held_buttons[0]));melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L1902Fighter_procInput_Inner1(fp);melee: a decompilation of Super Smash Bros. Melee (doldecomp/melee) · src/melee/ft/fighter.c#L2105-L2109if (fp->input.pressed_buttons & HSD_PAD_LR) { fp->x67F = 0; } else if (fp->x67F < 255) { fp->x67F++; }ssb-decomp-re: a decompilation of Super Smash Bros. (VetriTheRetri/ssb-decomp-re) · src/ft/ftcommon/ftcommonattackair.c#L53-L74void ftCommonAttackAirProcMap(GObj *fighter_gobj) … if (mpCommonCheckFighterLanding(fighter_gobj) != FALSE) { if ((fp->motion_vars.flags.flag1 != 0) && (fp->tics_since_last_z > FTCOMMON_ATTACKAIR_SMOOTHLANDING_TICS_MAX)) { … ftCommonLandingAirSetStatus(fighter_gobj); } else ftCommonLandingAirNullSetStatus(fighter_gobj, F_PCT_TO_DEC(fp->motion_vars.flags.flag1)); } else if (fp->physics.vel_air.y > FTCOMMON_ATTACKAIR_SKIPLANDING_VEL_Y_MAX) …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#L190fp->motion_vars.flags.flag1 = 0;Checked by claude, 2026-10-22 — read ftCo_LandingAir_EnterWithLag and EnterWithMsidLag whole, ftAnim_8006F484, the aerial entry that clears cmd_vars[0] and the script command that sets it, ftCo_AttackAir_Coll and ft_80082C74, the AttackAirN motion-table row, the five lag attributes, and Fighter_procInput from the trigger deadzone through the LR bit, the newly-pressed mask, and the x67F count; every file is Matching in configure.py; then read the SSB64 aerial landing routine, its two constants, the Z count in ftMainProcUpdateInterrupt, and the flag1 clear at the aerial's start, no REGION_ conditional enclosing them

Peach's float attacks call the same routine (ftpeachfloatattack.c). Which aerials set cmd_vars[0], and when, is in each fighter's move scripts, which are disc data; the community name for landing without it is an auto-cancel, and the reduced landing is the L-cancel. In Super Smash Bros., an aerial whose LandingAir animation is missing uses ftCommonLandingAirNullSetStatus with flag1 as a percentage.

Cited by: Landing lag, Super Smash Bros. Melee