Magus shares his Taunts = Footstool code from Project M! [OLD]

Which Taunts = Footstool code should we use in Brawl Minus?


  • Total voters
    7

Bent 00

Longtime Limit Breaker
There is a newer version of this topic. Please vote again!

Great news: We don't have to give up taunt-triggered footstools after all! After I learned that the "New Footstool Triggers" code Glitch and I worked on causes WiFi to desync, I investigated Project M's Taunts = Footstool code. I found out that it is superior to our version -- Project M's version detaches footstools from jumps, and ties them to taunts, without hardcoding them to specific buttons like we did -- and it should not cause WiFi to desync.

I asked Magus, the creator of Project M's Taunts = Footstool code, if we could use his work in Brawl Minus. Here is his first response:
Magus said:
Yeah, taking a quick look at that code it seems like it works by looking at the controller hardware and if physical buttons are pressed (A/B/X/Y/etc) it temporarily changes the requirement from 'Jump Button' to 'Up-Taunt Button'. Over WiFi and saved in Replays, only the button actions are sent/saved (Attack/Special/Jump/etc), so since it can't see the controller itself being pressed it doesn't work and desyncs. Light press shielding and analog c-stick shield action buffers and ASDI cause desyncs in WiFi/Replays in Project M in the full codeset for the same reason, since that analog data isn't sent/saved and is only seen locally. Also, since that footstool code toggles the requirement used by all players, I imagine you can mess with another player's input needed to footstool by holding buttons (probably depends on controller port for which player controls the setting if they conflict).

Sure, I have no problem with anyone using that code. The code in PM currently works by replacing the tap jump and button jump change actions for footstool into a check for any taunt button press. The requirement used, Any Taunt Press, is a custom PSA scripting requirement that I added into the game along with a few others to fill empty requirements using assembly code, so that code is also needed for it to work (doesn't have any effect other than the footstools code if using them outside of PM since those req slots aren't used normally). Without it, each taunt button needs to be checked separately (Up/Side/Down).

Needed for either footstool code version

Custom Requirements v1.1 [Magus]
* C27854B0 00000034
* 9421FFD8 BF010008
* DBC20010 DBE20018
* 38600001 2C04004D
* 41820028 2C04004E
* 41820074 2C04004F
* 418200B0 2C040050
* 418200E4 2C040051
* 41820138 4800014C
* 83E60068 8B9F00AE
* 8BBF00B0 2C1C0002
* 41800010 2C1D0002
* 41800008 48000030
* C3DF0038 C3FF003C
* EFDE07B2 EFFF07F2
* EFDEF82A 3F6080B8
* 637B8350 C3FB0000
* EFFF07F2 FC1EF840
* 40800008 38600000
* 480000F8 83E60068
* 83BF0074 839F0078
* 57BBEFFE 2C1B0000
* 41A20010 579BEFFE
* 2C1B0000 41820020
* 83C60070 83DE0020
* 83DE000C 837E0134
* 2C1B0001 41820008
* 38600000 480000B4
* 83E60068 83BF0074
* 57BBEFFE 2C1B0001
* 41820028 83C60070
* 83DE0020 83DE000C
* 837E0134 2C1B0001
* 41820010 2C1B0002
* 41820008 38600000
* 48000078 83E60068
* 83BF0074 839F0078
* 57BBB7FE 2C1B0000
* 41A20010 579BB7FE
* 2C1B0000 41820038
* 57BBAFFE 2C1B0000
* 41A20010 579BAFFE
* 2C1B0000 41820020
* 57BBA7FE 2C1B0000
* 41A20010 579BA7FE
* 2C1B0000 41820008
* 38600000 4800001C
* 83E60068 83BF0074
* 57BBB77E 2C1B0000
* 41810008 38600000
* CBC20010 CBE20018
* BB010008 38210028
* 60000000 00000000
-SDI Input (4D), Any Shield Input (4E-4F), Any Taunt Input (50-51)


Req 50 = Any Taunt Press
Req 51 = Any Taunt Held


The reason I created the Any Taunt button requirements is because in the routine for footstooling there are 3 change actions (tap jump, button jump, SSE enemy/green shell/etc auto jump). In earlier versions of PM when the taunts were checked individually you could only footstool with up/down taunt because those scripts don't allow more action changes than originally existed for whatever reason even by inserting additional code, so up taunt replaced tap jump and down replaced button jump. By combining the taunt checks into a single action change using the custom requirement all 3 taunts could fit and have SSE/green shells and stuff work properly. This is the first code listed below, and is the one used for PM.

If footstooling with taunt is wanted in addition to footstooling with jump, however, one of the footstool methods needs to go since there can only be 3. I've made a second code below that makes footstool work with any taunt and button jump, but tap-jump no longer footstools. Replacing auto-footstool instead would be significantly more work and I'm also not sure it's compatible anyway since there may be hard coding tied to the status ID it uses. SSE also becomes obnoxious with manual footstooling only.


Footstool with Only Taunt v1.2 [Magus]
* 02FC1528 001B0002
* 04FC1560 02000301
* 04FAA8D0 00000050
* 04FB62C4 000A0100
* 04FB6240 00000050
* 04FB61D4 000A0100
* 04FB6188 80000051
Code:
Footstool with Only Taunt v1.2 [Magus]
* 02FC1528 001B0002    fills 80FC1528-80FC1560 with nops (00020002)
* 04FC1560 02000301    02000401 -> 02000301. CHK_AIR_TREAD_JUMP (21908). 4->3 params
* 04FAA8D0 00000050    00000030 -> 00000050. CHK_AIR_TREAD_JUMP (21908). Req=Button Press -> Any Taunt Press
* 04FB62C4 000A0100    000A0200 -> 000A0100. Action 0x6D (Footstool). 2->1 params
* 04FB6240 00000050    00000030 -> 00000050. Action 0x6D (Footstool). Req=Button Press -> Any Taunt Press
* 04FB61D4 000A0100    000A0200 -> 000A0100. Action 0x6D CIL (Footstool). 2->1 params
* 04FB6188 80000051    00000033 -> 80000051. Action 0x6D CIL (Footstool). Req=Button Not Held -> Any Taunt Not Held

-OR-


Footstool with Taunt, but No Tap Jump Footstool [Magus]
* 04FAA828 00000050
* 06FC1528 00000038
* 02000301 80FAA814
* 02040400 80FAA8DC
* 02040400 80FAA8FC
* 02040100 80FAA91C
* 02040100 80FAA924
* 00020000 00000000
* 00020000 00000000
Code:
Footstool with Taunt, but No Tap Jump Footstool [Magus]
* 04FAA828 00000050    00000007 -> 00000050. CHK_AIR_TREAD_JUMP (21908). Req=Compare -> Any Taunt Press
* 06FC1528 00000038
* 02000301 80FAA814    Change Action(St)(EXT=1) - 0x274F, 0x6D, Req=Any Taunt Press
* 02040400 80FAA8DC    Additional Requirement - LA-Basic[6] = 0.00x
* 02040400 80FAA8FC    Additional Requirement - IC-Basic[1034] >= IC-Basic[3227]
* 02040100 80FAA91C    Additional Requirement - Req=Unknown(0x2713)
* 02040100 80FAA924    Additional Requirement - Req=In Air
* 00020000 00000000
* 00020000 00000000
And here is his second response:
Magus said:
I've made a new taunt to footstool code for you guys since it looks like there's a preference for keeping jump to footstool, and looking at my custom requirements code again it's a simple addition to change the custom requirement created from any taunt to any taunt or jump.

This allows the 3 different taunts and button jump to all be checked simultaneously in the action scripting's conditionals using a single requirement, and so the 3 action change limit in CHK_AIR_TREAD_JUMP isn't an issue since it's changing the button jump one to button jump+taunts instead of replacing one of the other 2 footstooling methods.


