Как я переставлял персонажей в UMK3 на Sega Mega Drive

В этой публикации я детально описываю процесс модификации персонажей и их портретов в Ultimate Mortal Kombat 3 для консоли Sega Genesis. Я не являюсь экспертом в области реверс-инжиниринга и не претендую на создание академического руководства. Напротив, я осознанно сохранил в тексте свои ошибочные гипотезы и тупиковые пути — чтобы вы увидели живой процесс разработки со всеми его трудностями и озарениями, а не «вылизанный» результат. Надеюсь, мой опыт послужит хорошим подспорьем для новичков, планирующих взяться за подобные задачи.

Введение

Для многих, включая меня, Ultimate Mortal Kombat 3 — легенда из детства. Желание заглянуть «под капот» игры преследовало меня давно, и наконец-то я нашел время для реализации этой идеи. В качестве отправной точки я выбрал задачу средней сложности: ротацию персонажей и замену их портретов в меню выбора. Ниже я пошагово разберу методики поиска данных в ROM, манипуляции с графическими ассетами и тестирование внесенных правок. Материал ориентирован на практику: от анализа адресного пространства до внедрения собственной графики в движок.

Для экспериментов использовался североамериканский образ игры: Ultimate Mortal Kombat 3 (USA)

Эксперименты с составом бойцов

На момент написания статьи ресурс DataCrystal содержал лишь RAM map, поэтому сторонние туториалы я практически не использовал.

Сначала я обратился к открытой документации и нашел адрес 126, отвечающий за выбор бойца:

P1 Character:
0x00 = Kano
0x01 = Sonya
0x02 = Jax
0x03 = Nightwolf
0x04 = Unmasked Sub-Zero
0x05 = Stryker
0x06 = Sindel
0x07 = Sektor
0x08 = Cyrax
0x09 = Kung Lao
0x0a = Kabal
0x0c = Shang Tsung
0x0d = Liu Kang
0x0e = Smoke
0x0f = Kitana
0x10 = Jade
0x11 = Mileena
0x12 = Scorpion
0x13 = Reptile
0x14 = Ermac
0x15 = Classic Sub-Zero
0x16 = Human Smoke
0x17 = Noob Saibot
0x18 = Rain

Я попытался найти последовательность ID персонажей, основываясь на их расположении в сетке выбора. Очевидно, прямой поиск не увенчался успехом. Тогда я предположил использование 16-битной адресации (по два байта на бойца) и успешно обнаружил искомую цепочку по смещению DFC8.

PlayerSelect
PlayerSelect

Тестовая замена персонажа Rain на Shao Khan (1B) сработала, однако для корректного отображения потребовалось переключение курсора — очевидно, в ROM существовали дополнительные дублирующие значения. Чтобы не заниматься «ковровым» поиском по всему дампу, я сравнил оригинальный ROM с хаком Ultimate Mortal Kombat 3 - Arcade Hack v0.6 by Nemesis_c через WinMerge. Выяснилось, что за инициализацию отвечают адреса D43E и D446.

Поиск и разбор графики портретов

Замена портретов — задача более трудоемкая, требующая понимания принципов отрисовки интерфейса. С помощью BizHawk я установил, что экран выбора использует два графических слоя (A и B), что характерно для реализации расширенной цветовой палитры. Портреты оказались частью фоновой графики.

VDPviewer
VDPviewer

Поиск необработанных данных тайлсета в 4-мегабайтном файле ожидаемо ничего не дал из-за компрессии. Углубившись в тематические ветки форума Emu-Land, я наткнулся на описание внутренней структуры данных. Опытным путем, зануляя фрагменты по адресу 3ee3ba (заставка компании Willem), я вывел формулу организации графики:

  1. TileSet (сами тайлы графики)
  2. Refs (указатели на тайлсет и тайловую карту, включая размерности)
  3. TileMap (тайловая карта)

Следующим открытием стало то, что палитры слоев A и B (адреса 5c40e и aa392) хранятся в открытом виде. Последовательный поиск ссылок рядом с палитрами вывел меня на адрес aa732 (указатель на TileSet). Первые попытки правки привели к графическим артефактам, что подтвердило: структура данных каждого портрета индивидуальна.

Замена и интеграция собственного портрета

Я поставил цель заменить портрет Noob Saibot на изображение Human Smoke. Использовав утилиту Ultimate MK3 Codec, я столкнулся с проблемой адаптации цветов: так как портрет был привязан к слою B, мне пришлось сжать исходник до 13 доступных оттенков.

HS13cPortrait
HS13cPortrait

Остро встал вопрос свободного места. Выручило «наследие» — по адресу 3EE47A были обнаружены неиспользуемые ассеты оригинального MK3 (например, Shiva). Это стало идеальной площадкой для вставки моих данных. Несмотря на ряд неудачных итераций (связанных с индексацией палитры и ошибками кодировщика), к четвертой попытке мне удалось добиться корректного отображения как в меню выбора, так и на экране VS.

fourth_try
fourth_try

Заключение

На этот проект ушло около двух недель кропотливой работы методом проб и ошибок. Многие технические детали остались «за кадром» ввиду объема статьи, но полученный опыт — бесценный фундамент. В планах — более глубокое изучение алгоритмов сжатия и полная переработка интерфейса выбора персонажей.

Ссылки

  1. DataCrystal: UMK3 Genesis

  2. Ресурсы сообщества UMK3

  3. Ultimate MK3 Codec

 

Источник

Читайте также