Mechanic · combat · fighting game
Stun gauge
A count of the stun a fighter has taken, which stuns it when it fills.
On this page
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.
- DrainingStreet Fighter III: 3rd Strike (1999). Each hit adds stun toward a limit of 56 to 72 by character; the gauge drains outside hit stop.1
Games
| Game | Year | How | Note |
|---|---|---|---|
| Street Fighter III: 3rd Strike | 1999 | Draining | each 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
- ^ abIn the PS2 port of Street Fighter III: 3rd Strike that crowded-street/3s-decomp rebuilds, each character's stun limit (
genkai) is itspl_piyo_tblvalue, 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, addsdm_piyoto the gauge: the_add_piyo_gaugevalue for the attacker's character and the move's stun value (the low four bits of itspiyobyte), 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'spl_nr_piyo_tblvalue 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'srecoverby 110/100 each time it runs whiletk_successis below 3, and plpat18.c by 120/100 while it's 0 or less.Codecrowded-street/3s-decomprevisedHow 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.
Sources
Code
- Crowded Street contributors. 2026. “3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp).” Commit be9b9bc. crowded-street/3s-decomp @ be9b9bc · licence, all uses