spiiin: (totoro)
Обновил мажорную версию своего редактора CadEditor уровней для кучи NES и SMD игр.

За 3 года добавил:

- Поддержку новых режимов аттрибутов (бит палитры и свойств) – поддержка аттрибутов на уровне блоков (уже была, игры Capcom) , макроблоков (Tiny Toon Adventures / серия Ninja Gaiden), описание аттрибутов отдельным слоем поэкранно (Contra Spirits / Mickey Mania / Batman).
- Поддержку иерархий макроблоков любого уровня вложенности (рекорд: Rokin' Kats – 4 уровня иерархии).
- Систему плагинов для редактирования конкретных аспектов игр (примеры - плагин для редактирования глобальной карты или плагин для редактирования фонов в SMD-играх, доработанный редактор фреймов анимаций для Capcom-игр).
- Конфиги для отображения блоков и экранов для десятка сеговских игр (в основном использующих компрессор RNC, для которого есть пакер). Заметки по форматам уровней: Раз, Два, Три. (SMD Earthworm Jim 1-2, Alladin, Jungle Book, Mickey Mania, Pitfall etc)
- Написал универсальную утилиту для поиска блоков и аттрибутов известных форматов для NES игр. Она магическим способом обнаруживает не только известные форматы блоков, но также находит и те, на которые не была запрограммирована!
- С помощью этой утилиты открыл наиболее часто встречающийся способ кодирования блоков в NES играх – 16 байт на блок 4x4 и 1 байт на палитру. Добавил поддержку таких блоков в редактор и описал конфиги для двух десятков игр с таким форматом (серия TMNT, серия Battletoads, серия Adventure Island, серия Power Blade, Jackal, Contra Force, Jackie Chan Action Kung Fu etc.)
- Улучшил утилиту Autocorrupter, для создания скриншотов изменных данных об уровне и их последующего анализа. Утилита используется для упрощения генерации конфигов картинками и блоками для редактора.
- Немного улучшил код редактора и добавил возможность использовать его как библиотеку, управляя ею из скриптов на языке Python (с использовнием Jupyter Notebook). Скриптование своих же программ позволило перейти от реверса конкретных игр к реверсу всех игр на платформе вообще.
- Написал несколько обзорных заметок про ромхакинг и возможности редактора.
- Запустил кампанию на Patreon, собирающую по 3$ в месяц на пиво :)
- Суммарно в проекте около 30к строк кода, 500 конфигов уровней для 85 разных игр.

Зачем всё это?
Если долго и упорно годами бить в одну точку, пространство раскрывается и показывает тайны скрытых неизведанных миров между строчек ассемблерного кода. Даже если эти миры существуют только для тебя и ещё нескольких сотен энтузиастов по всему миру.
Tags:
spiiin: (totoro)

Решил проверить оставшиеся методы компрессии, чтобы убедиться, что компрессор подходит для всех игр из списка.
По формату все игры похожи на EarthWorm Jim'ам, разобранным ранее, с небольшими отличиями.
Поиск конфигов осуществлялся для теста разными способами:
1. Логгированием адресов lua-скриптом при запуске кода компрессора (в регистре A1 лежит адрес в ROM начала архива, а A2 - место в оперативной памяти, куда происходит распаковка, поинтер и A1 можно найти в ROM, за исплючением последнего байта, так как несколько байт заголовка архива могут быть уже прочитаны).
2. Поиском палитры уровня в ROM, с последующим поиском указателей на эту палитру.
3. Поиском в дампе оперативной памяти игры самой длинной последовательности из кратных 8 чисел (в формате карт Earth Worm Jim индексы блоков кодировались кратными 8 значениями). Для этого использовался код на python:
https://gist.github.com/spiiin/1882d49b7f21961b7aee

Результаты:

1. Mickey Mania.
Размер блоков не 2x2, а 4x4, за счёт этого на описание одного блока на экране карты уходит не 2, а 1 байт (по 256 блоков на уровень).
cad_mm
2. Jungle Book
Полностью аналогичный EWJ формат, только в конфигах уровней иногда встречается формат архивов FAKERNC, распаковывающийся аналогично обычному RNC (первые четыре байта отбрасываются).

cad_jungle_book

