Spiiin's blog

Формат уровней EarthWorm Jim 1, EarthWorm Jim 2, Alladin [SEGA]

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_eaj1
cad_eaj2
cad_alladin

Ну и отдельно, отрендеренный закат из 1-го уровня Червяка Джимма 2:
cad_earthworm_jim2_back