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:
Ну и отдельно, отрендеренный закат из 1-го уровня Червяка Джимма 2: