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

Помощь по ромхакингу

Рекомендуемые сообщения

Как сделать, чтобы в Sonic 2 была на разных актах разная музыка

 

Подробно не буду расписывать, ибо лень, но тебе нужна Level_GetBgm. Поставь проверку на номер акта до MusicList (MusicList2 не трогай - это плейлист для режима двух игроков), а дальше, думаю, все понятно. Кстати, это еще не все, потому что после мелодии жизни, inviciblity и прохождения босса будет играть мелодия первого акта (почему - думаю, ты уже сам догадался), тут уже копайся и фикси сам.

 

и палитра

 

Ищешь PalLoad1 и PalLoad2, вставляешь проверку на номер акта и делаешь, чтобы палитра второго акта юзала другие PalPointers.

 

Как определить, что объект коснулся земли

 

 

 

cmp.w $C(a0),d0 ; has object moved below the level boundary?

 

возможно ли определить координаты этого соприкосновения

 

А что, собственно, вы хотите сделать? Просто, может быть, это можно реализовать менее извращенными способами.

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


Ссылка на сообщение

Подробно не буду расписывать, ибо лень, но тебе нужна Level_GetBgm. Поставь проверку на номер акта до MusicList (MusicList2 не трогай - это плейлист для режима двух игроков), а дальше, думаю, все понятно. Кстати, это еще не все, потому что после мелодии жизни, inviciblity и прохождения босса будет играть мелодия первого акта (почему - думаю, ты уже сам догадался), тут уже копайся и фикси сам.

 

 

 

Ищешь PalLoad1 и PalLoad2, вставляешь проверку на номер акта и делаешь, чтобы палитра второго акта юзала другие PalPointers.

 

 

 

 

 

cmp.w $C(a0),d0 ; has object moved below the level boundary?

 

 

 

А что, собственно, вы хотите сделать? Просто, может быть, это можно реализовать менее извращенными способами.

А какой флаг нужно ставить? Current Act не срабатывает и я не могу найти.

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


Ссылка на сообщение

Ну вот так же:

 

 

 

PalLoad1:

cmpi.b #$1,($FFFFFE11).w ; is this act 2?

beq.s PalLoad12act ; if not, branch

lea (PalPointers).l,a1

lsl.w #3,d0

adda.w d0,a1

movea.l (a1)+,a2

movea.w (a1)+,a3

adda.w #$80,a3

move.w (a1)+,d7

 

- move.l (a2)+,(a3)+

dbf d7,-

rts

 

PalLoad12act:

lea (PalPointers2act).l,a1

lsl.w #3,d0

adda.w d0,a1

movea.l (a1)+,a2

movea.w (a1)+,a3

adda.w #$80,a3

move.w (a1)+,d7

 

- move.l (a2)+,(a3)+

dbf d7,-

rts

; End of function PalLoad1

 

 

; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||

 

; sub_272E:

PalLoad2:

cmpi.b #$1,($FFFFFE11).w ; is this act 2?

beq.s PalLoad22act ; if not, branch

lea (PalPointers).l,a1

lsl.w #3,d0

adda.w d0,a1

movea.l (a1)+,a2

movea.w (a1)+,a3

move.w (a1)+,d7

 

- move.l (a2)+,(a3)+

dbf d7,-

rts

 

PalLoad22act:

lea (PalPointers2act).l,a1

lsl.w #3,d0

adda.w d0,a1

movea.l (a1)+,a2

movea.w (a1)+,a3

move.w (a1)+,d7

 

- move.l (a2)+,(a3)+

dbf d7,-

rts

; End of function PalLoad2

 

Копируешь PalPointers, обзываешь PalPointers2act. Тебе нужно сделать другую палитру на EHZ, берешь в строчке

 

 

 

palptr Pal_EHZ, Normal_palette_line2, $17

 

Приписываешь двойку к Pal_EHZ - получается Pal_EHZ2.

 

Юзаешь binclude:

 

 

 

Pal_EHZ2: BINCLUDE "art/palettes/EHZ2.bin" ; Emerald Hill Zone 2 palette

 

art/palettes/EHZ2.bin - вот твой файл палитры.

 

С остальными аналогично.

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


Ссылка на сообщение

Ну вот так же:

 

 

 

 

 

Копируешь PalPointers, обзываешь PalPointers2act. Тебе нужно сделать другую палитру на EHZ, берешь в строчке

 

 

 

 

 

Приписываешь двойку к Pal_EHZ - получается Pal_EHZ2.

 

Юзаешь binclude:

 

 

 

 

 

art/palettes/EHZ2.bin - вот твой файл палитры.

 

С остальными аналогично.

Че тут не правильно

 

Level_GetBgm:
tst.w (Demo_mode_flag).w
bmi.s loc_4114
moveq #0,d0
cmpi.b #$0,($FFFFFE11).w ; is this act 1?
lea MusicList(pc),a1
cmpi.b #$1,($FFFFFE11).w ; is this act 2?
lea MusicList2act(pc),a1
tst.w (Two_player_mode).w
beq.s Level_PlayBgm
lea MusicList2(pc),a1

Вроде бы сделал все "по науке", но почему-то на всех актах и зонах играет первая мелодия в списке MusicList2act.

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


Ссылка на сообщение

Как определить, что объект коснулся земли и возможно ли определить координаты этого соприкосновения ?

 

Как-то давно на другом форуме писал по этому вопросу, так что цитирую:

 	   bsr.w	ObjHitFloor
	tst.w   d1	; коснулись пола?
	bpl.w   ObjXX_NoHit; если нет, переход
	add.w   d1,$C(a0); корректируем Y-координату

 

Как это работает:

 

ObjHitFloor записывает расстояние до пола в d1. Если оно положительно, выполняется переход, а если отрицательно или равно нулю, значит объект касается пола или уже вошел в него. В этом случае к Y-координате прибавляется d1, поскольку он отрицателен - Y-координата уменьшится. Это нужно для того, чтобы объект касался пола, а не уходил в него.

 

Кстати, кусок кода должен выполняться после вызова SpeedToPos или ObjectFall, т.е. когда X и Y скорости уже прибавлены к координатам. Так что роль ObjHitFloor при прикосновении с полом - сделать так, чтобы объект приземлился ровно на его поверхность, для строка "add.w d1,$C(a0)" и корректирует Y-координату.

 

 

С координатами все просто. Если проверка на взаимодействие с полом удалась (tst.w d1 ; коснулись пола?), т.е. мы не прыгнули на ObjXX_NoHit (это кстати выдуманное имя чисто для примера, тебе следует заменить его на нужное тебе), то можно утверждать что координаты объекта в таком случае такие, что он коснулся пола (или вошел в него). Последняя команда в моем коде скорректирует Y-координату, так что она будет точной.

 

А координаты объекта записаны в байтах 8 ( x) и $C (Y) структуры объекта. В коде выглядят как 8(a0) и $C(a0).

 

Правда маленькая поправка: это координаты центра объекта, если тебе нужно посчитать именно координату соприкосновения с полом, прибавь к Y-координате, вертикальный радиус (высота/2) объекта (байт $16). Например:

 

	move.w	$C(a0),d0	; d0 = Ypos
add.w	$16(a0),d0	; d0 = Ypos + Height/2
<...>

 

Здесь в D0 посчитается как раз Y-координата соприкосновения с полом. Ну а дальше используй D0 в своем коде, как тебе угодно.

X-координату и считать не надо - она строго равна 8(a0).

 

cmp.w $C(a0),d0 ; has object moved below the level boundary?

 

Нельзя вырывать отдельные команды из контекста. В данном случае комментарий определяет смысл команды в некотором блоке кода. Если вырвать из блока отдельную команду, она теряет свой смысл, ибо более не несет смысловой нагрузки.

 

Ну, вот давай посмотрим с технической стороны, что она делает.

 

