Cite as
crowded-street/3s-decomp
Original
https://github.com/crowded-street/3s-decomp
Pinned
crowded-street/3s-decomp @ be9b9bc69dc19822a8eca9ce3e72ba560d5a3835
Accessed
2026-10-22
Licence
AGPL-3.0 (the repo's LICENSE file, GNU Affero General Public License v3.0, which GitHub's API also reports); the README and docs say nothing more about it, and the game code it rebuilds is Capcom's
Credit
The Crowded Street community's C decompilation of the PlayStation 2 release of Street Fighter III: 3rd Strike. Names and comments quoted in sf3 claims are theirs; most identifiers are the original romanized Japanese (`waza`, `paring`, `piyo`), which docs/decompiling.md says come from the binary's DWARF debug data.
Notes
The README says "Game code is fully decompiled!" and that CRI middleware is partly done. The build guide builds from `THIRD_U.BIN`, taken "from your copy of the game", and ends in "Files match"; docs/decompiling.md names the release as the SF Anniversary Collection (its decomp.me preset is "Street Fighter III: 3rd Strike (Anniversary Collection)"), and the code sits under src/anniversary. So the claims describe the 2004 PS2 port as the Anniversary Collection ships it; the 1999 CPS-3 arcade original may differ. src/anniversary/bin2obj holds data files from the game converted to C (the character table, the stun and super-gauge gain tables in gauge.c), so the atlas leaves it out of the fetched paths. Battle code is in src/anniversary/sf33rd/Source/Game: CMD_MAIN.c (inputs, including the parry), HITCHECK.c (hits, guards, parries), PLS02.c (super gauge), PLPDM.c and PLCNT.c (damage, stun). The PS2 port's System Direction and Extra Option menus can change the parry windows, the gauges, and the stun bar (SysDir.c).

Cited on

Claims (5)

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.src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L610–625src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L627–728src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L739–785src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L107–121src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L1530–1536src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L9–10src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L124–130src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L37src/anniversary/sf33rd/Source/Game/cmd_data.c L43–49src/anniversary/sf33rd/Source/Game/cmd_data.c L61src/anniversary/sf33rd/Source/Game/cmd_data.c L781–782src/anniversary/sf33rd/Source/Game/CMD_MAIN.c L55–66src/anniversary/sf33rd/Source/Game/SysDir.c L45src/anniversary/sf33rd/Source/Game/SysDir.c L168–181src/anniversary/sf33rd/Source/Game/DIR_DATA.c L9src/anniversary/sf33rd/Source/Game/init3rd.c L102src/anniversary/sf33rd/Source/Game/HITCHECK.c L1179–1180src/anniversary/sf33rd/Source/Game/HITCHECK.c L1198–1216src/anniversary/sf33rd/Source/Game/HITCHECK.c L1248–1261src/anniversary/sf33rd/Source/Game/HITCHECK.c L1172–1175src/anniversary/sf33rd/Source/Game/HITCHECK.c L1080–1093Code
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.src/anniversary/sf33rd/Source/Game/HITCHECK.c L36–52src/anniversary/sf33rd/Source/Game/HITCHECK.c L1172–1182src/anniversary/sf33rd/Source/Game/HITCHECK.c L1236–1237src/anniversary/sf33rd/Source/Game/HITCHECK.c L1081–1082src/anniversary/sf33rd/Source/Game/HITCHECK.c L759–760src/anniversary/sf33rd/Source/Game/PLPDM.c L147–151src/anniversary/sf33rd/Source/Game/PLPDM.c L304–310src/anniversary/sf33rd/Source/Game/PLPDM.c L353–359src/anniversary/sf33rd/Source/Game/SysDir.c L47src/anniversary/sf33rd/Source/Game/SysDir.c L183–187src/anniversary/sf33rd/Source/Game/DIR_DATA.c L9Code
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.src/anniversary/sf33rd/Source/Game/HITCHECK.c L662–689src/anniversary/sf33rd/Source/Game/HITCHECK.c L690–735src/anniversary/sf33rd/Source/Game/PLPNM.c L586–608src/anniversary/sf33rd/Source/Game/PLS02.c L832–836src/anniversary/sf33rd/Source/Game/PLMAIN.c L329–348Code
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.src/anniversary/sf33rd/Source/Game/CHARSET.c L2781–2817src/anniversary/sf33rd/Source/Game/PLS02.c L855–862src/anniversary/sf33rd/Source/Game/HITCHECK.c L627–652src/anniversary/sf33rd/Source/Game/PLS02.c L878–883src/anniversary/sf33rd/Source/Game/PLS02.c L887–944src/anniversary/sf33rd/Source/Game/PLPDM.c L1533–1539src/anniversary/sf33rd/Source/Game/PLS02.c L32src/anniversary/sf33rd/Source/Game/PLS02.c L903–920src/anniversary/sf33rd/Source/Game/PLS02.c L948–976src/anniversary/sf33rd/Source/Game/PLPNM.c L605–610src/anniversary/sf33rd/Source/Game/PLPDM.c L1672–1679src/anniversary/sf33rd/Source/Game/PLS02.c L1100–1134src/anniversary/sf33rd/Source/Game/SysDir.c L37src/anniversary/sf33rd/Source/Game/PLCNT.c L1399–1403src/anniversary/sf33rd/Source/Game/PLCNT.c L1415–1416src/anniversary/sf33rd/Source/Game/PLCNT.c L1426–1453Code
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.src/anniversary/sf33rd/Source/Game/PLCNT.c L290–292src/anniversary/sf33rd/Source/Game/PLCNT.c L1371–1380src/anniversary/sf33rd/Source/Game/SysDir.c L39–43src/anniversary/sf33rd/Source/Game/HITCHECK.c L961–963src/anniversary/sf33rd/Source/Game/CHARSET.c L2810src/anniversary/sf33rd/Source/Game/PLPDM.c L1533–1534src/anniversary/sf33rd/Source/Game/PLPDM.c L1563–1582src/anniversary/sf33rd/Source/Game/PLMAIN.c L301–302src/anniversary/sf33rd/Source/Game/PLMAIN.c L415–420src/anniversary/sf33rd/Source/Game/PLPAT02.c L83–85src/anniversary/sf33rd/Source/Game/plpat16.c L62–64src/anniversary/sf33rd/Source/Game/plpat17.c L305–307src/anniversary/sf33rd/Source/Game/plpat18.c L111–113include/structs.h L9–13include/structs.h L262–265Code