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

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

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

Никогда раньше не слышал о такой проблемме, хотя есть у меня одна догадка о ее причине.

Проверь, стоит ли у мостов "Remember Sprite" (не помню точно). Если да, то сними его, из-за этого объекты могут не создаваться после самоудаления.

Да не в мостах дело.Исчезают абсолютно любые объекты.Не знаю что теперь делать.

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


Ссылка на сообщение
moveq ($F000-$D800)/$40-1,d5; зададим количество перебираемых объектов (до последнего слота)

Я попытался написать аналогичный код, но у меня выдало ошибку ilegal addressing mode ($f000-$d800)/$40-1,d5.Как можно устранить?бадник - баз бомбер.

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


Ссылка на сообщение
Я попытался написать аналогичный код, но у меня выдало ошибку ilegal addressing mode ($f000-$d800)/$40-1,d5.Как можно устранить?бадник - баз бомбер.

Я опечатался, допиши "#":

moveq #($F000-$D800)/$40-1,d5

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


Ссылка на сообщение
Видимо в этом гиде ошибка. В суброутине LoadSonicDynPLC нет такой строки:

lea	(Art_Sonic).l,a1

Есть, только выглядит это дело по-другому:

LoadSonicDynPLC:		; XREF: Obj01_Control; et al
	moveq	#0,d0
	move.b	$1A(a0),d0	; load frame number
	cmp.b	($FFFFF766).w,d0; has Sonic frame changed?
	beq.s	locret_13C96	; if not, branch
	move.b	d0,($FFFFF766).w; update frame number
	lea	(SonicDynPLC).l,a2
	add.w	d0,d0
	adda.w	(a2,d0.w),a2
	moveq	#0,d5
	move.b	(a2)+,d5
	subq.w	#1,d5
	bmi.s	locret_13C96
	move.w	#$F000,d4
	move.l	#Art_Sonic,d6   ; <------------

 

В S1HS и в оригинальном дизасембле код LoadSonicDynPLC отличается. Дело в том, что в S1HS был изменен способ подгрузки арта Соника по гиду добавления Спин Дэша, части третьей. Это позволило освободить часть памяти, потому что раньше в память загружались целые тайлы для переброски в VRAM, а теперь лишь команды (DPLC). Все это делается через умную систему DMA-Transfer'а, портированную из Соник 2.

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

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


Ссылка на сообщение
Эмм, и как тогда поступить?

Берешь код из гида и переделываешь команды, загружающие арты (ArtSonic и арт перса).

Впрочем, я не удержался от небольшой оптимизации:

		move.l #ArtSonic,d6
	tst.b   $FFFFFFFE
	beq	SPLC_ReadEntry
	move.l #АртТвоегоПерса,d6

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


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

Спасибо!

 

Так, вставляю второго персонажа, делаю для него надпись "Has passed".

 

loc_C5CA:
	cmpi.b	#$01, ($FFFFFFFE).w; is the multiple character flag set to $01?
	bne.w	loc_C5CA_Sonic	; if not, load Sonic's art
	move.b	d0,$1A(a1)
	move.l	#Map_obj3A_НовыйПерсонаж,4(a1)
	bra.w	loc_C5CA_Continue

loc_C5CA_Sonic:
	move.b	d0,$1A(a1)
	move.l	#Map_obj3A,4(a1)
	bra.w	loc_C5CA_Continue

loc_C5CA_Continue:
	move.w	#$8580,2(a1)
	move.b	#0,1(a1)
	lea	$40(a1),a1
	dbf	d1,Obj3A_Loop; repeat 6 times

 

Теперь в "Map_obj3A_НовыйПерсонаж" вставил маппинги имени нового персонажа, а в результате вылезает беспорядочный набор текста, смешанный с графикой. Что делать?

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


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