Custom Requirements v1.Minus [Magus]
* C27854B0 0000000B
* 38600001 815C0068
* 812A0074 810A0078
* 2C040050 41820010
* 2C040051 41820020
* 48000034 7D274078
* 54E604EA 54E5077A
* 7CC52B79 41A2001C
* 4800001C 552604EA
* 5525077A 7CC52B79
* 41A20008 48000008
* 38600000 00000000
-Jump or Any Taunt Input (50-51)
Code:
li    r3,1        # entry point (807854B0). sets to true if requirement above 0x4C

lwz    r10,0x68(r28)    # Button Inputs Address
lwz    r9,0x74(r10)    # loads current inputs
lwz    r8,0x78(r10)    # loads previous inputs

cmpwi    r4,0x50        # r4 = Requirement ID
beq-    TAUNTJUMP_PRESS    # Req 0x50 = Jump or Any Taunt Press
cmpwi    r4,0x51
beq-    TAUNTJUMP_HELD    # Req 0x51 = Jump or Any Taunt Held
b    END        # skip code if none of the above

TAUNTJUMP_PRESS:
andc    r7,r9,r8    # remove bits for buttons input previous frame, leaving press inputs only
rlwinm    r6,r7,0,19,21    # u/s/d-taunt bits
rlwinm    r5,r7,0,29,29    # jump bit
or.    r5,r6,r5
beq+    FALSE        # set req to false if no press inputs for jump or taunts
b    END

TAUNTJUMP_HELD:
rlwinm    r6,r9,0,19,21    # u/s/d-taunt bits
rlwinm    r5,r9,0,29,29    # jump bit
or.    r5,r6,r5
beq+    FALSE        # set req to false if no held inputs for jump or taunts
b    END

FALSE:
li    r3,0        # set requirement to false

END:
Req 50 = Button Jump or Any Taunt Press
Req 51 = Button Jump or Any Taunt Held

I added the jump button check in there as well, removed all of the stuff not needed outside of PM, and simplified the coding a lot since I wasn't as good with assembly the last time I made a custom requirement a few years ago.


Footstool with Jump or Any Taunt [Magus]
* 04FC1560 02000301
* 04FAA8D0 00000050
* 04FB62C4 000A0100
* 04FB6240 00000050
* 04FB61D4 000A0100
* 04FB6188 80000051

Code:
Footstool with Jump or Any Taunt [Magus]
* 04FC1560 02000301    02000401 -> 02000301. CHK_AIR_TREAD_JUMP (21908). 4->3 params
* 04FAA8D0 00000050    00000030 -> 00000050. CHK_AIR_TREAD_JUMP (21908). Req=Button Press -> Any Taunt Press
* 04FB62C4 000A0100    000A0200 -> 000A0100. Action 0x6D (Footstool). 2->1 params
* 04FB6240 00000050    00000030 -> 00000050. Action 0x6D (Footstool). Req=Button Press -> Any Taunt Press
* 04FB61D4 000A0100    000A0200 -> 000A0100. Action 0x6D CIL (Footstool). 2->1 params
* 04FB6188 80000051    00000033 -> 80000051. Action 0x6D CIL (Footstool). Req=Button Not Held -> Any Taunt Not Held
This replaces the button jump footstool with a button jump or any taunt check. It also checks for button jump or any taunt when controlling shorthop/fulljump on the footstool.

If not having control over shorthop/fulljump by holding the taunt button like how the other code worked is for some reason preferable (you'd still be able to hold jump and start the footstool with taunt press and fulljump as before), remove the
highlighted lines.


Now, all we have to decide on is: Do we want to have...

1.) Footstools triggerable by Taunts ONLY (Tap Jump nor Button Jump will Footstool)
-OR-
2.) Footstools triggerable by Taunts and Button Jump, but NOT Tap Jump
-OR-
3.) Footstools triggerable by Taunts, Button Jump, and Tap Jump

