Author: Vladimir Chebotarev aka ex-lend
Формат зависит от версии файла. Нижеследующее описание соответствует версии 1600 (0x640).
Формат таблиц простой — размер и описание элемента. Если есть несколько похожих элементов, идущих друг за другом, ставится знак многоточия. Красным обозначены не целиком разобранные блоки
| файл alm | |
| 0x14 | заголовок alm |
| variable | секция alm |
| … | … |
| variable | секция alm |
| заголовок alm | |
| 0x04 | сигнатура (M7R\0) |
| 0x04 | размер заголовка alm (0x14) |
| 0x04 | некий размер (0x48+H*W*4) |
| 0x04 | количество секций |
| 0x04 | версия редактора (0x640) |
| секция alm | |
| 0x14 | заголовок секции alm |
| variable | данные секции alm |
| заголовок секции alm | |
| 0x04 | 7, иногда 5 (что это?) |
| 0x04 | размер заголовка секции alm (0x14) |
| 0x04 | размер данных секции (*) |
| 0x04 | id секции (не совпадает с порядком по умолчанию) |
| 0x04 | произвольное значение |
(*) Размер данных неверно задается редактором карт для секции c id=0.
| данные секции 1 (id=0) (общая информация) | |
| 0x04 | ширина карты (W) |
| 0x04 | высота карты (H) |
| 0x04 | отрицательный угол солнца (float, -45..45) |
| 0x04 | время суток в минутах |
| 0x04 | антияркость (0x00-0x40) |
| 0x04 | контрастность (0x00-0x40) |
| 0x04 | флаги присутствия типов ландшафта (useTiles) |
| 0x04 | количество игроков в секции 5 |
| 0x04 | количество строений в секции 7 (*) |
| 0x04 | количество юнитов в секции 10 |
| 0x04 | суммарное количество триггеров, проверок и инструкций (instance) |
| 0x04 | количество мешков в секции 9 |
| 0x04 | количество групп в секции 12 |
| 0x04 | количество описаний таверн в секции 6 |
| 0x04 | количество описаний магазинов в секции 6 |
| 0x04 | количество описаний указателей в секции 6 |
| 0x04 | количество записей о музыке в секции 13 |
| 0x40 | название карты |
| 0x04 | рекомендуемое число игроков |
| 0x04 | уровень карты |
| 0x04 | 0 (что это?) |
| 0x04 | 60,000,000, иногда 90,000,000 (что это?) |
| 0x200 | автор карты |
(*) Таверны и лавки записываются в обе секции: (6 и 7)
| данные секции 2 (id=1) (ландшафт) | |
| 0x02 | флаги | id тайла в данной клетке (всего W*H) |
| … | … |
| 0x02 | флаги | id тайла в данной клетке (всего W*H) |
Примечание. tile_id = raw & 0x3FF, флаги: 0x2000 — клетка не проходима
| данные секции 3 (id=2) (высоты) | |
| 0x01 | высота данного узла (всего W*H) |
| … | … |
| 0x01 | высота данного узла (всего W*H) |
| данные секции 4 (id=3) (объекты) | |
| 0x01 | id объекта в данной клетке (всего W*H) |
| … | … |
| 0x01 | id объекта в данной клетке (всего W*H) |
| данные секции 5 (id=5) (игроки) | |
| 0x4C | данные игрока |
| … | … |
| 0x4C | данные игрока |
| данные игрока | |
| 0x04 | цвет игрока |
| 0x04 | флаги (1 — AI, 2 — quest kill) |
| 0x04 | деньги игрока |
| 0x20 | имя игрока |
| 0x02 | дипломатия относительно каждого игрока (всего 16) — флаги (0x01 — враг, 0x02 — друг, 0x10 — вид) |
| … | … |
| 0x02 | дипломатия относительно каждого игрока (всего 16) — флаги (0x01 — враг, 0x02 — друг, 0x10 — вид) |
| данные секции 6 (id=11) (опции) | |
| 0x0C | описание данной таверны |
| … | … |
| 0x0C | описание данной таверны |
| 0x54 | описание данного магазина |
| … | … |
| 0x54 | описание данного магазина |
| 0x0C | описание данного указателя |
| … | … |
| 0x0C | описание данного указателя |
Примечание. В файле могут находиться описания несуществующих строений
| описание таверны | |
| 0x04 | id постройки |
| 0x04 | флаги (0x02 — delivery item, 0x04 — raise dead, 0x10 — kill all (humans), 0x20 — kill all (monsters), 0x40 — kill all (undead/necro) |
| 0x04 | delivery item id (если не задано, то -1) |
| описание указателя | |
| 0x04 | id постройки |
| 0x04 | флаг instanceOn |
| 0x04 | instance id |
| описание лавки | |||||
| 0x04 | id постройки | ||||
| 0x04 | флаги вещей на полке 1
|
||||
| 0x04 | флаги вещей на полке 2 | ||||
| 0x04 | флаги вещей на полке 3 | ||||
| 0x04 | флаги вещей на полке 4 | ||||
| 0x04 | минимальная цена (полка 1) | ||||
| 0x04 | минимальная цена (полка 2) | ||||
| 0x04 | минимальная цена (полка 3) | ||||
| 0x04 | минимальная цена (полка 4) | ||||
| 0x04 | максимальная цена (полка 1) | ||||
| 0x04 | максимальная цена (полка 2) | ||||
| 0x04 | максимальная цена (полка 3) | ||||
| 0x04 | максимальная цена (полка 4) | ||||
| 0x04 | максимальное число предметов (полка 1) | ||||
| 0x04 | максимальное число предметов (полка 2) | ||||
| 0x04 | максимальное число предметов (полка 3) | ||||
| 0x04 | максимальное число предметов (полка 4) | ||||
| 0x04 | максимальное число однотипных предметов (полка 1) | ||||
| 0x04 | максимальное число однотипных предметов (полка 2) | ||||
| 0x04 | максимальное число однотипных предметов (полка 3) | ||||
| 0x04 | максимальное число однотипных предметов (полка 4) | ||||
| данные секции 7 (id=4) (постройки) | |
| 0x14 | данные постройки |
| … | … |
| 0x14 | данные постройки |
Примечание. Если секция пуста, она не записывается.
| данные постройки | |
| 0x04 | (x << 0x10) + 0x80 |
| 0x04 | (y << 0x10) + 0x80 |
| 0x04 | type id постройки |
| 0x02 | здоровье постройки |
| 0x04 | id игрока |
| 0x02 | id постройки |
| 0x04 | ширина моста (*) |
| 0x04 | высота моста (*) |
Примечания. Поля (*) существуют только при typeid & 0x1000000
| данные секции 8 (id=9) (эффекты) | |
| 0x04 | количество эффектов |
| variable | данные эффекта |
| … | … |
| variable | данные эффекта |
| данные эффекта | ||
| эффект вещи | эффект ловушки (trap) | |
| 0x04 | effect id (начиная с 0), видимо, не используется | |
| 0x04 | 0 | trap x |
| 0x04 | 0 | trap y |
| 0x02 | урон магией … (0, 1-5) | флаги: 1 — from structure, 2 — to unit |
| 0x02 | минимальный урон магией | structure id (4 байта) |
| 0x02 | разброс урона магии | |
| 0x02 | type id заклинания (либо 0) | |
| 0x02 | сила заклинания (0-100) | |
| 0x04 | количество модификаторов | всегда 2 |
| 0x06 | данные модификатора | spell src x (2 байта) |
| spell src y (4 байта) | ||
| … | … | spell dest x (2 байта) |
| spell dest y (4 байта) | ||
| 0x06 | данные модификатора | |
| данные модификатора эффекта | |
| 0x02 | тип модификатора |
| 0x04 | значение модификатора |
| данные секции 9 (id=8) (мешки) | |
| variable | данные мешка |
| … | … |
| variable | данные мешка |
| данные мешка | |
| 0x04 | количество предметов в мешке |
| 0x04 | id юнита, в котором мешок (или 0, если просто мешок) |
| 0x04 | x |
| 0x04 | y |
| 0x04 | количество золота в мешке |
| 0x0A | данные предмета |
| … | … |
| 0x0A | данные предмета |
| данные предмета | |
| 0x04 | id предмета |
| 0x02 | признак wielded |
| 0x04 | номер присоединенного эффекта, начиная с 1 (в секции 8) |
| данные секции 10 (id=6) (юниты) | |
| 0x30 | данные юнита |
| … | … |
| 0x30 | данные юнита |
Примечание. Если секция пуста, она не записывается.
| данные юнита | |
| 0x04 | (x << 0x10) + 0x80 |
| 0x04 | (y << 0x10) + 0x80 |
| 0x02 | typeId |
| 0x02 | face |
| 0x04 | флаги (0x10 — isHuman) |
| 0x04 | флаги (01 — quest kill, 02 — quest intercept, 04 — quest escort, 08 — no xp for kill) |
| 0x04 | тип юнита (serverId) |
| 0x04 | id игрока |
| 0x04 | id вложенного мешка |
| 0x04 | поворот юнита (0 — С, 2 — СЗ, 4 — З, 6 — ЮЗ, 8 — Ю…) |
| 0x02 | HP |
| 0x02 | max HP |
| 0x04 | id юнита |
| 0x04 | id группы |
| данные секции 11 (id=7) (логика) | |
| 0x04 | количество инстанций (кто найдет перевод лучше пишите) |
| 0x31С | данные инстанции |
| … | … |
| 0x31С | данные инстанции |
| 0x04 | количество проверок (кто найдет перевод лучше пишите) |
| 0x31С | данные проверки |
| … | … |
| 0x31С | данные проверки |
| 0x04 | количество триггеров |
| 0xB8 | данные триггера |
| … | … |
| 0xB8 | данные триггера |
| данные инстанции (instance) | |
| 0x40 | название |
| 0x04 | instance type id (начиная с 1) |
| 0x04 | instance index (начиная с 1) |
| 0x04 | execute once flag |
| 0x04 | значение данного аргумента instance (всего 10) |
| … | … |
| 0x04 | значение данного аргумента instance (всего 10) |
| 0x04 | тип данного аргумента instance (всего 10) 1 — число, индекс 2 — group 3 — player 4 — unit 5 — x 6 — y 8 — item 9 — building см. Description checks/instants.ini |
| … | … |
| 0x04 | тип данного аргумента instance (всего 10) |
| 0x40 | название данного аргумента instance (всего 10) |
| … | … |
| 0x40 | название данного аргумента instance (всего 10) |
| данные проверки (check) | |
| 0x40 | название |
| 0x04 | check type id (начиная с 1) |
| 0x04 | check index (начиная с 1) |
| 0x04 | execute once flag |
| 0x04 | значение данного аргумента check (всего 10) |
| … | … |
| 0x04 | значение данного аргумента check (всего 10) |
| 0x04 | тип данного аргумента check (всего 10), см. данные instance |
| … | … |
| 0x04 | тип данного аргумента check (всего 10) |
| 0x40 | название данного аргумента check (всего 10) |
| … | … |
| 0x40 | название данного аргумента check (всего 10) |
| данные триггера | |
| 0x04 | check 1 id |
| 0x04 | check 2 id |
| 0x04 | check 3 id |
| 0x04 | check 4 id |
| 0x04 | check 5 id |
| 0x04 | check 6 id |
| 0x04 | instance 1 id |
| 0x04 | instance 2 id |
| 0x04 | instance 3 id |
| 0x04 | instance 4 id |
| 0x04 | check 1/2 operator 0 — ‘=’ 1 — ‘!=’ 2 — ‘>’ 3 — ‘<‘ 4 — ‘>=’ 5 — ‘<=’ |
| 0x04 | check 3/4 operator |
| 0x04 | check 5/6 operator |
| 0x04 | run once flag |
| данные секции 12 (id=10) (группы) | |
| 0x10 | данные группы |
| … | … |
| 0x10 | данные группы |
| данные группы | |
| 0x04 | id группы |
| 0x04 | repop time |
| 0x04 | flags (01 — ai instant enabled, 02 — random positions, 04 — quest kill, 08 — quest intercept) |
| 0x04 | instance id (если не выбрано, то -1) |
| данные секции 13 (id=12) (музыка) | |
| 0x1C | запись о музыке по умолчанию |
| 0x1C | данная запись о музыке |
| … | … |
| 0x1C | данная запись о музыке |
Примечание. Количество записей о музыке из секции 1 не включает запись по умолчанию.
| запись о музыке | |
| 0x04 | x |
| 0x04 | y |
| 0x04 | радиус |
| 0x04 | type id мелодии 1 (-1, если не задано) |
| 0x04 | type id мелодии 2 (-1, если не задано) |
| 0x04 | type id мелодии 3 (-1, если не задано) |
| 0x04 | type id мелодии 4 (-1, если не задано) |