Magus420
Smash Master
Made a code that can display various character and controller data in develop mode. The TopN setting also allows setting the character's position to the center of the stage to make measuring stuff easier.
Controls
X->DPad-Right - Cycle through enabling the display, switching through displaying players 1-4, and disabling it.
L->DPad-Right/Left - Change the pair of floats to highlight/modify the setting for. Shares the Pokemon setting which starts at 0 (Random) by default, and 1-3 are the float pairs (Tosakinto, Chikorita, Kabigon). While a pair is selected/highlighted, L->DPad-Up/Down will change what data is shown in them.
L->DPad-Up/Down - Change the data to display in the selected float pair. Shares the Item setting (replacing their names for the descriptions).
DPad-Down (with a TopN setting highlighted) - If Top-N is the setting on a selected float pair, this will set their position to 0,0 (on FD, that'll be the very center of the stage).
A->DPad-Down (with a TopN setting highlighted) - If Top-N is the setting on a selected float pair, this will set their position to 0,100. Useful if looking at an air move that'd have them land if 0,0 were used.
Settings
"Top-N" - The X/Y position of the base point of the character. With collision display enabled it's where the white '+' is at the bottom of the character. EXTRA FEATURE: If a Top-N setting is highlighted (yellow) by using L->DPad-Right/Left, pressing DPad-Down sets the character to a position of 0,0. A->DPad-Down sets them to a position of 0,100.
"ECB Top" - The X/Y offset from Top-N of the Top point of the character's environment collision box that's used for ceiling collisions.
"ECB Bottom" - The X/Y offset from Top-N of the Bottom point of the character's environment collision box that's used for floor collisions.
"ECB Right" - The X/Y offset from Top-N of the Right point of the character's environment collision box that's used for left wall collisions and pushing against other characters on the ground.
"ECB Left" - The X/Y offset from Top-N of the Left point of the character's environment collision box that's used for right wall collisions and pushing against other characters on the ground.
"F1 Ch Veloc" - Force 1: Character Velocity. One of 3 X/Y forces applied to characters that result in their total movement each frame. This force is generally stuff that is a result of your own character's actions and includes things like dashing, air mobility, fallspeed, air dodge, and animation based movement. Also includes shield pushback when someone hits your shield (Defending).
"F2 KB Veloc" - Force 2: Knockback Velocity. Knockback from getting hit/thrown.
"F3 Sh Veloc" - Force 3: Attacker Shield KB Velocity. IIRC I've only seen this force used for shield pushback when hitting someone else's shield (Attacking).
"Total Veloc" - Total Velocity. This is the combination of all forces and the end result you'll move by each frame.
"Sys Directi" - Directional X/Y Input from the player's controller port. This is the input at the system level and not inputs applied to their character, so it's 'live' while the game is stopped in frame advance. Helpful for getting a full 1/-1 (game is picky about full directional inputs) or a specific amount of input applied to the character since you can adjust as needed before advancing the frame.
"Sys C-Stick" - C-Stick X/Y Input from the player's controller port.
"Sys L/R" - Analog L/R Input from the player's controller port.
"Cur Directi" - Directional X/Y Input applied to the character on the current frame.
"Prv Directi" - Directional X/Y Input applied to the character on the previous frame.
"CrPr Shield" - Current and Previous Variable Shield Input.
"Tmr Any Shd" - Frames Since Any Shield Press. Used for things like l-canceling.
"Tmr Dig Shd" - Frames Since & Between Digital Shield Press. Tech window (<20 since) and Tech-fail (>=40 between) for example.
"Tmr Jump" - Frames Since & Between Jump Inputs. Includes tap jumps. Meteor canceling.
"Tmr Up-B" - Frames Since & Between Up-B Inputs. Meteor canceling.
"Dmg/Hitlag" - Total Damage, and Hitlag. Damage would probably be more useful if stale moves were enabled, though chargeable moves like smashes do non-integer damage in develop. Attacker/Victim hitlag remaining.
"HitStn/Grab" - Hitstun, and Grab Hold Time. Frames of hitstun remaining. Time remaining before able to break out of a grab. Fun Fact: The losing player breaks out of grabs slightly faster than a winning player (wut).
"ShieldStun" - Actual shieldstun remaining, and originally calculated shieldstun. The difference comes from the game adding 0.1 to the animation length (20) when calculating the GuardDamage animation speed (and l-canceling) to create the stun time, though it sometimes results in 1 frame shorter stun than calculated (notably 20 damage on full strength shield).
"Shd HP/Size" - Shield Health, and Shield Collision Size. Shields have a max health of 60. The powershield reflect collision is 0.75x the size of the main shield collision shown.
"Tmr Int/Inv" - Timed Intangibility & Invincibility. Ledgegrabs and walljumps use the former, and respawning the latter.
"HB-0 X/Y" - Hitbox ID [0]'s X/Y Position. You can see the hitbox ID in MasterHand.
"HB-0 Z/Size" - Hitbox ID [0]'s Z Position & Size (radius). If the character is at 0,0 adding the Size to the X/Y/Z gives you the range of the hitbox.
"HB-1 X/Y" - Hitbox ID [1]'s X/Y Position.
"HB-1 Z/Size" - Hitbox ID [1]'s Z Position & Size (radius).
"HB-2 X/Y" - Hitbox ID [2]'s X/Y Position.
"HB-2 Z/Size" - Hitbox ID [2]'s Z Position & Size (radius).
"HB-3 X/Y" - Hitbox ID [3]'s X/Y Position.
"HB-3 Z/Size" - Hitbox ID [3]'s Z Position & Size (radius).
GIFs of Controls & Features
DOL Downloads
NOTE: These are v1.00 of the game. If you only have a 1.01/1.02 version you can just replace the .DOL anyway and it'll work (although the executable will now be 1.00, so if it was originally 1.02 Bowser will now be able to flame cancel, Zelda's smashes actually work, etc).
C-Stick 1P, Debug Tourny, Rules, Physics & MORE Display (NTSC 100)
Has c-stick in 1P modes, Debug replaces Tournament mode, 4 Stock, 8 min, FF On default settings as well.
C-Stick 1P, C-Stick Debug, Debug Tourny, Rules, No Interp, Physics & MORE Display (NTSC 100)
This is the one I use that also disables develop mode displaying the interpolation on hitboxes since that's useful to me. Might as well also include it here since it's already made.
Controls
X->DPad-Right - Cycle through enabling the display, switching through displaying players 1-4, and disabling it.
L->DPad-Right/Left - Change the pair of floats to highlight/modify the setting for. Shares the Pokemon setting which starts at 0 (Random) by default, and 1-3 are the float pairs (Tosakinto, Chikorita, Kabigon). While a pair is selected/highlighted, L->DPad-Up/Down will change what data is shown in them.
L->DPad-Up/Down - Change the data to display in the selected float pair. Shares the Item setting (replacing their names for the descriptions).
DPad-Down (with a TopN setting highlighted) - If Top-N is the setting on a selected float pair, this will set their position to 0,0 (on FD, that'll be the very center of the stage).
A->DPad-Down (with a TopN setting highlighted) - If Top-N is the setting on a selected float pair, this will set their position to 0,100. Useful if looking at an air move that'd have them land if 0,0 were used.
Settings
"Top-N" - The X/Y position of the base point of the character. With collision display enabled it's where the white '+' is at the bottom of the character. EXTRA FEATURE: If a Top-N setting is highlighted (yellow) by using L->DPad-Right/Left, pressing DPad-Down sets the character to a position of 0,0. A->DPad-Down sets them to a position of 0,100.
"ECB Top" - The X/Y offset from Top-N of the Top point of the character's environment collision box that's used for ceiling collisions.
"ECB Bottom" - The X/Y offset from Top-N of the Bottom point of the character's environment collision box that's used for floor collisions.
"ECB Right" - The X/Y offset from Top-N of the Right point of the character's environment collision box that's used for left wall collisions and pushing against other characters on the ground.
"ECB Left" - The X/Y offset from Top-N of the Left point of the character's environment collision box that's used for right wall collisions and pushing against other characters on the ground.
"F1 Ch Veloc" - Force 1: Character Velocity. One of 3 X/Y forces applied to characters that result in their total movement each frame. This force is generally stuff that is a result of your own character's actions and includes things like dashing, air mobility, fallspeed, air dodge, and animation based movement. Also includes shield pushback when someone hits your shield (Defending).
"F2 KB Veloc" - Force 2: Knockback Velocity. Knockback from getting hit/thrown.
"F3 Sh Veloc" - Force 3: Attacker Shield KB Velocity. IIRC I've only seen this force used for shield pushback when hitting someone else's shield (Attacking).
"Total Veloc" - Total Velocity. This is the combination of all forces and the end result you'll move by each frame.
"Sys Directi" - Directional X/Y Input from the player's controller port. This is the input at the system level and not inputs applied to their character, so it's 'live' while the game is stopped in frame advance. Helpful for getting a full 1/-1 (game is picky about full directional inputs) or a specific amount of input applied to the character since you can adjust as needed before advancing the frame.
"Sys C-Stick" - C-Stick X/Y Input from the player's controller port.
"Sys L/R" - Analog L/R Input from the player's controller port.
"Cur Directi" - Directional X/Y Input applied to the character on the current frame.
"Prv Directi" - Directional X/Y Input applied to the character on the previous frame.
"CrPr Shield" - Current and Previous Variable Shield Input.
"Tmr Any Shd" - Frames Since Any Shield Press. Used for things like l-canceling.
"Tmr Dig Shd" - Frames Since & Between Digital Shield Press. Tech window (<20 since) and Tech-fail (>=40 between) for example.
"Tmr Jump" - Frames Since & Between Jump Inputs. Includes tap jumps. Meteor canceling.
"Tmr Up-B" - Frames Since & Between Up-B Inputs. Meteor canceling.
"Dmg/Hitlag" - Total Damage, and Hitlag. Damage would probably be more useful if stale moves were enabled, though chargeable moves like smashes do non-integer damage in develop. Attacker/Victim hitlag remaining.
"HitStn/Grab" - Hitstun, and Grab Hold Time. Frames of hitstun remaining. Time remaining before able to break out of a grab. Fun Fact: The losing player breaks out of grabs slightly faster than a winning player (wut).
"ShieldStun" - Actual shieldstun remaining, and originally calculated shieldstun. The difference comes from the game adding 0.1 to the animation length (20) when calculating the GuardDamage animation speed (and l-canceling) to create the stun time, though it sometimes results in 1 frame shorter stun than calculated (notably 20 damage on full strength shield).
"Shd HP/Size" - Shield Health, and Shield Collision Size. Shields have a max health of 60. The powershield reflect collision is 0.75x the size of the main shield collision shown.
"Tmr Int/Inv" - Timed Intangibility & Invincibility. Ledgegrabs and walljumps use the former, and respawning the latter.
"HB-0 X/Y" - Hitbox ID [0]'s X/Y Position. You can see the hitbox ID in MasterHand.
"HB-0 Z/Size" - Hitbox ID [0]'s Z Position & Size (radius). If the character is at 0,0 adding the Size to the X/Y/Z gives you the range of the hitbox.
"HB-1 X/Y" - Hitbox ID [1]'s X/Y Position.
"HB-1 Z/Size" - Hitbox ID [1]'s Z Position & Size (radius).
"HB-2 X/Y" - Hitbox ID [2]'s X/Y Position.
"HB-2 Z/Size" - Hitbox ID [2]'s Z Position & Size (radius).
"HB-3 X/Y" - Hitbox ID [3]'s X/Y Position.
"HB-3 Z/Size" - Hitbox ID [3]'s Z Position & Size (radius).
GIFs of Controls & Features
Physics, Input, etc Display in Develop Mode v2.0 (NTSC 1.00) [Magus]
C21A3CE8 00000008
3D808042 618C7940
894C0000 394A0001
2C0A0005 41A00008
39400000 994C0000
41A0001C 3D808016
618C4BC0 7D8803A6
4E800021 38000000
900DB088 00000000
061A3CEC 00000008
60000000 60000000
061A3E70 0000000C
3C608042 38637940
80630004 00000000
C2224D70 00000005
2C000001 41A0001C
2C000003 41A10014
3D408042 614A7947
7D2A00AE 913F0060
90040000 00000000
C2224DA8 00000005
2C000001 41A0001C
2C000003 41A10014
3D408042 614A7947
7D2A00AE 913F0060
90040000 00000000
C2390D68 00000079
9421FFC8 BE810008
3FE08042 63FF7940
8BDF0000 2C1E0001
4180000C 2C1E0004
40A10008 3BC00001
9BDF0000 1E9E2B67
929F0004 829F0008
2C140000 40A20010
3E801419 62941D00
929F0008 3A803030
3AA06666 3EC06666
62D63030 3FA08040
63BD84DE B2BD001C
B2BD0020 B2BD002E
B29D0038 92DD003A
B29D0046 92DD0048
92DD0054 B2BD0058
92DD0062 B2BD0066
3BFF0007 3F808049
639CD978 837C0004
2C1B0001 41A00034
2C1B0003 41A1002C
831C0000 7F1FD9AE
1EFB001C 3B17000E
7EBDBB2E 7EBDC32E
3AF70002 3B180002
7EDDB92E 7EDDC12E
3A800000 92820018
7C5A1378 3B200001
3FA0804D 63BD56A8
1EBEFFFC 7FBDA82E
83BD0020 6294FFFF
A2BD0006 7C15A000
4182027C 7F1FC8AE
82FD0070 2C180014
41820064 41800268
2C180018 408100B0
2C18001C 408100B4
2C18001F 408100EC
2C180022 40810108
2C18002E 40810114
2C1800D0 4182013C
2C1800D1 41820140
2C1800D2 41820154
2C1800D3 41820178
2C1800D4 41820190
2C1800DC 40810194
4800020C 7C19D800
40A2004C 3ABCFF3E
3B1CFF8E A6D50014
3AE00104 7ED7B879
4082002C A2F50008
56F7077B 41A20020
C0220018 C0420018
56D705EF 41A20008
C04281A8 D03D0110
D05D0114 7C15C000
4180FFC4 3ADD0110
4800017C 3ADD07D4
3AB8FFEB 48000168
3ADD00E0 41820010
3AB8FFE7 1EB5000C
48000158 C0360000
C0560004 C076000C
C0960010 C0B60018
C0D6001C EC21182A
EC21282A EC42202A
EC42302A 48000170
3EC0804B 62D6FE08
1EBE0044 7ED6AA14
8AB60021 2C1500FF
4182014C 3AB8FFE3
48000104 3ADD0680
40A20008 3AD60020
3AB8FFE0 480000F0
3AB8FFD5 7EBDAA14
3AC006E3 2C18002C
4081000C 3AB50004
3AC006E4 7EF5B0AE
8AD506DF 40A00008
3AE00000 480000D8
C03D1890 C05D19BC
480000FC C0220018
82DD227C 56D5018D
41A20008 C03D23A0
C05D1AAC 480000E0
2C1700B5 40A200D0
C03D08F4 C05D08FC
C0628F38 C0828B90
EC230828 EC211024
EC63202A EC431024
480000B4 C03D19F8
2C1700B2 41A000A4
2C1700B6 4181009C
82BD1A20 C0550058
48000094 82DD19F0
82FD19F4 48000058
3ADD09C0 3B18FF2B
3AE00002 7EB8BBD6
1EB50138 7ED6AA14
82B6FFB4 2C150000
41A2005C 3AF60004
571507FF 41A2001C
3AD60008 3AF6FFC8
48000010 1EB50008
7ED6AA14 3AF60004
C0360000 C0570000
48000034 C8628AF8
D8620020 D8620028
B2C20026 B2E2002E
C8220020 C8420028
EC211828 EC421828
4800000C C0220018
C0420018 D03A0000
D05A0004 3B390001
3B5A0008 2C190003
4081FD60 C0220000
C0420004 C0620008
C082000C C0A20010
C0C20014 BA810008
38210038 00000000
003D36ED 00000037
00408503 00000035
00408511 00000035
0640851F 00000030
3566205C 63303066
66303025 322E3566
205C6366 66303066
6625322E 3566205C
63666630 30666625
322E3566 20000000
06409FE0 00000010
C37A0000 C0000000
C1400000 440C0000
063E89F8 000000B4
546F702D 4E202020
20202000 45434220
546F7020 20202000
45434220 426F7474
6F6D2000 45434220
52696768 74202000
45434220 4C656674
20202000 46312043
68205665 6C6F6300
4632204B 42205665
6C6F6300 46332053
68205665 6C6F6300
546F7461 6C205665
6C6F6300 53797320
44697265 63746900
53797320 432D5374
69636B00 53797320
4C2F5220 20202000
43757220 44697265
63746900 50727620
44697265 63746900
43725072 20536869
656C6400 00000000
063E8C2C 00000030
546D7220 416E7920
53686400 546D7220
44696720 53686400
546D7220 4A756D70
20202000 546D7220
55702D42 20202000
063E8C6C 0000009C
446D672F 4869746C
61672000 48697453
746E2F47 72616200
53686965 6C645374
756E2000 53686420
48502F53 697A6500
546D7220 496E742F
496E7600 48422D30
20582F59 20202000
48422D30 205A2F53
697A6500 48422D31
20582F59 20202000
48422D31 205A2F53
697A6500 48422D32
20582F59 20202000
48422D32 205A2F53
697A6500 48422D33
20582F59 20202000
48422D33 205A2F53
697A6500 00000000
C21A3CE8 00000008
3D808042 618C7940
894C0000 394A0001
2C0A0005 41A00008
39400000 994C0000
41A0001C 3D808016
618C4BC0 7D8803A6
4E800021 38000000
900DB088 00000000
061A3CEC 00000008
60000000 60000000
061A3E70 0000000C
3C608042 38637940
80630004 00000000
C2224D70 00000005
2C000001 41A0001C
2C000003 41A10014
3D408042 614A7947
7D2A00AE 913F0060
90040000 00000000
C2224DA8 00000005
2C000001 41A0001C
2C000003 41A10014
3D408042 614A7947
7D2A00AE 913F0060
90040000 00000000
C2390D68 00000079
9421FFC8 BE810008
3FE08042 63FF7940
8BDF0000 2C1E0001
4180000C 2C1E0004
40A10008 3BC00001
9BDF0000 1E9E2B67
929F0004 829F0008
2C140000 40A20010
3E801419 62941D00
929F0008 3A803030
3AA06666 3EC06666
62D63030 3FA08040
63BD84DE B2BD001C
B2BD0020 B2BD002E
B29D0038 92DD003A
B29D0046 92DD0048
92DD0054 B2BD0058
92DD0062 B2BD0066
3BFF0007 3F808049
639CD978 837C0004
2C1B0001 41A00034
2C1B0003 41A1002C
831C0000 7F1FD9AE
1EFB001C 3B17000E
7EBDBB2E 7EBDC32E
3AF70002 3B180002
7EDDB92E 7EDDC12E
3A800000 92820018
7C5A1378 3B200001
3FA0804D 63BD56A8
1EBEFFFC 7FBDA82E
83BD0020 6294FFFF
A2BD0006 7C15A000
4182027C 7F1FC8AE
82FD0070 2C180014
41820064 41800268
2C180018 408100B0
2C18001C 408100B4
2C18001F 408100EC
2C180022 40810108
2C18002E 40810114
2C1800D0 4182013C
2C1800D1 41820140
2C1800D2 41820154
2C1800D3 41820178
2C1800D4 41820190
2C1800DC 40810194
4800020C 7C19D800
40A2004C 3ABCFF3E
3B1CFF8E A6D50014
3AE00104 7ED7B879
4082002C A2F50008
56F7077B 41A20020
C0220018 C0420018
56D705EF 41A20008
C04281A8 D03D0110
D05D0114 7C15C000
4180FFC4 3ADD0110
4800017C 3ADD07D4
3AB8FFEB 48000168
3ADD00E0 41820010
3AB8FFE7 1EB5000C
48000158 C0360000
C0560004 C076000C
C0960010 C0B60018
C0D6001C EC21182A
EC21282A EC42202A
EC42302A 48000170
3EC0804B 62D6FE08
1EBE0044 7ED6AA14
8AB60021 2C1500FF
4182014C 3AB8FFE3
48000104 3ADD0680
40A20008 3AD60020
3AB8FFE0 480000F0
3AB8FFD5 7EBDAA14
3AC006E3 2C18002C
4081000C 3AB50004
3AC006E4 7EF5B0AE
8AD506DF 40A00008
3AE00000 480000D8
C03D1890 C05D19BC
480000FC C0220018
82DD227C 56D5018D
41A20008 C03D23A0
C05D1AAC 480000E0
2C1700B5 40A200D0
C03D08F4 C05D08FC
C0628F38 C0828B90
EC230828 EC211024
EC63202A EC431024
480000B4 C03D19F8
2C1700B2 41A000A4
2C1700B6 4181009C
82BD1A20 C0550058
48000094 82DD19F0
82FD19F4 48000058
3ADD09C0 3B18FF2B
3AE00002 7EB8BBD6
1EB50138 7ED6AA14
82B6FFB4 2C150000
41A2005C 3AF60004
571507FF 41A2001C
3AD60008 3AF6FFC8
48000010 1EB50008
7ED6AA14 3AF60004
C0360000 C0570000
48000034 C8628AF8
D8620020 D8620028
B2C20026 B2E2002E
C8220020 C8420028
EC211828 EC421828
4800000C C0220018
C0420018 D03A0000
D05A0004 3B390001
3B5A0008 2C190003
4081FD60 C0220000
C0420004 C0620008
C082000C C0A20010
C0C20014 BA810008
38210038 00000000
003D36ED 00000037
00408503 00000035
00408511 00000035
0640851F 00000030
3566205C 63303066
66303025 322E3566
205C6366 66303066
6625322E 3566205C
63666630 30666625
322E3566 20000000
06409FE0 00000010
C37A0000 C0000000
C1400000 440C0000
063E89F8 000000B4
546F702D 4E202020
20202000 45434220
546F7020 20202000
45434220 426F7474
6F6D2000 45434220
52696768 74202000
45434220 4C656674
20202000 46312043
68205665 6C6F6300
4632204B 42205665
6C6F6300 46332053
68205665 6C6F6300
546F7461 6C205665
6C6F6300 53797320
44697265 63746900
53797320 432D5374
69636B00 53797320
4C2F5220 20202000
43757220 44697265
63746900 50727620
44697265 63746900
43725072 20536869
656C6400 00000000
063E8C2C 00000030
546D7220 416E7920
53686400 546D7220
44696720 53686400
546D7220 4A756D70
20202000 546D7220
55702D42 20202000
063E8C6C 0000009C
446D672F 4869746C
61672000 48697453
746E2F47 72616200
53686965 6C645374
756E2000 53686420
48502F53 697A6500
546D7220 496E742F
496E7600 48422D30
20582F59 20202000
48422D30 205A2F53
697A6500 48422D31
20582F59 20202000
48422D31 205A2F53
697A6500 48422D32
20582F59 20202000
48422D32 205A2F53
697A6500 48422D33
20582F59 20202000
48422D33 205A2F53
697A6500 00000000
Code:
..................... -Increment Player ID/CPU Stat View Toggle (801A3CE8)-
lis r12,0x8042
ori r12,r12,0x7940 # 80427940
lbz r10,0(r12) # loads player ID to display stuff for
addi r10,r10,1 # increment it
cmpwi r10,5
blt+ 0x8
li r10,0 # reset ID to 0 if above 4
stb r10,0(r12) # update player ID
blt+ END # skip disabling display if simply incrementing player ID
DISABLE:
lis r12,0x8016 # stuff to run if cycled beyond player 4 and disabling CPU Stat display
ori r12,r12,0x4BC0 # 80164BC0
mtlr r12
blrl
li r0,0
stw r0,-20344(r13) # clear pointer
END:
----------
801A3CEC: 38000000 li r0,0 -> nop
801A3CF0: 900DB088 stw r0,-20344(r13) -> nop
..................... -Load Player ID Instead of Frame Count (801A3E70)-
801A3E70: 3C608047 lis r3,-32697 -> lis r3,0x8042
801A3E74: 38637D90 addi r3,r3,32144 -> addi r3,r3,0x7940 # 80427940
801A3E78: 80630008 lwz r3,8(r3) -> lwz r3,4(r3) # loads player ID * 11111 (for readability)
..................... -Load Display Setting on Float Pair Change (Advance Right) (80224D70)-
cmpwi r0,1 # r0 is new pokemon setting (controls floats slot if 1-3)
blt+ END
cmpwi r0,3
bgt+ END
lis r10,0x8042
ori r10,r10,0x7947 # 80427947. settings address -0x1
lbzx r9,r10,r0 # loads floats setting for the slot
stw r9,0x60(r31) # store it into item setting so the float description text updates
END:
stw r0,0(r4) # entry point (80224D70). update pokemon setting after advancing Right
..................... -Load Display Setting on Float Pair Change (Advance Left) (80224DA8)-
cmpwi r0,1 # r0 is new pokemon setting (controls floats slot if 1-3)
blt+ END
cmpwi r0,3
bgt+ END
lis r10,0x8042
ori r10,r10,0x7947 # 80427947. settings address -0x1
lbzx r9,r10,r0 # loads floats setting for the slot
stw r9,0x60(r31) # store it into item setting so the float description text updates
END:
stw r0,0(r4) # entry point (80224DA8). update pokemon setting after advancing Left
..................... -Load Custom CPU Stat Floats (80390D68)-
stwu r1,-56(r1) # make space for 12 registers
stmw r20,8(r1) # push r20-r31 onto the stack
lis r31,0x8042
ori r31,r31,0x7940 # 80427940
lbz r30,0(r31) # loads player ID to display stuff for
cmpwi r30,1
blt- RESET_ID
cmpwi r30,4
ble+ SCALE_ID
RESET_ID:
li r30,1 # set player ID to 1 if not 1-4
SCALE_ID:
stb r30,0(r31) # store player ID
mulli r20,r30,11111 # scale up player id by 11111 (for on-screen readability)
stw r20,4(r31) # update player ID to display
DEFAULT_SETTINGS:
lwz r20,8(r31) # loads settings for displayed stuff
cmpwi r20,0 # 0 if no settings defined yet
bne+ DEFAULT_COLORS
lis r20,0x1419
ori r20,r20,0x1D00 # 14191D00. TopN, Char Velocity, Directional Input (System)
stw r20,8(r31) # default settings for displayed stuff
DEFAULT_COLORS:
li r20,0x3030 # 00003030 (- - 0 0)
li r21,0x6666 # 00006666 (- - f f)
lis r22,0x6666
ori r22,r22,0x3030 # 66663030 (f f 0 0)
lis r29,0x8040
ori r29,r29,0x84DE # 804084DE. Font color data address -0x1C
sth r21,0x1C(r29) # f f @804084FA (float 1 Red)
sth r21,0x20(r29) # f f @804084FE (float 1 Blue)
sth r21,0x2E(r29) # f f @8040850C (float 2 Blue)
sth r20,0x38(r29) # 0 0 @80408516 (float 3 Red)
stw r22,0x3A(r29) # f f 0 0 @80408518 (float 3 Green/Blue)
sth r20,0x46(r29) # 0 0 @80408524 (float 4 Red)
stw r22,0x48(r29) # f f 0 0 @80408526 (float 4 Green/Blue)
stw r22,0x54(r29) # f f 0 0 @80408532 (float 5 Red/Green)
sth r21,0x58(r29) # f f @80408536 (float 5 Blue)
stw r22,0x62(r29) # f f 0 0 @80408540 (float 6 Red/Green)
sth r21,0x66(r29) # f f @80408544 (float 6 Blue)
UPDATE_SETTING:
addi r31,r31,7 # 80427947. settings address -0x1
lis r28,0x8049
ori r28,r28,0xD978 # 8049D978. Address of Debug Item/Pokemon Settings
lwz r27,0x4(r28) # loads Pokemon Setting
cmpwi r27,1
blt+ FLOAT_PREP
cmpwi r27,3
bgt+ FLOAT_PREP # no float font highlight or updating floats setting if not slots 1-3
lwz r24,0x0(r28) # loads Item Setting
stbx r24,r31,r27 # stores item setting as floats setting for the slot
HIGHLIGHT:
mulli r23,r27,0x1C # float pairs' color data 0x1C apart. 1st float in pair offset
addi r24,r23,0xE # 2nd float in pair offset
sthx r21,r29,r23 # 1st float Red = f f
sthx r21,r29,r24 # 2nd float Red = f f
addi r23,r23,2 # moves 1st float offset to Green/Blue
addi r24,r24,2 # moves 2nd float offset to Green/Blue
stwx r22,r29,r23 # 1st float Green/Blue = f f 0 0
stwx r22,r29,r24 # 2nd float Green/Blue = f f 0 0
FLOAT_PREP:
li r20,0
stw r20,0x18(r2) # stores 0 for when loading null floats
mr r26,r2 # initialize address to store floats during code's loop
li r25,1 # initialize current float pair being worked on
GET_MAIN_INDEX:
lis r29,0x804D
ori r29,r29,0x56A8 # 804D56A8. Address for player pointers (P1) +0x4
mulli r21,r30,-0x4 # player ID * -4. pointers are 4 bytes apart and in reverse order
lwzx r29,r29,r21
lwz r29,0x20(r29) # loads Main Index for player being displayed
ori r20,r20,0xFFFF # 0000FFFF. for empty player slot check
LOOP_START:
lhz r21,0x6(r29) # FFFF if empty player slot
cmpw r21,r20
beq- NULL_FLOATS # go to use 0 for both floats in this pair if empty player slot
lbzx r24,r31,r25 # loads setting for float pair being worked on
lwz r23,0x70(r29) # loads current action
cmpwi r24,0x14 # 0x14 = TopN
beq- TOPN
blt- NULL_FLOATS # load null floats if invalid setting on this float pair
cmpwi r24,0x18
ble- SCD # 0x15 - 0x18 = SCD Top/Bottom/Right/Left
cmpwi r24,0x1C
ble- VELOCITIES # 0x19 - 0x1C = Forces|Velocities
cmpwi r24,0x1F
ble- LIVE_INPUTS # 0x1D - 0x1F = Live Controller Port Inputs
cmpwi r24,0x22
ble- CHAR_INPUTS # 0x20 - 0x22 = Inputs Applied to Character
cmpwi r24,0x2E
ble- BUTTON_TIMERS # 0x2B - 0x2E = Button Timers
cmpwi r24,0xD0 # 0xD0 = Total Damage|Hitlag
beq- DAMAGE_HITLAG
cmpwi r24,0xD1 # 0xD1 = Hitstun|Grab Hold Time
beq- HITSTUN_GRABTIME
cmpwi r24,0xD2 # 0xD2 = Shield Stun (Actual|Calculated)
beq- SHIELDSTUN
cmpwi r24,0xD3 # 0xD3 = Shield Health|Size
beq- SHIELD_HPSIZE
cmpwi r24,0xD4 # 0xD4 = Timed Intangibility/Invincibility
beq- TIMED_INTINV
cmpwi r24,0xDC # 0xD5 - 0xDC = Hitbox X/Y|Hitbox Z/Size
ble- HITBOX
b NULL_FLOATS # load null floats if invalid setting on this float pair
TOPN:
cmpw r25,r27
bne+ TOPN_ADDRESS # skip input checks for TopN modification if TopN float pair not highlighted
TOPN_MODIFY:
subi r21,r28,0xC2 # 8049D8B6. Controller port 1 debug held inputs -0x14
subi r24,r28,0x72 # port 4's address for end of loop
TOPN_LOOP:
lhzu r22,0x14(r21) # loads next port's held inputs
li r23,0x0104 # A and dpad-down buttons
andc. r23,r22,r23
bne- TOPN_LOOP_CHK # skip if inputting anything besides A or dpad-down
lhz r23,0x8(r21) # loads press inputs
rlwinm. r23,r23,0,29,29 # check if dpad-down press
beq+ TOPN_LOOP_CHK # skip if no dpad-down press
lfs f1,0x18(r2) # 0 for TopN X
lfs f2,0x18(r2) # 0 for TopN Y
rlwinm. r23,r22,0,23,23 # check if A button held
beq+ 0x8
lfs f2,-32344(r2) # loads 100 for TopN Y if holding A
stfs f1,0x110(r29) # update TopN X
stfs f2,0x114(r29) # update TopN Y
TOPN_LOOP_CHK:
cmpw r21,r24
blt+ TOPN_LOOP # loop if not finished checking all controller ports
TOPN_ADDRESS:
addi r22,r29,0x110 # Main Index + 0x110 = TopN X
b COMMON_PAIR_4
SCD:
addi r22,r29,0x7D4 # Main Index + 0x7D4 = SCD Top X
subi r21,r24,0x15
b COMMON_GROUP_8 # Top/Bottom/Right/Left are 0x8 bytes apart, and pairs 4 apart
VELOCITIES:
addi r22,r29,0xE0 # Main Index + 0xE0 = F1 Char Velocity X
beq- NET_VELOCITY # 0x1C = Net Velocity
subi r21,r24,0x19
mulli r21,r21,0xC # F1/F2/F3 forces float groups are 0xC bytes apart, and pairs 4 apart
b COMMON_GROUP
NET_VELOCITY:
lfs f1,0x0(r22) # F1 Char Velocity X
lfs f2,0x4(r22) # F1 Char Velocity Y
lfs f3,0xC(r22) # F2 KB Velocity X
lfs f4,0x10(r22) # F2 KB Velocity Y
lfs f5,0x18(r22) # F3 Atk-Shd KB Velocity X
lfs f6,0x1C(r22) # F3 Atk-Shd KB Velocity Y
fadds f1,f1,f3
fadds f1,f1,f5 # total force X
fadds f2,f2,f4
fadds f2,f2,f6 # total force Y
b LOOP_END
LIVE_INPUTS:
lis r22,0x804B
ori r22,r22,0xFE08 # 804BFE08. Controller port 1 inputs -0x44
mulli r21,r30,0x44 # player ID * 0x44 (ports 0x44 apart)
add r22,r22,r21
lbz r21,0x21(r22) # FF if empty controller port
cmpwi r21,0xFF
beq- NULL_FLOATS # null floats if no controller plugged into port showing floats for
subi r21,r24,0x1D
b COMMON_GROUP_8 # Directional/C-Stick/LR inputs are 0x8 bytes apart, and pairs 4 apart
CHAR_INPUTS:
addi r22,r29,0x680 # Main Index + 0x680 = Current Dir Input X
bne+ 0x8 # skip if not 0x22 Curr/Prev Shield Input
addi r22,r22,0x20 # shield input is 0x20 later than the usual 0x8 between groups
subi r21,r24,0x20
b COMMON_GROUP_8 # CurrDir/PrevDir/Shield inputs are 0x8 bytes apart, and pairs 4 apart
BUTTON_TIMERS:
subi r21,r24,0x2B
add r21,r29,r21 # Main Index + group offset
li r22,0x6E3 # offset from main index 1st timer + 0x4 (0x2C timers are 4 apart)
cmpwi r24,0x2C
ble- LOAD_TIMERS
addi r21,r21,0x4 # 2D-2E are 4 bytes after calculated group offset
li r22,0x6E4 # offset from main index 1st timer + 0x5 (0x2D-2E timers are 5 apart)
LOAD_TIMERS:
lbzx r23,r21,r22 # loads 2nd timer
lbz r22,0x6DF(r21) # loads 1st timer
bge+ 0x8 # skip if 2C-2E
li r23,0 # 2B has no 2nd timer. null
b INT_TO_FLOAT # convert the int timers into floats so they can be used
DAMAGE_HITLAG:
lfs f1,0x1890(r29) # loads Total Damage as 1st float
lfs f2,0x19BC(r29) # loads Hitlag as 2nd float
b LOOP_END
HITSTUN_GRABTIME:
lfs f1,0x18(r2) # loads 0 for 1st float by default
lwz r22,0x227C(r29) # loads flags for things like hitstun
rlwinm. r21,r22,0,6,6 # check flag for in hitstun (-2------)
beq+ GRAB_TIME # keep as 0 if not in hitstun
lfs f1,0x23A0(r29) # loads variable(?) that contains hitstun duration while in hitstun
GRAB_TIME:
lfs f2,0x1AAC(r29) # loads Grab Hold Time as 2nd float
b LOOP_END
SHIELDSTUN:
cmpwi r23,0xB5 # 0xB5 = GuardDamage
bne+ NULL_FLOATS # null floats if not shield damage action
lfs f1,0x8F4(r29) # loads current animation frame
lfs f2,0x8FC(r29) # loads animation speed
lfs f3,-28872(r2) # 804D6798. loads 20 (41A00000). GuardDamage animation length for all characters
lfs f4,-29808(r2) # 804D63F0. loads 0.1 (3DCCCCCD). added to animation length for FSM calculations
fsubs f1,f3,f1 # 20 - Current Frame = Animation Length Remaining
fdivs f1,f1,f2 # (20 - Current Frame) / Speed = Actual Stun Time Remaining
fadds f3,f3,f4 # 20 + 0.1
fdivs f2,f3,f2 # (20 + 0.1) / Speed = Originally Calculated Stun Time
b LOOP_END
SHIELD_HPSIZE:
lfs f1,0x19F8(r29) # loads Shield Health as 1st float
cmpwi r23,0xB2 # 0xB2 = GuardOn
blt+ NULL_SECOND # load 0 for 2nd float if not shield action
cmpwi r23,0xB6 # 0xB6 = GuardReflect
bgt- NULL_SECOND # load 0 for 2nd float if not shield action
lwz r21,0x1A20(r29)
lfs f2,0x58(r21) # loads Shield Collision Size as 2nd float
b LOOP_END
TIMED_INTINV:
lwz r22,0x19F0(r29) # loads timed Intangibility
lwz r23,0x19F4(r29) # loads timed Invincibility
b INT_TO_FLOAT # convert the int timers into floats so they can be used
HITBOX:
addi r22,r29,0x9C0 # Main Index + 0x9C0 = Hitbox-0 X
subi r24,r24,0xD5 # setting remainder for hitbox setting group 0xD5 - 0xDC
li r23,2
divw r21,r24,r23 # each hitbox has 2 float pair settings associated with it
mulli r21,r21,0x138 # hitboxes are 0x138 apart
add r22,r22,r21 # address of X Offset of Hitbox being looked at
lwz r21,-0x4C(r22) # 0 = inactive hitbox ID, 2 = active no interp, 3 = active interp
cmpwi r21,0
beq+ NULL_FLOATS # null floats if hitbox ID not active
addi r23,r22,0x4 # 2nd float is 4 bytes after 1st on Even hitbox settings
rlwinm. r21,r24,0,31,31 # check if Odd hitbox setting
beq+ COMMON_LOAD # skip and load floats if Even hitbox setting
addi r22,r22,0x8
subi r23,r22,0x38 # Size (2nd float) is -0x38 from Z (1st), not +0x4
b COMMON_LOAD # load hitbox floats
COMMON_GROUP_8:
mulli r21,r21,0x8 # groups of floats are 8 bytes apart
COMMON_GROUP:
add r22,r22,r21 # adds group offset
COMMON_PAIR_4:
addi r23,r22,0x4 # 2nd float 4 bytes after 1st
COMMON_LOAD:
lfs f1,0x0(r22)
lfs f2,0x0(r23)
b LOOP_END
INT_TO_FLOAT:
lfd f3,-29960(r2) # loads magic double for int to float conversion
stfd f3,0x20(r2)
stfd f3,0x28(r2)
sth r22,0x26(r2) # 0x43300000800000xx. put 1st int at end of magic double
sth r23,0x2E(r2) # 2nd int
lfd f1,0x20(r2)
lfd f2,0x28(r2)
fsubs f1,f1,f3 # subtract 0x4330000080000000 for converted int 1
fsubs f2,f2,f3 # subtract 0x4330000080000000 for converted int 2
b LOOP_END
NULL_FLOATS:
lfs f1,0x18(r2) # loads 0 for 1st float
NULL_SECOND:
lfs f2,0x18(r2) # loads 0 for 2nd float
LOOP_END:
stfs f1,0x0(r26) # store 1st float in pair at current pair's loading address
stfs f2,0x4(r26) # 2nd float
addi r25,r25,1 # increment current float pair
addi r26,r26,8 # update float storage address to next float pair slot
cmpwi r25,3
ble+ LOOP_START # loop for next float pair until all 3 are done
LOAD_FLOATS:
lfs f1,0x0(r2) # loads setting 1, float 1
lfs f2,0x4(r2) # loads setting 1, float 2
lfs f3,0x8(r2) # loads setting 2, float 1
lfs f4,0xC(r2) # loads setting 2, float 2
lfs f5,0x10(r2) # loads setting 3, float 1
lfs f6,0x14(r2) # loads setting 3, float 2
END:
lmw r20,8(r1) # pop r20-r31 off the stack
addi r1,r1,56 # release the space
r20 = Temp Stuff | 0000FFFF
r21 = Temp Stuff
r22 = Temp Stuff | Common Load 1, Int to Float 1
r23 = Temp Stuff | Current Action | Common Load 2, Int to Float 2
r24 = Temp Stuff | Current Floats Setting for Functions
r25 = Current Floats Pair
r26 = Current Float Storage Address
r27 = Pokemon Setting
r28 = Address of Debug Item/Pokemon Settings and Debug Inputs
r29 = Font Color Data Address | Main Index for Player
r30 = Player ID
r31 = Display Settings Address | Display Settings Address + 0x7 (for indexed loading of settings)
Code:
---DOL Edits---
801A3CE8 0x1A08C8 48283C68 60000000 60000000
80427950 0x424950 3D808042 618C7940 894C0000 394A0001 2C0A0005 41A00008 39400000 994C0000 41A0001C 3D808016 618C4BC0 7D8803A6 4E800021 38000000 900DB088 4BD7C360
801A3E70 0x1A0A50 3C608042 38637940 80630004
80224D70 0x221950 48202C30
804279A0 0x4249A0 2C000001 41A0001C 2C000003 41A10014 3D408042 614A7947 7D2A00AE 913F0060 90040000 4BDFD3B0
80224DA8 0x221988 48202C28
804279D0 0x4249D0 2C000001 41A0001C 2C000003 41A10014 3D408042 614A7947 7D2A00AE 913F0060 90040000 4BDFD3B8
80390D68 0x38D948 480969D8
80427740 0x424740 9421FFC8 BE810008 3FE08042 63FF7940 8BDF0000 2C1E0001 4180000C 2C1E0004 40A10008 3BC00001 9BDF0000 1E9E2B67 929F0004 829F0008 2C140000 40A20010 3E801419 62941D00 929F0008 3A803030 3AA06666 3EC06666 62D63030 3FA08040 63BD84DE B2BD001C B2BD0020 B2BD002E B29D0038 92DD003A B29D0046 92DD0048 92DD0054 B2BD0058 92DD0062 B2BD0066 3BFF0007 3F808049 639CD978 837C0004 2C1B0001 41A00034 2C1B0003 41A1002C 831C0000 7F1FD9AE 1EFB001C 3B17000E 7EBDBB2E 7EBDC32E 3AF70002 3B180002 7EDDB92E 7EDDC12E 3A800000 92820018 7C5A1378 3B200001 3FA0804D 63BD56A8 1EBEFFFC 7FBDA82E 83BD0020 6294FFFF 4BFFFB20
80427360 0x424360 A2BD0006 7C15A000 4182027C 7F1FC8AE 82FD0070 2C180014 41820064 41800268 2C180018 408100B0 2C18001C 408100B4 2C18001F 408100EC 2C180022 40810108 2C18002E 40810114 2C1800D0 4182013C 2C1800D1 41820140 2C1800D2 41820154 2C1800D3 41820178 2C1800D4 41820190 2C1800DC 40810194 4800020C 7C19D800 40A2004C 3ABCFF3E 3B1CFF8E A6D50014 3AE00104 7ED7B879 4082002C A2F50008 56F7077B 41A20020 C0220018 C0420018 56D705EF 41A20008 C04281A8 D03D0110 D05D0114 7C15C000 4180FFC4 3ADD0110 4800017C 3ADD07D4 3AB8FFEB 48000168 3ADD00E0 41820010 3AB8FFE7 1EB5000C 48000158 C0360000 C0560004 C076000C C0960010 C0B60018 C0D6001C EC21182A EC21282A EC42202A EC42302A 48000170 3EC0804B 62D6FE08 1EBE0044 7ED6AA14 8AB60021 2C1500FF 4182014C 3AB8FFE3 48000104 3ADD0680 40A20008 3AD60020 3AB8FFE0 480000F0 3AB8FFD5 7EBDAA14 3AC006E3 2C18002C 4081000C 3AB50004 3AC006E4 7EF5B0AE 8AD506DF 40A00008 3AE00000 480000D8 C03D1890 C05D19BC 480000FC C0220018 82DD227C 56D5018D 41A20008 C03D23A0 C05D1AAC 480000E0 2C1700B5 40A200D0 C03D08F4
C05D08FC C0628F38 C0828B90 EC230828 EC211024 EC63202A EC431024 480000B4 C03D19F8 2C1700B2 41A000A4 2C1700B6 4181009C 82BD1A20 C0550058 48000094 82DD19F0 82FD19F4 48000058 3ADD09C0 3B18FF2B 3AE00002 7EB8BBD6 1EB50138 7ED6AA14 82B6FFB4 2C150000 41A2005C 3AF60004 571507FF 41A2001C 3AD60008 3AF6FFC8 48000010 1EB50008 7ED6AA14 3AF60004 C0360000 C0570000 48000034 C8628AF8 D8620020 D8620028 B2C20026 B2E2002E C8220020 C8420028 EC211828 EC421828 4800000C C0220018 C0420018 D03A0000 D05A0004 3B390001 3B5A0008 2C190003 4081FD60 C0220000 C0420004 C0620008 C082000C C0A20010 C0C20014 BA810008 38210038 4BF69748
803D36ED 0x3D06ED 37
80408503 0x405503 35
80408511 0x405511 35
8040851F 0x40551F 3566205C 63303066 66303025 322E3566 205C6366 66303066 6625322E 3566205C 63666630 30666625 322E3566 20000000
80409FE0 0x406FE0 C37A0000 C0000000 C1400000 440C0000
803E89F8 0x3E59F8 546F702D 4E202020 20202000 45434220 546F7020 20202000 45434220 426F7474 6F6D2000 45434220 52696768 74202000 45434220 4C656674 20202000 46312043 68205665 6C6F6300 4632204B 42205665 6C6F6300 46332053 68205665 6C6F6300 546F7461 6C205665 6C6F6300 53797320 44697265 63746900 53797320 432D5374 69636B00 53797320 4C2F5220 20202000 43757220 44697265 63746900 50727620 44697265 63746900 43725072 20536869 656C6400
803E8C2C 0x3E5C2C 546D7220 416E7920 53686400 546D7220 44696720 53686400 546D7220 4A756D70 20202000 546D7220 55702D42 20202000
803E8C6C 0x3E5C6C 446D672F 4869746C 61672000 48697453 746E2F47 72616200 53686965 6C645374 756E2000 53686420 48502F53 697A6500 546D7220 496E742F 496E7600 48422D30 20582F59 20202000 48422D30 205A2F53 697A6500 48422D31 20582F59 20202000 48422D31 205A2F53 697A6500 48422D32 20582F59 20202000 48422D32 205A2F53 697A6500 48422D33 20582F59 20202000 48422D33 205A2F53 697A6500
DOL Downloads
NOTE: These are v1.00 of the game. If you only have a 1.01/1.02 version you can just replace the .DOL anyway and it'll work (although the executable will now be 1.00, so if it was originally 1.02 Bowser will now be able to flame cancel, Zelda's smashes actually work, etc).
C-Stick 1P, Debug Tourny, Rules, Physics & MORE Display (NTSC 100)
Has c-stick in 1P modes, Debug replaces Tournament mode, 4 Stock, 8 min, FF On default settings as well.
C-Stick 1P, C-Stick Debug, Debug Tourny, Rules, No Interp, Physics & MORE Display (NTSC 100)
This is the one I use that also disables develop mode displaying the interpolation on hitboxes since that's useful to me. Might as well also include it here since it's already made.