|
 |
« on: August 25, 2012, 03:20:10 PM » |
|
How to give a character Special Throw with Module Hacking For Experts Only  Note: This tutorial will be rated Expert and are only to those who have experience with PSA and some knowledge about Module itself! Also, this Tutorial are a Beta right now! also, GANONDORFS METHOD[3][16] WILL FREEZE THE GAME AFTER THE CHARACTER HAS DONE IT'S ENTRY! still, I used ganondorfs Method[3][16] in the tutorial *insert devil laugh here!* Anyhow, let’s begin the tutorial! In this tutorial, I will make Ganondorf Side B grab to Luigis B attack but it will cover up the basics so you can also make different grabs too. It might mess up some other attacks too like Ikes Final Smash where the opponent is in the middle in stage instead for ontop! I hope you will get the idea of how it works! I tried to explain how you can make your Own, not just with Ganondorfs Special Throw also, I did the tutorial like this: everything in green is the basic steps while everything in gray under the green is how I did it with my luigi and Ganondorf! Stuff you need • Latest Version of Brawlbox • Module Editor 2.2• Module Editor 3.1• Hex editor (Hex Edit recommended) • Calculator • Module Files (.rel), the one with grab and your characters .rel, preferable 2 of your character rel! • Your FitCharacter.pac (PSA) and FitCharacterMotionEct.pac Okay! Let’s start this! It will pretty much be a maze in this tutorial and I hope I don’t give you a headache! I also recommend to use “Save As” and save as a new cause it will be a lot of open and closing files around! Just in case something gets wrong you can always step back! Step 1 Open up your Module Editor 2.2 and open both your Module files in them! Go to Module -> Objects -> FtCharacter and scroll down to Method[3][16] in your Module file that you will use as a grab! Take a note of both Offset, their size on both ModulesAll Specials throws are stored there! Also, take care of the Size of the Method! For me (Ganondorf), it has the size of 250 in hex! Go and check on your original character Module -> Objects -> FtCharacter --- Method[3][16], if it are red, we have to add a new Method. If it are already one, we need to replace it! From now one, I will call ModuleA for the character you will give the throw and ModuleB for the one that has the Grab you will be using! Step 2 Close ModuleA in Module Editor 2.2 Instead, open up ModuleA in Module Editor 3.1 and open up Section1 with Memory Viewer! Use the Resize button and increase it with ModuleB's Method[3][16] SizeNotice the Resize buttom? We have to resize it! As you see, it’s 10F48 hex big for me and since we are adding a new method, we need to have more space! For me, I will add 250 hex to it so my new method will have some space! Meaning 10F48 + 250 = 11198 (yes, we are talking heximal, not decimal) Write the new size of the Section and hit the resize buttom! There! This will add “00” at the end of the section! We will use those “00” to add the New Method[3][16] Step 3 Save as a new Module File and close the ModuleA in Module Editor 3.1 Instead, open ModuleA in Module Editor 2.2 again but this time, go to Module -> Objects -> FtCharacter --- Method[3][1] instead for [3][16] and open it up! Take also note of it's OffsetThere is a Branch command here we need to correct and it’s ALWAYS the first Branch Code! If the ModuleA already has a Method[3][16], it has a Negative Number like this Luigi has! (-0x38BC). If ModuleA doesn’t have a Method[3][16], it will have positive numbers but have m1B[01] on Right side instead (Relocation Data). We have to change those to get our new Method[3][16] to work ingame! Also, remember the offset of your Method[3][1]! You need it in next step! My offset is BB8C Step 4 Open up ModuleA in Hex Editor and scroll down to your added “00” when you resized section1! It shouldn’t be hard to miss!My offset are to Luigi is “11014”. Remember your offset! (or just remember the offset in step2 + CC, it would be for me 10F48 + CC = 11014) Step 5 Scroll up again to the offset that were beginning of Method[3][1] you remembered from step3! but move 4 Hex forwardAs you remember, my offset were BB8C which is the beginning of Method[3][1] but the hex second in the Method[3][1]! At Offset BB90! Step 6 Time for some Math! You need to calculate the answer by subtracting the new Method[3][16] offset with this offset!For me, it would be “11014 – BB90 = 5484” So in the hex I need to edit: “4B FF C7 44” to “48 00 54 84” If your Module has already one Method[3][16], it will have “4B FF XX XX”. If it hasn’t, it will have have “48 00 XX XX”! Remember to change 4B FF to 48 00 if it has it! That will prevent the offset you gave is Negative! Step 7 Open up ModuleB in Module Editor 2.2 and go to Module -> Objects -> FtCharacter --- Method[3][16]! Take note to it's Offset and Size againThe only thing we need is the offset to on the Method! Since I will give Luigi Ganondorfs SideB ground throw, this is Ganon’s Method[3][16]. The Offset I will go to is 8784! Also, remember the size! It’s 250 Step 8 Open up ModuleB in Hex Editor and scroll down to the Method[3][16] offset!For me, I had to go to Offset 8784 since I am using Ganondorfs Method[3][16] Step 9 Now, select the whole Method[3][16] and copy it.The whole Method is selected since it is 250 big! Step 10 Go to your ModuleA in your Hex Editor and scroll down to your new Method[3][16] offset, select the same size of empty “00” like yours ModuleB method[3][16] and Paste itSince my Luigis’s new Method starts at 11014, I pasted Ganondorfs Method in there! Step 11 Save your ModuleA in Hex Editor, close it and open it in Module 3.1 instead!Step 12 This step is really tricky! The hardest in the tutorial! Go to Section5 in its memory viewer! Now you should look after its relocation data! We need to change it to the new offset! But as you see, it’s a maze!there is several ways to find it but I will go with the easiest one! The one you will have to change is above “FtCharacter”.  Here is a pic! There I have selected is the Method[3][16] relocation data! Memories the pattern! The relocationdata will always be 14 hex BEFORE the FF FF FF 9C! Note this, if your character has already Method[3][16], it will have ID of your character Module. If not, it will have the ID of 1B which is Sora_melee. Step 13 If you found it, change the “Addend” to your new Method Offset MINUS CC and make sure the ID is set to your character Module ID! Leave the other things untouched.For me, it would be 11014 – CC = 10F48. Also, Luigis Module ID is 63 so everything is now set! 13b. NOTE! Do only this step if your character didn’t have a Method[3][16] from the start! open Section1 and go now to your Method[3][1] + 4 offset (to the offset you changed at step6)! But you have to subtract it with CC to get the right offset! When you are on the right offset, delete the Relocation Data! Step 14 Open up ModuleB in a new Module Editor 3.1 window and go to the Section1! Go down to its Method[3][16]offset – CC Since I am using Ganondorfs Method[3][16], I go down to its offsets – CC. that would be 8784 – CC = 86B8 Step 15 Now, go to Section1 of your ModuleA in Module Editor 3.1 and scroll down to your new Method[3][16] offset – CC! it should be near the end and now you should be at same place with your ModuleBSince I am using Luigis Module File as ModuleA, I have my new method at 11014 – CC = 10F48 and now I have Luigi and Ganondorf at exactly same spot on both Method[3][16]! Step 16 Now, add all the relocation the ModuleA is missing with same information! Don’t miss one!Now I had all the relocation data to each correct Asm command! Ganondorf only had 3 to be added to Luigis! You simply press on a Hexdata that Luigis new Method[3][16] is missing, add a new relocation data and do it the same as Ganondorfs Relocationdata for that Hex! Step 17 Save your ModuleA, close Module 3.1 and open it in Hex Editor the last time! Scroll down to your New Method[3][16]! Time to give our Throws it's Action!Now for the Last thing we will do in Module Hacking! That’s give change the Action to the one you want it to be! There are 3 kind of action that will show up! First off is the Action that the opponent will do, second is the action the grab can work on and the third is what action you will do if you successfully grabbed someone! The actions are mostly load by “2C 03 XX XX” there the XX XX is the action. It can also be “2C 00 XX XX” and “38 80 XX XX” but “2C 03” is much more common to be used to action!  A perfect example what I mean is with this picture with ganondorfs Method[3][16]! In Purple Box = UpB In Gray Box = Grounded SideB In Black Box = Aired SideB In each Green box = All the action the opponent will do! (they need to have the same in the Catch command in PSA) In each Red Box = All the action the grab can only work in! In each Blue Box = All the action you will DO in a successful grab! So I ignored the UpB throw and Made all both Ganondorfs SideB to Luigis B but on ground it will do DownB and in Air it will do UpB Step 18 Save it and Close it! You are done with hacking the Module File!Finally! You are done now with the module hacking! But it’s the PSA left! I assume you are already good with PSAing so this should be a piece of cake! Last Words But I need to tell you something! You need the “Throwed” animation to the special throws! They are one character speficik to each throw characters! Just export the animation and import them to your FitCharacterMotionEct with same name and you should be fine! Also, I Will update this tutorial with more pics and using a different grab! I leave the PSAing up to you! If you are cursious about what PSA code I am using to Luigis Ganondorf SideB throw, check below! In Action 274: Bit Variable Clear: RA-Bit[16] = false Bit Variable Clear: RA-Bit[17] = false If On Ground: Posture 03 Posture 04 Character Specific 01 Basic Variable Set: RA-Basic[0] = 0 Change Subaction: sub action=SpecialSStartG Change Action action=0, requirement=Animation End Additional Change Action Requirement On Ground Change Action action=14, requirement=In Air Set Air/Ground: Undefined(15) Else Posture 03 Posture 04 Character Specific 01 Basic Variable Set: RA-Basic[0] = 2 Change Subaction: sub action=SpecialAirSStartG Change Action action=14, requirement=Animation End Set Air/Ground: Undefined(17) Change Action action=25, requirement=On Ground Additional Change Action Requirement Value Bit is Set: RA-Bit[17] End If
In Action 277: Set Edge Slide: Can't drop off side of stage Synchronous Timer: frames=1 Change Subaction: sub action=SpecialSG Set Air/Ground: On Ground Change Action action=14, requirement=In Air Change Action action=0, requirement=Animation End
In Action 276: Synchronous Timer: frames=1 Change Subaction: sub action=SpecialAirSCatchG Change Action action=14, requirement=Animation End Additional Change Action Requirement In Air Change Action action=0, requirement=On Ground Additional Change Action Requirement Animation End
In Subaction SpecialSStartG Main: Throw Specifier:ID=1, Bone?=0, Damage=4, Direction=0, KnockbackGrowth=10, WeightKnockback=0,BaseKnockback=100, Element=0, UnknownA=1, UnknownB=0, UnknownC=1, UnknownD=0, SFX=2, Direction?=3, UnknownE=true, UnknownF=true, UnknownG=0 Asynchronous Timer: frames=15 Catch Collision 2: Value-0, Value-0, Scalar-5, Scalar-0, Scalar-8, Scalar-4.5, Value-E7, Value-1, Value-2, Catch Collision 2: Value-1, Value-0, Scalar-1, Scalar-0, Scalar-8, Scalar-4.2, Value-E7, Value-3, Value-2, Bit Variable Set: RA-Bit[16] = true Special Offensive Collision: Id=2, Bone=0, Damage=12, ShieldDamage=0, Direction=25, BaseKnockback=60, WeightKnockback=0, KnockbackGrowth=100, Size=6, Z Offset=0, Y Offset=10, X Offset=7, TripRate=0%, HitlagMultiplier=x1, SDIMultiplier=x1, Flags=21030293 Special Offensive Collision: Id=3, Bone=31, Damage=12, ShieldDamage=0, Direction=25, BaseKnockback=60, WeightKnockback=0, KnockbackGrowth=100, Size=4.8, Z Offset=6, Y Offset=0, X Offset=0, TripRate=0%, HitlagMultiplier=x1, SDIMultiplier=x1, Flags=21030293 Asynchronous Timer: frames=30 Terminate Catch Collisions Terminate Collisions Bit Variable Clear: RA-Bit[16] = false
In SpecialAirSStartG Main: Throw Specifier:ID=1, Bone?=0, Damage=4, Direction=0, KnockbackGrowth=10, WeightKnockback=0,BaseKnockback=100, Element=0, UnknownA=1, UnknownB=0, UnknownC=1, UnknownD=0, SFX=2, Direction?=3, UnknownE=true, UnknownF=true, UnknownG=0 Asynchronous Timer: frames=18 Catch Collision 2: Value-0, Value-0, Scalar-5, Scalar-0, Scalar-6, Scalar-6.5, Value-E8, Value-2, Value-2, Catch Collision 2: Value-1, Value-0, Scalar-5, Scalar-0, Scalar-11, Scalar-6.5, Value-E8, Value-3, Value-2, Bit Variable Set: RA-Bit[16] = true Special Offensive Collision: Id=2, Bone=0, Damage=12, ShieldDamage=0, Direction=25, BaseKnockback=60, WeightKnockback=0, KnockbackGrowth=100, Size=6, Z Offset=0, Y Offset=10, X Offset=7, TripRate=0%, HitlagMultiplier=x1, SDIMultiplier=x1, Flags=21030293 Special Offensive Collision: Id=3, Bone=31, Damage=12, ShieldDamage=0, Direction=25, BaseKnockback=60, WeightKnockback=0, KnockbackGrowth=100, Size=4.8, Z Offset=6, Y Offset=0, X Offset=0, TripRate=0%, HitlagMultiplier=x1, SDIMultiplier=x1, Flags=21030293 Asynchronous Timer: frames=28 Bit Variable Set: RA-Bit[17] = true Asynchronous Timer: frames=31 Terminate Catch Collisions Terminate Collisions Bit Variable Clear: RA-Bit[16] = false
In Subaction SpecialSG Main: Throw Specifier:ID=0, Bone?=0, Damage=9, Direction=361, KnockbackGrowth=90, WeightKnockback=0,BaseKnockback=60, Element=13, UnknownA=1, UnknownB=0, UnknownC=1, UnknownD=2, SFX=B, Direction?=3, UnknownE=true, UnknownF=true, UnknownG=0 Throw Specifier:ID=1, Bone?=0, Damage=4, Direction=0, KnockbackGrowth=10, WeightKnockback=0,BaseKnockback=100, Element=0, UnknownA=1, UnknownB=0, UnknownC=1, UnknownD=0, SFX=2, Direction?=3, UnknownE=true, UnknownF=true, UnknownG=0 Asynchronous Timer: frames=16 Super/Heavy Armor: State=None, Tolerance=0 Asynchronous Timer: frames=30 Throw Applier: Value-0, Value-3E, Variable-RA-Basic[2], Variable-RA-Basic[3], Variable-RA-Basic[4], Asynchronous Timer: frames=38 Bit Variable Set: RA-Bit[23] = true Asynchronous Timer: frames=40 Super/Heavy Armor: State=None, Tolerance=0
In Subaction SpecialAirSCatchG Main: Throw Specifier:ID=0, Bone?=0, Damage=12, Direction=361, KnockbackGrowth=82, WeightKnockback=0,BaseKnockback=40, Element=3, UnknownA=1, UnknownB=0, UnknownC=1, UnknownD=2, SFX=B, Direction?=3, UnknownE=true, UnknownF=true, UnknownG=0 Throw Specifier:ID=1, Bone?=0, Damage=4, Direction=0, KnockbackGrowth=10, WeightKnockback=0,BaseKnockback=100, Element=0, UnknownA=1, UnknownB=0, UnknownC=1, UnknownD=0, SFX=2, Direction?=3, UnknownE=true, UnknownF=true, UnknownG=0 Asynchronous Timer: frames=18 Set Momentum: Scalar-0, Scalar-5, Asynchronous Timer: frames=59 Throw Applier: Value-0, Value-3E, Variable-RA-Basic[2], Variable-RA-Basic[3], Variable-RA-Basic[4],
Have fun with Fresh New Special Throws
|