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

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

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

Как сделать переход на экран "Sonic Team Presents"?

move.b #4,($FFFFF600).w

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


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

Привет всем.Кто нибудь знает,почему в моём хаке со звёздочками неуязвимости случилось такое:

post-10002-1300681248_thumb.png

Я только знаю,что этот баг появился после удаления погрузки арта всех фликов из Pattern load cues.asm

И ещё почему-то у меня появился такой вот баг:

post-10002-1300681500_thumb.png

И после добавления бестура появился вот такой вот баг с поинтом вылетающим из бадника: *На кусочек буквы не обращайте внимания.Это флик без подгруженного арта*

post-10002-1300681946_thumb.png

Помогите исправить эти баги.

После применения гида по увеличению количества слотов для музыки (перевод от Alexey383 кажется),после воспроизведения мелодии жизни не продолжала играть мелодия уровня,на котором играешь.Гид применял к S1HS2.Я уже заменял это:

CODE

cmpi.b #$8F,d7 ; is "extra life" music played?

bne.s loc_72024; if not, branch

 

на это:

CODE

cmpi.b #$1F,d7 ; is "extra life" music played?

bne.s loc_72024; if not, branch

 

и это:

CODE

loc_7202C:

jsr sub_725CA(pc)

movea.l (off_719A0).l,a4

subi.b #$81,d7

move.b (a4,d7.w),$29(a6)

movea.l (Go_MusicIndex).l,a4

cmpi.b #$01,($FFFFFFFD).w

bne.s CheckSounds00to80

movea.l (Go_MusicIndexFF).l,a4

jmp NormalIndexLoad

 

на это:

CODE

loc_7202C:

jsr sub_725CA(pc)

movea.l (off_719A0).l,a4

subi.b #$01,d7

move.b (a4,d7.w),$29(a6)

movea.l (Go_MusicIndex).l,a4

cmpi.b #$01,($FFFFFFFD).w

bne.s CheckSounds00to80

movea.l (Go_MusicIndexFF).l,a4

jmp NormalIndexLoad

 

Ничего мне не помогло.Пожалуйста помогите решить проблему.

 

UPD:

Про поинты можете уже не писать.

UPD:

С щитом такая же фигня как и со звёздочками неуязвимости.

Изменено пользователем TailsX-Doll

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


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

TailsX-Doll, очевидно это произошло из-за неверной подгрузки арта в файле Pattern Load Cues, замени его на оригинальный и все будет путем. А графический глюк от добавления бустера скорее всего из-за того, что он использует адрес VRAM графики поинта, вылетающего из бадника. С музыкой тоже все просто: забей по дизассемблу поиск "extra life" и смотри на номер слота в проверках - если он неправильный, поменяй.

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


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

Спасибо,Dexspot.Твоим методом я исправил только щит и звёздочки неуязвимости.Поинты я удалил.А второй баг с Got Through *или как он там* не исправляется...

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

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


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

Как сделать чтобы соник не задыхался в воде?

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


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

А ты смотрел гид по активации монитора goggles.В коде должна быть строка активации бесконечного кислорода.

------

Как сделать вот такое:

--

У соника 0 колец?

Если да,убить его.

--

Я делаю такую проверку:

cmpi.w #0,($FFFFFE20).w

bcs.w KillSonic

Но Соника не убивает...

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


Ссылка на сообщение
Как сделать чтобы соник не задыхался в воде?

Найди суброутину Countdown

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


Ссылка на сообщение
Я только знаю,что этот баг появился после удаления погрузки арта всех фликов из Pattern load cues.asm

Каким образом ты удалял их данные из Pattern load cues.asm? Если удалять целые блоки с лейбелами или убирать их из списка, вполне может получиться такая вот путаница с артами в игре. К сожалению, нельзя прописать в блоке, что ничего загружать не надо, так как даже 0 в начале блока говорит, что нужно выполнить одну команду и т. д.

Самый лучший способ избавиться от арта животных, удалить в коде место, где игра загружает их арт. Арт животных загружает Title Cards в процедуре Obj34_ChangeArt, закоментируй нужные строчки, и их арт больше не загрузится.

 

Как сделать чтобы соник не задыхался в воде?

Найти нужный код просто. Из справочника по RAM адресам узнаешь, какой адрес у счетчика кислорода:

$FE14 	Оставшийся воздух (работает под водой)

Где-то этот счетчик должен уменьшаться, то где-то должна быть команда subq.w #1,($FFFFFE14).w. Ищещь в коде эту команду и натыкаешься на:

Obj0A_ReduceAir:
	subq.w	#1,($FFFFFE14).w; subtract 1 from air remaining
	bcc.w	Obj0A_GoMakeItem; if air is above 0, branch

Нужный код найден! Что делать дальше, думаю, ты разберешься =Р

 

У соника 0 колец?

Если да,убить его.

--

Я делаю такую проверку:

cmpi.w #0,($FFFFFE20).w

bcs.w KillSonic

Но Соника не убивает...

 

У тебя бранч не тот. Бранчи bcc/bcs очень коварны, многие в них путаются, используют неправильно, из-за их туманных для новичков определений:

BCS - Branch if Carry Set

BCC - Branch if Carry Clear

 

Объяснять их значения очень долго, и чтобы их понять, нужно иметь представление о Condition Code Register и о том, что CMP - это на самом деле неявное вычитание, для сравнения чисел, первое вычитается из второго, однако результат операции в отличие от SUB никуда не записывается, только лишь затрагивает CCR (Condition Code Register). По битам CCR бранчи могут определить, какое число меньше, какое больше и пр. Какой все же АСМ гениальный :)

 

Пока тебе лучше запомнить вот так:

		cmpi.w	#$XX,($FFFFFE20).w 
	bcc	Location	; Кол-во колец больше или равно $XX
	bcs	Location	; Кол-во колец меньше $XX

 

Как видишь, ты пытался бранчить, если у Соника колец меньше, чем 0. Этого никогда не будет, поэтому бранч не работал.

Лучше просто использовать beq.

 

		cmpi.w	#0,($FFFFFE20).w 
	beq	Location	; Если кол-во колец равно 0, переход

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


Ссылка на сообщение
У тебя бранч не тот. Бранчи bcc/bcs очень коварны, многие в них путаются, используют неправильно, из-за их туманных для новичков определений:

BCS - Branch if Carry Set

BCC - Branch if Carry Clear

 

Объяснять их значения очень долго, и чтобы их понять, нужно иметь представление о Condition Code Register и о том, что CMP - это на самом деле неявное вычитание, для сравнения чисел, первое вычитается из второго, однако результат операции в отличие от SUB никуда не записывается, только лишь затрагивает CCR (Condition Code Register). По битам CCR бранчи могут определить, какое число меньше, какое больше и пр. Какой все же АСМ гениальный :)

 

Пока тебе лучше запомнить вот так:

		cmpi.w	#$XX,($FFFFFE20).w 
	bcc	Location; Кол-во колец больше или равно $XX
	bcs	Location; Кол-во колец меньше $XX

 

Как видишь, ты пытался бранчить, если у Соника колец меньше, чем 0. Этого никогда не будет, поэтому бранч не работал.

Лучше просто использовать beq.

 

		cmpi.w	#0,($FFFFFE20).w 
	beq	Location; Если кол-во колец равно 0, переход

Спасибо!

 

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

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


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

 

Даже не знаю, чем тебе помочь. Я никогда не занимался хакингом SMPS (и музыкальным хакингом вообще), так что не вникал в него и не изучал его исходники. Могу только посоветовать откопать на ретро оригинал гида (если ты пользовался переводом), может, в переводе была неточность или что-то пропущено, или в гиде была описка, которая могла бы быть давно исправлена.

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


Ссылка на сообщение
Найти нужный код просто. Из справочника по RAM адресам узнаешь, какой адрес у счетчика кислорода:

$FE14 	Оставшийся воздух (работает под водой)

Где-то этот счетчик должен уменьшаться, то где-то должна быть команда subq.w #1,($FFFFFE14).w. Ищещь в коде эту команду и натыкаешься на:

Obj0A_ReduceAir:
	subq.w	#1,($FFFFFE14).w; subtract 1 from air remaining
	bcc.w	Obj0A_GoMakeItem; if air is above 0, branch

Нужный код найден! Что делать дальше, думаю, ты разберешься =Р

Спасибо! Оказалось всё настолько легко, как я сам не додумался до этого..

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


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

 

Посмотри в гиде номер слота мелодии жизни. Забей команду воспроизведения музыки в поиск по дизассемблу.

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


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

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

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


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

Высота прыжка задается в Sonic_JumpHeight. Тебе нужно просто изменить значение.

 

 

Sonic_JumpHeight:	; XREF: Obj01_MdJump; Obj01_MdJump2
	tst.b	$3C(a0)
	beq.s	loc_134C4
	move.w	#-$400,d1
	btst	#6,$22(a0); Соник под водой?
	beq.s	loc_134AE; Если нет, переходим
	move.w	#-$200,d1; Задаем высоту прыжка под водой

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

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


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

Спасибо.Решение такое лёгкое оказывается.Чёто тупить я начал...

UPD:

Стоп!Чёто не работает твой метод.

Изменено пользователем TailsX-Doll

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


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

Значит накосячил в другом месте...

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


Ссылка на сообщение
У меня в хаке Соник под водой стал прыгать очень низко.Хак разрабатываю на S1HS2.Суброутины Sonic_Jump и другие связанные с прыжком я не трогал...

он вроде бы ниже прыгает под водой, нэ?

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


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

Ну так и есть.А у него он ОЧЕНЬ низко прыгает.Пикселей на 20 я так полагаю?)

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


Ссылка на сообщение
Ну так и есть.А у него он ОЧЕНЬ низко прыгает.Пикселей на 20 я так полагаю?)

Нет, под водой Соник прыгает так же высоко, как и на земле. Мне как раз довелось в этом недавно убедиться.

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

 

TailsX-Doll, расскажи подробнее, когда это случилось, после каких действий. Как выглядит этот низкий прыжок? Его высота фиксирована или зависит от того, как долго держать кнопку прыжка? Нормально ли Соник ведет себя под водой (кроме низкого прыжка)?

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


Ссылка на сообщение
Нет, под водой Соник прыгает так же высоко, как и на земле. Мне как раз довелось в этом недавно убедиться.

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

 

TailsX-Doll, расскажи подробнее, когда это случилось, после каких действий. Как выглядит этот низкий прыжок? Его высота фиксирована или зависит от того, как долго держать кнопку прыжка? Нормально ли Соник ведет себя под водой (кроме низкого прыжка)?

После каких действий я не помню,потому что после всех проделанных действий я в лабиринт в своём хаке не играл.Высота прыжка фиксирована.Хоть зажимай кнопку,хоть не зажимай,высота прыжка будет такая же низкая.Низкий прыжок выглядит так:Как только высота прыжка достигает примерно 200-250 пикселей,Соник резко начинает терять скорость взлёта от прыжка и падает...Как то так...Ну так то да,нормально Соник под водой себя ведёт...

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


Ссылка на сообщение
После каких действий я не помню,потому что после всех проделанных действий я в лабиринт в своём хаке не играл.Высота прыжка фиксирована.Хоть зажимай кнопку,хоть не зажимай,высота прыжка будет такая же низкая.Низкий прыжок выглядит так:Как только высота прыжка достигает примерно 200-250 пикселей,Соник резко начинает терять скорость взлёта от прыжка и падает...Как то так...Ну так то да,нормально Соник под водой себя ведёт...

 

Теперь суть проблемы проясняется. Если высота фиксирована, значит Sonic_JumpHeight по каким-то причинам не видит, что кнопка прыжка удерживается, считает что она отпущена. Если кнопка отпущена, а Соник только начинает свой прыжок, скорость прыжка, а значит и его высота, урезаются.

 

		theld	A+B+C,(SonicControl); is A,	B or C pressed?
	bne.s	locret_134C2	; if yes, branch
	move.w	d1,$12(a0)

 

Последняя строчка урезает вертикальную скорость до -$400 на земле и -$200 под водой. Судя по всему, код с первого же вызова считает, что кнопка отпущена, и урезает скорость.

 

Скорее всего, это получается из-за того, что ты переписал или случайно очистил битовое поле SonicControl|Held (оно ссылается на адрес $FFFFF602).

Например, если у тебя в коде есть команды, наподобие:

 

	andi.b	#<что-то>,(SonicControl|Held)
andi.b	#<что-то>,(SonicControl); эквивалентно предыдущей
andi.b	#<что-то>,($FFFFF602).w	; эквивалентно предыдущей

move.w	#<что-то>,(SonicControl)

 

то у тебя очищается/переписывается битовое поле с удерживаемими кнопками, что приводит к таким багам.

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


Ссылка на сообщение
Например, если у тебя в коде есть команды...

В коде Sonic_JumpHeight?Или вообще во всём sonic1.asm?

Изменено пользователем TailsX-Doll

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


Ссылка на сообщение
В коде Sonic_JumpHeight?Или вообще во всём sonic1.asm?

Да в любом месте. Если ты писал новые процедуры, проверял в них нажатия кнопок, посмотри их, вдруг в них ошибка.

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


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

Увидел я у себя это:

		move.b	($FFFFF602).w,d0; get jpad
	and.b	$2D(a0),d0; compare jpad to stored L,R button states

и ещё это:

		move.b	($FFFFF602).w,d0; get jpad
	andi.b	#(%00000100|%00001000),d0; keep just L and R state

и всё,больше ничего нет..

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


Ссылка на сообщение
Увидел я у себя это:

		move.b	($FFFFF602).w,d0; get jpad
	and.b	$2D(a0),d0; compare jpad to stored L,R button states

и ещё это:

		move.b	($FFFFF602).w,d0; get jpad
	andi.b	#(%00000100|%00001000),d0; keep just L and R state

и всё,больше ничего нет..

Здесь все впорядке, так как нажатия кнопок загружаются в регистр d0 и код уже оперирует им. Если конечно после этого нет команды типа move.b d0,($FFFFF602), но это вряд ли.

Попробуй еще проверить адрес $FFFFF604, из него копируются кнопки в $FFFFF602, если управление игроком не заблокировано.

Если и с ними все в порядке, то проблема в другом (тогда будет странно, что прыжок фиксированый). Еще одна моя догадка - не работает понижение "гравитации" под водой:

 

		btst	#6,$22(a0); is Sonic underwater?
	beq.s	loc_12EA6; if no, branch
	subi.w	#$28,$12(a0)

 

Это в Obj01_MdJump и Obj01_MdJump2.

 

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

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


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

Видео я запишу.Только придётся очень долго подождать...

Тьфу блин.Высота прыжка не фиксирована.Если нажать и сразу же опустить кнопку прыжка,Соник ещё ниже прыгнет...Я просто по привычке опять кнопку прыжка зажимал... =)

Изменено пользователем TailsX-Doll

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


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

Как сделать проверку: коснулся ли объект другого объекта? Надо проверять их координаты? Или есть другой способ проверки касания объектов?

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


Ссылка на сообщение
Как сделать проверку: коснулся ли объект другого объекта? Надо проверять их координаты? Или есть другой способ проверки касания объектов?

Готовой роутины для этого в игре не предусмотрено, ее придется писать вручную. Если не знаешь, как составлять алгоритм, его можно посмотреть в суброутине TouchResponse (проверка столкновения Соника с объектом).

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


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

Походу я видюху с багом несмогу сделать.У меня жестоко глючит ютуб...

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

×