В соседней теме про
TMNT III: Manhattan Project, Roket писал:
У меня также выйдет почти как у Ti_. Редактирование врагов не очень интересное. Хочется большего - сделать подряд несколько боссов или по две штуки. Ни то ни другое не работает. Можно чисто врагов по расставлять, что уже в принципе и сделал Ti_. Там в общем дополнительно код надо писать, чтобы заставить некоторых врагов нормально появляться и боссов сделать по несколько штук.
В общем, я нашёл код, отвечающий за расположение врагов, боссов и т.п. Пример во вложении. Сделан дешево и сердито, ломает выход с уровня, просто для примера.
Как сделано:
Данные о группах врагов грузятся в процедуре
A001, с использованием таблицы оффсетов по адресу
A61A и таблиц с данными. Для первого уровня данные располагаются по адресу
A638. Например, для первой группы врагов первого уровня данные начинаются с
656h.
Для обычных врагов используется 4 байта:
номер экрана; позиция экрана; номер группы; тэг
Тэг - особое значение, позволяющее влиять на уровень в дальнейшем. Тэг
2C говорит, что следующим врагом будет босс. Тэг
FF прекращает загрузку врагов.
Данные о боссах загружаются там же, но используют 12 байт:
номер экрана; позиция экрана; номер босса; ?; позиция по X; ?; позиция по Y; ?; позиция по Z; ?; ?; тэг
Меняя данные о врагах и тэги, можно расставлять боссов и группы врагов по уровню.
D166 - процедура, выполняемая при убийстве босса. Код
E6 A4 записывает 1 в
$A4, запрещая игровому персонажу двигаться. Если затереть - можно двигаться и далее.
$40 - внутриигровой статус. Используется для загрузки разных процедур. Ингейм равен E. После убийства босса выставляется в F и меняется далее.
A952 - процедура, вызываемая когда босс умер окончательно. Находится в отдельном банке, дебагом ловится после попадания в
D166. Код
E6 40 записывает F в
$40, вызывая конец уровня. Если заменить, например, на
C6 40, то можно продолжить играть после босса.
Предположения:
Если в
$40 записывать B, то можно перезапустить музыку уровня после смерти босса. Т.к. B - одно из значений для первоначальной загрузки уровня, вызывает несколько подпроцедур и меняется циклично до E.
Можно в первую процедуру, вызываемую от F значения переменной
$40 (кажется
FAFA) врезать джамп на свой код. В коде загружать значение из новой таблицы, например, по номеру босса, проверять его и, либо заканчивать уровень нормально, либо возвращать всё в добоссовое состояние, чтобы продолжить играть на уровне.