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

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

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

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

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

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

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


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

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

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


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

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

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

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


Ссылка на сообщение
  Dexspot писал:
Видимо в этом гиде ошибка. В суброутине 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

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


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

Берешь код из гида и переделываешь команды, загружающие арты (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. Хотя, может быть дело этим не ограничится и нужно еще что-то править, дабы добиться отображения у моего персонажа персональной иконки?

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


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

 

Остался всего один баг, связанный с новым персонажем - вместо нужного 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?

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


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

 

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

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

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


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

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

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

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

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


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

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

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

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

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


Ссылка на сообщение
  Dexspot писал:
Как убрать подводные течения в 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 хоть и представляется возможным,то расстановка предметов в оставшихся четырёх представляется не очень удобным...А остальное сделано сравнительно не плохо...

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


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

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

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

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

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


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

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

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


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

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


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

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

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


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

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

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


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

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

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


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

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

×