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

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

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

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

lea	(Art_Sonic).l,a1

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

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


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

lea	(Art_Sonic).l,a1

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

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

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


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

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

 

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

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


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

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

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

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


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

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

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


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

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

d94b0883d006t.jpg

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

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


Ссылка на сообщение
  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, однако как сделать проверку на то, вылетают ли колечки из бадника?

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


Ссылка на сообщение
  Dexspot писал:
Как я понял, тут нужно править 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

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


Ссылка на сообщение
  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

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


Ссылка на сообщение
  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

 

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

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


Ссылка на сообщение
  Dexspot писал:
Как сделать полноценный пропуск 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

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

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


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

 

До нового публичного релиза 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 удалить.В первой версии моего хаке всё равно будет только одна зона.

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


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

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

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


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

 

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. Но думаю, если загружать тайлы, когда босс уже пройден и не виден, все будет ок.

 

  TailsX-Doll писал:
Как правильно добавить режим в 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

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


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

UPD:

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

post-10002-1299915110_thumb.png

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

×
Этот сайт использует кукисы, стораджи и подобное. Бла, бла, бла.
Более подробно о том как мы их используем можно прочитать в нашей политике конфиденциальности.