I've briefly tested all three setups, and they all work perfectly offline. Haven't tested online yet, but none of them should cause a desync.

There are a few differences:

With Type 1, all footstools are the same. Everyone except Mario and Luigi can control how high a footstool jump sends them by tapping or holding the "Taunt" input. Tap for a low jump, hold for a high one. The Mario Bros.' footstool height cannot be controlled in this way; they always go the maximum height.

With Type 2, footstools differ slightly, depending on whether you perform one via a "Jump" or "Taunt" command. The height of "Jump" footstools are controlled by how long you hold the button, while the height of "Taunt" footstools are not affected this way -- "Taunt" footstools' height can only be increased by holding up on the Control Stick as you footstool. The Mario Bros.' "Taunt" footstools can be controlled in this way, but their "Jump" footstools always send them the maximum height.

Basically, with Type 2, you control "Jump" footstool height via buttons, and "Taunt" footstool height via the Control Stick. Mario and Luigi have no control over "Jump" footstool height, but they can control "Taunt" footstool height.

"Jump" footstools offer you more control over footstool jump height, but you risk wasting your aerial jumps if you miss.

It's more awkward to control the height of "Taunt" footstools, but they're useful if you want a quick, short footstool. Most importantly, "Taunt" footstools do not risk your aerial jumps; no matter how often you hit that "Taunt" command in the air, nothing will happen unless you can land the footstool.


The new Type 3 is like Type 1; all footstools are the same. The only difference is that you can also footstool via Button Jump and Tap Jump with Type 3. Any Jump or Taunt input can footstool via any button(s) you assign it to! "Jump" and "Taunt" footstools execute the same way, except that you don't risk wasting your midair jumps with "Taunt" footstools.

As with Type 1, everyone except Mario and Luigi can control how high a footstool jump sends them by tapping or holding the input. Tap for a low jump, hold for a high one. The Mario Bros.' footstool height cannot be controlled in this way; they always go the maximum height.


SUMMARY:

Type 1 is more uniform, but I'm sure some players will miss footstooling with "Jump" buttons. This is the code Project M uses.

Type 2 has... quirks, but it offers more options -- most notably the option of footstooling with any "Jump" command, except Tap Jump.

Type 3 combines Type 1's uniformity and Type 2's versatility; "Taunt" and "Jump" footstools execute the same way, and can be triggered by any "Taunt" or "Jump" button input, plus Tap Jump.

Personally, my favorite is Type 3. It's nice being able to control footstool Jump height the same way whether you're using the "Taunt" or "Jump" version. Only the Mario Bros. lose an option with Type 3; they can no longer do short footstools like they can with Type 2 "Taunt" footstools. That's fine, though -- while it was useful, it looked and felt a bit odd for such powerful footstools to only send Mario and Luigi up a short distance.

Finally, there is one more code that should be used with Magus's work:

Footstool Action Exit Clears Auto-Footstool Bit [ds22]
* 4A000000 90000000
* 1619BDD0 00000028
* 00000005 12000005
* 00000002 9019BDE0
* 12000200 80FB6334
* 120B0100 9019BDD0
* 00080000 00000000
* 06FB6344 00000008
* 00070100 9019BDD8


This code fixes the bug which causes players to auto-footstool after jumping off of a Green Shell, until they are K.O.ed.

ds22 has not yet given his permission to Minus to use this code officially, but I've sent him a message requesting it. Considering it is just a supporting code to Magus's codes in this instance, I don't see why he would refuse. Even if he does, we can just use Magus's codes, and tolerate the Green Shell bug. Most of us don't use items anyway... At any rate, I bet ds22 would be more inclined to grant permission if the Brawl Minus devs would credit him for his Team Colored Shields code, which is currently being used in Minus.

Here's hoping that these codes make it into Brawl Minus 4.0!

