Mechanic · combat · fighting game
Super meter
A gauge that fills as a fighter attacks and takes hits and is spent on special attacks.
On this page
A super meter fills during a fight and pays for the strongest attacks. In Street Fighter III: 3rd Strike it gains on a move’s start, on guard, on hit, and on parry, and fills whole stocks up to each Super Art’s limit1.
- StockedStreet Fighter III: 3rd Strike (1999). Gains on starting a move, on guard, on hit (cut through a combo), and on parry, stored in stocks of 64 to 128 points up to each Super Art's limit.1
Games
| Game | Year | How | Note |
|---|---|---|---|
| Street Fighter III: 3rd Strike | 1999 | Stocked | gains on starting a move, on guard, on hit (cut through a combo), and on parry, stored in stocks of 64 to 128 points up to each Super Art's limit |
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, the Super Art gauge fills from
_add_arts_gauge, a table by character, by the move's gauge points (the top four bits of its attack data'spiyobyte), and by one of four columns. The attacker gains column 0 when a move starts a new attack, whether it hits or not (unless bit 0x20000000 of itsspmv_ng_flag2is set), and column 1 when it's guarded (set_guard_status, for an attack with any hit stop). When damage is applied (subtract_dm_vital, which the parry statuses also run), a nonzero column 2 gives the defender a third of the table value as read. The attacker then gets the value plus a difficulty bonus,asagh_zuru(−2 to 4), if the attacker is CPU-controlled (operator0), at least 1, cut to (32 − 2(n − 1))/32 for the defender's nth hit of a combo (at least 1/32), and raised by 120/100 for a CPU attacker whenBreak_Into_CPUis 1; so the combo cut reaches only the attacker's share. Column 3 goes to the defender when its parry status starts, plusasagh_zuruif the parrying player is CPU-controlled, and nothing whilesa_stop_check()is nonzero.add_super_arts_gaugemultiplies each gain by 120/100, by 150/100 more whenBattle_Numberis 0, and by an Extra Option factor of 0, 24, 32, or 44 over 32 (0 stops all gain), and adds nothing while the stocks are full, in a bonus game, or in a few other states the function tests. Pastgauge_lenthe gauge adds a stock and keeps the rest, and atstore_maxstocks it stops. Each Super Art'sgauge_lenandstore_maxcome from thesuper_arts_datatable, or fromsuper_arts_DATAwhencmd_selorno_sais set for that side, shifted by Extra Options and held to 64 to 128 and 1 to 9.Codecrowded-street/3s-decomprevisedHow we know
2781 aag_sw = 0; ⋮ 2783 if (wk->cg_att_ix < 0) { 2784 wk->cg_att_ix = -wk->cg_att_ix; 2785 wk->attack_num = att_req; 2786 wk->att_hit_ok = 1; 2787 aag_sw = 1; ⋮ 2809 wk->add_arts_point = (wk->att.piyo >> 4) & 0xF; ⋮ 2815 if (aag_sw) { 2816 add_sp_arts_gauge_init((PLW*)wk);
src/anniversary/sf33rd/Source/Game/CHARSET.c lines 2781–2817 at be9b9bc · upstream ↗ 856 if ((mwk->wu.work_id == 1) && !(mwk->spmv_ng_flag2 & 0x20000000)) { 857 asag = _add_arts_gauge[mwk->player_number][wk->wu.add_arts_point][0]; ⋮ 860 } else if (!(wk->spmv_ng_flag2 & 0x20000000)) { 861 asag = _add_arts_gauge[wk->player_number][wk->wu.add_arts_point][0];
src/anniversary/sf33rd/Source/Game/PLS02.c lines 855–862 at be9b9bc · upstream ↗ 627void set_guard_status(PLW* as, PLW* ds) { ⋮ 633 if (as->wu.att.hs_you == 0 && as->wu.att.hs_me == 0) { 634 ds->wu.routine_no[2] = ds->wu.old_rno[2]; 635 } else { ⋮ 651 as->wu.cmwk[8]++; 652 add_sp_arts_gauge_guard(as);
src/anniversary/sf33rd/Source/Game/HITCHECK.c lines 627–652 at be9b9bc · upstream ↗ 878 asag = _add_arts_gauge[mwk->player_number][wk->wu.add_arts_point][1]; ⋮ 882 asag = _add_arts_gauge[wk->player_number][wk->wu.add_arts_point][1];
src/anniversary/sf33rd/Source/Game/PLS02.c lines 878–883 at be9b9bc · upstream ↗ 887void add_sp_arts_gauge_hit_dm(PLW* wk) { ⋮ 900 emwk = (PLW*)wk->wu.target_adrs; 901 asag = _add_arts_gauge[emwk->player_number][wk->wu.dm_arts_point][2]; ⋮ 903 if (asag != 0) { 904 add_super_arts_gauge(wk->sa, wk->wu.id, asag / 3, wk->metamorphose); ⋮ 914 asag = cal_sa_gauge_waribiki(wk, asag); ⋮ 920 add_super_arts_gauge(emwk->sa, emwk->wu.id, asag, emwk->metamorphose); ⋮ 926s16 cal_sa_gauge_waribiki(PLW* wk, s16 asag) { ⋮ 929 if (wk->cb->total < 2) { 930 return asag; ⋮ 933 num = 32 - (wk->cb->total - 1) * 2; ⋮ 935 if (num <= 0) { ⋮
src/anniversary/sf33rd/Source/Game/PLS02.c lines 887–944 at be9b9bc · upstream ↗ 1533void subtract_dm_vital(PLW* wk) { ⋮ 1539 add_sp_arts_gauge_hit_dm(wk);
src/anniversary/sf33rd/Source/Game/PLPDM.c lines 1533–1539 at be9b9bc · upstream ↗ 32const s16 asagh_zuru[8] = { -2, -1, 0, 0, 1, 2, 3, 4 };src/anniversary/sf33rd/Source/Game/PLS02.c line 32 at be9b9bc · upstream ↗ 903 if (asag != 0) { 904 add_super_arts_gauge(wk->sa, wk->wu.id, asag / 3, wk->metamorphose); ⋮ 906 if (emwk->wu.operator == 0) { 907 asag += asagh_zuru[save_w[Present_Mode].Difficulty]; ⋮ 910 if (asag <= 0) { 911 asag = 1; ⋮ 914 asag = cal_sa_gauge_waribiki(wk, asag); ⋮ 916 if (emwk->wu.operator == 0 && Break_Into_CPU == 1) { 917 asag = (asag * 120) / 100; ⋮ 920 add_super_arts_gauge(emwk->sa, emwk->wu.id, asag, emwk->metamorphose);
src/anniversary/sf33rd/Source/Game/PLS02.c lines 903–920 at be9b9bc · upstream ↗ 948void add_sp_arts_gauge_paring(PLW* wk) { ⋮ 956 if (sa_stop_check() != 0) { 957 return; ⋮ 961 return; ⋮ 965 asag = _add_arts_gauge[emwk->player_number][wk->wu.dm_arts_point][3]; ⋮ 967 if (asag != 0) { 968 if (wk->wu.operator == 0) { 969 asag += asagh_zuru[save_w[Present_Mode].Difficulty]; ⋮ 976 add_super_arts_gauge(wk->sa, wk->wu.id, asag, wk->metamorphose);
src/anniversary/sf33rd/Source/Game/PLS02.c lines 948–976 at be9b9bc · upstream ↗ 608 set_hit_stop_hit_quake(&wk->wu); 609 add_sp_arts_gauge_paring(wk); 610 subtract_dm_vital(wk);
src/anniversary/sf33rd/Source/Game/PLPNM.c lines 605–610 at be9b9bc · upstream ↗ 1672void get_damage_reaction_data(PLW* wk) { ⋮ 1679 subtract_dm_vital(wk);
src/anniversary/sf33rd/Source/Game/PLPDM.c lines 1672–1679 at be9b9bc · upstream ↗ 1100void add_super_arts_gauge(SA_WORK* wk, s16 ix, s16 asag, u8 mf) { ⋮ 1106 if (!pcon_dp_flag && !Bonus_Game_Flag && (sa_gauge_omake[omop_sa_gauge_ix[ix]] != 0) && (asag > 0) && 1107 (wk->store != wk->store_max)) { 1108 asag = asag * 0x78 / 100; ⋮ 1110 if (save_w[Present_Mode].Battle_Number[Play_Type] == 0) { 1111 asag = asag * 0x96 / 100; ⋮ 1114 asag = asag * sa_gauge_omake[omop_sa_gauge_ix[ix]] / 32; ⋮ 1116 if (asag == 0) { 1117 asag = 1; ⋮ 1120 wk->gauge.s.h += asag; ⋮ 1123 if (wk->gauge.s.h > wk->gauge_len) { 1124 wk->store += 1; ⋮
src/anniversary/sf33rd/Source/Game/PLS02.c lines 1100–1134 at be9b9bc · upstream ↗ 37const s16 sa_gauge_omake[4] = { 0, 24, 32, 44 };src/anniversary/sf33rd/Source/Game/SysDir.c line 37 at be9b9bc · upstream ↗ 1399 if (cmd_sel[ix] || no_sa[ix]) { 1400 saptr = &super_arts_DATA[My_char[ix]][Super_Arts[ix]]; 1401 } else { 1402 saptr = &super_arts_data[My_char[ix]][Super_Arts[ix]];
src/anniversary/sf33rd/Source/Game/PLCNT.c lines 1399–1403 at be9b9bc · upstream ↗ 1415 super_arts[ix].gauge_len = remake_sa_gauge_len(ix, saptr->gauge_len); 1416 super_arts[ix].store_max = remake_sa_store_max(ix, saptr->store_max);
src/anniversary/sf33rd/Source/Game/PLCNT.c lines 1415–1416 at be9b9bc · upstream ↗ 1426s16 remake_sa_store_max(s16 ix, s16 store_max) { 1427 s16 num = store_max + sag_stock_omake[omop_sag_max_ix[ix]]; ⋮ 1429 if (num <= 0) { 1430 num = 1; ⋮ 1433 if (num > 9) { 1434 num = 9; ⋮ 1440s16 remake_sa_gauge_len(s16 ix, s16 gauge_len) { 1441 s16 num = gauge_len + sag_length_omake[omop_sag_len_ix[ix]] * 8; ⋮ 1443 if (num < 0x40) { 1444 num = 0x40; ⋮ 1447 if (num > 0x80) { 1448 num = 0x80;
src/anniversary/sf33rd/Source/Game/PLCNT.c lines 1426–1453 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