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

SHooTeR

Пользователи
  • Публикации

    30
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    4

Последний раз SHooTeR выиграл 28 июня 2018

Публикации SHooTeR были самыми популярными!

Репутация

112 Хорошая репутация

5 подписчиков

О SHooTeR

  • Звание
    Новичок
  • День рождения 11.04.1996

Контакты

  • Skype
    shooter-rus-46

О себе

  • Пол
    Мужской

Посетители профиля

3 737 просмотров профиля
  1. Неправильно называть это хаком. Это патч на оригинальную игру, даже можно сказать "официальный", ведь делал его не рандомный ромхакер, а основатель компании Traveller's Tales, создавшие оригинальную игру. Он ничего не взламывал, у него есть все оригинальные исходники. Это просто новая и улучшенная версия, но никак не хак.
  2. Решил сделать свою версию перевода с исправленными шрифтами. Перевёл всё, кроме хада и подсчёта очков в конце актов/спецуровней, но мог что-то и упустить. https://yadi.sk/d/i_pDTpL13Mffu7 Загрузчик модов можно найти одним сообщением выше.
  3. В s2.asm сравни PlrList_Ehz1 и PlrList_Ehz2 с PlrList_Hpz1 и PlrList_Hpz2. Часть проблем ты решишь после этого.
  4. В Obj79_Main замени move.w #$7A0,2(a0) на move.w #$6C0,2(a0) Если в хаке есть спиндеш, арт чекпоинта загружается в другое место памяти. Готовый код в том гайде делался без расчёта на спиндеш. Та же проблема может и со звёздочками случится, заменишь эти же значения в Obj79_MakeStarsLoop.
  5. Спасибо всем за отзывы, рад что вам понравилось, не зря старался. Хотелось бы сделать уровень гораздо больше, но он и так занимает всю доступную площадь, да и строитель из меня не лучший. Мне пришлось их сделать такими, чтобы уровень казался длиннее и проходился дольше. Когда они были нелинейными, то проходились примерно вдвое быстрее. Весь этот уровень я планировал сделать двумя отдельными уровнями для своего прошлого хака, но большие хаки я не потяну один, поэтому решил сделать маленький. Получилось лучше, чем я планировал это раньше, так что я не жалею, что решил сделать именно минихак. Если вдруг кому-то будет интересно посмотреть на всю карту уровня или кто-то не может найти секреты, то можете глянуть ниже. Катсцена, Уровень, Финальный босс
  6. Даже не думал, что парочка правок в коде перед релизом смогу так поломать хак. Спасибо за обнаружение. Вот исправленная версия. Протестировал только в Regen и MD.emu Dropbox Яндекс Диск
  7. Sonic 1: Egg Factory - мой минихак, который я недавно упоминал в топике для скриншотов, наконец закончен и я рад представить его вам! Что же в нём нового? 1. Полностью новый уровень с новой графикой 2. Новые и изменённые враги 3. Разные щиты с разными способностями Белый - Двойной прыжок Синий - Защита от мелких снарядов врагов Красный - Jumpdash Желтый - Притягивание колец 4. Секретики! На уровне есть несколько секретов, с одним из них можно взаимодействовать. 5. Новые боссы. 6. Оригинальный саундтрек, который написал Ivan YO. Большое Спасибо! 7. Много прочих мелких улучшений, которые и так будут заметны. 8. В конце все умрут. Ссылки на скачивание: Яндекс Диск Dropbox
  8. Частичка финального босса из моего будущего минихака.
  9. Всегда хотел тут что-то написать, но не знал что. Вот наконец придумал. Вход в спецуровни через чекпоинты (как в 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 Теперь нам надо заменить все константы на байты. Можно конечно сами константы добавить, но я их не особо люблю и поэтому предлагаю избавиться от них. Во всём новом коде находим и заменяем: Obj79_MapUnc_1F4A0 -> Map_obj79b mappings ->$04 art_tile -> $02 render_flags -> $01 routine -> $24 x_pos -> $08 y_pos -> $0C objoff_30 -> $30 objoff_32 -> $32 priority -> $18 width_pixels -> $19 mapping_frame -> $1A x_vel -> $10 y_vel -> $12 objoff_34 -> $34 collision_property -> $21 Game_Mode -> $FFFFF600 objoff_36 -> $36 collision_flags -> $20 anim_frame -> $1B Проверяем... ага, нету мапингов... да и скажу сразу, арта звездочек тоже нету. Не буду рассказывать как их выдрать, а просто приложу архив с уже готовым артом и мапингами. https://yadi.sk/d/lDeBb4Pykc8fP Теперь в коде добавим новые мапинги. Рядом с Map_obj79 добавьте Map_obj79b: include "_maps\obj79b.asm" Снова проверяем и... Скомпилировалось, но звездочки не появляются. Если ещё раз сравнить код из sonic1 и sonic2, то можно увидеть ещё одну важную деталь. В s2.asm в Obj79_CheckActivation в конце есть 3 строчки, которые нам нужны. Копируем и переносим в sonic1.asm перед loc_16F76. Замените в этом коде Ring_count на $FFFFFE20, а loc_1F206 на loc_16F76. При компиляции будет ошибка. Проблема в том, что код стал длинне и некоторые быстрые переходы уже не достают до нужного им кода. В Obj79_HitLamp найдите строчку bcc.s locret_16F90 и сотрите в ней .s Снова проверяем. Работает! Работает, но не совсем. Звездочки отображаются не правильно и мы не попадаем в спец уровень при их прикосновении. Исправляем. Переходим к Obj79_MakeStarsLoop, находим там строчку move.w #$47C,$02(a1) и меняем тут значение с $47C на $7A0. Это адресс, из которого будет браться арт для звездочек. В sonic2 этот арт лежит в другом месте, поэтому такой баг получился. Если у вас в хаке есть спиндеш, то адрес надо указать $6C0 (или $D800/$20, как предлагается в гиде по добавлению спиндеша). Осталось исправить одну вещь, перемещение в спец уровень. Переходим к Obj79_Star. Честно скажу, не знаю в чём проблема, просто замените эти 6 строк на это move.b #$D7,$20(a0) tst.b $21(a0) beq.s loc_1F554 move.b #$10,($FFFFF600).w (первые 2 строчки взяты из кода бампера) Готово. Всё должно работать как надо. Если у вас что-то не получилось, то вот полный готовый код чекпоинта. ; --------------------------------------------------------------------------- ; Object 79 - lamppost ; --------------------------------------------------------------------------- Obj79: ; XREF: Obj_Index moveq #0,d0 move.b $24(a0),d0 move.w Obj79_Index(pc,d0.w),d1 jsr Obj79_Index(pc,d1.w) jmp MarkObjGone ; =========================================================================== Obj79_Index: dc.w Obj79_Main-Obj79_Index dc.w Obj79_BlueLamp-Obj79_Index dc.w Obj79_AfterHit-Obj79_Index dc.w Obj79_Twirl-Obj79_Index dc.w Obj79_Star-Obj79_Index ; =========================================================================== Obj79_Main: ; XREF: Obj79_Index addq.b #2,$24(a0) move.l #Map_obj79,4(a0) move.w #$7A0,2(a0) move.b #4,1(a0) move.b #8,$19(a0) move.b #5,$18(a0) lea ($FFFFFC00).w,a2 moveq #0,d0 move.b $23(a0),d0 bclr #7,2(a2,d0.w) btst #0,2(a2,d0.w) bne.s Obj79_RedLamp move.b ($FFFFFE30).w,d1 andi.b #$7F,d1 move.b $28(a0),d2 ; get lamppost number andi.b #$7F,d2 cmp.b d2,d1 ; is lamppost number higher than the number hit? bcs.s Obj79_BlueLamp ; if yes, branch Obj79_RedLamp: bset #0,2(a2,d0.w) move.b #4,$24(a0) ; run "Obj79_AfterHit" routine move.b #3,$1A(a0) ; use red lamppost frame rts ; =========================================================================== Obj79_BlueLamp: ; XREF: Obj79_Index tst.w ($FFFFFE08).w ; is debug mode being used? bne.w locret_16F90 ; if yes, branch tst.b ($FFFFF7C8).w bmi.w locret_16F90 move.b ($FFFFFE30).w,d1 andi.b #$7F,d1 move.b $28(a0),d2 andi.b #$7F,d2 cmp.b d2,d1 bcs.s Obj79_HitLamp lea ($FFFFFC00).w,a2 moveq #0,d0 move.b $23(a0),d0 bset #0,2(a2,d0.w) move.b #4,$24(a0) move.b #3,$1A(a0) bra.w locret_16F90 ; =========================================================================== Obj79_HitLamp: move.w ($FFFFD008).w,d0 sub.w 8(a0),d0 addq.w #8,d0 cmpi.w #$10,d0 bcc.w locret_16F90 move.w ($FFFFD00C).w,d0 sub.w $C(a0),d0 addi.w #$40,d0 cmpi.w #$68,d0 bcc locret_16F90 move.w #$A1,d0 jsr (PlaySound_Special).l ; play lamppost sound addq.b #2,$24(a0) jsr SingleObjLoad bne.s loc_16F76 move.b #$79,0(a1) ; load twirling lamp object move.b #6,$24(a1) ; use "Obj79_Twirl" routine move.w 8(a0),$30(a1) move.w $C(a0),$32(a1) subi.w #$18,$32(a1) move.l #Map_obj79,4(a1) move.w #$7A0,2(a1) move.b #4,1(a1) move.b #8,$19(a1) move.b #4,$18(a1) move.b #2,$1A(a1) move.w #$20,$36(a1) cmpi.w #$32,($FFFFFE20).w bcs.s loc_16F76 bsr.w Obj79_MakeSpecialStars loc_16F76: move.b #1,$1A(a0) ; use "post only" frame, with no lamp bsr.w Obj79_StoreInfo lea ($FFFFFC00).w,a2 moveq #0,d0 move.b $23(a0),d0 bset #0,2(a2,d0.w) locret_16F90: rts ; =========================================================================== Obj79_AfterHit: ; XREF: Obj79_Index rts ; =========================================================================== Obj79_Twirl: ; XREF: Obj79_Index subq.w #1,$36(a0) bpl.s loc_16FA0 move.b #4,$24(a0) loc_16FA0: move.b $26(a0),d0 subi.b #$10,$26(a0) subi.b #$40,d0 jsr (CalcSine).l muls.w #$C00,d1 swap d1 add.w $30(a0),d1 move.w d1,8(a0) muls.w #$C00,d0 swap d0 add.w $32(a0),d0 move.w d0,$C(a0) rts ; =========================================================================== ; --------------------------------------------------------------------------- ; Subroutine to store information when you hit a lamppost ; --------------------------------------------------------------------------- Obj79_StoreInfo: ; XREF: Obj79_HitLamp move.b $28(a0),($FFFFFE30).w ; lamppost number move.b ($FFFFFE30).w,($FFFFFE31).w move.w 8(a0),($FFFFFE32).w ; x-position move.w $C(a0),($FFFFFE34).w ; y-position move.w ($FFFFFE20).w,($FFFFFE36).w ; rings move.b ($FFFFFE1B).w,($FFFFFE54).w ; lives move.l ($FFFFFE22).w,($FFFFFE38).w ; time move.b ($FFFFF742).w,($FFFFFE3C).w ; routine counter for dynamic level mod move.w ($FFFFF72E).w,($FFFFFE3E).w ; lower y-boundary of level move.w ($FFFFF700).w,($FFFFFE40).w ; screen x-position move.w ($FFFFF704).w,($FFFFFE42).w ; screen y-position move.w ($FFFFF708).w,($FFFFFE44).w ; bg position move.w ($FFFFF70C).w,($FFFFFE46).w ; bg position move.w ($FFFFF710).w,($FFFFFE48).w ; bg position move.w ($FFFFF714).w,($FFFFFE4A).w ; bg position move.w ($FFFFF718).w,($FFFFFE4C).w ; bg position move.w ($FFFFF71C).w,($FFFFFE4E).w ; bg position move.w ($FFFFF648).w,($FFFFFE50).w ; water height move.b ($FFFFF64D).w,($FFFFFE52).w ; rountine counter for water move.b ($FFFFF64E).w,($FFFFFE53).w ; water direction rts ; --------------------------------------------------------------------------- ; Subroutine to load stored info when you start a level from a lamppost ; --------------------------------------------------------------------------- ; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||||||||| Obj79_LoadInfo: ; XREF: LevelSizeLoad move.b ($FFFFFE31).w,($FFFFFE30).w move.w ($FFFFFE32).w,($FFFFD008).w move.w ($FFFFFE34).w,($FFFFD00C).w move.w ($FFFFFE36).w,($FFFFFE20).w move.b ($FFFFFE54).w,($FFFFFE1B).w clr.w ($FFFFFE20).w clr.b ($FFFFFE1B).w move.l ($FFFFFE38).w,($FFFFFE22).w move.b #59,($FFFFFE25).w subq.b #1,($FFFFFE24).w move.b ($FFFFFE3C).w,($FFFFF742).w move.b ($FFFFFE52).w,($FFFFF64D).w move.w ($FFFFFE3E).w,($FFFFF72E).w move.w ($FFFFFE3E).w,($FFFFF726).w move.w ($FFFFFE40).w,($FFFFF700).w move.w ($FFFFFE42).w,($FFFFF704).w move.w ($FFFFFE44).w,($FFFFF708).w move.w ($FFFFFE46).w,($FFFFF70C).w move.w ($FFFFFE48).w,($FFFFF710).w move.w ($FFFFFE4A).w,($FFFFF714).w move.w ($FFFFFE4C).w,($FFFFF718).w move.w ($FFFFFE4E).w,($FFFFF71C).w cmpi.b #1,($FFFFFE10).w bne.s loc_170E4 move.w ($FFFFFE50).w,($FFFFF648).w move.b ($FFFFFE52).w,($FFFFF64D).w move.b ($FFFFFE53).w,($FFFFF64E).w loc_170E4: tst.b ($FFFFFE30).w bpl.s locret_170F6 move.w ($FFFFFE32).w,d0 subi.w #$A0,d0 move.w d0,($FFFFF728).w locret_170F6: rts ; End of function Obj79_LoadInfo Obj79_MakeSpecialStars: moveq #4-1,d1 ; execute the loop 4 times (1 for each star) moveq #0,d2 Obj79_MakeStarsLoop: jsr SingleObjLoad2 bne.s return_1F534 move.b 0(a0),0(a1) ; load obj79 move.l #Map_obj79b,$04(a1) move.w #$7A0,$02(a1) move.b #4,$01(a1) move.b #8,$24(a1) ; => Obj79_Star move.w $08(a0),d0 move.w d0,$08(a1) move.w d0,$30(a1) move.w $0C(a0),d0 subi.w #$30,d0 move.w d0,$0C(a1) move.w d0,$32(a1) move.b $18(a0),$18(a1) move.b #8,$19(a1) move.b #1,$1A(a1) move.w #-$400,$10(a1) move.w #0,$12(a1) move.w d2,$34(a1) ; set the angle addi.w #$40,d2 ; increase the angle for next time dbf d1,Obj79_MakeStarsLoop ; loop return_1F534: rts ; =========================================================================== ; loc_1F536: Obj79_Star: move.b #$D7,$20(a0) tst.b $21(a0) beq.s loc_1F554 move.b #$10,($FFFFF600).w loc_1F553: clr.b $21(a0) loc_1F554: addi.w #$A,$34(a0) move.w $34(a0),d0 andi.w #$FF,d0 jsr (CalcSine).l asr.w #5,d0 asr.w #3,d1 move.w d1,d3 move.w $34(a0),d2 andi.w #$3E0,d2 lsr.w #5,d2 moveq #2,d5 moveq #0,d4 cmpi.w #$10,d2 ble.s loc_1F555 neg.w d1 loc_1F555: 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 loc_1F595 add.w d1,d4 loc_1F595: asl.w #1,d1 dbf d5,loc_1F594 asr.w #4,d4 add.w d4,d0 addq.w #1,$36(a0) move.w $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,$20(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 $30(a0),d2 add.w d3,d2 move.w d2,$08(a0) move.w $32(a0),d2 add.w d0,d2 move.w d2,$0C(a0) addq.b #1,$1B(a0) move.b $1B(a0),d0 andi.w #6,d0 lsr.w #1,d0 cmpi.b #3,d0 bne.s loc_1F5D7 moveq #1,d0 loc_1F5D7: move.b d0,$1A(a0) bra.w JmpTo_MarkObjGone ; =========================================================================== JmpTo10_DeleteObject jmp DeleteObject ; =========================================================================== nop JmpTo_MarkObjGone jmp MarkObjGone ; =========================================================================== ; --------------------------------------------------------------------------- ; Sprite mappings - lamppost ; --------------------------------------------------------------------------- Map_obj79: include "_maps\obj79.asm" Map_obj79b: include "_maps\obj79b.asm" Так же выложу дизасембл с уже выполненым гайдом. https://yadi.sk/d/z_rjrPVskc8wc Гайд составлен мною, в кредитах указывать не обязательно. Всё-равно никто не укажет :)
  10. Вторая строчка в Obj21_Main move.w #$90,8(a0)
  11. Замени весь код LZMoveWater на этот LZMoveWater: clr.b ($FFFFF64E).w cmp.w #$101,($FFFFFE10).w beq.s LZMoveWater2 moveq #0,d0 move.b ($FFFFFE60).w,d0 lsr.w #1,d0 LZMoveWater2: add.w ($FFFFF648).w,d0 move.w d0,($FFFFF646).w move.w ($FFFFF646).w,d0 sub.w ($FFFFF704).w,d0 bcc.s loc_3C1A tst.w d0 bpl.s loc_3C1A move.b #-$21,($FFFFF625).w move.b #1,($FFFFF64E).w Движение воды полностью отключится. Но есть один минус. Если ты будешь менять уровень воды, то вода будет изменяться резко, а не плавно.
  12. Никогда бы не подумал, что это LZ. Выглядит классно.
  13. SonicMen210, лично тебе нравится играть в свой хак? Ты получаешь удовольствие, когда в него играешь?
  14. Я к нему вернулся из-за двух причин. 1) Ivan YO меня уговаривает добавить английский язык и выложить хак на иностранных форумах (скорее всего так и будет). 2) Я ещё не смог придумать русское название уровня, поэтому специально для видео поставил английское (которое мне Иван предложил). Ага
  15. Это потрясающе. Выглядит великолепно. Мне бы твои навыки) Несомненно докажет. Желаю удачи!
  • Сейчас на странице   0 пользователей

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

×