Want to try these codes out now? Just drop one of the attached "RSBE01.gct" codelists in your "Codes" folder:

TYPE 1: Brawl Minus 3.Q Default + New WiFi code + Footstools Triggerable by Taunts ONLY
TYPE 2: Brawl Minus 3.Q Default + New WiFi code + Footstools Triggerable by Taunts and Button Jump
TYPE 3: Brawl Minus 3.Q Default + New WiFi code + Footstools Triggerable by Taunts, Button Jump, and Tap Jump

Credits: Thanks to...
the Minus Dev Team for continued development of Brawl Minus,
Magus, for making a special version of his taunts=footstool code especially for Minus,
ds22, for letting us use his "Footstool Action Exit Clears Auto-Footstool Bit" code (hopefully),
Glitch, for his efforts in coding the first version of the Taunts = Footstool codes used in Minus 3.Q,
and you, for caring enough to read all this, and helping me test it online!
 

Attachments

  • TYPE 1 - 3.Q WiFi FS=T.7z
    10.7 KB · Views: 330
  • TYPE 2 - 3.Q WiFi FS=T&BJ.7z
    10.7 KB · Views: 346
  • TYPE 3 - 3.Q WiFi FS=T,BJ,&TJ.7z
    10.2 KB · Views: 326
Last edited by a moderator:

Pin Clock

Project Leader
Minus Backroom
Linked this thread in the devroom!
I bet ds22 would be more inclined to grant permission if the Brawl Minus devs would credit him for his Team Colored Shields code, which is currently being used in Minus.

I'm gonna assume this happened somewhere inbetween 2.x.6 and MAX where some codes were thrown in without credit. We've corrected most of them, but this slipped under our radar.

In the .txt containing the 4.0 .GCT, this will be fixed.
 

Mawootad

Minus Backroom
I could probably code a non-desyncing version that responded to tap-jump, button jump, and all taunts if people are really interested in that, but there's more critical stuff for 4.0 release that I'm busy with atm so no guarantees. If anyone else has moderate understanding of asm and how to make module calls and wants to try implementing it I can explain in detail how to do so.
 

Thor

Well-Known Member
I vote for type 2 for now - I like footstools with both options being available, since I usually don't go for taunt footstools but very occasionally remember to, and I DEFINITELY don't want to lose jump footstools - so really, please just NOT option 1 [the PM version].
 

NEWB

Well-Known Member
I'm not sure what the quirks for type 2 is. My preference would probably be to do taunt footstools only but I don't want to mess with mario and luigi's footstools in some way.
 

Bent 00

Longtime Limit Breaker
I'm not sure what the quirks for type 2 is. My preference would probably be to do taunt footstools only but I don't want to mess with mario and luigi's footstools in some way.
I described Type 2's quirks in purple text.

My preference would probably be to do taunt footstools only but I don't want to mess with mario and luigi's footstools in some way.
Type 2 is actually better for Mario & Luigi, since they get two footstool heights to choose from instead of only one.

Unrelated side note: Jigglypuff's footstool is... odd. It only boosts Jiggs up a very short distance, and her air jumps are refreshed whenever she lands one. Has it always been this way?
 

Thor

Well-Known Member
Unrelated side note: Jigglypuff's footstool is... odd. It only boosts Jiggs up a very short distance, and her air jumps are refreshed whenever she lands one. Has it always been this way?

If memory serves, Jigg's footstool is both intended to refresh all jumps when landed, and also she can cancel the footstool animation with any move [and this still refreshes her jumps]. So I would guess her footstool height is small to allow more easy followups.
 

Bent 00

Longtime Limit Breaker
Update: I just got a new message from Magus -- he's made a new version of the code just for Minus! How thoughtful.

I'll briefly test it and get it posted as soon as I can.
 

NEWB

Well-Known Member
Tell him thanks from all of us.

I can't imagine that project m is doing much though. That or the code was just that simple.
 
Top