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

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

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

Я собрался добавить героя по гиду на ретро, но я не могу найти строчку

lea	(Art_Sonic).l,a1

Что делать??Я зря спрайты сделал что ли?

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


Ссылка на сообщение
Я собрался добавить героя по гиду на ретро, но я не могу найти строчку

lea	(Art_Sonic).l,a1

Что делать??Я зря спрайты сделал что ли?

Была такая проблеммка недавно, вот ее решение: http://forum.sonic-world.ru/index.php?s=&a...amp;p=252418302

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


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

vladikcomper, спасибо, все работает!

 

SONIC2010, если нужна помощь по добавлению героев, можешь обращаться ко мне.

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


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

Влад спасибо!

Кул спасибо за помощь если чё то напишу.

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


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

Всегда пожалуйста =)

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


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

Осталась последняя проблема с Майти - глючит спиндеш. В спрайте, который мне дали, нет графики спиндеша, я попробовал вставить ее самостоятельно, добавил арт в пустые места в графике, сделал правильные маппинги во фреймах, в которых маппинги спиндеша у Соника, сохранил маппинги, проверяю, все равно эта фигня...

d94b0883d006t.jpg

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

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


Ссылка на сообщение
Осталась последняя проблема с Майти - глючит спиндеш. В спрайте, который мне дали, нет графики спиндеша, я попробовал вставить ее самостоятельно, добавил арт в пустые места в графике, сделал правильные маппинги во фреймах, в которых маппинги спиндеша у Соника, сохранил маппинги, проверяю, все равно эта фигня...

d94b0883d006t.jpg

Очевидно, тайлы подгружаются левые, т.е. отсутствующие. Думаю, у твоего Майти DPLC от Соника. Впрочем, в этом нет ничего страшного.

Правда, я не совсем понял, как ты тайлы Спин Дэша добавлял. Их можно спокойно добавить в конец файла с тайлами, увеличив его размер, а маппинги оставить оригинальные (если маппинги Майти и Соника совпадают).

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


Ссылка на сообщение
Правда, я не совсем понял, как ты тайлы Спин Дэша добавлял

Я просто открыл файл в тайловом редакторе, нашел пустые места и вставил туда графику спиндеша.

Так значит дело все в DPLC? Сейчас попробую что-нибудь сделать.

 

Урря! Получилось! Теперь у меня в хаке полноценный Майти со своими способностями!

 

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

 

Obj27_LoadAnimal:		; XREF: Obj27_Index
	addq.b	#2,$24(a0)
	bsr.w	SingleObjLoad
	bne.s	Obj27_Main
	jsr	SingleObjLoad		   ; тут начинается загрузка колец
	move.b	#$37,0(a1); load bouncing	multi rings object
	move.w	8(a0),8(a1)
	move.w	$C(a0),$C(a1)

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


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

И ещё кольца отнимаются,когда бадника ударяешь...

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


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

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

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


Ссылка на сообщение
Как я понял, тут нужно править Obj37, однако как сделать проверку на то, вылетают ли колечки из бадника?

Так вполне можно сделать, но понадобятся дополнительные затраты, и это не самый хороший способ. Юджи Нака бы сделал по-другому...

 

Для начала, изучим что делает этот Obj37. Вот его роутины:

dc.w Obj37_CountRings-Obj37_Index; #0 - обнуление счетчика колец, создания выпадающих колец
dc.w Obj37_Bounce-Obj37_Index	; #2 - физика единичного кольца: падение, подпрыгивание...
dc.w Obj37_Collect-Obj37_Index	; #4 - кольцо собрано
dc.w Obj37_Sparkle-Obj37_Index	; #6 - эффект после сбора кольца
dc.w Obj37_Delete-Obj37_Index	; #8 - удаление объекта

 

Здесь важно отметить такой момент, который встречается довольно часто в сложных объектах: каждое кольцо - отдельный экземпляр объекта $37. Вначале создается одна копия объекта, и при выполнении кода для нее запускается первая же роутина - Obj37_CountRings, она в свою очередь создает множество копий объекта, задает им, в какую сторону лететь и т.д. И разумеется, для копий объектов счетчик роутины (байт $24) увеличивается, чтобы выполнилась вторая роутина, Obj37_Bounce.

 

Очевидно, код Obj37_CountRings в нашем случае совсем ни к месту, надо бы сделать так, чтобы он не выполнялся. Легко!

 

		jsr	SingleObjLoad
	move.b #$37,0(a1)	 ; load bouncing  multi rings object
	move.w 8(a0),8(a1)
	move.w $C(a0),$C(a1)
	move.b #2,$24(a1)	 ;++ set routine to #2 (Obj37_Bounce)

 

Но возникает другая проблема - создаваемое колечко не настроено, не задается направление, куда лететь, не задаются маппинги, габариты и пр. Не беда, можно просто позаимствовать из Obj37_CountRings, где настраиваются колечки, то, что нам надо:

 

		jsr	SingleObjLoad
	move.b #$37,0(a1)	 ; load bouncing  multi rings object
	move.w 8(a0),8(a1)
	move.w $C(a0),$C(a1)
	move.b #2,$24(a1)	 ;++ set routine to #2 (Obj37_Bounce)
	move.b #8,$16(a1)	 ;++ height/2
	move.b #8,$17(a1)	 ;++ width/2
	move.l #Map_obj25,4(a1);++ mappings offset
	move.w #$27B2,2(a1);++ art ptr
	move.b #4,1(a1)	;++ render flags
	move.b #3,$18(a1)	 ;++ priority
	move.b #$47,$20(a1);++ touch response
	move.b #8,$19(a1)	 ;++ visible part
	move.b #-1,($FFFFFEC6).w;++ something to do with synchro ani
	move.w #0,$10(a1)	 ;+++++ X-vel
	move.w #-$300,$12(a1) ;+++++ Y-vel

 

Колечко теперь настроено и должно вести себя подобающим образом, мало того, теперь можно с легкостью задавать его скорости и все это без лишних проверок и участия ненужного кода =)

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

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


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

 

Для начала, изучим что делает этот Obj37. Вот его роутины:

dc.w Obj37_CountRings-Obj37_Index; #0 - обнуление счетчика колец, создания выпадающих колец
dc.w Obj37_Bounce-Obj37_Index; #2 - физика единичного кольца: падение, подпрыгивание...
dc.w Obj37_Collect-Obj37_Index; #4 - кольцо собрано
dc.w Obj37_Sparkle-Obj37_Index; #6 - эффект после сбора кольца
dc.w Obj37_Delete-Obj37_Index; #8 - удаление объекта

 

Здесь важно отметить такой момент, который встречается довольно часто в сложных объектах: каждое кольцо - отдельный экземпляр объекта $37. Вначале создается одна копия объекта, и при выполнении кода для нее запускается первая же роутина - Obj37_CountRings, она в свою очередь создает множество копий объекта, задает им, в какую сторону лететь и т.д. И разумеется, для копий объектов счетчик роутины (байт $24) увеличивается, чтобы выполнилась вторая роутина, Obj37_Bounce.

 

Очевидно, код Obj37_CountRings в нашем случае совсем ни к месту, надо бы сделать так, чтобы он не выполнялся. Легко!

 

		jsr	SingleObjLoad
	move.b #$37,0(a1)	; load bouncing  multi rings object
	move.w 8(a0),8(a1)
	move.w $C(a0),$C(a1)
	move.b #2,$24(a1)	;++ set routine to #2 (Obj37_Bounce)

 

Но возникает другая проблема - создаваемое колечко не настроено, не задается направление, куда лететь, не задаются маппинги, габариты и пр. Не беда, можно просто позаимствовать из Obj37_CountRings, где настраиваются колечки, то, что нам надо:

 

		jsr	SingleObjLoad
	move.b #$37,0(a1)	; load bouncing  multi rings object
	move.w 8(a0),8(a1)
	move.w $C(a0),$C(a1)
	move.w #2,$24(a1)	;++ set routine to #2 (Obj37_Bounce)
	move.b #8,$16(a1)	;++ height/2
	move.b #8,$17(a1)	;++ width/2
	move.l #Map_obj25,4(a1);++ mappings offset
	move.w #$27B2,2(a1);++ art ptr
	move.b #4,1(a1);++ render flags
	move.b #3,$18(a1)	;++ priority
	move.b #$47,$20(a1);++ touch response
	move.b #8,$19(a1)	;++ visible part
	move.b #-1,($FFFFFEC6).w;++ something to do with synchro ani
	move.w #0,$10(a1)	;+++++ X-vel
	move.w #-$300,$12(a1);+++++ Y-vel

 

Колечко теперь настроено и должно вести себя подобающим образом, мало того, теперь можно с легкостью задавать его скорости и все это без лишних проверок и участия ненужного кода =)

Спасибо тебе огромное!!!А если мне надо сделать так,чтобы из объекта вылетало 10 колец,что надо в этом случае сделать?

UPD:

Стоп!Чёто теперь у меня из бадника вообще ничего не вылетает...

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

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


Ссылка на сообщение
Стоп!Чёто теперь у меня из бадника вообще ничего не вылетает...

 

Я допустил опечатку, во втором примере написано:

		move.w #2,$24(a1)   ;++ set routine to #2 (Obj37_Bounce)

А должно быть

		move.b #2,$24(a1)   ;++ set routine to #2 (Obj37_Bounce)

 

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

 

UPD: Опечатка в примере уже исправлена.

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


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

Спасибо, все работает! Решение оказалось очень простым, видимо я вчера опять тупил (как это часто со мной происходит).

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


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

Почему у меня в xm3smps в прослушивании мелодия играет,а в игре она не играет?Кто нибудь знает решение этой проблемы?

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


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

Как сделать полноценный пропуск Ending Sequence, чтобы сразу после Final перемещался в Credits?

 

Вот это не работает:

 

EndingSequence:			; XREF: GameModeArray
	move.b	#$1C,($FFFFF600).w; go	to credits
	move.b	#$9D,d0
	bsr.w	PlaySound_Special; play credits music
	move.w	#0,($FFFFFFF4).w; set credits index number to 0
	rts

 

Точнее работает, однако показывается только первый кадр кредитсов и автоматически перемещается на сегаскрин.

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


Ссылка на сообщение
Как сделать полноценный пропуск Ending Sequence, чтобы сразу после Final перемещался в Credits?

 

Вот это не работает:

 

EndingSequence:		; XREF: GameModeArray
	move.b	#$1C,($FFFFF600).w; go	to credits
	move.b	#$9D,d0
	bsr.w	PlaySound_Special; play credits music
	move.w	#0,($FFFFFFF4).w; set credits index number to 0
	rts

 

Точнее работает, однако показывается только первый кадр кредитсов и автоматически перемещается на сегаскрин.

Все сделано верно. Я даже проверил этот код на чистом дизасембле S1HS2 - все работает.

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

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


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

Да, видимо это я где-то напортачил.

 

До нового публичного релиза Sonic Night Trouble меня отделяет всего лишь одна проблема.

 

Как можно убрать убегающего и садящегося в эггмобиль Эггмана после победы над ним в FZ? Я где-то там химичил, и пришел к такому выводу, что код там очень сложен и практически некомментирован, и от бегущего Эггмана зависит ресайзинг уровня после победы над боссом. Так что можно даже рассмотреть такой вариант: сделать так, чтобы графика Эггмана и Эггмобиля попросту не загружалась.

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


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

Предлагаю свою помощь, которая заключается в добавлении дополнительных кадров.Например ожидание из Sonic 2 или три, или какие нибудь идеи. С вас изображения с кадрами в личку и какие-нибудь ресурсы за оплату труда 0_o

Обращайтесь.

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


Ссылка на сообщение
Да, видимо это я где-то напортачил.

 

До нового публичного релиза Sonic Night Trouble меня отделяет всего лишь одна проблема.

 

Как можно убрать убегающего и садящегося в эггмобиль Эггмана после победы над ним в FZ? Я где-то там химичил, и пришел к такому выводу, что код там очень сложен и практически некомментирован, и от бегущего Эггмана зависит ресайзинг уровня после победы над боссом. Так что можно даже рассмотреть такой вариант: сделать так, чтобы графика Эггмана и Эггмобиля попросту не загружалась.

Да, объект 85 очень сложен и нестандартен. Кстати, графика их в любом случае загружена, так что очищать ее неразумно. Может, ты имел ввиду не отображать спрайты?

Мне было нечего делать, так что я решил разобрать и откомментировать нужную часть кода Obj85 ^_^ Обожаю читать и разбирать хороший код, ведь так можно многому научиться, особенно если речь про объекты и использование ими движка игры.

 

http://pastebin.com/E5BnAAA8

 

Здесь ситуация сложная. За все, связанное с Эггманом, включая нахождения в капсулах, ответ на удары, побег и даже полет на Eggman's Ship, отвечает одна роутина "Obj85_Eggman". В ней, в свою очередь, вызываются другие роутины, кстати примечательно, что счетчик вторичной роутины там байт $34, а не $25. Список роутин в off_19E80. То, что тебе нужно - loc_1A02A, именно отсюда начинается побег, там же я начал подробно комментировать код. Эта роутина отвечает за выпадение Эггмана из капсулы (не знаю как точно ее назвать) справа. Код падения можно удалить, тогда Эггман останется внутри капсулы - что и требуется. Теперь можно написать новый код, который и будет двигать камерой и завершать уровень.

 

Итак, камера. Да, этот именно этот объект начинает двигать камеру вправо при побеге, впрочем, как и все боссы в игре.

Ключевые моменты в управлении камерой:

1) В loc_1A02A, когда Эггман приземлился:

addq.b  #2,($FFFFF742).w	  ; increase dyn resize routine

Увеличивает счетчик роутин в Dynamic Screen Resizing (или Dynamic Level Events по версии SVN), меняет роутину в Resize_FZ с "Resize_FZboss" на "Resize_FZend".

 

2) В loc_1A166:

addq.w  #2,($FFFFF72A).w	  ; move camera right

Собственно, двигает камеру вправо со скоростью 2 пикселя за кадр.

Кстати, здесь все сделано весьма своеобразно, меняется значение правой границы камеры - $FFFFF72A, а в Resize_FZ выполняется код "move.w ($FFFFF700).w,($FFFFF728).w", который задает левой границе текущее положение камеры, т.е. сдвинулась камера чуть-чуть и сразу зафиксировалась на этой позиции, назад никак. Гениальное решение.

 

Последняя проблема - переход к концовке. С этим я думаю, ты справишься, можно просто сделать проверку на определенную позицию камеры и переходить в этом случае к концовке.

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

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


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

С камерой я разобрался, но возникли две проблемы:

 

1) Как убрать стоящий эггмобиль после победы над боссом FZ?

2) Как заставить корректно отображаться Giant Ring на FZ?

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


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

Как правильно добавить режим в GameModeArray?Я уже не знаю,чё делать...Но я уже точно знаю,что проблема,с которой я столкнулся,именно в GameModeArray.

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


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

Я, кстати, кода портировал опции соник 2, новый режим не создавал, я просто заменил режим спешл стейджев, так как в моем хаке они все равно не используются.

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


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

А в моём они нужны...Можно Demo Mode удалить.В первой версии моего хаке всё равно будет только одна зона.

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


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

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

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


Ссылка на сообщение
С камерой я разобрался, но возникли две проблемы:

 

1) Как убрать стоящий эггмобиль после победы над боссом FZ?

2) Как заставить корректно отображаться Giant Ring на FZ?

1) Снова придется поработать с кодом Obj85.

Obj85_ObjData:	dc.w $100, $100, $470; X pos, Y pos,	VRAM setting
	dc.l Map_obj82	; mappings pointer
	dc.w $25B0, $590, $300
	dc.l Map_obj84
	dc.w $26E0, $596, $3A0
	dc.l Map_FZBoss
	dc.w $26E0, $596, $470
	dc.l Map_obj82
	dc.w $26E0, $596, $400
	dc.l Map_Eggman
	dc.w $26E0, $596, $400
	dc.l Map_Eggman

За Эггмобиль отвечают два последних объекта, один из них сам "мобиль", второй - пламя (flame). Убрать их очень просто - достаточно изменить код загрузки объектов, чтобы он загружал не 6 объектов, а 4.

 

2) Для корретного отображения кольца нужно, разумеется, загрузить его тайлы.

   moveq  #$XX,d0
  jsr  LoadPLC

Я не помню, какой номер PLC у большого кольца, это можно посмотреть в _inc\Pattern Load Cues.asm, а можно даже и в коде (если знать, где).

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

 

Как правильно добавить режим в GameModeArray?Я уже не знаю,чё делать...Но я уже точно знаю,что проблема,с которой я столкнулся,именно в GameModeArray.

Чтобы добавить новый режим в GameModeArray, достаточно просто дописать в конец новый бранч:

GameModeArray:
	bra.w	SegaScreen; Sega Screen ($00)
	bra.w	TitleScreen; Title	Screen ($04)	
	bra.w	Level	; Demo Mode ($08)
	bra.w	Level	; Normal Level ($0C)
	bra.w	SpecialStage; Special Stage	($10)
	bra.w	ContinueScreen; Continue Screen ($14)
	bra.w	EndingSequence; End of game sequence ($18)
	bra.w	Credits	; Credits ($1C)
	bra.w	NewScreenie; Credits ($20)
	rts
; ============================================================
===============

Номера режимов возрастают по порядку, каждый следующий номер на 4 больше предыдущего. Это связано с тем, что команда bra.w занимает 4 байта, следовательно оффсет каждой следующей команды на 4 больше предыдущей.

 

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

Посмотрим на код MainGameLoop (вариант из S1HS2):

 

MainGameLoop:
	move.b	($FFFFF600).w,d0; load	Game Mode
	andi.w	#%11100,d0; apply bit mask, so d0 will be <= $1C and multiple of 4
	jsr	GameModeArray(pc,d0.w); jump to apt location in ROM
	bra.s	MainGameLoop

 

Вначале загружается байт из адреса $FFFFF600, потом к нему применяется побитовая маска - %11100, или $1C.

 

Операция ANDI здесь очень важна. Во-первых, она предохраняет число от случайных значений, после применения маски число будет строго в интервале $00-$1C и кратно 4. Я специально записал значение в двоичном виде, чтобы ни у кого не было соблазна подумать, что в ANDI можно вписать любое число, чтобы задать некий интервал. Это побитовая операция, она очищает в нужном нам адресе/регистре все биты, которые равны 0 в маске.

 

Еще важно то, что размер операции - word, то есть маска применяется не к байту, а к двум байтам (слову), а поскольку в маске заданы только 3 бита, все вокруг них обнуляется, так получается, что инструкция еще и подчистила d0 от лишнего мусора. Ведь в первой инструкции тронулся только 1 байт регистра, а jsr будет работать с d0 как со словом.

 

Как уже было сказано, при этой маске число будет строго в интервале $00-$1C, а у нас-то добавился режим $20. Чтобы исправить это, можно расширить маску, т.е. написать "andi.w #%111100,d0", тогда будут допустимы значения в интервале от $00 до $3C.

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


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

Спасибо огромное!

UPD:

Вот у меня возник ещё один вопрос.Играя в Мегамикс,думаю вы замечали,как Соник выбегает из левой границы уровня.Из этой:

post-10002-1299915110_thumb.png

Как сделать такую же фичу?Я уже всё перепробовал...

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

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


Ссылка на сообщение
Спасибо огромное!

UPD:

Вот у меня возник ещё один вопрос.Играя в Мегамикс,думаю вы замечали,как Соник выбегает из левой границы уровня.Из этой:

post-10002-1299915110_thumb.png

Как сделать такую же фичу?Я уже всё перепробовал...

Ну я думаю надо сделать следуюющее:

-задать новые координаты соника

-заблокировать управление

-задать скорость и направление соника

-в нужном месте задать нулевую скорость

-отблокировать управление

Ну наверно надо что-так в коде

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


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

Для начала изменить стартовое положение соника.

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


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

у кого нибуть есть фон и чанки hidden palace из соник 2 бета а то я нигде не могу найти.

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

×