CMP (Compare) - это команда сравнения. В данном случае она сравнит значение в регистре D0 со значением адреса памяти $C(a0). Сама по себе команда CMP не имеет большого смысла -- сравнили, так сравнили и ничего с этими значениями не случилось. Смысл появляется только тогда, когда мы выполняем выполняем переход в зависимости от результата работы CMP. Переходы выполняют бранчи, например BEQ (перейти если равно) и BNE (перейти если не равно). Вместе пара команд CMP + Бранч образует условие (condition), а используемый бранч называют условным (conditional branch). Бранч работает (переносит нас на новое место) или не работает (код продолжает выполняться со старого места), и это в зависимости от того, выполняется ли его условие или нет.

 

Твоя команда не имеет смысла по отдельности, потому что:

 

1) Используемый в ней регистр D0 не определен. Что в D0? Что угодно! Зависит от места, где его расположить, какой код выполнялся до этого. В силу этого эту команду нельзя рассматривать как отдельный кусок кода, должна быть команда определяющая D0 или вызов процедуры, которая записывает что-то в D0.

 

2) Нет бранча, так что нельзя сказать, что это за условие. Кстати, комментарии в дизасембле сделаны так, что вопросы в них всегда зависят от условия, т.е. от следующего за командой бранча. Если нет бранча, то и сказать ничего нельзя.

 

Я даже не могу сказать, что должна была делать эта команда. Информации настолько мало, что это может быть что угодно.

Изменено пользователем vladikcomper
  • Лайк 1

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


Ссылка на сообщение

Как-то давно на другом форуме писал по этому вопросу, так что цитирую:

 

 

 

С координатами все просто. Если проверка на взаимодействие с полом удалась (tst.w d1 ; коснулись пола?), т.е. мы не прыгнули на ObjXX_NoHit (это кстати выдуманное имя чисто для примера, тебе следует заменить его на нужное тебе), то можно утверждать что координаты объекта в таком случае такие, что он коснулся пола (или вошел в него). Последняя команда в моем коде скорректирует Y-координату, так что она будет точной.

 

А координаты объекта записаны в байтах 8 ( x) и $C (Y) структуры объекта. В коде выглядят как 8(a0) и $C(a0).

 

Правда маленькая поправка: это координаты центра объекта, если тебе нужно посчитать именно координату соприкосновения с полом, прибавь к Y-координате, вертикальный радиус (высота/2) объекта (байт $16). Например:

 

	move.w	$C(a0),d0	; d0 = Ypos
add.w	$16(a0),d0	; d0 = Ypos + Height/2
<...>

 

Здесь в D0 посчитается как раз Y-координата соприкосновения с полом. Ну а дальше используй D0 в своем коде, как тебе угодно.

X-координату и считать не надо - она строго равна 8(a0).

 

 

 

Нельзя вырывать отдельные команды из контекста. В данном случае комментарий определяет смысл команды в некотором блоке кода. Если вырвать из блока отдельную команду, она теряет свой смысл, ибо более не несет смысловой нагрузки.

 

Ну, вот давай посмотрим с технической стороны, что она делает.

 

CMP (Compare) - это команда сравнения. В данном случае она сравнит значение в регистре D0 со значением адреса памяти $C(a0). Сама по себе команда CMP не имеет большого смысла -- сравнили, так сравнили и ничего с этими значениями не случилось. Смысл появляется только тогда, когда мы выполняем выполняем переход в зависимости от результата работы CMP. Переходы выполняют бранчи, например BEQ (перейти если равно) и BNE (перейти если не равно). Вместе пара команд CMP + Бранч образует условие (condition), а используемый бранч называют условным (conditional branch). Бранч работает (переносит нас на новое место) или не работает (код продолжает выполняться со старого места), и это в зависимости от того, выполняется ли его условие или нет.

 

Твоя команда не имеет смысла по отдельности, потому что:

 