3. Pitfall: The Mayan Adventure
После распаковки архива RNC с описанием карты в оперативную память оказывается, что он сжат ещё раз - вначале распакованных данных идут 2 ворда - количество сжатых колонок и их длина, затем для каждой колонки записаны относильные адреса начала столбцов (например, для первой колонки 1-го уровня - индекс 0x0218, означает, что сжатые данные колонки начинаются с адреса 0xFF7040 + 0x218  = 0xFF7258, где 0xFF7040, начало данных столбцов, зависит от кол-ва столбцов на уровне), и далее сами столбцы, сжатые алгоритмом RLE - FF признак повтора байта, за которым следует число повторов (1 байт) и сам повторяемый ворд.
Скрипт для распаковки:
https://gist.github.com/spiiin/70d5d6babf8ed064e685
Итоговый формат после распаковки совпадает с форматом EWJ.
cad_pitfall
Tags:
spiiin: (totoro)
1. Конфиги уровней
Уровни описываются конфигами по 64 байта.
Формат конфигов на примере первого уровня EarthWorm Jim 2 (адрес в rom:0x27543E):
0010 03D0 стартовая позиция
10AE 1090 стартовая позиция
001ECD7E obj.rnc - архив с описанием типов блоков
001DE00A grp.rnc - архив с видеопамятью
001E95E0 map.rnc - архив с картой тайлов
000044A0 anim
0054 0400 anim/sound
001E1AF8 back.rnc - архив с задним фоном (описывается маппингом)
0024DE42 pal      - указатель на палитру
001E1FC0 tilemap  - описание блоков (4 ворда на один блок 2x2, каждый ворд описывает маппинг одного тайла из блока), несжатое
0025A33A func1
0025A3BE func2
00E1 0050 map size - размер карты
0025842C func3
00000000
00003700


Дальше конфиги от других уровней. Отсюда для рисования карты используются архив map.rnc и массив с описанием блоков tilemap для переднего фона и back.rnc для заднего.

2. Копирование архивов RNC из ROM'а.
Формат массива RNC - сначала идут три байта идентификации массива ("RNC"), дальше метод сжатия (01 или 02), 4 байта размера несжатых данных, 4 байта размера сжатых данных и непосредственно сами данные архива. К размеру сжатых данных нужно прибавить 0x12 и скопировать это количество байт (начиная с букв "RNC", в отдельный файл). На примере архива obj.rnc для 1-го уровня:
52 4E 43 - заголовок RNC
01 - первый метод сжатия
00 00 3B 10 - размер данных, которые получатся после извлечения (0x3B10 или 15120 байт).
00 00 07 96 - размер сжатых данных.
прибавляем к размеру 0x12 байт и получаем 0x7A8 (1960 в десятичной системе) байт. Копируем 1960 байт, начиная с букв "RNC" в отдельный файл, например, EA2_OBJ00.RNC.


3. Копирование и запаковка архивов RNC.
Архиватор ppibm.exe (RNC_ProPack). Архиватор 16-битный, возможно, для его запуска в современных ос понадобится эмулятор dosbox.

4. Маппинг.
Стандартный формат описания одного тайла размером 8x8 - маппинг. Это 16 бит информации о тайле, которые кодируют:
   pccvhnnnnnnnnnnn
    p = Priority flag (за или перед персонажем будет отрисован тайл).
    c = Palette select (два бита выбора одной из 4х палитр)
    v = Vertical flip  (вертикальное отражение)
    h = Horizontal flip (горизонтальное отражение)
    n = Pattern name (номер тайла видеопамяти)


5. Карта.
Передний слой описывается номерами блоков 2x2(номера умножены на 8), описание блоков хранится в массиве tilemap (4096 блоков), он не сжат из-за уникальности каждого блока. Задний слой описан в массиве back размером 64x64, каждый тайл которого хранится в формате маппинга (2 байта на один тайл).

6. Свойства блоков.
Кроме маппинга, каждому из 4096 блоков присвоены еще 4 байта информации, хранящейся в сжатом массиве obj.rnc. Эти байты описывают свойства блока:
1 - Пол. 0x00 если тайл проходим или 0xFF если тайл непроходим.
2 - Условный пол. Тайл проходим, если определённый байт в оперативной памяти == 0, и непроходим в другом случае.
3 - Триггер. Объект, который "срабатывает", когда игрок его касается.
4 - Объект. Появляется как только тайл становится видимым на экране.


7. Другие игры
Аналогичный формат (кроме кодировки свойств блоков) используют также игры EarthWorm Jim 1 и Alladin. Всё это можно отобразить в редакторе CadEditor:
cad_eaj1cad_eaj2
cad_alladin
Ну и отдельно, отрендеренный закат из 1-го уровня Червяка Джимма 2:
cad_earthworm_jim2_back
Tags:
spiiin: (totoro)
В продолжение поста.

