• Welcome to Smashboards, the world's largest Super Smash Brothers community! Over 250,000 Smash Bros. fans from around the world have come to discuss these great games in over 19 million posts!

    You are currently viewing our boards as a visitor. Click here to sign up right now and start on your path in the Smash community!

Request Cancel all specials with jumping

Quillion

Smash Hero
Joined
Sep 17, 2014
Messages
5,644
We all know that the Shine/Reflector can be cancelled with jumping, and thus wavedashing, but what if all specials could do that? I want to see what happens.
 

Punkline

Dr. Frankenstack
Joined
May 15, 2015
Messages
423
I’ve been staring at action state stuff all week, so this is right up my alley.

There’s a funny consequence of the inevitable kneebend IASA from jump canceling that allows for upSmashes, upThrows, and upBs before a jump. It’s A LOT more apparent in jumps slower than fox's, so (I think) I got around it by making a fake IASA function pointer that branches into the second half of kneebend in order to skip those checks, making it only check for shorthops.

Also, in most cases canceling B-specials isn’t a problem; but issues come up when trying to apply them to everything all willy nilly. I have a code that explores these issues at their worst. Most of it can be avoided pretty easily in this scenario, but article spawns in particular are still a problem.

Things like yoshi eggs, link’s boomerang/bow/arrows, Ice climbers’ icicle projectiles, and Kirby’s hammer will not despawn if canceled from. In Link’s case, it wrecks his boomerang timer, and even crashes the game if you cancel while trying to fire an arrow twice.

There’s definitely ways around this, but it’ll take some more experimentation to figure out how to do it cleanly. At the moment, I’m trying to look in on how the autocancel subaction event (4C) is related to finalizing yoshi’s up-b projectile, and how the model mod subaction event (7C) is related to Link’s moves.

Here’s a concept code to play around with in the meantime:

Code:
    -==-


Jump cancel any grounded B-special 0.1
Buggy article spawns. Beware of Link's arrow cancels; they crash
[Punkline]
Version -- DOL Offset ------ Hex to Replace ---------- ASM Code
1.02 ----- 0x8006b7f4 --- 819F219C -> Branch

4800002C 4E800021
7C0802A6 90010004
9421FFE0 93E1001C
7C7F1B78 3D80800C
618CB63C 7D8903A6
4E800420 887F2073
28030011 41A00050
28030014 41A10048
807F00E0 28030000
4082003C 807F1A58
28030000 40820030
7FC3F378 3D80800C
618CAED0 7D8803A6
4E800021 28030000
41A20014 4BFFFF91
7D8802A6 919F219C
48000008 819F219C
00000000
$Jump cancel any grounded B-special 0.1 [Punkline]
C206B7F4 00000012
4800002C 4E800021
7C0802A6 90010004
9421FFE0 93E1001C
7C7F1B78 3D80800C
618CB63C 7D8903A6
4E800420 887F2073
28030011 41A00050
28030014 41A10048
807F00E0 28030000
4082003C 807F1A58
28030000 40820030
7FC3F378 3D80800C
618CAED0 7D8803A6
4E800021 28030000
41A20014 4BFFFF91
7D8802A6 919F219C
48000008 819F219C
60000000 00000000
Code:
#@8006b7f4: lwz    r12, 0x219C (r31)       (loading IASA blrl)
#r0, r3-12, cr0, lr are presumed safe
#--adds a check to the playerThinkController update that checks the current move
#--if it's within move ID range of 11-14, it's considered a B-special
#--run jump interrupt based on air/ground/grab situation
#--on a successful interrupt, apply fake IASA function pointer to resulting kneebend state
b codeStart
getFakeIASAPointer:
blrl
mflr r0                 #reconstruction the prolog of kneebend IASA function
stw r0, 0x4(sp)         #!this is not run from the hook, it runs from the IASA blrl
stwu sp, -0x20(sp)
stw r31, 0x1C(sp)
mr r31, r3              #put passed player data pointer in r31, so the code works right
lis r12, 0x800c
ori r12, r12, 0xb63c
mtctr r12
bctr


codeStart:              #from our hook, we're checking if the move is a grounded B-special
lbz r3, 0x2073(r31)     #load move ID
cmplwi r3, 0x11
blt+ default
cmplwi r3, 0x14         #if move ID is between 0x11 and 0x14, it's a special move
bgt+ default

specialMove:
lwz r3, 0xE0(r31)       #check if on ground or in air
cmplwi r3, 0
bne- default
lwz r3, 0x1A58(r31)     #grabbing player? (0 if no, pointer if yes)
cmplwi r3, 0            #check if holding a player
bne- default

interrupt:
mr r3, r30              #pass external player data pointer
lis r12, 0x800c         #if on ground, load jump interrupt check
ori r12, r12, 0xaed0
mtlr r12
blrl
cmplwi r3, 0
beq+ default

bl getFakeIASAPointer
mflr r12                #if interrupt is successful, override the IASA pointer with our fake one
stw r12, 0x219C(r31)
b return

default:
lwz r12, 0x219C(r31)
return:
 
Last edited:
Top Bottom