|
|
(45 intermediate revisions by 11 users not shown) |
Line 1: |
Line 1: |
− | The following guide was made by Tailsguy24, and is not yet complete. DO NOT edit/delete it for any reason.
| + | This is the page where you can test out stuff on the Wiki. |
− | ==How to Port Knuckles into Sonic 2==
| |
− | It surprises me that nobody else took up responsibility for making this guide, considering I, as a major fan of hacks, have seen Knuckles implemented in Sonic 2 on more than one occasion. Today, I'll be explaining how you, too, can implement Knuckles in your Sonic 2 hack.
| |
− | ===What You'll Need===
| |
− | *This guide (no duh, really)
| |
− | *The Hg disassembly of Sonic 2
| |
− | *The one known disassembly of Knuckles in Sonic 2, found on the following page: http://info.sonicretro.org/Disassemblies
| |
− | *The ConTEXT text editor (because Notepad will take WAY too long)
| |
− | *Your favorite Genesis emulator (I recommend Kega Fusion but you can use any Genesis emulator you'd like)
| |
| | | |
− | ==Step 1: Creating the Knuckles object==
| + | This page is NOT for drafting new articles. If you want to write up a new article and save it on the Wiki, but don't want to publish it in a main article, create a new article using your User namespace, e.g. User:JoeSchmoe/My_New_Article . |
− | First, open up s2.asm in ConTEXT and search for "dc.l ObjNull." This should come up:
| |
− | <asm>
| |
− | dc.l ObjNull ; Obj4C
| |
− | dc.l ObjNull ; Obj4D
| |
− | dc.l ObjNull ; Obj4E
| |
− | dc.l ObjNull ; Obj4F
| |
− | </asm>
| |
− | Change this line:
| |
− | <asm>
| |
− | dc.l ObjNull ; Obj4C
| |
− | </asm>
| |
| | | |
− | To this:
| + | Tailsguy24: Your article-in-progress has been moved to [[User:Tailsguy24/How_to_Port_Knuckles_into_Sonic_2]]. Also, see your [[User talk:Tailsguy24|user talk]] page for discussion about your article. |
− | <asm>
| |
− | dc.l Obj4C ; Knuckles
| |
− | </asm>
| |
| | | |
− | We've created our Knuckles object. Now let's get started.
| + | WAT '''''[http://info.sonicretro.org/Sandbox This] leads to the sandbox, try it!!''''' |
| | | |
− | ==Step 2: Creating the offset table==
| + | Ow, the Edge!! |
− | Now that you have created your Knuckles object, go to whatever folder you saved the Knuckles in Sonic 2 disassembly to, open s2k.asm, and scroll down or search until you find the following code:
| + | [[User talk:SuperKnucklestheEchidna|user talk]] |
− | <asm>
| |
− | Obj01_Index: dc.w Obj01_Init-Obj01_Index ; 0 ; ...
| |
− | dc.w Obj01_Control-Obj01_Index ; 1
| |
− | dc.w Obj01_Hurt-Obj01_Index ; 2
| |
− | dc.w Obj01_Dead-Obj01_Index ; 3
| |
− | dc.w Obj01_Gone-Obj01_Index ; 4
| |
− | dc.w Obj01_Respawning-Obj01_Index ; 5
| |
− | </asm>
| |
− | Back in s2.asm, copy and paste the following piece of code above the description of the Masher object:
| |
− | <asm>
| |
− | ; ----------------------------------------------------------------------------
| |
− | ; Object 01 - Knuckles
| |
− | ; ----------------------------------------------------------------------------
| |
| | | |
− | Obj01:
| + | I did a thing! This is ''italic''. This is '''bold'''. This is '''''bold AND italic'''''. [http://forums.sonicretro.org/ Sonic Retro.] |
− | ; a0=character
| + | ==External Links== |
− | tst.w (Debug_placement_mode).w ; is debug mode being used?
| + | *[http://forums.sonicretro.org/ Sonic Retro Forum Page] |
− | beq.s Obj01_Normal ; if not, branch
| |
− | jmp (DebugMode).l
| |
− | ; ---------------------------------------------------------------------------
| |
− | ; loc_19F5C:
| |
− | Obj01_Normal:
| |
− | moveq #0,d0
| |
− | move.b routine(a0),d0
| |
− | move.w Obj01_Index(pc,d0.w),d1
| |
− | jmp Obj01_Index(pc,d1.w)
| |
− | ; End of function Obj01
| |
| | | |
− | ; ----------------------------------------------------------------------------
| + | ==A heading== |
− | </asm>
| |
− | Now copy the code I mentioned earlier in this step, and paste it below the code displayed above. Then, replace all of the "dc.w"'s with "offsetTableEntry.w"'s, delete the "-Obj01_Index" on the end of each line, move all of the entries down one line, add "offsetTable" to the top, and change all of the 01's in the whole section of code to 4C's. If you're following this guide correctly, your code should look like this:
| |
− | <asm>
| |
− | ; ----------------------------------------------------------------------------
| |
− | ; Object 4C - Knuckles
| |
− | ; ----------------------------------------------------------------------------
| |
| | | |
− | Obj4C:
| + | ===Another heading=== |
− | ; a0=character
| |
− | tst.w (Debug_placement_mode).w ; is debug mode being used?
| |
− | beq.s Obj4C_Normal ; if not, branch
| |
− | jmp (DebugMode).l
| |
− | ; ---------------------------------------------------------------------------
| |
− | ; loc_19F5C:
| |
− | Obj4C_Normal:
| |
− | moveq #0,d0
| |
− | move.b routine(a0),d0
| |
− | move.w Obj4C_Index(pc,d0.w),d1
| |
− | jmp Obj4C_Index(pc,d1.w)
| |
− | ; End of function Obj4C
| |
| | | |
− | ; ----------------------------------------------------------------------------
| + | ====Moar headings==== |
− | Obj4C_Index: offsetTable
| |
− | offsetTableEntry.w Obj4C_Init ; 0
| |
− | offsetTableEntry.w Obj4C_Control ; 2
| |
− | offsetTableEntry.w Obj4C_Hurt ; 4
| |
− | offsetTableEntry.w Obj4C_Dead ; 6
| |
− | offsetTableEntry.w Obj4C_Gone ; 8
| |
− | offsetTableEntry.w Obj4C_Respawning ; $A
| |
− | ...
| |
− | </asm>
| |
− | Now that '''THAT''' is done and over with, let's continue to importing Knuckles' many modes (or whatever you people call them).
| |
− | ==Step 3: Obj4C_Init== | |
− | Going back to s2k.asm , you should see this piece of code right below the code I mentioned earlier in Step 2:
| |
− | <asm>
| |
− | ; ---------------------------------------------------------------------------
| |
| | | |
− | Obj01_Init: ; ...
| + | =====Final heading===== |
− | addq.b #2,$24(a0)
| |
− | move.b #$13,$16(a0)
| |
− | move.b #9,$17(a0)
| |
− | move.l #SK_Map_Knuckles,4(a0) ; SK_Map_Knuckles
| |
− | move.b #2,$18(a0)
| |
− | move.b #$18,$19(a0)
| |
− | move.b #4,1(a0)
| |
− | move.w #$600,($FFFFF760).w
| |
− | move.w #$C,($FFFFF762).w
| |
− | move.w #$80,($FFFFF764).w
| |
− | tst.b ($FFFFFE30).w
| |
− | bne.s Obj01_Init_Continued
| |
− | move.w #$780,2(a0)
| |
− | bsr.w Adjust2PArtPointer2_Useless
| |
− | move.b #$C,$3E(a0)
| |
− | move.b #$D,$3F(a0)
| |
− | move.w 8(a0),($FFFFFE32).w
| |
− | move.w $C(a0),($FFFFFE34).w
| |
− | move.w 2(a0),($FFFFFE3C).w
| |
− | move.w $3E(a0),($FFFFFE3E).w
| |
| | | |
− | Obj01_Init_Continued: ; ...
| + | ==Video== |
− | move.b #0,$2C(a0)
| + | [[File:Sonic2 MD US TVAdvert 15s.mp4|320px|start=9|end=11]] |
− | move.b #4,$2D(a0)
| |
− | move.b #0,($FFFFFE19).w
| |
− | move.b #$1E,$28(a0)
| |
− | sub.w #$20,8(a0)
| |
− | add.w #4,$C(a0)
| |
− | move.w #0,($FFFFEED2).w
| |
− | move.w #$3F,d2
| |
− | | |
− | loc_3153EC: ; ...
| |
− | bsr.w Knuckles_RecordPositions
| |
− | subq.w #4,a1
| |
− | move.l #0,(a1)
| |
− | dbf d2,loc_3153EC
| |
− | add.w #$20,8(a0)
| |
− | sub.w #4,$C(a0)
| |
− | </asm>
| |
− | All we need to do is copy this, paste it below our already ported code, and change all of the 01's to 4C's. Now you should have this below the offset table:
| |
− | <asm>
| |
− | ; ---------------------------------------------------------------------------
| |
− | | |
− | Obj4C_Init: ; ...
| |
− | addq.b #2,$24(a0)
| |
− | move.b #$13,$16(a0)
| |
− | move.b #9,$17(a0)
| |
− | move.l #SK_Map_Knuckles,4(a0) ; SK_Map_Knuckles
| |
− | move.b #2,$18(a0)
| |
− | move.b #$18,$19(a0)
| |
− | move.b #4,1(a0)
| |
− | move.w #$600,($FFFFF760).w
| |
− | move.w #$C,($FFFFF762).w
| |
− | move.w #$80,($FFFFF764).w
| |
− | tst.b ($FFFFFE30).w
| |
− | bne.s Obj4C_Init_Continued
| |
− | move.w #$780,2(a0)
| |
− | bsr.w Adjust2PArtPointer2_Useless
| |
− | move.b #$C,$3E(a0)
| |
− | move.b #$D,$3F(a0)
| |
− | move.w 8(a0),($FFFFFE32).w
| |
− | move.w $C(a0),($FFFFFE34).w
| |
− | move.w 2(a0),($FFFFFE3C).w
| |
− | move.w $3E(a0),($FFFFFE3E).w
| |
− | | |
− | Obj4C_Init_Continued: ; ...
| |
− | move.b #0,$2C(a0)
| |
− | move.b #4,$2D(a0)
| |
− | move.b #0,($FFFFFE19).w
| |
− | move.b #$1E,$28(a0)
| |
− | sub.w #$20,8(a0)
| |
− | add.w #4,$C(a0)
| |
− | move.w #0,($FFFFEED2).w
| |
− | move.w #$3F,d2
| |
− | | |
− | loc_3153EC: ; ...
| |
− | bsr.w Knuckles_RecordPositions
| |
− | subq.w #4,a1
| |
− | move.l #0,(a1)
| |
− | dbf d2,loc_3153EC
| |
− | add.w #$20,8(a0)
| |
− | sub.w #4,$C(a0)
| |
− | </asm>
| |
− | ==Test what I've got so far!== | |
− | Follow what is currently in this guide and see if I'm doing this right. I don't want to write the next section if I'm not doing it right.
| |