loc_C5CA в Obj3A - часть цикла, загружающего объекты для экрана SONIC HAS PASSED. Он состоит из нескольких объектов: "SONIC", "HAS PASSED", Овал, "Act X", "SCORE", "TIME BONUS" и "RING BONUS". Для каждого из этих объектов выполняется твой код, а так что маппинги меняются и у овала, "Act X" и пр. А поскольку в маппингах нового кадров для тех объектов видимо нет, получается каша.

 

Если тебе нужно лишь заменять маппинги надписи "SONIC", можно пойти таким путем:

loc_C5CA:
	move.l	#Map_obj3A,4(a1)
	move.b	d0,$1A(a1); кадр #0 (надпись "SONIC"/'имя перса')?
	bne	@Skip	; если нет, значит это другой объект, не трогаем его
	tst.b	$FFFFFFFE; игрок - Соник?
	beq	@Skip	; если да, оставляем старые маппинги
	move.l	#YourNewMaps,4(a1); использовать маппинги для второго перса

@Skip:	move.w	#$8580,2(a1)
	move.b	#0,1(a1)
	lea	$40(a1),a1
	dbf	d1,Obj3A_Loop; repeat 6 times

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

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


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

Я решил эту проблему именно этим путем.

 

Остался всего один баг, связанный с новым персонажем - вместо нужного life counter icon показывается сониковский. Хотя я все прописал, у моего персонажа отдельный Pattern Load Cues, в котором совершенно точно указан правильный бранч на графику life counter icon. Хотя, может быть дело этим не ограничится и нужно еще что-то править, дабы добиться отображения у моего персонажа персональной иконки?

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


Ссылка на сообщение
Я решил эту проблему именно этим путем.

 

Остался всего один баг, связанный с новым персонажем - вместо нужного life counter icon показывается сониковский. Хотя я все прописал, у моего персонажа отдельный Pattern Load Cues, в котором совершенно точно указан правильный бранч на графику life counter icon. Хотя, может быть дело этим не ограничится и нужно еще что-то править, дабы добиться отображения у моего персонажа персональной иконки?

Покажи, что именно ты делал в Pattern Load Cues и в коде, чтобы загрузить новый арт. Из твоего описания не понятно, каким способом ты пытался этого добиться и что пошло не так.

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


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

; ---------------------------------------------------------------------------
; Pattern load cues - standard block 1
; ---------------------------------------------------------------------------
PLC_MMain:	dc.w 4
	dc.l Nem_Lamp; lamppost
	dc.w $D800
	dc.l Nem_Hud; HUD
	dc.w $D940
	dc.l Nem_LivesM; lives	counter !!!
	dc.w $FA80
	dc.l Nem_Ring; rings
	dc.w $F640
	dc.l Nem_Points; points from enemy
	dc.w $F2E0

 

 

; ---------------------------------------------------------------------------
; Compressed graphics - various
; ---------------------------------------------------------------------------
Nem_TitleCard:	incbin	artnem\ttlcards.bin; title cards
	even
Nem_Hud:	incbin	artnem\hud.bin; HUD (rings, time, score)
	even
Nem_Lives:	incbin	artnem\lifeicon.bin; life counter icon
	even
Nem_LivesM:	incbin	artnem\lifeiconm.bin; life counter icon !!!
	even
Nem_Ring:	incbin	artnem\rings.bin; rings
	even
Nem_Monitors:	incbin	artnem\monitors.bin; monitors
	even
Nem_MonitorsM:	incbin	artnem\monitorsm.bin; monitors

 

Главное то, что это не работает только с иконкой жизней, остальное (мониторы, сигнпост, надпись в ending sequence) отображается как надо.

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

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


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

Судя по всему, с PLC все в порядке. Но это лишь массив данных, важно то, как им управляет код. Если я правильно понял, ты создал новый блок в PLC - PLC_MMain, да? Каким образом ты загружаешь для нового перса новые блоки вместо стандартных? Скорее всего, проблема именно в этом и вместо твоего блока загружается стандартный.

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


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

Мне уже помогли.

Нужно было в loc_37B6 добавить

