[Nes] Мы Пишем Редактор Уровней Для Prince Of Persia. Глава Вторая. Букетно-Конфетный Период

Глава первая , Глава вторая , В третьей главе , Глава четвертая , Глава пятая , Эпилог



Отказ от ответственности
Пролистывая в редакторе изображений скриншоты, которые мне сделала утилита (очень удобно было переключаться между изображениями в папке), я.

проснулся от будильника.

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

Проблему пришлось решать каким-то другим способом.

Тем вечером.

Давайте заглянем в банку.

Способ №2. Когда мы смотрим на шестнадцатеричный набор данных в памяти (как говорилось выше, достаточно просмотреть первые 2 КБ данных) — важно «высматривать» важные для нас вещи.

Но какие? Примем следующие предположения как очевидные:

  • Данные считываются из ПЗУ непосредственно перед использованием.

    Аргумент: свободной памяти мало, данные хранить негде, поэтому берем их только тогда, когда они нам нужны, и кладем обратно, если необходимость отпала;

  • Игра простая, поэтому вероятность того, что данные зашифрованы, довольно мала;
  • Данные сохраняются в абстрактной форме для экономии памяти ПЗУ, которая затем при выводе на экран преобразуется в блоки тайлов.

Мы не можем с уверенностью сказать, как можно хранить данные о помещении и/или уровне.

Мы снова можем предположить, что структура довольно проста.

Исходя из этих предположений, попробуем представить, что нам нужно найти:

  1. Данные будут считываться из ROM-файла при переходах между комнатами или уровнями (когда экран черный);
  2. Данные считываются небольшими порциями (может быть даже по 1 байту) для перевода в блок тайлов при отображении на экране;
Это значит, что мы будем искать, когда изменится наша комната или порядковый номер уровня.

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

Поэтому будем искать ячейку, в которой хранится номер уровня.

Как искать? Вы можете применить RAM-фильтр в FCEUXDSP, но можно и посмотреть глазами.

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

  • Во-первых, номер можно сохранить как число.

    Если он хранится в виде числа, он считается от 0 или 1?

  • Во-вторых, его можно хранить как указатель на некоторую структуру данных этого уровня.

    Здесь будет сложно найти что-либо с первого взгляда.

Вы можете просмотреть эти параметры или сохранить состояние перед переходом на следующий уровень, двигаться дальше и посмотреть еще раз.

И так несколько раз.

Честно говоря, этот метод на удачу.

Если не повезет, воспользуемся RAM Filter. Развиваем орлиное зрение Запускаем игру, запускаем до выхода из уровня, сохраняем состояние, открываем Инструменты-> Hex-редактор и идем.

Я сразу пропустил «дергающиеся» байты.

Начиная с ячейки $80, очевидно, сохраняется текущее изображение спрайта главного героя.

А остальное в принципе предсказуемо.

После пары проходов с первого на второй, а затем со второго на третий, орлиный взор поймал ячейку $70, значение которой менялось с 0 на 1, а затем с 1 на 2. Попробуем сыграть с этим.

Начнем первый уровень.

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

Но что это такое? Попадая в нижнюю комнату попадаем в пропасть, которая находится прямо в конце второго уровня! После падения принца игра попросит вас нажать «Старт».

Нажимаем и попадаем в начало второго уровня, как будто начали оттуда.

Скорее всего, это оно.

Во всем этом нас смущает только одно: когда мы начинаем игру, в этой ячейке стоит цифра 9. Раз мы считаем с нуля, значит ли это, что мы находимся на 10 уровне? Чуть позже выяснится, что это действительно так, а пока нам нужно найти кирпичики, из которых построен уровень.



Откройте банку консервным ножом.

Способ №1

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

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

Откройте отладчик (Инструменты-> Отладчик) и добавьте точку останова.

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

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

Добавьте точку, нажав кнопку Добавить.

Указываем в окошке адрес «70» и отмечаем, что нас интересует запись в эту ячейку.

Мы также указываем, что нас интересует память ЦП.

Каким-то образом вызываем точку в поле Имя и ждем.



[NES] Мы пишем редактор уровней для Prince of Persia. Глава вторая.
</p><p>
 Букетно-конфетный период

Действительно, при переходе из стартовой комнаты на первый уровень игра зависает и нас переводят в отладчик.

   

$D0E6:A2 00

Теги: #nes #взлом #эмуляция #Assembler
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.