1) Используемый в ней регистр D0 не определен. Что в D0? Что угодно! Зависит от места, где его расположить, какой код выполнялся до этого. В силу этого эту команду нельзя рассматривать как отдельный кусок кода, должна быть команда определяющая D0 или вызов процедуры, которая записывает что-то в D0.

 

2) Нет бранча, так что нельзя сказать, что это за условие. Кстати, комментарии в дизасембле сделаны так, что вопросы в них всегда зависят от условия, т.е. от следующего за командой бранча. Если нет бранча, то и сказать ничего нельзя.

 

Я даже не могу сказать, что должна была делать эта команда. Информации настолько мало, что это может быть что угодно.

 

Спасибо огромное. Каждое ваше сообщение в этой теме для меня очень ценно. Вот еще один вопрос. Хочу добавить букву "W" в "Sonic Has PASSED", иначе говоря, новые тайлы в ttlcards. Добавляю тайлы в самый конец, чтобы не нарушить маппинг других надписей, леплю SHADOW HAS и вставляю все Map_obj3A. Компилирую, дохожу до завершения уровня и появляется моя измененная надпись, но вместе с ней какието искажения в верхней части экрана (извиняюсь, за отсутствие скрина). Причиной оказались добавленные тайлы, т.к. без них все отлично. Можно ли это как-нибудь исправить, а кто перевернутая буква "М" выглядит не очень хорошо. Поймите меня правильно, я начал занимать ромхакингом совсем недавно и хочется все изучить.

Изменено пользователем Trollface

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


Ссылка на сообщение
Че тут не правильно

 

Как уже заметил Влад, CMP - команда сравнения. Ты сравниваешь значение акта по адресу $FFFFFE11, всего и того, без бранча сравнение теряет свой смысл.

 

 

Level_GetBgm:
cmpi.b #$0,($FFFFFE11).w ; is this act 1?
bne.s Level_GetBgm2act ; if not, branch
tst.w (Demo_mode_flag).w
bmi.s loc_4114
moveq #0,d0
move.b (Current_Zone).w,d0
lea MusicList(pc),a1
tst.w (Two_player_mode).w
beq.s Level_PlayBgm
lea MusicList2(pc),a1
bra.s Level_PlayBgm
; loc_40C8:
Level_GetBgm2act
tst.w (Demo_mode_flag).w
bmi.s loc_4114
moveq #0,d0
move.b (Current_Zone).w,d0
lea MusicList2act(pc),a1
tst.w (Two_player_mode).w
beq.s Level_PlayBgm
lea MusicList2(pc),a1

 

Нельзя вырывать отдельные команды из контекста. В данном случае комментарий определяет смысл команды в некотором блоке кода. Если вырвать из блока отдельную команду, она теряет свой смысл, ибо более не несет смысловой нагрузки.

 

Правильно ведь говорят: легче написать свой код, чем разобраться в чужом :)

Изменено пользователем Teffycom

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


Ссылка на сообщение

Спасибо огромное. Каждое ваше сообщение в этой теме для меня очень ценно. Вот еще один вопрос. Хочу добавить букву "W" в "Sonic Has PASSED", иначе говоря, новые тайлы в ttlcards. Добавляю тайлы в самый конец, чтобы не нарушить маппинг других надписей, леплю SHADOW HAS и вставляю все Map_obj3A. Компилирую, дохожу до завершения уровня и появляется моя измененная надпись, но вместе с ней какието искажения в верхней части экрана (извиняюсь, за отсутствие скрина). Причиной оказались добавленные тайлы, т.к. без них все отлично. Можно ли это как-нибудь исправить, а кто перевернутая буква "М" выглядит не очень хорошо. Поймите меня правильно, я начал занимать ромхакингом совсем недавно и хочется все изучить.

 

Если я правильно понимаю суть проблемы, должно быть ты добавил новый тайлы в арт Title Cards? Т.е. в файл artnem\ttlcards.bin. В таком случае причина "искажений" на экране -- повреждение маппингов (тайловой таблицы) плана А.

 

 

 

