Claim set · data/claims/sf3.yaml

Street Fighter III 3rd Strike (the crowded-street decompilation of the PS2 port, crowded-street/3s-decomp)

Game: Street Fighter III: 3rd Strike.

In 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. sf3/parry-window

About: Street Fighter III: 3rd Strike Parry

Value
{
 "highLowReset": 11,
 "airReset": 8,
 "antiAirReset": 6,
 "highLowPasses": 10,
 "airPasses": 7,
 "antiAirPasses": 5,
 "offsets": [
  -2,
  0,
  2,
  4
 ],
 "defaultOffset": 0,
 "holdLimit": 6,
 "rearmAfter": 10
}
Code3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L610-L625void check_10() { switch (waza_ptr->shot_ok) { case 0: if (chk_pl->sw_lever == 0) { waza_ptr->shot_ok++; … case 1: if ((cmd_pl->wu.xyz[1].disp.pos > 0 || (waza_type[cmd_id] != 5 && waza_type[cmd_id] != 6)) && chk_pl->now_lvbt & 0xF) { if (chk_pl->sw_lever == waza_ptr->w_lvr) { waza_ptr->shot_ok++; wcp[cmd_id].waza_flag[waza_type[cmd_id]] = wcp[cmd_id].reset[waza_type[cmd_id]]; …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L627-L728switch (waza_type[cmd_id]) { case 3: if (wcp[cmd_id].waza_flag[3] > wcp[cmd_id].waza_flag[4]) { wcp[cmd_id].waza_flag[4] = 0; … if (wcp[cmd_id].waza_flag[3] > wcp[cmd_id].waza_flag[12]) { wcp[cmd_id].waza_flag[12] = 0; … case 5: … if (waza_work[cmd_id][6].free3 > 0) { wcp[cmd_id].waza_flag[5] = 0; …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L739-L785case 2: waza_ptr->w_int--; waza_ptr->free3--; if (waza_ptr->w_int > 0) { if (chk_pl->sw_lever == 0) { waza_ptr->shot_ok++; break; } if (chk_pl->sw_lever & 8) { wcp[cmd_id].waza_flag[waza_type[cmd_id]] = 0; … if (chk_pl->sw_lever != waza_ptr->w_lvr) { …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L107-L121for (j = 0; j < 56; j++) { if (wcp[cmd_id].waza_flag[j] != -1) { … chk_move_jp[waza_ptr->w_type](); … for (j = 0; j < 56; j++) { if ((wcp[cmd_id].waza_flag[j] != -1) && (wcp[cmd_id].waza_flag[j] != 0)) { waza_ptr = &waza_work[cmd_id][j]; command_ok_move(j);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L1530-L1536void command_ok_move(s16 waza_num) { if (dead_lvr_check()) { … wcp[cmd_id].waza_flag[waza_num]--;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L9-L10void (*chk_move_jp[28])() = { check_init, check_0, check_1, check_2, check_3, check_4, check_5, check_6, check_7, check_7, check_9, check_10, check_11, check_12,3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L124-L130void check_init() { cmd_tbl_ptr += 12; waza_ptr->w_type = *cmd_tbl_ptr++; waza_ptr->w_int = *cmd_tbl_ptr++; waza_ptr->free1 = *cmd_tbl_ptr; waza_ptr->free2 = *cmd_tbl_ptr++; waza_ptr->w_lvr = *cmd_tbl_ptr++;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L37wcp[cmd_id].reset[i] = *cmd_tbl_ptr++;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/cmd_data.c#L43-L49const s16 pc_cmd_03[17] = { 11, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 11, 0, 0, 4, 28 }; … const s16 pc_cmd_04[17] = { 11, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 11, 0, 0, 2, 28 }; … const s16 pc_cmd_05[17] = { 8, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 11, 0, 0, 4, 28 };3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/cmd_data.c#L61const s16 pc_cmd_12[17] = { 6, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 11, 0, 0, 4, 28 };3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/cmd_data.c#L781-L782const_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, pc_cmd_08, pc_cmd_09, pc_cmd_10, pc_cmd_11, pc_cmd_12, pc_cmd_13, pc_cmd_14, pc_cmd_15,3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CMD_MAIN.c#L55-L66switch (i) { case 3: case 4: case 5: wcp[cmd_id].reset[i] += blok_b_omake[omop_b_block_ix[cmd_id]]; make_red_blocking_time(cmd_id, i, wcp[cmd_id].reset[i]); break; case 6: case 12: wcp[cmd_id].reset[i] += blok_b_omake[omop_b_block_ix[cmd_id]];3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/SysDir.c#L45const s16 blok_b_omake[4] = { -2, 0, 2, 4 };3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/SysDir.c#L168-L181void get_system_direction_parameter(DirData* sysdir_data) { if (sysdir_data->contents[0][0] == 0) { omop_spmv_ng_table[0] |= 0x300; } if (sysdir_data->contents[0][1] == 0) { omop_spmv_ng_table[0] |= 0x800; } if (sysdir_data->contents[0][2] == 0) { omop_spmv_ng_table[0] |= 0x400; } omop_b_block_ix[0] = sysdir_data->contents[0][3];3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/DIR_DATA.c#L9const DirData Dir_Default_Data = { .contents = { { 1, 1, 1, 1, 1, 1, 1 },3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/init3rd.c#L102system_dir[ix] = Dir_Default_Data;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L1179-L1180if (ds->py->flag == 0 && !(ds->guard_flag & 2) && as->wu.att.guard & 3) { if (as->wu.att.guard & 2) {3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L1198-L1216} else if (!(ds->spmv_ng_flag & 0x100)) { if (as->wu.jump_att_flag) { if (!(ds->spmv_ng_flag & 0x800) && (ds->cp->waza_flag[12] != 0 || abs)) { … } else if (ds->cp->waza_flag[3] != 0 || abs) {3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L1248-L1261} else if (!(ds->spmv_ng_flag & 0x200)) { if (as->wu.jump_att_flag) { if (!(ds->spmv_ng_flag & 0x800) && (ds->cp->waza_flag[4] != 0 || abs)) { … } else if (ds->cp->waza_flag[4] != 0 || abs) {3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L1172-L1175just_now = 0; if (ds->guard_chuu != 0 && ds->guard_chuu < 5) { just_now = 1;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L1080-L1093if (ds->py->flag == 0 && !(ds->guard_flag & 2) && as->wu.att.guard & 4) { … } else if (!(ds->spmv_ng_flag & 0x400) && ((ds->cp->waza_flag[5] != 0) || abs)) {Checked by claude, 2026-10-22 — read check_10 whole (L610-L795), cmd_move's two loops, command_ok_move and dead_lvr_check (the parry entries have w_dead 0, so it never fires), check_init's field order, cmd_data_set and its option offsets, pc_cmd_03 to pc_cmd_06 and pc_cmd_12, and the 40 command tables (p0_cmd to p14_cmd and p0_CMD to p14_CMD), each of which puts pc_cmd_03, pc_cmd_04, pc_cmd_05, and pc_cmd_12 at entries 3, 4, 5, and 12; then defense_ground and defense_sky from the guard-bit test to each parry branch, and the System Direction defaults After the audit, also read check_10's counter-clearing switch (L627-L728) and the jump-attack branches.

The counts are passes of the command check, waza_check from Player_move in PLMAIN.c; that it runs once a frame isn't traced here, and nor is whether the hit check of the same frame sees the counter before or after its decrement. Lever bits 4 and 8 are the two horizontal directions, which pl_lvr_set swaps when the character turns round; which one faces the opponent isn't traced here, and bit 2 is down (a low attack that defense_ground guards needs it held). Entry 6 (pc_cmd_06, lever 2, reset 8, an air down parry) is armed the same way, but no line read here checks its counter. Each branch also needs check_dm_att_blocking not to refuse the hit, which some projectiles' chip damage can do. A clear bit 0x80 in the defender's spmv_ng_flag (the code's abs) makes every parry check pass, as the training dummy's automatic parrying uses. Values from the 1999 arcade game haven't been compared.

Cited by: Blocking, Parry, Street Fighter III: 3rd Strike

In the PS2 port of Street Fighter III: 3rd Strike that crowded-street/3s-decomp rebuilds, a defender who is already guarding (guard_chuu 1 to 4, which Damage_04000 and Damage_07000 set in damage routines 4 to 7) parries a hit only if the parry's counter is still at least the threshold make_red_blocking_time stores from that parry's reset: reset less 3 against moves check_normal_attack counts as normal, and less 2 against the rest, less a second System Direction offset of −1, 0, 1, or 2 (0 at its defaults). For the high and low parries (reset 11) that is 8 or 9, and for the air parry (reset 8) 5 or 6, so the press must come in the window's first 3 passes against a normal move or first 2 against others (computed). Otherwise the code goes on to the guard checks. A System Direction setting (bit 0x1000) turns this parry off. sf3/red-parry

About: Street Fighter III: 3rd Strike Parry

Value
{
 "normalLess": 3,
 "otherLess": 2,
 "offsets": [
  -1,
  0,
  1,
  2
 ],
 "defaultOffset": 0,
 "highLowThreshold": {
  "normal": 8,
  "other": 9
 },
 "airThreshold": {
  "normal": 5,
  "other": 6
 },
 "passes": {
  "normal": 3,
  "other": 2
 }
}
Code3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L36-L52void make_red_blocking_time(s16 id, s16 ix, s16 num) { switch (ix) { case 3: grdb[id][0][0] = num - (blok_r_omake[omop_r_block_ix[id]] + 2); grdb[id][1][0] = num - (blok_r_omake[omop_r_block_ix[id]] + 3); break; case 4: grdb[id][0][1] = num - (blok_r_omake[omop_r_block_ix[id]] + 2); grdb[id][1][1] = num - (blok_r_omake[omop_r_block_ix[id]] + 3); break; case 5: grdb2[id][0] = num - (blok_r_omake[omop_r_block_ix[id]] + 2); …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L1172-L1182just_now = 0; if (ds->guard_chuu != 0 && ds->guard_chuu < 5) { just_now = 1; attr_att = check_normal_attack(as->wu.kind_of_waza); } if (ds->py->flag == 0 && !(ds->guard_flag & 2) && as->wu.att.guard & 3) { if (as->wu.att.guard & 2) { if (just_now) { if (!(ds->spmv_ng_flag & 0x1000) && ((ds->cp->waza_flag[3] >= grdb[ds->wu.id][attr_att][0]) || abs)) {3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L1236-L1237if (just_now) { if (!(ds->spmv_ng_flag & 0x1000) && (!(ds->cp->waza_flag[4] < grdb[ds->wu.id][attr_att][1]) || abs)) {3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L1081-L1082if (just_now) { if (!(ds->spmv_ng_flag & 0x1000) && (ds->cp->waza_flag[5] >= grdb2[ds->wu.id][attr_att] || abs)) {3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L759-L760s32 check_normal_attack(u8 waza) { return sel_sp_ch_tbl[waza >> 3] == 0;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPDM.c#L147-L151const u8 guard_kind[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0 }; … Damage_00000, Damage_01000, Damage_01000, Damage_01000, Damage_04000, Damage_04000, Damage_04000, Damage_07000, Damage_04000, Damage_04000, Damage_04000, Damage_07000, Damage_12000, Damage_12000, Damage_14000, Damage_14000,3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPDM.c#L304-L310void Damage_04000(PLW* wk) { … wk->guard_chuu = guard_kind[wk->wu.routine_no[2] - 4];3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPDM.c#L353-L359void Damage_07000(PLW* wk) { … wk->guard_chuu = guard_kind[wk->wu.routine_no[2] - 4];3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/SysDir.c#L47const s16 blok_r_omake[4] = { -1, 0, 1, 2 };3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/SysDir.c#L183-L187if (sysdir_data->contents[0][4] == 0) { omop_spmv_ng_table[0] |= 0x1000; } omop_r_block_ix[0] = sysdir_data->contents[0][5];3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/DIR_DATA.c#L9const DirData Dir_Default_Data = { .contents = { { 1, 1, 1, 1, 1, 1, 1 },Checked by claude, 2026-10-22 — read make_red_blocking_time and its call in cmd_data_set (after the first offset is added), the just_now branches of defense_ground (high and low) and defense_sky, check_normal_attack, guard_kind and the damage-routine table in PLPDM.c, Damage_04000 and Damage_07000, the parry statuses' own guard_chuu (guard_kind[routine - 27], so 5 and up for routines 31 on), and the System Direction lines for the offset and the 0x1000 bit

The community calls this a red parry, after its flash; the code's names are grdb, make_red_blocking_time, and blok_r_omake. check_normal_attack reads sel_sp_ch_tbl (HITCHECK.c L660) by kind_of_waza / 8, and its 0 rows (kinds 0 to 7, 16 to 23, and 72 to 95) count as normal. Routines 8 to 11 run the same guard functions but set guard_chuu 5 to 8, outside the test; what tells them apart from 4 to 7 isn't traced here. The pass counts take the counter's first value after the press as 10 (high and low) or 7 (air), as in sf3/parry-window.

Cited by: Parry, Street Fighter III: 3rd Strike

In the PS2 port of Street Fighter III: 3rd Strike that crowded-street/3s-decomp rebuilds, when a parried attack has any hit stop, set_paring_status sets the parrying defender's dm_stop to −15 and the attacker's hit_stop to 16. When the attacker is on the ground and the parry is a ground one (routines 31 to 33), a move whose kind_of_waza is 0 to 7 gets 4, 3, 2, or 1 more, by kind_of_waza / 2. The defender's parry status makes its stop negative and moves it to hit_stop. check_hit_stop counts a negative stop up to 0 while still calling char_move, and a positive one down without calling it. The attacker's count is 1 to 5 longer than the defender's 15 (computed). The same routine sets the hit's stun (dm_piyo) and its gauge points (dm_arts_point) to 0. sf3/parry-freeze

About: Street Fighter III: 3rd Strike Parry

Value
{
 "defenderStop": -15,
 "attackerStop": 16,
 "groundNormalAdd": [
  4,
  3,
  2,
  1
 ],
 "attackerLonger": [
  1,
  5
 ]
}
Code3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L662-L689const s16 sel_hs_add_tbl[6] = { 4, 3, 2, 1, 0, 0 }; void set_paring_status(PLW* as, PLW* ds) { … if ((as->wu.att.hs_you == 0) && (as->wu.att.hs_me == 0)) { ds->wu.routine_no[2] = ds->wu.old_rno[2]; } else { hsadix = 4; if ((as->wu.kind_of_waza & 0xF8) == 0) { hsadix = (as->wu.kind_of_waza / 2) & 3; } … dm_status_copy(&as->wu, &ds->wu); …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L690-L735case 1: case 3: case 5: ds->wu.dm_stop = -15; as->wu.hit_stop = 16; … case 9: ds->wu.dm_stop = -15; as->wu.hit_stop = 16; as->wu.hit_quake = 16; break; default: …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPNM.c#L586-L608void Normal_31000(PLW* wk) { … if (wk->wu.dm_stop > 0) { wk->wu.dm_stop = -wk->wu.dm_stop; } set_hit_stop_hit_quake(&wk->wu);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLS02.c#L832-L836void set_hit_stop_hit_quake(WORK* wk) { if (wk->dm_stop) { wk->hit_stop = wk->dm_stop; wk->dm_stop = 0;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLMAIN.c#L329-L348if (wk->wu.hit_stop) { num = 1; if (wk->wu.hit_stop > 0) { wk->wu.hit_stop--; … } else { wk->wu.hit_stop++; char_move(&wk->wu);Checked by claude, 2026-10-22 — read set_paring_status whole (L664-L756), the switch's ten cases, sel_hs_add_tbl, the ground parry routines 31 and 32 and the low parry 33 that defense_ground sets and the air parry 0x22 that defense_sky sets, Normal_31000's first case, set_hit_stop_hit_quake, and check_hit_stop's two branches

The air-parry cases (6 to 9, routines 34 and 35) all give 16 and −15. hit_quake, the shake, matches hit_stop in each case. Whether the defender's negative count lets it act before it reaches 0 isn't traced here, so the 1 to 5 is a difference of the two stops, not a measured frame advantage. kind_of_waza 0 to 7 are the moves check_normal_attack counts as normal; which strengths they are isn't traced here. Normal_35000 (the air parry status) flips and moves the stop the same way.

Cited by: Parry, Street Fighter III: 3rd Strike

In 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's piyo byte), 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 its spmv_ng_flag2 is 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 (operator 0), 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 when Break_Into_CPU is 1; so the combo cut reaches only the attacker's share. Column 3 goes to the defender when its parry status starts, plus asagh_zuru if the parrying player is CPU-controlled, and nothing while sa_stop_check() is nonzero. add_super_arts_gauge multiplies each gain by 120/100, by 150/100 more when Battle_Number is 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. Past gauge_len the gauge adds a stock and keeps the rest, and at store_max stocks it stops. Each Super Art's gauge_len and store_max come from the super_arts_data table, or from super_arts_DATA when cmd_sel or no_sa is set for that side, shifted by Extra Options and held to 64 to 128 and 1 to 9. sf3/super-art-gauge

About: Street Fighter III: 3rd Strike Super meter

Value
{
 "columns": [
  "start",
  "guard",
  "hit",
  "parry"
 ],
 "defenderShareOnHit": 0.3333333,
 "baseScale": 1.2,
 "battleZeroScale": 1.5,
 "optionFactors": [
  0,
  24,
  32,
  44
 ],
 "optionPer": 32,
 "gaugeLen": [
  64,
  128
 ],
 "storeMax": [
  1,
  9
 ]
}
Code3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CHARSET.c#L2781-L2817aag_sw = 0; if (wk->cg_att_ix < 0) { wk->cg_att_ix = -wk->cg_att_ix; wk->attack_num = att_req; wk->att_hit_ok = 1; aag_sw = 1; … wk->add_arts_point = (wk->att.piyo >> 4) & 0xF; … if (aag_sw) { add_sp_arts_gauge_init((PLW*)wk);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLS02.c#L855-L862if ((mwk->wu.work_id == 1) && !(mwk->spmv_ng_flag2 & 0x20000000)) { asag = _add_arts_gauge[mwk->player_number][wk->wu.add_arts_point][0]; … } else if (!(wk->spmv_ng_flag2 & 0x20000000)) { asag = _add_arts_gauge[wk->player_number][wk->wu.add_arts_point][0];3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L627-L652void set_guard_status(PLW* as, PLW* ds) { … if (as->wu.att.hs_you == 0 && as->wu.att.hs_me == 0) { ds->wu.routine_no[2] = ds->wu.old_rno[2]; } else { … as->wu.cmwk[8]++; add_sp_arts_gauge_guard(as);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLS02.c#L878-L883asag = _add_arts_gauge[mwk->player_number][wk->wu.add_arts_point][1]; … asag = _add_arts_gauge[wk->player_number][wk->wu.add_arts_point][1];3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLS02.c#L887-L944void add_sp_arts_gauge_hit_dm(PLW* wk) { … emwk = (PLW*)wk->wu.target_adrs; asag = _add_arts_gauge[emwk->player_number][wk->wu.dm_arts_point][2]; if (asag != 0) { add_super_arts_gauge(wk->sa, wk->wu.id, asag / 3, wk->metamorphose); … asag = cal_sa_gauge_waribiki(wk, asag); … add_super_arts_gauge(emwk->sa, emwk->wu.id, asag, emwk->metamorphose); … s16 cal_sa_gauge_waribiki(PLW* wk, s16 asag) { …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPDM.c#L1533-L1539void subtract_dm_vital(PLW* wk) { … add_sp_arts_gauge_hit_dm(wk);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLS02.c#L32const s16 asagh_zuru[8] = { -2, -1, 0, 0, 1, 2, 3, 4 };3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLS02.c#L903-L920if (asag != 0) { add_super_arts_gauge(wk->sa, wk->wu.id, asag / 3, wk->metamorphose); if (emwk->wu.operator == 0) { asag += asagh_zuru[save_w[Present_Mode].Difficulty]; } if (asag <= 0) { asag = 1; } asag = cal_sa_gauge_waribiki(wk, asag); if (emwk->wu.operator == 0 && Break_Into_CPU == 1) { asag = (asag * 120) / 100; } …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLS02.c#L948-L976void add_sp_arts_gauge_paring(PLW* wk) { … if (sa_stop_check() != 0) { return; } … asag = _add_arts_gauge[emwk->player_number][wk->wu.dm_arts_point][3]; if (asag != 0) { if (wk->wu.operator == 0) { asag += asagh_zuru[save_w[Present_Mode].Difficulty]; … add_super_arts_gauge(wk->sa, wk->wu.id, asag, wk->metamorphose);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPNM.c#L605-L610set_hit_stop_hit_quake(&wk->wu); add_sp_arts_gauge_paring(wk); subtract_dm_vital(wk);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPDM.c#L1672-L1679void get_damage_reaction_data(PLW* wk) { … subtract_dm_vital(wk);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLS02.c#L1100-L1134void add_super_arts_gauge(SA_WORK* wk, s16 ix, s16 asag, u8 mf) { … if (!pcon_dp_flag && !Bonus_Game_Flag && (sa_gauge_omake[omop_sa_gauge_ix[ix]] != 0) && (asag > 0) && (wk->store != wk->store_max)) { asag = asag * 0x78 / 100; if (save_w[Present_Mode].Battle_Number[Play_Type] == 0) { asag = asag * 0x96 / 100; } asag = asag * sa_gauge_omake[omop_sa_gauge_ix[ix]] / 32; if (asag == 0) { asag = 1; } …3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/SysDir.c#L37const s16 sa_gauge_omake[4] = { 0, 24, 32, 44 };3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLCNT.c#L1399-L1403if (cmd_sel[ix] || no_sa[ix]) { saptr = &super_arts_DATA[My_char[ix]][Super_Arts[ix]]; } else { saptr = &super_arts_data[My_char[ix]][Super_Arts[ix]];3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLCNT.c#L1415-L1416super_arts[ix].gauge_len = remake_sa_gauge_len(ix, saptr->gauge_len); super_arts[ix].store_max = remake_sa_store_max(ix, saptr->store_max);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLCNT.c#L1426-L1453s16 remake_sa_store_max(s16 ix, s16 store_max) { s16 num = store_max + sag_stock_omake[omop_sag_max_ix[ix]]; if (num <= 0) { num = 1; } if (num > 9) { num = 9; … s16 remake_sa_gauge_len(s16 ix, s16 gauge_len) { s16 num = gauge_len + sag_length_omake[omop_sag_len_ix[ix]] * 8; if (num < 0x40) { num = 0x40; …Checked by claude, 2026-10-22 — read the attack-data setup in CHARSET.c from aag_sw to add_sp_arts_gauge_init, the four add_sp_arts_gauge_ functions for start, guard, hit, and parry and their callers (the guard branch in HITCHECK.c, subtract_dm_vital, the parry statuses in PLPNM.c), cal_sa_gauge_waribiki, add_super_arts_gauge whole, sa_gauge_omake, and set_super_arts_status with both remake functions After the audit, also read the order of the defender's third and the cut in add_sp_arts_gauge_hit_dm, add_sp_arts_gauge_paring's early return, asagh_zuru, and the super_arts_DATA branch.

The _add_arts_gauge table itself is in src/anniversary/bin2obj/gauge.c, game data the atlas doesn't fetch, so no gain is given as a number. A tech recovery adds 3 and a throw escape 6 (add_sp_arts_gauge_ukemi, add_sp_arts_gauge_nagenuke). Throw damage (subtract_cu_vital in PLPCA.c) also runs the hit gain. Which damage routines reach get_damage_reaction_data isn't traced here. set_paring_status clears dm_arts_point (sf3/parry-freeze), which the parry status later reads; that would make a parry's gains the table's row 0 for the attacker's character whatever the move, but that the hit check runs before the parry status isn't traced here, so it stays out of the statement. The per-art values (64 to 128, one to three stocks in the rows read) aren't tied to characters here. Battle_Number isn't traced.

Cited by: Street Fighter III: 3rd Strike, Super meter

In 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. sf3/stun-gauge

About: Street Fighter III: 3rd Strike Stun gauge

Value
{
 "limits": [
  56,
  64,
  72
 ],
 "limitOffsets": [
  -16,
  -8,
  0,
  8,
  16
 ],
 "limitClamp": [
  56,
  72
 ],
 "addFactors": [
  0,
  24,
  32,
  44
 ],
 "drainFactors": [
  0,
  20,
  32,
  44
 ],
 "factorPer": 32,
 "drainUnit": 65536
}
Code3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLCNT.c#L290-L292const 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 }; … const s32 pl_nr_piyo_tbl[20] = { 3276, 2849, 2978, 2730, 2978, 2849, 3120, 2730, 2978, 2730,3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLCNT.c#L1371-L1380piyori_type[ix].recover = pl_nr_piyo_tbl[plnum]; piyori_type[ix].genkai = pl_piyo_tbl[plnum] + stun_gauge_len_omake[omop_stun_gauge_len[ix]]; if (piyori_type[ix].genkai < 56) { piyori_type[ix].genkai = 56; } if (piyori_type[ix].genkai > 72) { piyori_type[ix].genkai = 72;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/SysDir.c#L39-L43const s16 stun_gauge_omake[4] = { 0, 24, 32, 44 }; const s16 stun_gauge_r_omake[4] = { 0, 20, 32, 44 }; const s16 stun_gauge_len_omake[5] = { -16, -8, 0, 8, 16 };3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/HITCHECK.c#L961-L963cal_damage_vitality(as, ds); ds->wu.dm_piyo = _add_piyo_gauge[as->player_number][as->wu.att.piyo]; ds->wu.dm_piyo = ds->wu.dm_piyo * stun_gauge_omake[omop_stun_gauge_add[(ds->wu.id + 1) & 1]] / 32;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/CHARSET.c#L2810wk->att.piyo &= 0xF;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPDM.c#L1533-L1534void subtract_dm_vital(PLW* wk) { if (wk->dead_flag == 0) {3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPDM.c#L1563-L1582if (wk->wu.vital_new < 0) { wk->wu.vital_new = -1; wk->dead_flag = 1; … } else if (wk->py->flag == 0) { wk->py->now.quantity.h += wk->wu.dm_piyo; if (wk->py->now.quantity.h >= wk->py->genkai) { wk->py->now.timer = 0; wk->py->flag = 1;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLMAIN.c#L301-L302if (Timer_Freeze == 0) { look_after_timers(wk);3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLMAIN.c#L415-L420if (wk->py->now.quantity.h && (wk->wu.hit_stop == 0)) { wk->py->now.timer -= (wk->py->recover * stun_gauge_r_omake[omop_stun_gauge_rcv[wk->wu.id]]) / 32; if (wk->py->now.quantity.h <= 0) { wk->py->now.timer = 0;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/PLPAT02.c#L83-L85if (wk->tk_success < 3) { wk->tk_success++; wk->py->recover = (wk->py->recover * 110) / 100;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/plpat16.c#L62-L64if (wk->tk_success < 3) { wk->tk_success++; wk->py->recover = (wk->py->recover * 110) / 100;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/plpat17.c#L305-L307if (wk->tk_success < 3) { wk->tk_success++; wk->py->recover = (wk->py->recover * 110) / 100;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · src/anniversary/sf33rd/Source/Game/plpat18.c#L111-L113if (wk->tk_success <= 0) { wk->tk_success++; wk->py->recover = (wk->py->recover * 120) / 100;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · include/structs.h#L9-L13typedef struct { // total size: 0x4 s16 l; // offset 0x0, size 0x2 s16 h; // offset 0x2, size 0x2 } LoHi16;3s-decomp: a decompilation of Street Fighter III: 3rd Strike for PlayStation 2 (crowded-street/3s-decomp) · include/structs.h#L262-L265union { s32 timer; // offset 0x0, size 0x4 LoHi16 quantity; // offset 0x0, size 0x4 } now; // offset 0x8, size 0x4Checked by claude, 2026-10-22 — read set_kizetsu_status, both tables in PLCNT.c, set_damage_and_piyo's stun lines, the attack-data split of the piyo byte in CHARSET.c, the vitality-and-stun update in PLPDM.c from the knockout branch to the stun flag, the drain in PLMAIN.c, the three option tables, and the LoHi16 union (the PS2 is little-endian, so h at offset 2 is the top half) After the audit, also read the four recover boosts.

piyo and kizetsu are the code's words for dizzy and fainting. _add_piyo_gauge is in src/anniversary/bin2obj/gauge.c, game data the atlas doesn't fetch, so no per-move stun is given. Which character each table index is isn't traced here. The recover boosts sit in character-specific code (three of the four sites call grade_add_personal_action nearby); which move triggers each isn't traced here.

Cited by: Street Fighter III: 3rd Strike, Stun gauge