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

A stun gauge counts hits toward a daze. In Street Fighter III: 3rd Strike each hit adds stun toward a limit of 56 to 72 by character, and the gauge drains while play runs1.

Games

GameYearHowNote
Street Fighter III: 3rd Strike1999Drainingeach hit adds stun toward a limit of 56 to 72 by character; the gauge drains outside hit stop
Every claim about this mechanic, by game (1)

References

  1. ^ abIn the PS2 port of Street Fighter III: 3rd Strike that crowded-street/3s-decomp rebuilds, each character's stun limit (genkai) is its pl_piyo_tbl value, 56, 64, or 72, plus an Extra Option offset of −16, −8, 0, 8, or 16, held to 56 to 72. A hit that finds the defender neither knocked out nor already stunned, and doesn't knock it out, adds dm_piyo to the gauge: the _add_piyo_gauge value for the attacker's character and the move's stun value (the low four bits of its piyo byte), scaled by an Extra Option factor of 0, 24, 32, or 44 over 32. A parried hit adds none (sf3/parry-freeze). When the gauge reaches the limit, the stun flag (py->flag) is set. Outside hit stop, and while the timers aren't frozen (Timer_Freeze), the gauge drains each pass by the character's pl_nr_piyo_tbl value times an Extra Option factor (0, 20, 32, or 44) over 32, taken from a 32-bit count whose top 16 bits are the gauge (2730 to 3276 in the first ten entries, about 0.042 to 0.050 a pass at the factor 32, computed). Which Extra Option factor applies by default isn't shown in the lines read. Code in PLPAT02.c, plpat16.c, and plpat17.c multiplies a character's recover by 110/100 each time it runs while tk_success is below 3, and plpat18.c by 120/100 while it's 0 or less.Codecrowded-street/3s-decomprevised
    How we know
    290const s16 pl_piyo_tbl[20] = { 72, 72, 64, 64, 72, 64, 72, 64, 64, 72, 64, 64, 64, 64, 56, 64, 64, 72, 64, 56 };
    ⋮
    292const s32 pl_nr_piyo_tbl[20] = { 3276, 2849, 2978, 2730, 2978, 2849, 3120, 2730, 2978, 2730,
    
    src/anniversary/sf33rd/Source/Game/PLCNT.c lines 290–292 at be9b9bc · upstream ↗
    1371    piyori_type[ix].recover = pl_nr_piyo_tbl[plnum];
    1372    piyori_type[ix].genkai = pl_piyo_tbl[plnum] + stun_gauge_len_omake[omop_stun_gauge_len[ix]];
    ⋮
    1374    if (piyori_type[ix].genkai < 56) {
    1375        piyori_type[ix].genkai = 56;
    ⋮
    1378    if (piyori_type[ix].genkai > 72) {
    1379        piyori_type[ix].genkai = 72;
    
    src/anniversary/sf33rd/Source/Game/PLCNT.c lines 1371–1380 at be9b9bc · upstream ↗
    39const s16 stun_gauge_omake[4] = { 0, 24, 32, 44 };
    ⋮
    41const s16 stun_gauge_r_omake[4] = { 0, 20, 32, 44 };
    ⋮
    43const s16 stun_gauge_len_omake[5] = { -16, -8, 0, 8, 16 };
    
    src/anniversary/sf33rd/Source/Game/SysDir.c lines 39–43 at be9b9bc · upstream ↗
    961    cal_damage_vitality(as, ds);
    962    ds->wu.dm_piyo = _add_piyo_gauge[as->player_number][as->wu.att.piyo];
    963    ds->wu.dm_piyo = ds->wu.dm_piyo * stun_gauge_omake[omop_stun_gauge_add[(ds->wu.id + 1) & 1]] / 32;
    
    src/anniversary/sf33rd/Source/Game/HITCHECK.c lines 961–963 at be9b9bc · upstream ↗
    2810    wk->att.piyo &= 0xF;
    
    src/anniversary/sf33rd/Source/Game/CHARSET.c line 2810 at be9b9bc · upstream ↗
    1533void subtract_dm_vital(PLW* wk) {
    1534    if (wk->dead_flag == 0) {
    
    src/anniversary/sf33rd/Source/Game/PLPDM.c lines 1533–1534 at be9b9bc · upstream ↗
    1563        if (wk->wu.vital_new < 0) {
    1564            wk->wu.vital_new = -1;
    1565            wk->dead_flag = 1;
    ⋮
    1576        } else if (wk->py->flag == 0) {
    1577            wk->py->now.quantity.h += wk->wu.dm_piyo;
    ⋮
    1579            if (wk->py->now.quantity.h >= wk->py->genkai) {
    1580                wk->py->now.timer = 0;
    1581                wk->py->flag = 1;
    
    src/anniversary/sf33rd/Source/Game/PLPDM.c lines 1563–1582 at be9b9bc · upstream ↗
    301    if (Timer_Freeze == 0) {
    302        look_after_timers(wk);
    
    src/anniversary/sf33rd/Source/Game/PLMAIN.c lines 301–302 at be9b9bc · upstream ↗
    415    if (wk->py->now.quantity.h && (wk->wu.hit_stop == 0)) {
    416        wk->py->now.timer -= (wk->py->recover * stun_gauge_r_omake[omop_stun_gauge_rcv[wk->wu.id]]) / 32;
    ⋮
    418        if (wk->py->now.quantity.h <= 0) {
    419            wk->py->now.timer = 0;
    
    src/anniversary/sf33rd/Source/Game/PLMAIN.c lines 415–420 at be9b9bc · upstream ↗
    83            if (wk->tk_success < 3) {
    84                wk->tk_success++;
    85                wk->py->recover = (wk->py->recover * 110) / 100;
    
    src/anniversary/sf33rd/Source/Game/PLPAT02.c lines 83–85 at be9b9bc · upstream ↗
    62            if (wk->tk_success < 3) {
    63                wk->tk_success++;
    64                wk->py->recover = (wk->py->recover * 110) / 100;
    
    src/anniversary/sf33rd/Source/Game/plpat16.c lines 62–64 at be9b9bc · upstream ↗
    305            if (wk->tk_success < 3) {
    306                wk->tk_success++;
    307                wk->py->recover = (wk->py->recover * 110) / 100;
    
    src/anniversary/sf33rd/Source/Game/plpat17.c lines 305–307 at be9b9bc · upstream ↗
    111            if (wk->tk_success <= 0) {
    112                wk->tk_success++;
    113                wk->py->recover = (wk->py->recover * 120) / 100;
    
    src/anniversary/sf33rd/Source/Game/plpat18.c lines 111–113 at be9b9bc · upstream ↗
    9typedef struct {
    10    // total size: 0x4
    11    s16 l; // offset 0x0, size 0x2
    12    s16 h; // offset 0x2, size 0x2
    13} LoHi16;
    
    include/structs.h lines 9–13 at be9b9bc · upstream ↗
    262    union {
    263        s32 timer;       // offset 0x0, size 0x4
    264        LoHi16 quantity; // offset 0x0, size 0x4
    265    } now;               // offset 0x8, size 0x4
    
    include/structs.h lines 262–265 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