Корни проблемы уходят в большие "дебри" -- устройство VRAM, специфику VDP и формат плановых маппингов. Не хотелось бы загружать новичка кучей технической информации, так что постараюсь быть предельно простым и кратким (хотя это у меня плохо получается =Р)

 

Есть VRAM, или видео память. В ней хранятся все тайлы, которые будут выведены на экран видео процессором (VDP). Помимо простых тайлов отдельные части VRAM используются для формирования слоев (план А, план Б и спрайты), у которых свой формат. Этот формат я называю "плановыми маппингами" для Планов А и Б, и "спрайтовыми маппингами" для спрайтов. Маппинги слоев говорят, какими тайлами эти слои заполнять. На основе маппингов выстраивает "картинку" из тайлов для каждого слоя, потом комбинирует все слои с учетом смещения и получается финальное изображение.

 

На основе содержимого VRAM и строится видеокадр. Кадр строится из трех слоев. Каждый слой состоит из "мозайки" тайлов, а маппинги говорят какие тайлы в эту "мозайке" расположить.

 

Эту скучную теорию я рассказывал чтобы подвести к сути проблеммы (к сожалению без теории тут никак). Вот снимок части VRAM, он сделан в момент, когда отображаются результаты уровня, в него как раз попали эти самые тайлы и то, что после них (эти тайлы кстати подгружаются только когда нужно отобразить результаты уровня, при обычной игре там арт животных и взрывов):

 

VRAM_TtlCards.png

 

Тайлы выделены зеленым. Что выделено красным после них? Это маппинги плана А, из которых строится картинка переднего плана. Ты добавил еще несколько тайлов -- и что произойдет? "Зеленая" рамка зайдет за "красную", новые тайлы будут помещены туда, где им не место. Будет конфликт данных.

 

Когда тайлы заезжают на плановые маппинги, нарушается "мозаика" из тайлов на плане, и часть слоя окажется заполненной случайными тайлами.

 

В других случаях был просто конфликт арта, но вот арт Тайтл Кардс граничит с такими данными... Ситуация тут сложная.

 

Манипулировать загрузкой тайлов сложно, из-за того что их подгрузка в игре заточена под определенные места. Хотя могу предложить один трюк, надеюсь он не вызовет проблем с артом.

 

* * *

 

Найди лейбел "loc_C5CA:", ниже по коду ты увидешь команду:

 

move.w #$8580,2(a1)

 

Замени $8580 на $8400.

 

В коде "SignpostArtLoad:" замени:

 

 moveq #$12,d0
 bra.w LoadPLC2 ; load signpost patterns

 

на

 

 jsr ClearPLC
 lea ($FFFFF680).w,a2
 move.l #Nem_TitleCard,(a2)+
 move.w #$8000,(a2)+
 rts

 

Решение довольно "хакерское", но другое в голову не пришло =\

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


Ссылка на сообщение

Как вы думаете, в эту тему можно выкладывать проги?

Я перевожу одну, вот мне и интересно.

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


Ссылка на сообщение
Как вы думаете, в эту тему можно выкладывать проги?

 

Ответ напрашивается сам собой. Это "помощь по ромхакингу", а не "тема по выкладыванию прог".

 

Я перевожу одну.

 

Довольно бесполезное занятие. Зачем ухудшать и без того гиблое положение английского языка в наших кругах?

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


Ссылка на сообщение

Как вы думаете, в эту тему можно выкладывать проги?

Я думаю если свои проги, то выкладывать можно здесь, т.к. это твоя прога, и её пока негде скачать.

Перевод тоже можно выложить, т.к. может кому-нибудь помочь.

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


Ссылка на сообщение

Я думаю если свои проги, то выкладывать можно здесь, т.к. это твоя прога, и её пока негде скачать.

Перевод тоже можно выложить, т.к. может кому-нибудь помочь.

Если эта прога SonMapEd?

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


Ссылка на сообщение
Если эта прога SonMapEd?

 

