Опубликовано: 25 апр 2018 Здесь я собрал и буду собирать свои гайды по хакингу. 1. Как добавить Jump Dash в S3K? Ищем роутину "Sonic_InstaShield" и заменяем её на это: Цитата Sonic_InstaShield: ; Jumpdash code for sonic, written by DelayHacks btst #Status_Shield,status_secondary(a0) ; does Sonic have an S2 shield (The Elementals were already filtered out at this point)? bne.s locret_11A14 ; if yes, branch move.b #1,double_jump_flag(a0) btst #Status_Facing,status(a0) ; is Sonic facing left? bne.w Sonic_JumpdashLeft ; if yes, branch move.b #0,y_vel(a0) ; Clear y velocity move.w #3000,x_vel(a0) ; Set x velocity move.w #$47,d0 ; play Jumpdash sound jmp (Play_Sound_2).l Sonic_JumpdashLeft: move.b #0,y_vel(a0) ; Clear y velocity move.w #-3000,x_vel(a0) ; Set x velocity move.w #$47,d0 ; play Jumpdash sound jmp (Play_Sound_2).l 2. Как добавить камеру как в Sonic CD в S1? (Если вы используете GitHub дизассембл, то вам сюда.) Всем привет, с вами я. Приступим... Сперва перед "end of rom" вставляем эту строчку Цитата include "_inc\Sonic_PanCamera.asm" ; ++add this++ Потом меняем роутину "Obj01_Control" на эту: Цитата Obj01_Control: ; XREF: Obj01_Index bsr.s Jmpto_Sonic_PanCamera ; ++add this++ tst.w ($FFFFFFFA).w ; is debug cheat enabled? beq.s loc_12C58 ; if not, branch btst #iC,(Joypad|Press) ; is button C pressed? beq.s loc_12C58 ; if not, branch move.w #1,($FFFFFE08).w ; change Sonic into a ring/item clr.b ($FFFFF7CC).w rts Jmpto_Sonic_PanCamera: jmp Sonic_PanCamera bsr Obj01_Control Потом создаём новый файл в папке "_inc" под названием "Sonic_PanCamera.asm" и вставляем туда этот код: Цитата ; --------------------------------------------------------------------------- ; Subroutine to horizontally pan the camera view ahead of the player ; (Ported from the US version of Sonic CD's "R11A__.MMD" by Nat The Porcupine, ported to Hivebrain disasm by DelayHacks) ; --------------------------------------------------------------------------- ; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||||||||| Sonic_PanCamera: move.w ($FFFFF7A0).w,d1 ; get the current camera pan value move.w $14(a0),d0 ; get sonic's inertia bpl.s Sonic_PanCamera_abs_inertia ; if sonic's inertia is positive, branch ahead neg.w d0 ; otherwise, we negate it to get the absolute value Sonic_PanCamera_abs_inertia: ; These lines were intended to prevent the Camera from panning while ; going up the very first giant ramp in Palmtree Panic Zone Act 1. ; However, given that no such object exists in Sonic 1, I just went ; ahead and commented these out. ; btst #1,$2C(a0) ; is sonic going up a giant ramp in PPZ? ; beq.s Sonic_PanCamera_skip ; if not, branch ; cmpi.w #$1B00,($FFFFD008).w ; is sonic's x position lower than $1B00? ; bcs.s Sonic_PanCamera_reset_pan ; if so, branch ; These lines aren't part of the original routine; I added them myself. ; If you've ported the Spin Dash, uncomment the following lines of code ; to allow the camera to pan ahead while charging the Spin Dash: tst.b $39(a0) ; is sonic charging up a spin dash? beq.s Sonic_PanCamera_skip ; if not, branch btst #0,$22(a0) ; check the direction that sonic is facing bne.s Sonic_PanCamera_pan_right ; if he's facing right, pan the camera to the right bra.s Sonic_PanCamera_pan_left ; otherwise, pan the camera to the left Sonic_PanCamera_skip: cmpi.w #$600,d0 ; is sonic's inertia greater than $600 bcs.s Sonic_PanCamera_reset_pan ; if not, recenter the screen (if needed) tst.w $14(a0) ; otherwise, check the direction of inertia (by subtracting it from 0) bpl.s Sonic_PanCamera_pan_left ; if the result was positive, then inertia was negative, so we pan the screen left Sonic_PanCamera_pan_right: addq.w #2,d1 ; add 2 to the pan value cmpi.w #224,d1 ; is the pan value greater than 224 pixels? bcs.s Sonic_PanCamera_update_pan ; if not, branch move.w #224,d1 ; otherwise, cap the value at the maximum of 224 pixels bra.s Sonic_PanCamera_update_pan ; branch ; --------------------------------------------------------------------------- Sonic_PanCamera_pan_left: subq.w #2,d1 ; subtract 2 from the pan value cmpi.w #96,d1 ; is the pan value less than 96 pixels? bcc.s Sonic_PanCamera_update_pan ; if not, branch move.w #96,d1 ; otherwise, cap the value at the minimum of 96 pixels bra.s Sonic_PanCamera_update_pan ; branch ; --------------------------------------------------------------------------- Sonic_PanCamera_reset_pan: cmpi.w #160,d1 ; is the pan value 160 pixels? beq.s Sonic_PanCamera_update_pan ; if so, branch bcc.s Sonic_PanCamera_reset_left ; otherwise, branch if it greater than 160 Sonic_PanCamera_reset_right: addq.w #2,d1 ; add 2 to the pan value bra.s Sonic_PanCamera_update_pan ; branch ; --------------------------------------------------------------------------- Sonic_PanCamera_reset_left: subq.w #2,d1 ; subtract 2 from the pan value Sonic_PanCamera_update_pan: move.w d1,($FFFFF7A0).w ; update the camera pan value rts ; return ; End of function Sonic_PanCamera Теперь ищем роутину "ScrollHoriz2" и заменяем всё начиная c "ScrollHoriz2:" до "bra.s loc_65CC" (влючительно) на это: Цитата ScrollHoriz2: move.w ($FFFFD008).w,d0 sub.w ($FFFFF700).w,d0 ; Sonic's distance from left edge of screen sub.w ($FFFFF7A0).w,d0 ; Horizontal camera pan value beq.s SH_ProperlyFramed ; if zero, branch bcs.s SH_BehindMid ; if less than, branch bra.s SH_AheadOfMid ; branch ; =========================================================================== SH_ProperlyFramed: clr.w ($FFFFF73A).w rts ; =========================================================================== SH_AheadOfMid: cmpi.w #16,d0 ; is Sonic within 16px of middle area? blt.s SH_Ahead16 ; if yes, branch move.w #16,d0 ; set to 16 if greater SH_Ahead16: add.w ($FFFFF700).w,d0 cmp.w ($FFFFF72A).w,d0 blt.s SH_SetScreen move.w ($FFFFF72A).w,d0 SH_SetScreen: move.w d0,d1 sub.w ($FFFFF700).w,d1 asl.w #8,d1 move.w d0,($FFFFF700).w ; set new screen position move.w d1,($FFFFF73A).w ; set distance for screen movement rts ; =========================================================================== SH_BehindMid: cmpi.w #-16,d0 ; is Sonic within 16px of middle area? bge.s SH_Behind16 ; if no, branch move.w #-16,d0 ; set to -16 if less SH_Behind16: add.w ($FFFFF700).w,d0 cmp.w ($FFFFF728).w,d0 bgt.s SH_SetScreen move.w ($FFFFF728).w,d0 bra.s SH_SetScreen ; End of function MoveScreenHoriz ; =========================================================================== tst.w d0 bpl.s loc_6610 move.w #$FFFE,d0 bra.s SH_Behind16 ; =========================================================================== loc_6610: move.w #2,d0 bra.s SH_AheadOfMid Далее ищем роутину "LevelSizeLoad" и перед бранчем в конце вставляем вот эту строчку: Цитата move.w #160,($FFFFF7A0).w ; reset the horizontal camera pan value to 160 pixels 3. Как добавить Spinboost (способность из Sonic Advance) в S3K? Сперва добавляем эту роутину после строчки "; End of function Player_Spindash": Цитата Sonic_Spinboost: ; Sonic Advance feature, code by DelayHacks, original code from STHOSP move.b ($FFFFF603).w,d0 ; read controller andi.b #$10,d0 ; pressing B? beq.w Sonic_SpinboostRts ; if not, return addq.l #4,sp ; increment stack ptr move.b #1,$3D(a0) ;Set Spindash flag move.w #0,$3E(a0) ; set charge count to 0 Sonic_SpinboostRts: rts Далее ищем роутину "Sonic_MdNormal:" и добавляем эту строчку в начале: Цитата bsr.w Sonic_Spinboost 4. Как добавить экран опций (из S2) в S1? Сперва скачиваем этот архив, Распаковываем файлы и папки из него в ваш дизассембл. После чего добавляем эту строчку в самом начале кода: Цитата include "s2_constants.asm" Теперь добавляем эти строчки перед роутиной "LevelSelect": Цитата MenuScreen: include "s2_beginning.asm" ; =========================================================================== ; --------------------------------------------------------------------------- ; Sonic 2 Menu Option ; --------------------------------------------------------------------------- include "s2_option.asm" ; =========================================================================== include "s2_end.asm" ; end of function MenuScreen ; =========================================================================== Осталось только исправить баг, ищем роутину "Obj37_MakeRings" и нужно заменить эту строчку: Цитата bsr.w CalcSine На эту: Цитата jsr CalcSine Весь код добавлен, теперь нужно сделать так, чтобы игра могла загрузить палитру. Заходим в "_inc/Pallet Pointers.asm" и вставляем эти строчки в конце: Цитата dc.l Menu_Palette; pallet address dc.w $FB00 ; RAM address dc.w $1F ; (pallet length / 2) - 1 Сейчас вы должны придумать как открыть экран опций... Вы можете использовать такой вариант: Ищем роутину "loc_3230" и в начале добавляем эти две строчки: Цитата tpress B,(Joypad) ; is B button pressed? bhi MenuScreenOpts ; if yes, branch to options screen Чтобы изменить тексты, ищите эти строчки в файле "_inc\s2_option.asm": Цитата TextOptScr_PlayerSelect: dc.b $10,_st,__,_P,_L,_A,_Y,_E,_R,__,_S,_E,_L,_E,_C,_T,__,_st TextOptScr_Sonic: dc.b $E,__,__,__,__,_S,_O,_N,_I,_C,__,__,__,__,__,__ TextOptScr_Miles: dc.b $E,__,__,__,__,_M,_I,_L,_E,_S,__,__,__,__,__,__ TextOptScr_Tails: dc.b $E,__,__,__,__,_T,_A,_I,_L,_S,__,__,__,__,__,__ TextOptScr_Knuckles: dc.b $E,__,__,__,_K,_N,_U,_C,_K,_L,_E,_S,__,__,__,__ TextOptScr_VsModeItems: dc.b $10,_st,__,__,_S,_O,_U,_N,_D,_T,_R,_A,_C,_K,__,__,__,_st TextOptScr_AllKindsItems: dc.b $E,__,__,_H,_Y,_P,_E,_R,_D,_R,_I,_V,_E,__,__,__ TextOptScr_TeleportOnly: dc.b $E,__,__,__,_O,_R,_I,_G,_I,_N,_A,_L,__,__,__,__ TextOptScr_SoundTest: dc.b $10,_st,__,__,_S,_O,_U,_N,_D,__,_T,_E,_S,_T,__,__,__,_st TextOptScr_0: dc.b $10,__,__,__,__,__,__,__,_0,__,__,__,__,__,__,__,__,__ (Надписи Soundtrack, hyperdrive, original были добавлены мной) Чтобы изменить кол-во вариантов ищите эти строчки: Цитата OptionScreen_Choices: dc.l (3-1)<<24|($FFFF8A&$FFFFFF) dc.l (2-1)<<24|($FFFFBE&$FFFFFF) dc.l ($FF)<<24|($FFFF84&$FFFFFF) Чтобы добавить варианты, вы должны сперва добавить для них текст, потом добавить его сюда: Цитата off_92D2: dc.l TextOptScr_Sonic dc.l TextOptScr_Tails dc.l TextOptScr_Knuckles off_92DE: dc.l TextOptScr_Sonic dc.l TextOptScr_Miles dc.l TextOptScr_Knuckles off_92EA: dc.l TextOptScr_AllKindsItems dc.l TextOptScr_TeleportOnly off_92F2: dc.l TextOptScr_0 (off_92D2 - это player select, off_92DE - это player select, только с консолью японии, off_92EA - это "soundtrack" или же вторая опция) Адресы в RAM: Выбор персонажа - $FFFFFF8B "Soundtrack" или же вторая опция - $FFFFFFBF Вот все мои гайды, пользуйтесь. 3 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах