On this page
  1. Related
  2. Games
  3. References
  4. Sources

Blocking stops an attack while the defender holds it. Super Smash Bros. gives each fighter a shield with 55 points1 of health that wears down while held and when hit, and breaks when empty1. In its NTSC 1.02 version, Super Smash Bros. Melee makes the shield’s wear while held and its damage from hits both depend on how far the analog trigger is pressed2. Street Fighter III: 3rd Strike adds a parry: a lever tap opens a window of 10 passes3 of the input check, and a hit that lands in it is parried instead of guarded3.

  • Guard meterSuper Smash Bros. (1999). A shield of 55 points wears down while held and when hit, and breaks at 0, coming back at 30.1Super Smash Bros. Melee (2001). A shield whose wear while held and damage from hits both depend on how far the analog trigger is pressed.2
  • ParryStreet Fighter III: 3rd Strike (1999). A tap of the lever opens a 10-pass parry window (7 in the air), and a hit that lands in it is parried instead of guarded.3

Games

GameYearHowNote
Super Smash Bros.1999Guard metera shield of 55 points wears down while held and when hit, and breaks at 0, coming back at 30
Super Smash Bros. Melee2001Guard metera shield whose wear while held and damage from hits both depend on how far the analog trigger is pressed
Street Fighter III: 3rd Strike1999Parrya tap of the lever opens a 10-pass parry window (7 in the air), and a hit that lands in it is parried instead of guarded
Every claim about this mechanic, by game (2)
Super Smash Bros. 1999In 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).Code
Super Smash Bros. Melee 2001In 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.Code