То боюсь представить, каким будет перевод.

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


Ссылка на сообщение

То боюсь представить, каким будет перевод.

С английским у меня всё норм...

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


Ссылка на сообщение

А зачем переводить? Если ромхакер умелый, и у него есть стремление, то он сам переведет. А так, разведется лентяев хакеров (как я :) ), хотя может я неправ?

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


Ссылка на сообщение
то он сам переведет

 

Зачем переводить то, что интуитивно понятно?

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


Ссылка на сообщение

Да ладно вам! Оставлю прогу себе (хотя я против английской версии ничего не имею и активно ей пользуюсь, русской версии мне и самому не надо) =) . А переводить - чисто для себя!

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


Ссылка на сообщение

Зачем переводить то, что интуитивно понятно?

Ну знаешь, я сначала вообще в ней ничего не понимал. Сейчас более менее разбираюсь в ней

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


Ссылка на сообщение

Всем привет.Напомните кто нибудь параметры конвертации wav'ки для звука SEGA.

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


Ссылка на сообщение

Нужна помощь: цикличное движение экрана (как в S3&K).

Я конечно знаю что это оч сложно.

Или хоть подскажите строку, отвечающую за движение камеры.

Изменено пользователем Suler

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


Ссылка на сообщение

Как поставить условие: Монитор на расстоянии 10 от Соника ?

		   move.w ($FFFFD008).w,d0 ; записываем Х позицию в d0
 sub.w 8(a0),d0; вычитаем x позицию монитора
 bpl.s	  Obj26_NrSonic
 neg.w d0
Obj26_NrSonic:
 cmpi.w #$A,d0  ;количество пикселей
 bcc.s locret_932A ; если меньше, переходим
		   ; твой код, если ближе чем на 10.
locret_932A:	rts

Думаю разберешься куда тыкать. Obj26 - монитор. Но учти, что это проверка на X позицию. Если тебе надо вокруг, то нужно проверять ещё и Y позицию. Если не ошибаюсь адрес $FFFFD012.

Изменено пользователем KameKAgZZe
  • Лайк 1

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


Ссылка на сообщение

		   move.w ($FFFFD008).w,d0 ; записываем Х позицию в d0
 sub.w 8(a0),d0; вычитаем x позицию монитора
 bpl.s	  Obj26_NrSonic
 neg.w d0
Obj26_NrSonic:
 cmpi.w #$A,d0  ;количество пикселей
 bcc.s locret_932A ; если меньше, переходим
		   ; твой код, если ближе чем на 10.
locret_932A:	rts

Думаю разберешься куда тыкать. Obj26 - монитор. Но учти, что это проверка на X позицию. Если тебе надо вокруг, то нужно проверять ещё и Y позицию. Если не ошибаюсь адрес $FFFFD012.

 

Спасибо. Как раз по Y мне не нужно.

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


Ссылка на сообщение

Подскажите плиз люди умные как в СМПС добавить этот замечательный эффект.

В первой песне. Я его не раз в буме замечал.

Изменено пользователем Ivan YO

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


Ссылка на сообщение

Подскажите плиз люди умные как в СМПС добавить этот замечательный эффект.

В первой песне. Я его не раз в буме замечал.

Ты про модуляцию? Если да то она в xm делается, а конвертируется как обычная мелодия( я могу ошибаться, если ошибусь, надеюсь меня S_T_D поправит).

Вот скриншот модуляции post-10548-0-54883800-1337150301_thumb.png

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


Ссылка на сообщение

Как в Соник 2 уровни изменять в СонЕД 2? Он не берёт мой хак с изм. исх. кодом.

Как быть? (Существует предположение что можно хакнуть уровень оригинального рома, и вставить в папку с изменённым дисас-мом).

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


Ссылка на сообщение

Файлы проектов нужно настроить.

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


Ссылка на сообщение

Спсбс. Заменил .. на длинный путь и готово! Теперь на конец смогу захакать Соник 2 до конца.

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


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

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

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

×