| Главная » Статьи » Гайды по хакингу Sonic 1 |
Вход в спецуровни через чекпоинты (Часть1)
Вход в спецуровни через чекпоинты (как в sonic2)
Прежде чем начать делать всё по этому гайду, предлагаю вам скачать готовый ром и оценить результат. Вдруг он вам не понравится. Скачать
Портировать звездочки для чекпоинта будем из дизасембла Sonic2 от Xenowhirl (Скачать тут)
Откроем исходники обоих соников и перейдем к Obj79. Они в основном похожи, но в sonic2 у чекпоинта есть одна дополнительная роутина, которая как раз нам и нужна. Приступаем к портированию.
В sonic1.asm найдите Obj79_Index и после строки dc.w Obj79_Twirl-Obj79_Index вставьте dc.w Obj79_Star-Obj79_Index Теперь в s2.asm найдите Obj79_MakeSpecialStars и скопируйте весь код до строки JmpTo2_AnimateSprite и вставьте его в sonic1.asm передMap_obj79. Obj79_MakeSpecialStars: moveq #4-1,d1 ; execute the loop 4 times (1 for each star) moveq #0,d2 - bsr.w SingleObjLoad2 bne.s return_1F534 _move.b 0(a0),0(a1) ; load obj79 move.l #Obj79_MapUnc_1F4A0,mappings(a1) move.w #$47C,art_tile(a1) move.b #4,render_flags(a1) move.b #8,routine(a1) ; => Obj79_Star move.w x_pos(a0),d0 move.w d0,x_pos(a1) move.w d0,objoff_30(a1) move.w y_pos(a0),d0 subi.w #$30,d0 move.w d0,y_pos(a1) move.w d0,objoff_32(a1) move.b priority(a0),priority(a1) move.b #8,width_pixels(a1) move.b #1,mapping_frame(a1) move.w #-$400,x_vel(a1) move.w #0,y_vel(a1) move.w d2,objoff_34(a1) ; set the angle addi.w #$40,d2 ; increase the angle for next time dbf d1,- ; loop return_1F534: rts ; =========================================================================== ; loc_1F536: Obj79_Star: move.b collision_property(a0),d0 beq.w loc_1F554 andi.b #1,d0 beq.s + move.b #1,($FFFFF7CD).w move.b #$10,(Game_Mode).w ; => SpecialStage + clr.b collision_property(a0) loc_1F554: addi.w #$A,objoff_34(a0) move.w objoff_34(a0),d0 andi.w #$FF,d0 jsr (CalcSine).l asr.w #5,d0 asr.w #3,d1 move.w d1,d3 move.w objoff_34(a0),d2 andi.w #$3E0,d2 lsr.w #5,d2 moveq #2,d5 moveq #0,d4 cmpi.w #$10,d2 ble.s + neg.w d1 + andi.w #$F,d2 cmpi.w #8,d2 ble.s loc_1F594 neg.w d2 andi.w #7,d2 loc_1F594: lsr.w #1,d2 beq.s + add.w d1,d4 + asl.w #1,d1 dbf d5,loc_1F594 asr.w #4,d4 add.w d4,d0 addq.w #1,objoff_36(a0) move.w objoff_36(a0),d1 cmpi.w #$80,d1 beq.s loc_1F5BE bgt.s loc_1F5C4 loc_1F5B4: muls.w d1,d0 muls.w d1,d3 asr.w #7,d0 asr.w #7,d3 bra.s loc_1F5D6 ; =========================================================================== loc_1F5BE: move.b #$D8,collision_flags(a0) loc_1F5C4: cmpi.w #$180,d1 ble.s loc_1F5D6 neg.w d1 addi.w #$200,d1 bmi.w JmpTo10_DeleteObject bra.s loc_1F5B4 ; =========================================================================== loc_1F5D6: move.w objoff_30(a0),d2 add.w d3,d2 move.w d2,x_pos(a0) move.w objoff_32(a0),d2 add.w d0,d2 move.w d2,y_pos(a0) addq.b #1,anim_frame(a0) move.b anim_frame(a0),d0 andi.w #6,d0 lsr.w #1,d0 cmpi.b #3,d0 bne.s + moveq #1,d0 + move.b d0,mapping_frame(a0) bra.w JmpTo_MarkObjGone ; =========================================================================== JmpTo10_DeleteObject jmp DeleteObject ; =========================================================================== nop JmpTo_MarkObjGone jmp MarkObjGone В таком виде код работать не будет, поэтому надо его поправить. В Obj79_MakeSpecialStars замените - (минус) на Obj79_MakeStarsLoop:
Ниже замените bsr.w SingleObjLoad2 на jsr SingleObjLoad2
Ниже _move.b 0(a0),0(a1) на move.b 0(a0),0(a1)
Перед return_1F534 замените dbf d1,- на dbf d1Obj79_MakeStarsLoop
В Obj79_Star замените плюсы на loc_1F553
В loc_1F554 замените плюсы на loc_1F555
В loc_1F594 замените плюсы на loc_1F595
В loc_1F5D6 замените плюсы на loc_1F5D7
Часть 2 : http://ultimatesofttn.ucoz.org/publ/gajdy_po_khakingu_sonic_1/vkhod_v_specurovni_cherez_chekpointy_chast_2/2-1-0-4
| |
| Просмотров: 478 | |
| Всего комментариев: 0 | |