moveq   #0,d0
  bsr.w   LoadPLC	 ; load main   patterns

 

Кстати, СонЭд обновлен!

 

Как убрать подводные течения в SBZ3?

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


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

 

это получается новая версия вышла что-ли?

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

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


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

Да, вышла версия 11, до этого была 1.03.

Новый SonED2 теперь поддерживает редактирование Sonic 3, Sonic & Knuckles, Sonic CD, Sonic Crackers и, наконец, Knuckles' Chaotix.

С новой версией я ознакомился мало, из приятных вещей заметил измененный интерфейс, без мелких, режущих глаза стрелочек, новую консоль. И вообще, чувствуется, все было переделано и улучшено. Как-никак первое глобальное обновление с 2004 года, и то, что Stealth не забросил свой проект, очень радует.

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


Ссылка на сообщение
Да, вышла версия 11, до этого была 1.03.

Новый SonED2 теперь поддерживает редактирование Sonic 3, Sonic & Knuckles, Sonic CD, Sonic Crackers и, наконец, Knuckles' Chaotix.

С новой версией я ознакомился мало, из приятных вещей заметил измененный интерфейс, без мелких, режущих глаза стрелочек, новую консоль. И вообще, чувствуется, все было переделано и улучшено. Как-никак первое глобальное обновление с 2004 года, и то, что Stealth не забросил свой проект, очень радует.

А мне он показался до невозможности нестабильным (bah) после сохранения проэкта нельзя второй открываь- всё глючит!

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


Ссылка на сообщение
Как убрать подводные течения в SBZ3?

Посмотри роутины LZWindTunnels и LZWaterSlides, в них создаются течения для всех уровней LZ, и по идее, для SBZ3 (так как он является четвертым актом LZ).

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


Ссылка на сообщение
Да, вышла версия 11, до этого была 1.03.

Новый SonED2 теперь поддерживает редактирование Sonic 3, Sonic & Knuckles, Sonic CD, Sonic Crackers и, наконец, Knuckles' Chaotix.

С новой версией я ознакомился мало, из приятных вещей заметил измененный интерфейс, без мелких, режущих глаза стрелочек, новую консоль. И вообще, чувствуется, все было переделано и улучшено. Как-никак первое глобальное обновление с 2004 года, и то, что Stealth не забросил свой проект, очень радует.

Как я понял, пока поддерживается только PC версия Sonic CD?

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


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

А меня вот новая версия одним огорчила-список предметов так и не пополнили.Сплошные знаки вопроса.Если редактирование первых двух уровней (Green Hill и Marble) игры Sonic the Hedgehog хоть и представляется возможным,то расстановка предметов в оставшихся четырёх представляется не очень удобным...А остальное сделано сравнительно не плохо...

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


Ссылка на сообщение
А мне он показался до невозможности нестабильным (bah) после сохранения проэкта нельзя второй открываь- всё глючит!

Да, новая версия нестабильна: у меня сначала все было нормально, а потом после очередной компиляции на уровне пропал весь уровень, то есть объекты есть а Layout'а нет.

И еще иногда он при загрузке проекта смешивал палитру.

Изменено пользователем MAXXX-309

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


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

Как сделать так, чтобы Соник перемещался в FINAL из SBZ3 если он запрыгнет за вертикальные пределы уровня уровня в любом месте? Я сделал два пути в SBZ3, в одном пути Соник перемещается в FINAL, а в другом нет.

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


Ссылка на сообщение
Как сделать так, чтобы Соник перемещался в FINAL из SBZ3 если он запрыгнет за вертикальные пределы уровня уровня в любом месте? Я сделал два пути в SBZ3, в одном пути Соник перемещается в FINAL, а в другом нет.

Разумеется, перемещение происходит в Dynamic Screen Events, а именно в Resize_SBZ3, вот так он выглядит в дизасембле S1HS2:

; ============================================================
===============
; Vladikcomper:	Some code was changed to fit level order.