Нашёл редактор уровней для игры Earth Worm Jim - EWJ2edit, со ссылкой на скачивание. Редактор поставляется в сыром виде, по сути в нём есть только работа с тайловой картой (как в CadEditor'е), для получения этой тайловой карты необходимо "обработать напильником" ром - выдрать из оперативной памяти видеоданные и данные тайловой карты и макроблоков (или извлечь их с помощью архиватора).

RNC_ProPack.
Интересно, что в мануале к редактору было описано как извлечь архивы из игры с помощью утилит RNC_ProPack, а также упоминалось, что архиватор подходит для ещё нескольких игр (Alladin, Jungle Book).
Решил проверить, в каких играх используется данный тип архивов.
В наборе RNC_ProPack есть код распаковки под платформы SNES, Mips, M68000 (Sega и Amiga), Lynx, IBM PC, GameBoy.
Для данного поста я проверял сеговские игры, для них существуют 4 версии исходников - 2 вариации метода, полный и компактный. Сверив их, можно написать небольшой кусочек кода, который присутствует во в разных версиях и скомпилировать его ассемблером asm68k:
BUFSIZE EQU    16*8*3
  lea    -BUFSIZE(sp),sp #захватывает нестандартную константу.
  move.l    sp,a2            #и несколько байт вокруг неё.
  addq.w    #4,a0

ASM68K.EXE /p путь_к_asm,путь_к_bin

После этого можно проверить собранный файл в онлайн-дизассемблере (в поле Arch выставить m68k:68000, в поле Endian оставить Default, в поле с бинарными данными вставить содержимое полученного бинарного файла - его можно скопировать открыв его в любом шестнадцатеричном редакторе).

Дальше можно прогнать поиск бинарного куска кода по всем файлам из набора GoodGen.
Дополнительно можно отсечь случайно найденные игры, проверив, содержится ли в роме сигнатура архива из букв "RNC" и повторно провести поиск больших кусков кода, чтобы разделить игры на используемые внутри них версии компрессора/декомпрессора.

Результаты (игры, в которых используется одна из версии компрессора/декомпрессора RNC_ProPack):

1. Версия EarthWorm Jim Method 1, сигнатура 4FEFFE80244F47E800117800181B5344.
Read more... )
2. Версия EarthWorm Jim Method 2, сигнатура 4FEFFE80244F5848610000EC47E8000A.
Read more... )
3. Версия Pitfall : The Mayan Adventure, cигнатура 4FEFFE80244F6100016C72000C80524E
Read more... )
4. Версия Toy Story, сигнатура 4FEFFE80244F6100016C7200B0BC524E
Read more... )

Напоследок, добавил редактор EWJ2Edit и RNC_ProPack в папку с сега-компрессорами.
Tags:
spiiin: (totoro)
Семестровый пост про CadEditor.

cad_editor_v30

