• 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!

New Melee Syntax school. You can WRITE character commands now!!

omegagmaster

Smash Cadet
Joined
Dec 20, 2015
Messages
44
I'm in the process of reworking Dr. Mario's down B to be like Soaring Tornado in SSB4. Soaring Tornado is a custom move that basically does nothing on startup (other than a windbox) and then at the end of the move it makes you rise up kinda high and a GIANT hitbox appears with a TON of killpower. Well I finished making the hitbox and removed all other hitboxes, but I still need the rise at the end of the move. Is there any way to do this?

AND HERE IT IS, THE ATTACK IT ALL OF ITS GLORY



If you feel I should adjust the radius of the hitbox please let me know. I think it's a pretty close match to the Sm4sh version itself aside from the rise at the end.
 
Last edited:

nebula_benula

Smash Cadet
Joined
Sep 3, 2015
Messages
26
Location
Oviedo, Florida
I'm in the process of reworking Dr. Mario's down B to be like Soaring Tornado in SSB4. Soaring Tornado is a custom move that basically does nothing on startup (other than a windbox) and then at the end of the move it makes you rise up kinda high and a GIANT hitbox appears with a TON of killpower. Well I finished making the hitbox and removed all other hitboxes, but I still need the rise at the end of the move. Is there any way to do this?

AND HERE IT IS, THE ATTACK IT ALL OF ITS GLORY



If you feel I should adjust the radius of the hitbox please let me know. I think it's a pretty close match to the Sm4sh version itself aside from the rise at the end.
I'd recommend using Crazy Hand to look at the stats for the move, maybe see if there is an already existing value for having it move up (at the end). Otherwise, I'd try to find out whether you can add an extra hitbox at the end of the move, most likely a windbox. Although programs such as Crazy Hand won't let you add anything that enlarges the original file size, so maybe removing those earlier hitboxes freed up enough space.
You should probably ask DRGN though, he's a genius.

EDIT: I looked at the data in Crazy Hand, you should try messing with the values labeled Down B:
 
Last edited:

omegagmaster

Smash Cadet
Joined
Dec 20, 2015
Messages
44
I'd recommend using Crazy Hand to look at the stats for the move, maybe see if there is an already existing value for having it move up (at the end). Otherwise, I'd try to find out whether you can add an extra hitbox at the end of the move, most likely a windbox. Although programs such as Crazy Hand won't let you add anything that enlarges the original file size, so maybe removing those earlier hitboxes freed up enough space.
You should probably ask DRGN though, he's a genius.

EDIT: I looked at the data in Crazy Hand, you should try messing with the values labeled Down B:
I manually edited the move in a hex editor. The thing is I edited the hitboxes of the final hit by manually editing the hitbox command itself (converting to binary, changing BKB and KBG, etc). I already matched the framedata of the move to that of Smash 4. What I'm trying to accomplish is this:

https://youtu.be/vvIj5mo7HfA?t=4s

Notice how Dr. Mario rises when the hitbox comes out. The thing is, he didn't mash. Dr. Mario will always rise up at the end of Soaring Tornado, with or without mashing. And that is what I'm trying to accomplish.
 

nebula_benula

Smash Cadet
Joined
Sep 3, 2015
Messages
26
Location
Oviedo, Florida
I manually edited the move in a hex editor. The thing is I edited the hitboxes of the final hit by manually editing the hitbox command itself (converting to binary, changing BKB and KBG, etc). I already matched the framedata of the move to that of Smash 4. What I'm trying to accomplish is this:

https://youtu.be/vvIj5mo7HfA?t=4s

Notice how Dr. Mario rises when the hitbox comes out. The thing is, he didn't mash. Dr. Mario will always rise up at the end of Soaring Tornado, with or without mashing. And that is what I'm trying to accomplish.
I realized you used a hex editor for this, but you can still edit the move with crazy hand--trust me it's a good program. To make the tornado rise at the end of the move should be too hard, rather it would require a very quick mash at a certain time. To automate this would require changing the mash time possibly. I tried editing the "mashability" attribute and I got it to when I press b again, at the end of the move he goes as high as he did in the video. This isn't perfect, but if you can find a way to force another input of b automatically at the end (probably in relation to when you first press down b) then it could work.
 

omegagmaster

Smash Cadet
Joined
Dec 20, 2015
Messages
44
I got it done. Huge thanks to Achilles for writing a code that allows you to edit character data (which includes velocities) which means I can do the rise at the end now. Now for figuring out how to use frame dump...
 

omegagmaster

Smash Cadet
Joined
Dec 20, 2015
Messages
44
Hi,

I'm trying to rewrite Luigi's forward smash to resemble Little Mac's. My question is how does "damage rate of increase" work? How is it scaled with the time of charge of the smash attack? I looked in Crazy Hand and I saw the damage rate of increase was 350 for Luigi's forward smash. Also this was a question somebody else asked, how do you add super armor to moves? Like Yoshi's double jump.

Thanks!
 

Itaru

MasterGanon
Joined
Jun 25, 2014
Messages
279
Location
日本 茨城県
Hi,

I'm trying to rewrite Luigi's forward smash to resemble Little Mac's. My question is how does "damage rate of increase" work? How is it scaled with the time of charge of the smash attack? I looked in Crazy Hand and I saw the damage rate of increase was 350 for Luigi's forward smash. Also this was a question somebody else asked, how do you add super armor to moves? Like Yoshi's double jump.

Thanks!
Probably.
2.png
 

Achilles1515

Smash Master
Joined
Jun 18, 2007
Messages
3,211
Location
Cincinnati / Columbus OH
Hi,

I'm trying to rewrite Luigi's forward smash to resemble Little Mac's. My question is how does "damage rate of increase" work? How is it scaled with the time of charge of the smash attack? I looked in Crazy Hand and I saw the damage rate of increase was 350 for Luigi's forward smash. Also this was a question somebody else asked, how do you add super armor to moves? Like Yoshi's double jump.

Thanks!
For super armor, try setting a 32-bit float to 0x18B4. Yoshi's double jump uses 120 as a reference.
 

GunBlaze

Smash Lord
Joined
May 6, 2012
Messages
1,854
Location
Santo Domingo, Dominican Republic
Slippi.gg
GBLZ#778
I used Animation Swapping in CrazyHand.
UpAir->UpTilt
UpTilt->UpAir
Oh, so Melee can use aerial animations on the ground with no issues...

Have you considered making further changes or animation swaps with them?

Also, if I'm not being a bother, do they absolutely lack the coding for special moves or charging Smashes?
 

DRGN

Technowizard
Moderator
Joined
Aug 20, 2005
Messages
2,178
Location
Sacramento, CA
What do you mean?
Pretty sure he's talking about how some moves turn you around when you do them. For example, when Marth does his bair, after he finishes, he'll be facing the opposite direction from whichever way he was facing before.
 

Itaru

MasterGanon
Joined
Jun 25, 2014
Messages
279
Location
日本 茨城県
Note.

14000000 0000XXXX and 1C000000 0000XXXX are "black sheep" and f**kin' weird.
These commands still remain likes ghost even though you delete these commands.

For example,

this commands
14000000 000035F8 ...........
change to
08000005 2C00000A ..........

In this case, game will freeze when hitbox hit a character because damage is 504%(0x1F8%).

So, we should be careful not to move these commands.
 

Achilles1515

Smash Master
Joined
Jun 18, 2007
Messages
3,211
Location
Cincinnati / Columbus OH
Note.

14000000 0000XXXX and 1C000000 0000XXXX are "black sheep" and f**kin' weird.
These commands still remain likes ghost even though you delete these commands.

For example,

this commands
14000000 000035F8 ...........
change to
08000005 2C00000A ..........

In this case, game will freeze when hitbox hit a character because damage is 504%(0x1F8%).

So, we should be careful not to move these commands.
I don't see how that is possible. Can you give a particular example within a file?

EDIT:
Itaru, command 0x14 is the GoTo event of length 8 bytes. 14000000XXXXXXXX. In your above example, the 0x000035f8 is the pointer to a specific location in the file of a new script to jump to. The game knows the 0x000035f8 value is a pointer because the file offset at which you find the 0x000035f8 value is an entry in the relocation table found at the end of the file.


A random example:

Fox is loaded into the match. The entire contents of PlFx.dat are loaded into the RAM at address 0x80130000 (arbitrary address). Immediately after PlFx.dat is copied into the RAM, and before any of the data is actually used, the game needs to adjust all the pointer values within it. It needs to make all the pointer values point to the actual RAM address, given a new starting location of the file in the RAM (0x80130000). To do so, it uses the relocation table, which lists all the offsets in PlFx.dat that contain pointers.

So say the 0x000035f8 value is located at 0x00005ce0 in PlFx.dat. Since 0x000035f8 is a pointer, there will be a relocation table entry for 0x00005cc0 (-0x20 from 0x5ce0).

Once the game loads the file in the RAM and starts adjusting pointers, it goes to each relocation table entry and will do 0x80130000 (the new file offset in the RAM) + the value at that relocation offset. So for this random example, it would turn 0x000035f8 into 0x801335f8.

The relocation table pointer adjustment code doesn't care what value is at that pointer entry. It simply adds it to the RAM file start point.

So in your example above that is causing freezing, the 0x2c00000a line exists at a file offset that previously held a pointer. Meaning, it is still in the relocation table. So the RAM pointer adjustment code would take 0x2c00000a and turn it into 0x80130000 + 0x2c00000a = 0xAC13000A. Once the script for this command is executed, it will not do what you plan it to because of its new value.

Relocation table entries can be modified.
 
Last edited:

Punkline

Dr. Frankenstack
Joined
May 15, 2015
Messages
423
I don't see how that is possible. Can you give a particular example within a file?

EDIT:
Itaru, command 0x14 is the GoTo event of length 8 bytes. 14000000XXXXXXXX. In your above example, the 0x000035f8 is the pointer to a specific location in the file of a new script to jump to. The game knows the 0x000035f8 value is a pointer because the file offset at which you find the 0x000035f8 value is an entry in the relocation table found at the end of the file.


A random example:

Fox is loaded into the match. The entire contents of PlFx.dat are loaded into the RAM at address 0x80130000 (arbitrary address). Immediately after PlFx.dat is copied into the RAM, and before any of the data is actually used, the game needs to adjust all the pointer values within it. It needs to make all the pointer values point to the actual RAM address, given a new starting location of the file in the RAM (0x80130000). To do so, it uses the relocation table, which lists all the offsets in PlFx.dat that contain pointers.

So say the 0x000035f8 value is located at 0x00005ce0 in PlFx.dat. Since 0x000035f8 is a pointer, there will be a relocation table entry for 0x00005cc0 (-0x20 from 0x5ce0).

Once the game loads the file in the RAM and starts adjusting pointers, it goes to each relocation table entry and will do 0x80130000 (the new file offset in the RAM) + the value at that relocation offset. So for this random example, it would turn 0x000035f8 into 0x801335f8.

The relocation table pointer adjustment code doesn't care what value is at that pointer entry. It simply adds it to the RAM file start point.

So in your example above that is causing freezing, the 0x2c00000a line exists at a file offset that previously held a pointer. Meaning, it is still in the relocation table. So the RAM pointer adjustment code would take 0x2c00000a and turn it into 0x80130000 + 0x2c00000a = 0xAC13000A. Once the script for this command is executed, it will not do what you plan it to because of its new value.

Relocation table entries can be modified.
Oops. I completely missed this while posting in the crazy hand thread. I went over some of the same information with a different example.

I haven’t done a lot of manual .dat edits, so this is a little unfamiliar to me. I wanted to know more about what you explained about tatatat0 tatatat0 ’s DK taunt hitbox example a while back.

I had it in my head that modifying the structure of the relocation table would screw up the index or something, so I was trying to avoid that by turning unwanted relocation entries into some kind of “dud” that effectively did nothing and left the structure alone.

Is it ok to modify the structure though? Like, if you change the info in the header to reflect a smaller relocation table, remove the problematic entries, and then make up the difference in the arbitrary string table length with 00 padding… is everything still peachy?

I’m testing it right now and it seems to work. I’m able to just straight up cut out the relocation table entries and selectively stop the pointer conversions. I won't be able to thoroughly test it for a while though.
 

Punkline

Dr. Frankenstack
Joined
May 15, 2015
Messages
423
Does Anyone have a complete list of commands?
Most of it is available on Crazy Hand, but here's an incomplete list of opcodes that I know of atm.

Code:
Control Events
00 - Stop Reading Subaction
04 - Synchronous Timer
08 - Asynchronous Timer
0C - Set Loop
10 - Execute Loop
14 - GoTo
18 - Return
1C - Subroutine
20 - (?)
24 - (?)

Player Events
28 - Create GFX
2C - Create Hitbox
30 - Adjust Hitbox Damage
34 - Adjust hitbox Size
38 - (?)
3C - Clear Specific Hitbox ID
40 - Clear All (of this player's) Hitboxes
44 - Create SFX
48 - Random Smash Sound
4C - Auto Cancel
50 - (?) (used in throws and direction reversals)
54 - (?)
58 - (?)
5C - Flag for IASA frames
60 - Flag for Projectile Spawn
64 - (?) (related to ground/air state)
68 - (?)
6C - Change All Hurtbox Status
70 - Change Single Hurtbox Status
74 - Enable flag for Jab Followup
78 - Toggle flag for Jab Followup
7C - Model Modification
80 - (?)
84 - (?)
88 - Throw
8C - Flag for Held Item Invisibility
90 - Flag for (equipped article?) Invisibility
94 - Flag for Player Invisibility
98 - Pseudo-random SFX (RNG from pool of 6)
9C - (?)
A0 - (?)
A4 - Animate Bodypart Model (change hands/eyes/expression)
A8 - (?)
AC - Rumble
B0 - (?)
B4 - (?)
B8 - Set Body Aura
BC - (?)
C0 - (?)
C4 - Set Sword Trail Visibility
C8 - (?)
CC - Damage Self
D0 - Continuation Control
D4 - (?)
D8 - Footstep SFX + GFX
DC - Landing SFX + GFX
E0 - Start Smash Charge
E4?
E8?
EC?
F0?
F4?
F8?
FC?
 
Last edited:

Itaru

MasterGanon
Joined
Jun 25, 2014
Messages
279
Location
日本 茨城県
My note of "free space" in Pl**.dat

For example, the number of ganon's animation is 0x14A. (The number of normal animations is 0x13E and, The number of Special Animations(Victory pose animations, Selected, IntroL(R) and Ending) is 0xC. So, 0x13E + 0xC = 0x14A)

And, I assumed that the size of "free space" for one animation is 2 bites. Because many character has
06000000 00000000 06000600 0C000C00 00000000 00000600 or similar data on the beginning part of "free space".

I think that the size of "free space" of Ganon is




0x14A * 0x2 = 294
YEEEEEEESSSSS!!!!!

And, I checked with falco and DK.

This is completely my intuition. But, I believe it is true.
 

Ripple

ᗣᗣᗣᗣ ᗧ·····•·····
Joined
Sep 4, 2006
Messages
9,632
For super armor, try setting a 32-bit float to 0x18B4. Yoshi's double jump uses 120 as a reference.
can you (or anyone) give me a quick example as to what this will look like
 

Punkline

Dr. Frankenstack
Joined
May 15, 2015
Messages
423
Ripple Ripple omegagmaster was referring to this code before asking the question, which allows for memory edits to the player entity via subaction events. The data offset is actually in the internal player data. I have an example here.
 

Punkline

Dr. Frankenstack
Joined
May 15, 2015
Messages
423
Edit: Last updated 9/27/2018 -- added more info about color events

I know a lot of you aren't familiar with exploring RAM or with reading PPC, but I thought I would share these notes about subaction event parses for those who can make use of them.
@MagicScrumpy tatatat0 tatatat0 UnclePunch UnclePunch Ripple Ripple

With some scrutiny, these functions can be reversed in order to document the remaining unknown subaction event syntaxes. (Function addresses are for Melee 1.02)

There are 6 subaction event parsing loops in the game that I know of. I'm only really familiar with the first 3:
Code:
--Subaction Event Parsing Functions
80005b64 $!_SAevent_Parse_Control_usedByAllEventParseLoops (common events 00-24)
80073240 $!_SAevent_Parse_Player (player events 28-E8)
802799e4 $!_SAevent_Parse_Projectile/Item/Article (projectile events 28-64)

80073354 $?_SAevent_Parse_unkOnActionstateChange (modified player event index 28-E8)
80014258 $!_SAevent_Parse_Color (events related to color overlays 28-50)

8007349c $?_SAevent_Parse_unkContinuationControl?
  (lookup table contains word length of player event data)
These functions are responsible for serving subaction event data to the individual parsing functions that know how to read them. I have labeled them by their parent parse functions, ID, [OP], and name if available.

---

The most important one is the Control Event parse--used by all 5 other parses in order to cover events 00 -24; which control how events are parsed:
Code:
--Parse_Control events (lookup table @ 803B9840)
80005940 $!_SAeventControl_00-[00]-Stop_Parse
8000594C $!_SAeventControl_01-[04]-Synchronous_Timer
80005994 $!_SAeventControl_02-[08]-Asynchronous_Timer
800059DC $!_SAeventControl_03-[0C]-Set_Loop
80005A30 $!_SAeventControl_04-[10]-Execute_Loop
80005A88 $!_SAeventControl_05-[14]-GoTo_creates_return
80005AC4 $!_SAeventControl_06-[18]-Return
80005AE4 $!_SAeventControl_07-[1C]-Subroutine_no_return
80005b00 $!_SAeventControl_08-[20]-?_setTimerTo_7F7FFFFF_loopingAnimation?
80005B18 $!_SAeventControl_09-[24]-?
---

Then there's the Player Events:
Code:
--Parse_Player events (lookup table @ 803C06E8)
80071028 $!_SAeventPlayer_00-[28]-GFX_Create
8007121C $!_SAeventPlayer_01-[2C]-Hitbox_Create
8007162C $!_SAeventPlayer_02-[30]-Hitbox_AdjustDamage
8007169C $!_SAeventPlayer_03-[34]-Hitbox_AdjustSize
80071708 $!_SAeventPlayer_04-[38]-?_Hitbox_unkflags_0x42_05
80071784 $!_SAeventPlayer_05-[3C]-Hitbox_ClearID
800717D8 $!_SAeventPlayer_06-[40]-Hitbox_ClearAll
80071B50 $!_SAeventPlayer_07-[44]-SFX_Create
80071CCC $!_SAeventPlayer_08-[48]-SFX_RNG_Smash
80071820 $!_SAeventPlayer_09-[4C]-Auto_Cancel
800718A4 $!_SAeventPlayer_0A-[50]-?_used_in_throws_and_direction_reversals
80071908 $!_SAeventPlayer_0B-[54]-?_set_flag_0x2210_20
8007192C $!_SAeventPlayer_0C-[58]-?_set_flag_0x2210_10
80071950 $!_SAeventPlayer_0D-[5C]-IASA_flag
80071974 $!_SAeventPlayer_0E-[60]-Projectile_flag
80071998 $!_SAeventPlayer_0F-[64]-?_related_to_ground/air_state
80071A14 $!_SAeventPlayer_10-[68]-Set_BodyState_and_Apply_Color_Overlay
80071A58 $!_SAeventPlayer_11-[6C]-Bodystate_Status
80071A9C $!_SAeventPlayer_12-[70]-Hurtbox_Status
80071AE8 $!_SAeventPlayer_13-[74]-Enable_Jab_Followup
80071B28 $!_SAeventPlayer_14-[78]-Toggle_Jab_Followup
80071d40 $!_SAeventPlayer_15-[7C]-Set_Character_Object_Model
80071D94 $!_SAeventPlayer_16-[80]-Revert_All_Character_Object_Models
80071DCC $!_SAeventPlayer_17-[84]-Remove_All_Character_Object_Models
80071E04 $!_SAeventPlayer_18-[88]-Throw
80071F34 $!_SAeventPlayer_19-[8C]-Invisible_Item
80071F78 $!_SAeventPlayer_1A-[90]-Invisible_BodyArticle
80071FA0 $!_SAeventPlayer_1B-[94]-Invisible_Player
80071FC8 $!_SAeventPlayer_1C-[98]-SFX_RNG_Pool
80072320 $!_SAeventPlayer_1D-[9C]-?
800726F4 $!_SAeventPlayer_1E-[A0]-Animate_Texture_State
800727C8 $!_SAeventPlayer_1F-[A4]-Animate_Model_State
80072894 $!_SAeventPlayer_20-[A8]-?_Something_With_Parasol_Item?
800728F8 $!_SAeventPlayer_21-[AC]-Rumble
80072B14 $!_SAeventPlayer_26-[C0]-?_set_flag_0x221E_20
800729D4 $!_SAeventPlayer_23-[B4]-?
80072A5C $!_SAeventPlayer_24-[B8]-Body_Aura
80072ABC $!_SAeventPlayer_25-[BC]-Remove_Color_Overlay
80072B14 $!_SAeventPlayer_26-[C0]-?_set_flag_0x221E_20
80072B3C $!_SAeventPlayer_27-[C4]-Sword_Trail_State
80072B94 $!_SAeventPlayer_28-[C8]-?_Ragdoll_Stuff
80072BF4 $!_SAeventPlayer_29-[CC]-Damage_Self
80072C6C $!_SAeventPlayer_2A-[D0]-Continuation_Control
80072CB0 $!_SAeventPlayer_2B-[D4]-?_set_flag_0x2225_10
80072CD8 $!_SAeventPlayer_2C-[D8]-SFX+GFX_Footstep
80072E4C $!_SAeventPlayer_2D-[DC]-SFX+GFX_Landing
80073008 $!_SAeventPlayer_2E-[E0]-Start_SmashCharge
800730B8 $!_SAeventPlayer_2F-[E4]-?
80073118 $!_SAeventPlayer_30-[E8]-GFX_Aesthetic_Wind
---

The Projectile/Item Events have not been thoroughly explored, but the lookup table suggests it has no more than 16 events; and the hitbox event syncs up with the player event index:
Code:
--Parse_Projectile/Item/Article events (lookup table @ 803F22A8)
80278F2C $!_SAeventProjectile_00-[28]-?
802790C0 $!_SAeventProjectile_01-[2C]-Hitbox_Create
80279544 $!_SAeventProjectile_02-[30]-?
802795EC $!_SAeventProjectile_03-[34]-?
80279680 $!_SAeventProjectile_04-[38]-?
802796C4 $!_SAeventProjectile_05-[3C]-?
8027978C $!_SAeventProjectile_06-[40]-?
802796FC $!_SAeventProjectile_07-[44]-?
80279720 $!_SAeventProjectile_08-[48]-?
80279744 $!_SAeventProjectile_09-[4C]-?
80279768 $!_SAeventProjectile_0A-[50]-?
80279888 $!_SAeventProjectile_0B-[54]-?
802798D4 $!_SAeventProjectile_0C-[58]-?
8027990C $!_SAeventProjectile_0D-[5C]-?
80279958 $!_SAeventProjectile_0E-[60]-?
802799A8 $!_SAeventProjectile_0F-[64]-?
---

The rest are unfamiliar to me, but seem to be related to the player event index.

unkOnActionStateChange appears to use a full lookup table of player events, except several of them have been replaced with functions that skip the event data. Event A4 is a sole exception, which seems to be modified somehow:
Code:
--Parse_unkOnActionstateChange (lookup table @ 803C07AC)
800711dc $!_SAEventSkip_00-[28]-5word
800715ec $!_SAEventSkip_01-[2C]-5word
8007168c $!_SAEventSkip_02-[30]-1word
800716f8 $!_SAEventSkip_03-[34]-1word
80071774 $!_SAEventSkip_04-[38]-1word
800717c8 $!_SAEventSkip_05-[3C]-1word
80071810 $!_SAEventSkip_06-[40]-1word
80071ca4 $!_SAEventSkip_07-[44]-3word
80071d30 $!_SAEventSkip_08-[48]-1word
---
80071f0c $!_SAEventSkip_18-[88]-3word
---
800722c8 $!_SAEventSkip_1C-[98]-7word
800726c0 $!_SAEventSkip_1D-[9C]-4word
---
8007283C $?_SAeventPlayerOther_1F-[A4]-Modified_Animate_Model_State
---
8007296c $!_SAEventSkip_21-[AC]-1word
800729c4 $!_SAEventSkip_22-[B0]-1word
80072a4c $!_SAEventSkip_23-[B4]-1word
80072aac $!_SAEventSkip_24-[B8]-1word
80072b04 $!_SAEventSkip_25-[BC]-1word
---
80072b84 $!_SAEventSkip_27-[C4]-1word
80072be4 $!_SAEventSkip_28-[C8]-1word
80072c5c $!_SAEventSkip_29-[CC]-1word
---
80072e24 $!_SAEventSkip_2C-[D8]-3word
80072fe0 $!_SAEventSkip_2D-[DC]-3word
8007309c $!_SAEventSkip_2E-[E0]-2word
80073108 $!_SAEventSkip_2F-[E4]-1word
8007320c $!_SAEventSkip_30-[E8]-4word
---

Color events are used for a diverse number of applications, such as defining body aura behavior, smash charge auras, screen flashes, world transition lighting, and item flashes. A special argument for the parse function allows a second opcode index to be defined for unique operations that can be applied only to specific GObjs, like player or item GObjs.

Code:
80014258    $!_SAevent_Parse_Color

# generic color events: list @803BA248
80013bb0    $!_SAeventColor_00-[28]-Terminate_color_update
80013bb8    $!_SAeventColor_01-[2C]-Sync_Timer_INT
80013be4    $!_SAeventColor_02-[30]-Disable_Light_and_Overlay
80013c18    $!_SAeventColor_03-[34]-Set_New_Light
80013d68    $!_SAeventColor_04-[38]-Set_Light_Color
80013e3c    $!_SAeventColor_05-[3C]-Set_Light_Blend_Rate
80013f78    $!_SAeventColor_06-[40]-Set_Light_Position
80013ff0    $!_SAeventColor_07-[44]-Disable_Light
80014014    $!_SAeventColor_08-[48]-Set_New_Overlay
800140f8    $!_SAeventColor_09-[4C]-Set_Overlay_Blink_Rate
80014234    $!_SAeventColor_0A-[50]-Disable_Overlay
Player Color events:
Code:
800bff34    $!_SAevent_Parse_ColorPlayer

# extra events for fighters: list @803C6AD0

800bfe74    $!_SAeventColorPlayer_00-[54]-Spawn_GFX
800bfeb4    $!_SAeventColorPlayer_04-[58]-Spawn_SFX
800bfef4    $!_SAeventColorPlayer_08-[5C]-unkFlag
Player Skip Color events:
Code:
800bff70    $!_SAevent_Parse_ColorPlayerSkip

# extra events for skipping fighter color events: list @803C6ADC

800BFE94    $!_SAeventColorPlayerSkip_00-[54]-5word
800BFED4    $!_SAeventColorPlayerSkip_00-[58]-3word
800BFF14    $!_SAeventColorPlayerSkip_00-[5C]-1word
Screen Flash Color events:
Code:
80021c18    $!_SAevent_Parse_ColorScreenFlash

# This is literally just a blr. 
# There is no extra index of opcodes for screen flashes, 
# so this blr instruction is passed in place of a new parse function.
World Color events:
Code:
801c9664    $!_SAevent_Parse_ColorWorld

# extra events for world color events: @r13 - 0x‭7134‬ (804D456C)

# events are determined by variables, and may change depending on stage
Item Color events:
Code:
80279b30    $!_SAevent_Parse_ColorItem

# extra events for item color events: @r13 - 0x‭64D8‬ (804D51C8)

# events are determined by variables, and may change depending on item
---

Finally, a second parse that happens on action state changes seems to be related to the continuation control event. It does not seem to parse any player events; only control events--however it has a very interesting list of data lengths for each vanilla player event:
@Roundel @Ampers @Tater

Code:
--Parse_unkContinuationControl? (lookup table @ 803C0870)
--From lookup table: Word Length of each Player Event
05 - Player_00-[28]-GFX_Create
05 - Player_01-[2C]-Hitbox_Create
01 - Player_02-[30]-Hitbox_AdjustDamage
01 - Player_03-[34]-Hitbox_AdjustSize
01 - Player_04-[38]-?_Hitbox_unkflags_0x42_05
01 - Player_05-[3C]-Hitbox_ClearID
01 - Player_06-[40]-Hitbox_ClearAll
03 - Player_07-[44]-SFX_Create
01 - Player_08-[48]-SFX_RNG_Smash
01 - Player_09-[4C]-Auto_Cancel
01 - Player_0A-[50]-?_used_in_throws_and_direction_reversals
01 - Player_0B-[54]-?_set_flag_0x2210_20
01 - Player_0C-[58]-?_set_flag_0x2210_10
01 - Player_0D-[5C]-IASA_flag
01 - Player_0E-[60]-Projectile_flag
01 - Player_0F-[64]-?_related_to_ground/air_state
01 - Player_10-[68]-Set_BodyState_and_Apply_Color_Overlay
01 - Player_11-[6C]-Bodystate_Status
01 - Player_12-[70]-Hurtbox_Status
01 - Player_13-[74]-Enable_Jab_Followup
01 - Player_14-[78]-Toggle_Jab_Followup
01 - Player_15-[7C]-Set_Character_Object_Model
01 - Player_16-[80]-Revert_All_Character_Object_Models
01 - Player_17-[84]-Remove_All_Character_Object_Models
03 - Player_18-[88]-Throw
01 - Player_19-[8C]-Invisible_Item
01 - Player_1A-[90]-Invisible_BodyArticle
01 - Player_1B-[94]-Invisible_Player
07 - Player_1C-[98]-SFX_RNG_Pool
04 - Player_1D-[9C]-?
01 - Player_1E-[A0]-Animate_Texture_State
01 - Player_1F-[A4]-Animate_Model_State
01 - Player_20-[A8]-?_Something_With_Parasol_Item?
01 - Player_21-[AC]-Rumble
01 - Player_26-[C0]-?_set_flag_0x221E_20
01 - Player_23-[B4]-?
01 - Player_24-[B8]-Body_Aura
01 - Player_25-[BC]-Remove_Color_Overlay
01 - Player_26-[C0]-?
01 - Player_27-[C4]-Sword_Trail_State
01 - Player_28-[C8]-?_Ragdoll_Stuff
01 - Player_29-[CC]-Damage_Self
01 - Player_2A-[D0]-Continuation_Control
01 - Player_2B-[D4]-?_set_flag_0x2225_10
03 - Player_2C-[D8]-SFX+GFX_Footstep
03 - Player_2D-[DC]-SFX+GFX_Landing
02 - Player_2E-[E0]-Start_SmashCharge
01 - Player_2F-[E4]-?
04 - Player_30-[E8]-GFX_Aesthetic_Wind
 
Last edited:

Itaru

MasterGanon
Joined
Jun 25, 2014
Messages
279
Location
日本 茨城県
Some note...

4C000001 and 4C000002 is modei mod similar to 7C command. But, 4C000001 means "use model or graphic effect which should be used here" and 4C000002 is "end".


And, if we don't know about psuedo-random sound effect.

99FX008Y 000AAAAA 000BBBBB 000CCCCC 000DDDDD 000EEEEE 000FFFFF

A-F is SFX number.
X is sound volume. but, I don't know which value is max volume. 1 and F is very small, D and 8 is large volume.
Y is number of sound effect. For example, Y = 3, This command plays A or B or C at random.


And...
Peach's SideB hitbox is 0x4044 and 0x4064(Smash) in PlPe.dat
 

Punkline

Dr. Frankenstack
Joined
May 15, 2015
Messages
423
Some note...

4C000001 and 4C000002 is modei mod similar to 7C command. But, 4C000001 means "use model or graphic effect which should be used here" and 4C000002 is "end".
Itaru Itaru - event [4C] has confused me in the past, but I have seen this as you describe with yoshi egg projectiles.

There is a section in the player entity that the [4C] event writes these numbers to, and their effects are difficult to see clearly. I wonder if they are related to events [80] and [84] which seem to only run on action state changes.

---

I have some names for unknown events that you may be interested in. I have not explored these syntaxes, only their code. They may be incorrect:

[20] - Control Event - ?_setTimerTo_7F7FFFFF_loopingAnimation?
- in the code, this event sets the event timer to float value 0x7F7FFFFF -- which is insanely large and appears to be a kind of code that has something to do with the looping parts of running and rapid jab animations. This gets saved to the same variable that stores timers set by [04] Synchronous timers, or calculated by [08] Asynchronous timers.
1 word, No Syntax

[38] - Player Event - ?_Hitbox_unkflags_0x42_05 (sets either 04 or 01 flag)
- hitboxes allocated inside of a player entity during the game have a set of flags at offset 0x40.
1 word:
03FFFFFC = hitbox ID
00000003 = Flag modifications
- Flag modifications are actually 2 bools, but one is prioritized over the other--causing them to act like a 2-bit ID:
0 = set hitbox flag 0x42_01 to 0
1 = set hitbox flag 0x42_01 to 1
2 = set hitbox flag 0x42_04 to 0
3 = set hitbox flag 0x42_04 to 1
- Effect of flags are unknown. Can be observed in action state change from Yoshi egg roll air -> ground

[54] - Player Event - ?_set_flag_0x2210_20
- simple event just sets a flag. Effect untested
- This is similar to other flag-setting events, like [5C] (IASA flag) and [60] (projectile spawn flag)
1 word, No Syntax

[58] - Player Event - ?_set_flag_0x2210_10
- simple event just sets a flag. Effect untested
1 word, No Syntax

[68] - Player Event - Set_BodyState_and_Apply_Color_Overlay
- Looks like it sets player body state and applies a color overlay of some kind
1 word:
03FFFFFF = Body State (0 = normal, 1 = invulnerable 2 = intangible)

[7C] - Player Event - Set_Character_Object_Model ("Model_Mod")
- uses function 80074b0c $!_CharacterObjectFlag_Set_Temporary_r3=playerData_r4=structID_r5=objectID
- Each character has up to 12 struct allocations for object models defined by character data. These structs each have 2 bytes that can hold object IDs. The first byte is a "default" ID that models reset to--and the second byte is the a "temporary" ID that the display uses. "Temporary" ID is reset to default ID by various mechanisms.
1 word:
03F00000 = structID
000000FF = temporary objectID

[80] - Player Event - Revert_All_Character_Object_Models
- uses 80074a8c $!_CharacterObjectFlag_Revert_All_to_Default
- appears to set each of the possible 12 structs to their default objectIDs -- undoing temporary models
1 word, No Syntax

[84] - Player Event - Remove_All_Character_Object_Models
- uses 80074acc $!_CharacterObjectFlag_Temporary_Disable_All
- appears to set each of the possible 12 structs to "FF" -- which effectively deactivates any existing model in the struct slot
1 word, No Syntax

[A8] - Player Event - ?_Something_With_Parasol_Item?
- unknown, appears to check the player's held item for a parasol ID
1 word, syntax unknown (2 arguments)

[BC] - Player Event - Remove_Color_Overlay
- Community Symbols Map suggests this event removes color overlays. Input variable is unknown
1 word, syntax unknown (1 argument)

[C0] - Player Event - ?_set_flag_0x221E_20
- simple event just sets a flag. Effect untested
1 word:
00000001 = flag setting

[C8] - Player Event - Ragdoll_Stuff
- The details of this event are unknown, but it accesses an area in the player entity known to hold 10 ragdoll elements that attach to player bones and give them ragdoll properties.
1 word, syntax unknown (1 argument)

---

I’ve added the above information to my previous post, as they are more descriptive than “?”
@Ampers @Tater @MagicScrumpy tatatat0 tatatat0 UnclePunch UnclePunch Ripple Ripple

In addition, I’ve removed the player event names from the “unkFX” index--as they appear to revolve around color overlays and are used by more than just player entities.

The “playerOther” index curiously has all of the events I labeled as “modified” simply skip event data. I’ve labeled them accordingly. An interesting exception is event A4, which seems to actually be a modified version of the player event.
 

tatatat0

Smash Journeyman
Joined
Jan 28, 2015
Messages
412
Itaru Itaru - event [4C] has confused me in the past, but I have seen this as you describe with yoshi egg projectiles.

There is a section in the player entity that the [4C] event writes these numbers to, and their effects are difficult to see clearly. I wonder if they are related to events [80] and [84] which seem to only run on action state changes.

---

I have some names for unknown events that you may be interested in. I have not explored these syntaxes, only their code. They may be incorrect:

[20] - Control Event - ?_setTimerTo_7F7FFFFF_loopingAnimation?
- in the code, this event sets the event timer to float value 0x7F7FFFFF -- which is insanely large and appears to be a kind of code that has something to do with the looping parts of running and rapid jab animations. This gets saved to the same variable that stores timers set by [04] Synchronous timers, or calculated by [08] Asynchronous timers.
1 word, No Syntax

[38] - Player Event - ?_Hitbox_unkflags_0x42_05 (sets either 04 or 01 flag)
- hitboxes allocated inside of a player entity during the game have a set of flags at offset 0x40.
1 word:
03FFFFFC = hitbox ID
00000003 = Flag modifications
- Flag modifications are actually 2 bools, but one is prioritized over the other--causing them to act like a 2-bit ID:
0 = set hitbox flag 0x42_01 to 0
1 = set hitbox flag 0x42_01 to 1
2 = set hitbox flag 0x42_04 to 0
3 = set hitbox flag 0x42_04 to 1
- Effect of flags are unknown. Can be observed in action state change from Yoshi egg roll air -> ground

[54] - Player Event - ?_set_flag_0x2210_20
- simple event just sets a flag. Effect untested
- This is similar to other flag-setting events, like [5C] (IASA flag) and [60] (projectile spawn flag)
1 word, No Syntax

[58] - Player Event - ?_set_flag_0x2210_10
- simple event just sets a flag. Effect untested
1 word, No Syntax

[68] - Player Event - Set_BodyState_and_Apply_Color_Overlay
- Looks like it sets player body state and applies a color overlay of some kind
1 word:
03FFFFFF = Body State (0 = normal, 1 = invulnerable 2 = intangible)

[7C] - Player Event - Set_Character_Object_Model ("Model_Mod")
- uses function 80074b0c $!_CharacterObjectFlag_Set_Temporary_r3=playerData_r4=structID_r5=objectID
- Each character has up to 12 struct allocations for object models defined by character data. These structs each have 2 bytes that can hold object IDs. The first byte is a "default" ID that models reset to--and the second byte is the a "temporary" ID that the display uses. "Temporary" ID is reset to default ID by various mechanisms.
1 word:
03F00000 = structID
000000FF = temporary objectID

[80] - Player Event - Revert_All_Character_Object_Models
- uses 80074a8c $!_CharacterObjectFlag_Revert_All_to_Default
- appears to set each of the possible 12 structs to their default objectIDs -- undoing temporary models
1 word, No Syntax

[84] - Player Event - Remove_All_Character_Object_Models
- uses 80074acc $!_CharacterObjectFlag_Temporary_Disable_All
- appears to set each of the possible 12 structs to "FF" -- which effectively deactivates any existing model in the struct slot
1 word, No Syntax

[A8] - Player Event - ?_Something_With_Parasol_Item?
- unknown, appears to check the player's held item for a parasol ID
1 word, syntax unknown (2 arguments)

[BC] - Player Event - Remove_Color_Overlay
- Community Symbols Map suggests this event removes color overlays. Input variable is unknown
1 word, syntax unknown (1 argument)

[C0] - Player Event - ?_set_flag_0x221E_20
- simple event just sets a flag. Effect untested
1 word:
00000001 = flag setting

[C8] - Player Event - Ragdoll_Stuff
- The details of this event are unknown, but it accesses an area in the player entity known to hold 10 ragdoll elements that attach to player bones and give them ragdoll properties.
1 word, syntax unknown (1 argument)

---

I’ve added the above information to my previous post, as they are more descriptive than “?”
@Ampers @Tater @MagicScrumpy tatatat0 tatatat0 UnclePunch UnclePunch Ripple Ripple

In addition, I’ve removed the player event names from the “unkFX” index--as they appear to revolve around color overlays and are used by more than just player entities.

The “playerOther” index curiously has all of the events I labeled as “modified” simply skip event data. I’ve labeled them accordingly. An interesting exception is event A4, which seems to actually be a modified version of the player event.
uncle punch doesn't mod melee anymore. lol
 

Ripple

ᗣᗣᗣᗣ ᗧ·····•·····
Joined
Sep 4, 2006
Messages
9,632
you have to install achilles mod that allows that code to work
 

Punkline

Dr. Frankenstack
Joined
May 15, 2015
Messages
423
where would I get that?
It's the code at the end of the post you quoted. If you install that gecko code, the syntax you tried earlier should heal.

Alternatively, there's a version of the code included with Crazy Hand that you can install using MCM.
 
Top Bottom