Resize_SBZ3:
	cmpi.w	#$D00,($FFFFF700).w
	bcs.s	locret_6F8C
	cmpi.w	#$18,($FFFFD00C).w; has Sonic reached the top of the level?
	bcc.s	locret_6F8C	; if not, branch
	clr.b	($FFFFFE30).w
	move.b	#1,($FFFFF7C8).w; freeze Sonic
	lea	LevelOrder,a2	; load level order array
	move.w	$E(a2),d0
	beq.s	@GotoSegaScreen
	move.w	d0,($FFFFFE10).w; set next level according level order
	move.w	#1,($FFFFFE02).w; set restart level flag
	rts

@GotoSegaScreen:
	move.b	#0,($FFFFF600).w

locret_6F8C:
	rts

 

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

 

К счастью, роутина Ресайзинга у SBZ3 очень даже простая и приятная.

Первые две команды проверяют X-позицию камеры, если она меньше $D00, остальной код не выполняется. Следующая пара команд проверят X-позицию Соника, если она больше или равна $18, остальной код тоже не выполняется.

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

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

Например, у тебя второй проход в FZ начинается с позиции $200 (левее начала уровня), тогда проверка будет выглядеть примерно так:

	cmpi.w	#$200,($FFFFF700).w; позиция камеры - левее $200?
bcs	@ChkSonicPos   ; если да, Сонику вполне можно перемещаться
cmpi.w	#$D00,($FFFFF700).w; позиция камеры - правее $D00?
bcs	locret_6F8C   ; если нет, нельзя никуда перемещаться

@ChkSonicPos:
cmpi.w	#$18,($FFFFD00C).w; has Sonic reached the top of the level?
bcc.s	locret_6F8C	; if not, branch

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


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

Мне нужно поставить в SBZ3 объект типа Door (SBZ), который после одноразового прохождения через него БОЛЬШЕ НИКОГДА НЕ ОТКРЫВАЛСЯ НИ ТУДА, НИ СЮДА. Какой ID может быть у такой двери?

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


Ссылка на сообщение
Мне нужно поставить в SBZ3 объект типа Door (SBZ), который после одноразового прохождения через него БОЛЬШЕ НИКОГДА НЕ ОТКРЫВАЛСЯ НИ ТУДА, НИ СЮДА. Какой ID может быть у такой двери?

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

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


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

А если игрок попросту не нажмет кнопку? Он пройдет влево, а потом вправо поверху, спрыгнет вниз и опять пойдет по этому пути.

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


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

чтобы откыть дверь НУЖНО нажать на кнопку :), иначе просто нге откроется дверь

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


Ссылка на сообщение
Мне нужно поставить в SBZ3 объект типа Door (SBZ), который после одноразового прохождения через него БОЛЬШЕ НИКОГДА НЕ ОТКРЫВАЛСЯ НИ ТУДА, НИ СЮДА. Какой ID может быть у такой двери?

 

В LZ такой объект наверное не предусмотрен (хотя можно поиграться с подтипами существующих там "дверей", вдруг найдется что-то похожее).

Если подходящих дверей в LZ нет, можно пойти несколькими путями:

 

1) Создать абсолютно новый объект.

 

2) Перепрограммировать существующие в LZ "двери", добавить в них новый подтип, при котором дверь и будет вести себя как тебе нужно.

 

3) Разместить на уровне дверь с таким же ID-ом, как у нужной тебе двери в SBZ. Этот способ самый легкий, причем все будет работать, единственное но: арт двери будет неправильный. Это можно изменить, добавив в код двери проверку на зону LZ и давать ей в этой случае другие маппинги.

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


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

Сделал Майти двойной прыжок на основе джампдеша S1HS. Однако возникла проблемка: под водой если сделать джампдеш и оставить держать кнопку, двойной прыжок получается очень высоким, когда как если нажать сразу нажать два раза кнопку и отпустить, двойной прыжок получается таким, каким надо.