References

  1. ^ abcIn 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).CodeVetriTheRetri/ssb-decomp-rerevised
    How we know
    431    fp->shield_health = (fp->fkind == nFTKindYoshi) ? 55 : 55;
    
    src/ft/ftmanager.c line 431 at 572a747 · upstream ↗
    3837    if (!(fp->is_shield) && (fp->shield_health < 55))
    ⋮
    3839        fp->shield_heal_wait--;
    ⋮
    3841        if (fp->shield_heal_wait == 0.0F)
    ⋮
    3843            fp->shield_health++;
    ⋮
    3845            fp->shield_heal_wait = 10.0F;
    ⋮
    3848    fp->shield_health -= fp->shield_damage_total;
    ⋮
    3850    if (fp->shield_health <= 0)
    ⋮
    3852        fp->shield_health = (fp->fkind == nFTKindYoshi) ? 30 : 30;
    ⋮
    3854        is_shieldbreak = TRUE;
    
    src/ft/ftmain.c lines 3837–3854 at 572a747 · upstream ↗
    3856    if (fp->damage_knockback != 0.0F)
    
    src/ft/ftmain.c line 3856 at 572a747 · upstream ↗
    3925    else if (fp->shield_damage != 0)
    ⋮
    3927        if (is_shieldbreak != FALSE)
    ⋮
    3929            ftCommonShieldBreakFlyCommonSetStatus(fighter_gobj);
    
    src/ft/ftmain.c lines 3924–3929 at 572a747 · upstream ↗
    2072    victim_fp->shield_damage_total += (attack_coll->damage + attack_coll->shield_damage);
    
    src/ft/ftmain.c line 2072 at 572a747 · upstream ↗
    2264    fp->shield_damage_total += damage + wp_attack_coll->shield_damage;
    
    src/ft/ftmain.c line 2264 at 572a747 · upstream ↗
    2446    fp->shield_damage_total += damage + it_attack_coll->shield_damage;
    
    src/ft/ftmain.c line 2446 at 572a747 · upstream ↗
    72void ftCommonGuardUpdateShieldVars(GObj *fighter_gobj)
    ⋮
    76    if (fp->is_shield)
    ⋮
    78        if (fp->status_vars.common.guard.shield_decay_wait != 0)
    ⋮
    80            fp->status_vars.common.guard.shield_decay_wait--;
    ⋮
    82            if (fp->status_vars.common.guard.shield_decay_wait == 0)
    ⋮
    84                fp->shield_health--;
    ⋮
    86                if (fp->shield_health != 0)
    ⋮
    88                    fp->status_vars.common.guard.shield_decay_wait = FTCOMMON_GUARD_DECAY_INT;
    
    src/ft/ftcommon/ftcommonguard1.c lines 71–88 at 572a747 · upstream ↗
    234#define FTCOMMON_GUARD_DECAY_INT 16
    
    src/ft/ftcommon.h line 234 at 572a747 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Revised after a check by a second AI model, 2026-10-22.

    In the claim ledger

  2. ^ abIn 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.Codedoldecomp/melee · VetriTheRetri/ssb-decomp-rerevised
    How we know
    420    fp->shield_health = p_ftCommonData->x260_startShieldHealth;
    
    src/melee/ft/fighter.c line 420 at f0cdbb0 · upstream ↗
    1741    /* fp+1998 */ float shield_health;
    1742    /* fp+199C */ float lightshield_amount;
    1743    /* fp+19A0 */ s32 x19A0_shieldDamageTaken;
    
    src/melee/ft/types.h lines 1741–1743 at f0cdbb0 · upstream ↗
    2806void Fighter_procCollResolve(Fighter_GObj* gobj)
    ⋮
    2816    if (!fp->is_sleeping) {
    2817        if (!fp->x221A_b7) {
    2818            if (fp->shield_health < p_ftCommonData->x260_startShieldHealth) {
    2819                fp->shield_health += p_ftCommonData->x27C;
    2820                if (fp->shield_health > p_ftCommonData->x260_startShieldHealth)
    ⋮
    2822                    fp->shield_health = p_ftCommonData->x260_startShieldHealth;
    ⋮
    2827        if (fp->x221A_b7) {
    2828            fp->shield_health -=
    2829                (p_ftCommonData->x284 *
    2830                 ((fp->x19A0_shieldDamageTaken) *
    2831                  (1.0f - ((fp->lightshield_amount *
    ⋮
    
    src/melee/ft/fighter.c lines 2806–2842 at f0cdbb0 · upstream ↗
    2853        if (forceAppliedOnHit) {
    
    src/melee/ft/fighter.c line 2853 at f0cdbb0 · upstream ↗
    2907        } else if (fp->dmg.x18a0) {
    ⋮
    2910        } else if (fp->x19A4) {
    2911            if (bool3) {
    2912                ftCo_80098B20(gobj);
    
    src/melee/ft/fighter.c lines 2907–2912 at f0cdbb0 · upstream ↗
    21void ftCo_80098B20(Fighter_GObj* gobj)
    ⋮
    25    Fighter_ChangeMotionState(gobj, ftCo_MS_ShieldBreakFly, Ft_MF_Unk06, 0, 1,
    
    src/melee/ft/kinds/ftCommon/ftCo_ShieldBreakFly.c lines 21–26 at f0cdbb0 · upstream ↗
    301        if (!fp1->x221C_b2) {
    302            int tmp_dmg = int_dmg + hit0->x34;
    303            PAD_STACK(4);
    304            fp1->x19A0_shieldDamageTaken += tmp_dmg < 0 ? 0 : tmp_dmg;
    
    src/melee/ft/ftcoll.c lines 301–304 at f0cdbb0 · upstream ↗
    763        int total = dmg + hurt->x34;
    ⋮
    770        fp->x19A0_shieldDamageTaken += clamped_total;
    
    src/melee/ft/ftcoll.c lines 763–770 at f0cdbb0 · upstream ↗
    899void ftCo_8009388C(HSD_GObj* gobj)
    ⋮
    902    Fighter_ChangeMotionState(gobj, ftCo_MS_GuardReflect,
    ⋮
    910    fp->x221C_b2 = true;
    
    src/melee/ft/kinds/ftCommon/ftCo_Guard.c lines 899–910 at f0cdbb0 · upstream ↗
    507void ftCo_80092908(Fighter_GObj* gobj)
    ⋮
    510    Fighter_ChangeMotionState(gobj, ftCo_MS_Guard, Ft_MF_SkipAnim, 0, 1, 0,
    ⋮
    523            ftColl_8007B1B8(gobj, (ShieldDesc*) &absorb, ftCo_80092E50);
    524            fp2->x221A_b7 = true;
    
    src/melee/ft/kinds/ftCommon/ftCo_Guard.c lines 507–526 at f0cdbb0 · upstream ↗
    2651void ftColl_8007B1B8(Fighter_GObj* gobj, ShieldDesc* shield, HSD_GObjEvent cb)
    ⋮
    2653    Fighter* fp = GET_FIGHTER(gobj);
    2654    fp->x221B.x221B_b0 = true;
    
    src/melee/ft/ftcoll.c lines 2651–2654 at f0cdbb0 · upstream ↗
    400bool ftCo_800925A4(HSD_GObj* gobj)
    ⋮
    404    if (fp->x221B.x221B_b0) {
    405        fp->mv.co.guard.x2C = fp->lightshield_amount;
    ⋮
    407            fp->lightshield_amount =
    408                (fp->input.triggers[0] -
    409                 p_ftCommonData->analog_shoulder_deadzone) /
    410                            (1 - p_ftCommonData->analog_shoulder_deadzone) <
    ⋮
    412                    ? fp->mv.co.guard.x2C
    413                    : (fp->input.triggers[0] -
    414                       p_ftCommonData->analog_shoulder_deadzone) /
    415                          (1 - p_ftCommonData->analog_shoulder_deadzone);
    ⋮
    417        fp->shield_health -= p_ftCommonData->x278 *
    ⋮
    
    src/melee/ft/kinds/ftCommon/ftCo_Guard.c lines 400–427 at f0cdbb0 · upstream ↗
    440void ftCo_GuardOn_Anim(Fighter_GObj* gobj)
    ⋮
    442    Fighter* fp = gobj->user_data;
    443    fp->mv.co.guard.x0 += 1;
    444    if (ftCo_800925A4(gobj) == 0) {
    
    src/melee/ft/kinds/ftCommon/ftCo_Guard.c lines 440–444 at f0cdbb0 · upstream ↗
    530void ftCo_Guard_Anim(Fighter_GObj* gobj)
    ⋮
    535    if (!ftCo_800925A4(gobj)) {
    
    src/melee/ft/kinds/ftCommon/ftCo_Guard.c lines 530–535 at f0cdbb0 · upstream ↗
    2093        // ftCo_MS_GuardOn = 178
    ⋮
    2097        ftCo_GuardOn_Anim,
    ⋮
    2104        // ftCo_MS_Guard = 179
    ⋮
    2108        ftCo_Guard_Anim,
    
    src/melee/ft/ftmotionstates.c lines 2093–2108 at f0cdbb0 · upstream ↗
    431    fp->shield_health = (fp->fkind == nFTKindYoshi) ? 55 : 55;
    
    src/ft/ftmanager.c line 431 at 572a747 · upstream ↗
    3837    if (!(fp->is_shield) && (fp->shield_health < 55))
    ⋮
    3848    fp->shield_health -= fp->shield_damage_total;
    ⋮
    3850    if (fp->shield_health <= 0)
    ⋮
    3852        fp->shield_health = (fp->fkind == nFTKindYoshi) ? 30 : 30;
    
    src/ft/ftmain.c lines 3837–3854 at 572a747 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Revised after a check by a second AI model, 2026-10-22.

    In the claim ledger

  3. ^ abcIn the PS2 port of Street Fighter III: 3rd Strike that crowded-street/3s-decomp rebuilds (the Street Fighter Anniversary Collection build), the parry is an input command that check_10 in CMD_MAIN.c reads. Once the lever has been neutral, a fresh lever press equal to the command's lever value (4 for the high parry and the air parry, 2 for the low one; the whole lever is compared, so a diagonal doesn't match; the air parry only while the character is above the ground) sets the parry's counter in waza_flag to the command's reset value, and command_ok_move takes 1 off it on every pass, the tap's own included. When a press sets one parry counter, check_10 zeroes each of the other parry counters (entries 3, 4, 5, 6, and 12) that is smaller than the new one, and an air parry press (entry 5) is zeroed at once while the entry-6 command's free3 is above 0. The command tables every character shares give reset 11 for the high and low parries (entries 3 and 4), 8 for the air parry (entry 5), and 6 for entry 12, so the counter stays nonzero for 10, 7, and 5 passes (computed). defense_ground checks entry 12, not entry 3, against a jumping attack parried high (guard bit 2 with jump_att_flag); a jumping attack parried low still uses entry 4, and both of those branches are gated by bit 0x800. The System Direction setting adds −2, 0, 2, or 4 to each, and its defaults add 0. The window closes early if the held lever turns to another value or includes bit 8, if it's still held 6 passes after the press, or if any direction is pressed after it's let go. The command arms again only after a second counter, set to reset plus 10, has counted below zero. While the defender's guard_chuu isn't 1 to 4 (the test is guard_chuu != 0 && guard_chuu < 5), defense_ground and defense_sky turn a hit that the attack's guard bits let it parry into a parry when the matching counter is nonzero, unless the defender is stunned, its guard_flag has bit 2 set, or a System Direction setting has switched that parry off.Codecrowded-street/3s-decomprevised
    How we know
    610void check_10() {
    611    switch (waza_ptr->shot_ok) {
    612    case 0:
    613        if (chk_pl->sw_lever == 0) {
    614            waza_ptr->shot_ok++;
    ⋮
    618    case 1:
    619        if ((cmd_pl->wu.xyz[1].disp.pos > 0 || (waza_type[cmd_id] != 5 && waza_type[cmd_id] != 6)) &&
    620            chk_pl->now_lvbt & 0xF) {
    621            if (chk_pl->sw_lever == waza_ptr->w_lvr) {
    622                waza_ptr->shot_ok++;
    623                wcp[cmd_id].waza_flag[waza_type[cmd_id]] = wcp[cmd_id].reset[waza_type[cmd_id]];
    624                waza_ptr->free3 = wcp[cmd_id].reset[waza_type[cmd_id]] + 10;
    ⋮
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c lines 610–625 at be9b9bc · upstream ↗
    627                switch (waza_type[cmd_id]) {
    628                case 3:
    629                    if (wcp[cmd_id].waza_flag[3] > wcp[cmd_id].waza_flag[4]) {
    630                        wcp[cmd_id].waza_flag[4] = 0;
    ⋮
    634                        wcp[cmd_id].waza_flag[5] = 0;
    ⋮
    641                    if (wcp[cmd_id].waza_flag[3] > wcp[cmd_id].waza_flag[12]) {
    642                        wcp[cmd_id].waza_flag[12] = 0;
    ⋮
    649                        wcp[cmd_id].waza_flag[3] = 0;
    ⋮
    653                        wcp[cmd_id].waza_flag[5] = 0;
    ⋮
    661                        wcp[cmd_id].waza_flag[12] = 0;
    ⋮
    666                case 5:
    ⋮
    668                        wcp[cmd_id].waza_flag[3] = 0;
    ⋮
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c lines 627–728 at be9b9bc · upstream ↗
    739    case 2:
    740        waza_ptr->w_int--;
    741        waza_ptr->free3--;
    ⋮
    743        if (waza_ptr->w_int > 0) {
    744            if (chk_pl->sw_lever == 0) {
    745                waza_ptr->shot_ok++;
    746                break;
    ⋮
    749            if (chk_pl->sw_lever & 8) {
    750                wcp[cmd_id].waza_flag[waza_type[cmd_id]] = 0;
    751                waza_ptr->shot_ok++;
    752                break;
    ⋮
    755            if (chk_pl->sw_lever != waza_ptr->w_lvr) {
    ⋮
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c lines 739–785 at be9b9bc · upstream ↗
    107    for (j = 0; j < 56; j++) {
    108        if (wcp[cmd_id].waza_flag[j] != -1) {
    ⋮
    111            waza_ptr = &waza_work[cmd_id][j];
    112            chk_move_jp[waza_ptr->w_type]();
    ⋮
    116    for (j = 0; j < 56; j++) {
    117        if ((wcp[cmd_id].waza_flag[j] != -1) && (wcp[cmd_id].waza_flag[j] != 0)) {
    118            waza_ptr = &waza_work[cmd_id][j];
    119            command_ok_move(j);
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c lines 107–121 at be9b9bc · upstream ↗
    1530void command_ok_move(s16 waza_num) {
    1531    if (dead_lvr_check()) {
    ⋮
    1536    wcp[cmd_id].waza_flag[waza_num]--;
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c lines 1530–1536 at be9b9bc · upstream ↗
    9void (*chk_move_jp[28])() = { check_init, check_0,  check_1,  check_2,  check_3,  check_4,  check_5,
    10                              check_6,    check_7,  check_7,  check_9,  check_10, check_11, check_12,
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c lines 9–10 at be9b9bc · upstream ↗
    124void check_init() {
    125    cmd_tbl_ptr += 12;
    126    waza_ptr->w_type = *cmd_tbl_ptr++;
    127    waza_ptr->w_int = *cmd_tbl_ptr++;
    128    waza_ptr->free1 = *cmd_tbl_ptr;
    129    waza_ptr->free2 = *cmd_tbl_ptr++;
    130    waza_ptr->w_lvr = *cmd_tbl_ptr++;
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c lines 124–130 at be9b9bc · upstream ↗
    37    wcp[cmd_id].reset[i] = *cmd_tbl_ptr++;
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c line 37 at be9b9bc · upstream ↗
    43const s16 pc_cmd_03[17] = { 11, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 11, 0, 0, 4, 28 };
    ⋮
    45const s16 pc_cmd_04[17] = { 11, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 11, 0, 0, 2, 28 };
    ⋮
    47const s16 pc_cmd_05[17] = { 8, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 11, 0, 0, 4, 28 };
    
    src/anniversary/sf33rd/Source/Game/cmd_data.c lines 43–49 at be9b9bc · upstream ↗
    61const s16 pc_cmd_12[17] = { 6, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 11, 0, 0, 4, 28 };
    
    src/anniversary/sf33rd/Source/Game/cmd_data.c line 61 at be9b9bc · upstream ↗
    781const_s16_arr p0_cmd[56] = { pc_cmd_00, pc_cmd_01, pc_cmd_02, pc_cmd_03, pc_cmd_04, pc_cmd_05, pc_cmd_06, pc_cmd_07,
    782                             pc_cmd_08, pc_cmd_09, pc_cmd_10, pc_cmd_11, pc_cmd_12, pc_cmd_13, pc_cmd_14, pc_cmd_15,
    
    src/anniversary/sf33rd/Source/Game/cmd_data.c lines 781–782 at be9b9bc · upstream ↗
    55    switch (i) {
    56    case 3:
    57    case 4:
    58    case 5:
    59        wcp[cmd_id].reset[i] += blok_b_omake[omop_b_block_ix[cmd_id]];
    60        make_red_blocking_time(cmd_id, i, wcp[cmd_id].reset[i]);
    61        break;
    ⋮
    63    case 6:
    64    case 12:
    65        wcp[cmd_id].reset[i] += blok_b_omake[omop_b_block_ix[cmd_id]];
    66        break;
    
    src/anniversary/sf33rd/Source/Game/CMD_MAIN.c lines 55–66 at be9b9bc · upstream ↗
    45const s16 blok_b_omake[4] = { -2, 0, 2, 4 };
    
    src/anniversary/sf33rd/Source/Game/SysDir.c line 45 at be9b9bc · upstream ↗
    168void get_system_direction_parameter(DirData* sysdir_data) {
    169    if (sysdir_data->contents[0][0] == 0) {
    170        omop_spmv_ng_table[0] |= 0x300;
    ⋮
    173    if (sysdir_data->contents[0][1] == 0) {
    174        omop_spmv_ng_table[0] |= 0x800;
    ⋮
    177    if (sysdir_data->contents[0][2] == 0) {
    178        omop_spmv_ng_table[0] |= 0x400;
    ⋮
    181    omop_b_block_ix[0] = sysdir_data->contents[0][3];
    
    src/anniversary/sf33rd/Source/Game/SysDir.c lines 168–181 at be9b9bc · upstream ↗
    9const DirData Dir_Default_Data = { .contents = { { 1, 1, 1, 1, 1, 1, 1 },
    
    src/anniversary/sf33rd/Source/Game/DIR_DATA.c line 9 at be9b9bc · upstream ↗
    102        system_dir[ix] = Dir_Default_Data;
    
    src/anniversary/sf33rd/Source/Game/init3rd.c line 102 at be9b9bc · upstream ↗
    1179    if (ds->py->flag == 0 && !(ds->guard_flag & 2) && as->wu.att.guard & 3) {
    1180        if (as->wu.att.guard & 2) {
    
    src/anniversary/sf33rd/Source/Game/HITCHECK.c lines 1179–1180 at be9b9bc · upstream ↗
    1198            } else if (!(ds->spmv_ng_flag & 0x100)) {
    1199                if (as->wu.jump_att_flag) {
    1200                    if (!(ds->spmv_ng_flag & 0x800) && (ds->cp->waza_flag[12] != 0 || abs)) {
    ⋮
    1216                } else if (ds->cp->waza_flag[3] != 0 || abs) {
    
    src/anniversary/sf33rd/Source/Game/HITCHECK.c lines 1198–1216 at be9b9bc · upstream ↗
    1248            } else if (!(ds->spmv_ng_flag & 0x200)) {
    1249                if (as->wu.jump_att_flag) {
    1250                    if (!(ds->spmv_ng_flag & 0x800) && (ds->cp->waza_flag[4] != 0 || abs)) {
    ⋮
    1261                } else if (ds->cp->waza_flag[4] != 0 || abs) {
    
    src/anniversary/sf33rd/Source/Game/HITCHECK.c lines 1248–1261 at be9b9bc · upstream ↗
    1172    just_now = 0;
    ⋮
    1174    if (ds->guard_chuu != 0 && ds->guard_chuu < 5) {
    1175        just_now = 1;
    
    src/anniversary/sf33rd/Source/Game/HITCHECK.c lines 1172–1175 at be9b9bc · upstream ↗
    1080    if (ds->py->flag == 0 && !(ds->guard_flag & 2) && as->wu.att.guard & 4) {
    ⋮
    1093        } else if (!(ds->spmv_ng_flag & 0x400) && ((ds->cp->waza_flag[5] != 0) || abs)) {
    
    src/anniversary/sf33rd/Source/Game/HITCHECK.c lines 1080–1093 at be9b9bc · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Revised after a check by a second AI model, 2026-10-22.

    In the claim ledger

Sources

Code