Добавил в редактор конфиги игр на Sega/GBA (Contra Hards Corps, Lost Vikings, Tiny Toon Buster's Hidden Adventure, Quack Shot, Zombies Ate My Neighbors, Final Fantasy Tactics Advance) – общие принципы построения уровней из тайлов такие же, разве что часто требуются внешние компрессор-декомпрессор из внутриигровых архивов.

Разобрал с десяток систем хранения списков игровых объектов (Tale Spin, Little Mermaid, Ninja Cat, Tiny Toon Adventures, Chip & Dale 2, Flintstones 1 & 2, Tom & Jerry, New Ghostbusters 2, Jungle Book, Zombies Ate My Neignborns), вдобавок к тем, что уже были разобраны. В них тоже много общих идей, прослеживаются два типа устройства систем – с равными по длине списками и с переменными по длине (часто со встроенной системой команд). У объекта имеется тип (иногда может быть несколько разных списков с разными форматами), координаты на экране (либо одномерные, либо двумерные) и, часто, несколько байт дополнительных данных (подтип, кол-во жизней, радиус появления и т.п.).

Из улучшений редактора:
- Нормальный интерфейс главного окна.
- Возможность работать с двумя реальными слоями и произвольным количеством виртуальных.
- Подредактор виртуальных макроблоков (структур), для составления и расставления по карте блоков произвольного размеры и формы.

Cписок поддерживаемых игр (8 игр полностью и ещё 33 в режиме редактора картинками).
Ссылка на редактор
Tags:
spiiin: (totoro)
В дополнение к началу.
Собрал в кучу компрессоры для игр, которые разбирал на сегу.

konami_lzkns_comp_v1
  Компрессоры для Konami-игр авторства Mefisto (методы сжатия - вариации алгоритма lz77)
  Список поддерживаемых игр:
  LZKN1:
Animaniacs
  Contra - Hard Corps
  Lethal Enforcers II - Gun Fighters
  Sparkster


LZKN2:
4-in-1
  5-in-1 Megadrive Portable
  Animaniacs
  Castlevania - Bloodlines
  Contra - Hard Corps
  Rocket Knight Adventures
  Sunset Riders
  Super 15-in-1
  Super 19-in-1
  Teenage Mutant Ninja Turtles - The Hyperstone Heist
  Tiny Toon Adventures - Acme All-Stars
  Tiny Toon Adventures - Buster's Hidden Treasure


lzkn1_r57shell
  Улучшенная версия компрессора по алгоритму LZKN1 от r57shell'а. Жмёт максимально хорошо для   данного вида декомпрессора.

quackshot_kens
  Исправленная версия компрессора KENS для QuackShot, методы компрессии Kosinski-Enigma-Nemesis.

tf3compressor
  Компрессор для Thunder Force 3 от Mefisto - сжатие по методу Rle и вариация сжатия Хаффмана (алгоритм Иванаги).

DUMPS
  собранные адреса архивов внутри ROM-файлов.

В дропбоксе:
https://www.dropbox.com/sh/mn6sanuwtu0gbac/X2GZBS3-UI
Tags:
spiiin: (totoro)
Подключение разных контроллеров к компу:
https://www.kickstarter.com/projects/kadevice/kade-connects-arcade-controls-to-computers-and-con

http://www.brunofreitas.com/node/43


Считывалка сеговских картриджей:
http://www.brunofreitas.com/node/42


и тому подобный чудный стафф.
Tags:
spiiin: (totoro)
ЧАСТЬ 1.
В продолжение поста "Взлом NES игр без знания ассемблера".

Идея та же, с небольшими модификациями. Берётся любой эмулятор Sega Mega Drive, который умеет запускать lua-скрипты (например, Gens Rerecording v11b).
Дальше важный факт о сеговских играх - в большинстве из них используются разные варианты сжатия данных, но для некоторых игр существуют компрессоры-декомпрессоры. Распаковку данных игра чаще всего проводит при загрузке уровня. Процесс распаковки не мгновенный, поэтому допускаем, что уровень распаковывается в оперативную память целиком. Соответственно, начинать поиск можно сразу в оперативной памяти. Однако, следует учесть, что данные на экране зависят оттого, что находится не в оперативной, а в видеопамяти, и поймать момент между загрузкой данных в оперативную память и передачей её видеоадаптеру без отладчика не выйдет. Поэтому заметить измененные в оперативной памяти данные получится только, проскроллив до 2-го игрового экрана. Это можно сделать, загрузив на проигрывание файл с записью нажатий кнопок, или сделать руками. Второй вариант более простой, поэтому стоит рассмотреть его.

Адресное пространство оперативной памяти - 0xFF0000-0xFFFFFF - 64 кб.
Луа-скрипт для изменения данных может быть таким:

startAddr = 0xFF0000
size = 0x1000
val = 0x00
savestate.load(1);
for mem = startAddr,startAddr+size ,1 do
  memory.writebyte(mem, val);
  val = val + 1;
end;


Перед запуском нужно сделать сейв тестируемой игры в момент, когда уровень уже распакован и загружен. Дальше мы забиваем первые 0x1000 байт оперативной памяти своими данными и пробегаемся по уровню, чтобы обнаружить изменения. Их с первого раза обнаружить, естественно, не удаётся, поэтому надо сделать следующий шаг в организации поиска. Эмулятор сам обнаруживает изменение скрипта и перезагружает его, поэтому можно изменять скрипт "налету". Для этого удобно использовать внешний метаскрипт (например, на python), который будет перезаписывать файл скрипта, меняя значение startAddr, затем засыпать на несколько секунд, давая игроку доскроллить до экрана и заметить наличие/отсутствие изменений, а потом инкрементировать начальный адрес коррапта, чтобы эмулятор перезапустил скрипт и снова отправил игрока на исследования.

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

После сужения поиска до обнаружения одного-двух рядов блоков (см. скрин ниже), можно переписать метаскрипт так, чтобы он больше не менял значение адреса и размера, зато менял значение val в оперативной памяти. Это нужно, чтобы сделать скриншоты всех возможных блоков уровня для блочного редактора. Для удобства снятия скриншотов можно отключить фоны и/или отображение спрайтов в эмуляторе (клавишами Ctrl+F1/F2/F3). Процесс нужно будет повторить для блоков переднего и заднего фонов (Layer A & Layer B), они обычно находятся в памяти рядом друг с другом.
Quack Shot Starring Donald Duck_000

После этого остаётся вырезать со скриншотов линии с блоками и "сшить" их в ленту, чтобы засунуть в редактор CadEditor. После этого нужно сохранить дамп оперативной памяти в файл (в меню эмулятора - Tools->Ram dump) и написать конфиг для редактора, в котором указать файл с картинками и найденное смещение начала данных в дампе.

Метод протестирован на играх Tiny Toon Buster's Hidden Treasure, QuackShot и Contra Hard Corps (^_^), все получилось добавить в редактор уровней:
cad_editor_contra
cad_editor_quackshot
cad_editor_tt

Игры используют системы построения уровней из блоков размером 32x32 (16x16 для QuackShot) пиксела, как и большинство NES-овских). Разница только в том, что Tiny Toon  и Quackshot хранят их поэкранно, и используют раскладку(layout), в которой записаны номера экранов (они частенько повторяются в первых четырёх подуровнях первой зоны Tiny Toon), а Contra описывает весь уровень длинными линиями в 256 блоков и 16 блоков в высоту (причём в местах, куда игрок не может добраться, здания и не дорисованы доверху).

После редактирования уровня его ещё нужно упаковать и засунуть обратно в игру. Этого без кодирования сделать не удастся =\
Про запаковку в следующий раз.
Tags:
spiiin: (totoro)
предыдущая:
http://spiiin.livejournal.com/69867.html

Chip & Dale by VZIP
cad1cad_hack_vzipcad_hack_vzip_2

Описание:
Перерисована практически вся графика фонов и объектов, новые уровни и боссы, новые типы загадок (некоторые в случае нерешения требуют перезапуска уровня). Пара уровней с очень оригинальной графикой.
Сложность: запредельная
Готовность: готов
Ссылки:
на эму-ленде
на сайте ломакса


Duck Tales Hardcore by Lomax (Revision)
dt1dt2dt3
Описание:
Вторая версия хака – уменьшена сложность, уровни полностью изменены по сравнению с оригиналом и подтюнены в редакторе, новые загадки и боссы.
Сложность: 1,2 уровень – умеренная, 3,4,5 – сложная.
Готовность: готов
Ссылки:
на эму-ленде
на сайте ломакса

дальше не хаки, но связанные CadEditor'ом проекты:
Редактор уровней Block Editor.
cad_battletoads_1cad_jungle_book_1cad_tom_and_jerry_1

Описание:
Проект Ti_ по созданию универсального блочного редактора экранов для разных игр, сделан в Game Maker'е. По фичам сыроват, но хорош своей простотой и тем, что с разрешения автора конфиги для игр легко удалось портировать под CadEditor (собственно, на скринах он).
Поддержка игр: Jungle Book (уровни 1,3,4,5,9), Battletoads & Double Dragon (уровни 3,5), Battletoads (уровни 1,3,4,9,11), Captain America (уровень 1, город и комнаты), ShatterHand, по несколько уровней Little Nemo, Ninja Cats, Tom & Jerry, также есть отдельная версия под Duck Tales 2.
Состояние: версия 5, дальше пока не развивается.
Ссылки:
на эму-ленде (периодически им куда-то перекладывается)


Редактор уровней Thunder Force 3 (SEGA)
tf3ed_v10_small
Описание:
Редактор Mefisto для сеговской игры Thunder Force 3 на основе исходников CadEditor'а. Умеет редактировать передний и задний планы всех уровней, а также просматривать и изменять графические блоки, в планах поддержка редактирования таймлайна объектов.
Поддержка игр: Thunder Force 3.
Состояние: версия 1, развивается.
Ссылки:
на сайте Lab313
Tags:
spiiin: (Default)
В Final Fantasy Tactics Advance в 11 раз больше побочных миссий, чем основных, среди которых есть более сложные, чем битва с последним боссом.

В японской версии New GhostBusters 2 охотники за привидениями бегают на 25% быстрее и ловят на 25% привидений больше.

В европейской версии Contra Hard Corps на 5, а 6 концовок (можно присоединиться к главзлодею):
Tags:

Profile

spiiin: (Default)
spiiin

September 2017

S M T W T F S
     1 2
34 567 89
101112131415 16
17181920212223
24252627282930

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 11:29 am
Powered by Dreamwidth Studios