Sonic_DoubleJump:
	cmpi.b	#2,$1C(a0)	; is Sonic rolling?
	bne.s	Sonic_DJ_Rts; if no, branch
	btst	#7,$22(a0); was Jump Dash flag set?
	bne.s	Sonic_DJ_Rts; if yes, branch
	tpress	A+B+C,(SonicControl); is A, B or C pressed?
	beq.w	Sonic_DJ_Rts; if not, branch
	bset	#7,$22(a0); set Jump Dash flag
	move.w	#$A0,d0	; move the sound slot number to d0
	jsr	(PlaySound_Special).l;	play jumping sound;
	move.w	#$700,d0; set normal jumpdash speed
	neg.w	d0		; negate d0 (for jumping to up)
	clr.w	$10(a0)	; clear X-velocity to move sonic directly to up
	move.w	d0,$12(a0); move d0 to Y-velocity
	btst	#6,$22(a0); is Sonic underwater?
	beq.s	Sonic_DJ_ChkShoes; if not, branch
	move.w	#$500,d0; set speed to $500

Sonic_DJ_ChkShoes:
	tst.b	($FFFFFE2E).w; does Sonic have speed	shoes?
	beq.s	Sonic_DJ_ChkOrientation; if not, branch
	addi.w	#$200,$10(a0); set speed to $B00 or $500 if underwater

Sonic_DJ_ChkOrientation:
	btst	#0,$22(a0)
	beq.s	Sonic_DJ_Rts
	neg.w	$10(a0)

Sonic_DJ_Rts:
	rts

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

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


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

Скорее всего это происходит из-за бага в твоем коде, по причине которого при нахождении под водой не задается нужная скорость.

 

		move.w   #$700,d0	 ; d0 -> $700
	neg.w	d0		   ; d0 -> -$700
	clr.w	$10(a0)
	move.w   d0,$12(a0)   ; $12(a0) -> set Y-vel to -$700
	btst	 #6,$22(a0)   ; is Sonic underwater?
	beq.s	Sonic_DJ_ChkShoes; if not, branch
	move.w   #$500,d0	 ; d0 -> $500

Sonic_DJ_ChkShoes:

 

Вначале ты записываешь в d0 значение -$700, скорость нормального прыжка. Потом применяешь эту скорость, т.е. сохраняешь ее в $12(a0). Если Соник под водой, ты записываешь в d0 значение $500, и на этом все заканчивается. Ты не сохраняешь измененную скорость в $12(a0), никак не используешь то, что ты записал в d0.

 

Поэтому скорость прыжка под водой такая же, как и в воздухе, а учитывая что под водой "гравитация" меньше, полный прыжок получается выше. Полный прыжок - это когда ты зажимаешь кнопку прыжка и не отпускаешь ее до самого конца. В движке Соников предусмотрена замечательная вещь - регулируемая высота прыжка, чем раньше ты отпустишь кнопку прыжка, тем ниже будет прыжок. Работает это так: при отпускании кнопки прыжка проверяется вертикальная скорость Соника, если она меньше -$400 (например, -$500, это перемещение вверх со скорость 5 пикселей за кадр), она урезается до -$400. Поэтому, когда отпустишь кнопку, прыжок естественно будет не таким высоким.

 

Чтобы исправить твою проблему, можно просто переместить комаду "move.w d0,$12(a0)" в начало Sonic_DJ_ChkShoes, чтобы она выполнялась когда все манипуляции со значением скорости завершены:

 

		clr.w	$10(a0)	  ; clear X-vel to move sonic directly to up
	move.w   #-$700,d0	; set normal speed (-$700)
	btst	 #6,$22(a0)   ; is Sonic underwater?
	beq.s	Sonic_DJ_ChkShoes; if not, branch
	move.w   #-$500,d0	 ; set underwater speed (-$500)

Sonic_DJ_ChkShoes:
	move.w   d0,$12(a0)   ; move d0 to Y-velocity

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

×