Перейти к содержимому

Гайды по хакингу от DelayHacks

1 сообщение в этой теме

Здесь я собрал и буду собирать свои гайды по хакингу.

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

        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


; 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

        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

        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
; ---------------------------------------------------------------------------

        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
; ---------------------------------------------------------------------------

        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
        addq.w    #2,d1                    ; add 2 to the pan value
        bra.s    Sonic_PanCamera_update_pan                ; branch
; ---------------------------------------------------------------------------

        subq.w    #2,d1                    ; subtract 2 from the pan value

        move.w    d1,($FFFFF7A0).w        ; update the camera pan value
        rts                                ; return
; End of function Sonic_PanCamera

Теперь ищем роутину "ScrollHoriz2" и заменяем всё начиная c "ScrollHoriz2:" до "bra.s    loc_65CC" (влючительно) на это:


        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
; ===========================================================================

        clr.w    ($FFFFF73A).w
; ===========================================================================

        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

        add.w    ($FFFFF700).w,d0
        cmp.w    ($FFFFF72A).w,d0
        blt.s    SH_SetScreen
        move.w    ($FFFFF72A).w,d0

        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

; ===========================================================================

        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

        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
; ===========================================================================

        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_MdNormal:" и добавляем эту строчку в начале:


        bsr.w    Sonic_Spinboost

4. Как добавить экран опций (из S2) в S1?

Сперва скачиваем этот архив,

Распаковываем файлы и папки из него в ваш дизассембл.

После чего добавляем эту строчку в самом начале кода:


        include "s2_constants.asm"

Теперь добавляем эти строчки перед роутиной "LevelSelect":


    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 были добавлены мной)

Чтобы изменить кол-во вариантов ищите эти строчки:


        dc.l (3-1)<<24|($FFFF8A&$FFFFFF)
        dc.l (2-1)<<24|($FFFFBE&$FFFFFF)
        dc.l ($FF)<<24|($FFFF84&$FFFFFF)

Чтобы добавить варианты, вы должны сперва добавить для них текст, потом добавить его сюда:


        dc.l TextOptScr_Sonic
        dc.l TextOptScr_Tails
        dc.l TextOptScr_Knuckles
        dc.l TextOptScr_Sonic
        dc.l TextOptScr_Miles
        dc.l TextOptScr_Knuckles
        dc.l TextOptScr_AllKindsItems
        dc.l TextOptScr_TeleportOnly
        dc.l TextOptScr_0

(off_92D2 - это player select, off_92DE - это player select, только с консолью японии, off_92EA - это "soundtrack" или же вторая опция)

Адресы в RAM:

Выбор персонажа - $FFFFFF8B

"Soundtrack" или же вторая опция - $FFFFFFBF


Вот все мои гайды, пользуйтесь.


Поделиться сообщением

Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, войдите для комментирования

Вы сможете оставить комментарий после входа

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу