Таблица 1. Тайлы ландшафта и объектов ландшафта
TIL name | Кол-во кадров (d) | Описание | Кадры |
---|---|---|---|
GROUND32.TIL | 124 | Тайлы ландшафта | GROUND32.TIL.pdf |
ICN ID (h) | ICN name | Кол-во кадров (d) | Описание | Кадры |
---|---|---|---|---|
00 | OBJ32-00.ICN | 74 | 1-я группа тайлов: тайлы объектов водного ландшафта | 00 - OBJ32-00.ICN.pdf |
01 | OBJ32-01.ICN | 124 | 2-я группа тайлов: тайлы объектов травяного ландшафта | 01 - OBJ32-01.ICN.pdf |
02 | OBJ32-02.ICN | 37 | 3-я группа тайлов: тайлы объектов снежного ландшафта | 02 - OBJ32-02.ICN.pdf |
03 | OBJ32-03.ICN | 35 | 4-я группа тайлов: тайлы объектов болотного ландшафта | 03 - OBJ32-03.ICN.pdf |
04 | OBJ32-04.ICN | 95 | 5-я группа тайлов: тайлы объектов лавового ландшафта | 04 - OBJ32-04.ICN.pdf |
05 | OBJ32-05.ICN | 35 | 6-я группа тайлов: тайлы объектов пустынного ландшафта | 05 - OBJ32-05.ICN.pdf |
06 | OBJ32-06.ICN | 41 | 7-я группа тайлов: тайлы объектов земляного ландшафта | 06 - OBJ32-06.ICN.pdf |
07 | OBJ32-07.ICN | 168 | 8-я группа тайлов: тайлы общих объектов | 07 - OBJ32-07.ICN.pdf |
08 | MTN32.ICN | 132 | 9-я группа тайлов: тайлы гор | 08 - MTN32.ICN.pdf |
09 | TREE32.ICN | 101 | 10-я группа тайлов: тайлы деревьев | 09 - TREE32.ICN.pdf |
0A | TOWN32.ICN | 120 | 11-я группа тайлов: тайлы городов и замков | 0A - TOWN32.ICN.pdf |
0B | RSRC32.ICN | 89 | 12-я группа тайлов: тайлы шахт, Города драконов, Маяка и ресурсов | 0B - RSRC32.ICN.pdf |
0C | MONS32.ICN | 34 | 13-я группа тайлов: тайлы монстров | 0C - MONS32.ICN.pdf |
0D | ART32.ICN | 38 | 14-я группа тайлов: тайлы артефактов | 0D - ART32.ICN.pdf |
0E | FLAG32.ICN | 28 | 15-я группа тайлов: тайлы флагов | 0E - FLAG32.ICN.pdf |
* * *
Сначала рисуются тайлы ландшафта (Cлой/Layer 0), затем - тайлы объектов ландшафта на заднем плане (Cлой/Layer 1), следом идут герои и корабли, а последними - тайлы объектов ландшафта на переднем плане (Cлой/Layer 2). Т.о. герои и корабли закрывают тайлы слоёв 0 и 1 (рисуются поверх них), а тайлы слоя 2 закрывают героев и корабли.
Двумерный массив структур клеток карты имеет размер 72х72 (TTile Tile[72][72]) и расположен по смещению 3E6h в файле сохранения и по смещению 55Аh в файле карты (по смещению 6 в файлах карт кампаний и карт без заголовка). Структура клетки карты (TTile) состоит из 10 однобайтовых полей, т.о. размер этой структуры равен 10 байтам. Первое поле структуры - номер тайла ландшафта, второе и третье поля содержат информацию о слое 1: номер графического ресурса ICN и номер тайла объекта ландшафта внутри этого ICN соответственно, четвёртое и пятое - аналогичную информацию о слое 2. Если слой отсутствует, поля слоя получают значения 00 FF.
Однако есть один нюанс: флажки, которыми обозначается принадлежность объекта игроку, рисуются после слоя 1 или 2 (в зависимости от того, где находятся). В этом случае номер графического ресурса ICN, содержащего флажки, - 0Eh - помещается в старший полубайт второго (для слоя 1) или четвёртого (для слоя 2) поля структуры TTile.
Например, на рисунке ниже отмеченный тайл замка находится в графическом ресурсе TOWN32.ICN, который имеет порядковый номер 0Ah (см. таблицу выше), и лежит в первом слое, поэтому значение второго поля структуры клетки будет равно 0Ah. А вот значение второго поля струкруры клетки справа от отмеченного тайла будет равно 0EAh, т.к. клетка содержит флаг игрока. Аналогично для лесопилки: 0Вh и 0EBh для клеток крыши лесопилки без флага и с флагом соответственно. Только в случае лесопилки эти значения будут записаны в четвёртое поле структуры клетки, т.к. тайлы находятся во втором слое (крыша лесопилки закрывает героя).
Каким образом игра и редактор карт узнают, какой именно флаг им рисовать? За это (и не только за это) отвечают шестой и седьмой байты структуры клетки. Седьмой байт является битовым полем, т.е. в нём хранятся различные флаги (в данном случае - битовые флаги), которые характеризуют тайл: 76543210. Бит 0 этого поля отвечает за зеркальное отражение тайла ландшафта по вертикали, а бит 1 - по горизонтали. Если же установлен бит 4, то тайл имеет флаг, а порядковый номер флага (ID) внутри ICN с флагами попадает в шестой байт структуры клетки.
Таблица 2. Битовые флаги седьмого поля (Flags) структуры клетки TTile
№ бита | Описание |
---|---|
0 | Зеркальное отражение тайла ландшафта по вертикали |
1 | Зеркальное отражение тайла ландшафта по горизонтали |
2 | Тайл объекта ландшафта в слое 1 требует анимацию * |
3 | Тайл объекта ландшафта в слое 2 требует анимацию * |
4 | Поверх тайла расположен ещё один тайл в слое 1 ** |
5 | Поверх тайла расположен ещё один тайл в слое 2 ** |
6 | На клетке расположен активный герой (в том числе и на корабле) *** |
7 | На клетке расположен декоративный объект 32h (цветы, камни, ямы от раскопок и т.п.) *** |
* Монстры считаются анимированными по умолчанию и не требуют установленных флагов анимации.
** Порядковый номер (ID) графического ресурса ICN попадает в старший полубайт второго (для слоя 1) / четвёртого (для слоя 2) поля структуры клетки, номер тайла объекта ландшафта внутри ICN попадает в шестой байт. Примеры: флаг игрока у ворот города/замка, тележка с ресурсами в шахтах (слой 1), флаг игрока над шахтами, городом драконов, маяком (слой 2).
*** Этот флаг устанавливается уже в игре: бит 6 устанавливается в 1 при получении фокуса героем и сбрасывается при потере (в т.ч. при скроллинге карты). Скорее всего, чисто технический флаг, связанный, например, с кастом Dimension Door (игра определяет по этому флагу, нужно ли центрировать героя), бит 7 - для всех одноклеточных декоративных объектов c ID = 32h (тоже технический флаг, связанный с отрисовкой тайла; в частности, пропускает анимацию монстров).
В восьмом и девятом полях находятся ID объектов, полностью или частично расположенных на клетке. Если на клетке расположен только один объект, его ID попадает в девятое поле, если два - ID объекта на переднем плане попадает в восьмое поле, а объекта на заднем - в девятое. Не следует путать ID объекта и ID тайлов этого объекта. Объект - это совокупность всех его тайлов. Так, например, объект "Лаборатория алхимика" имеет ID = 1 и состоит из 10 тайлов: 4-х статичных и 6-ти тайлов анимации, каждый из которых имеет свой уникальный ID. Далее, при клике правой кнопкой мыши на любом из тайлов объекта отображается название объекта, общее для всех тайлов, из которых этот объект состоит (однако если на клетке расположены тайлы двух разных объектов, то подсказка отображается для объекта на заднем плане). Также восьмое поле отвечает за проходимость: если в нём установлен бит 7, то такой тайл непроходим.
Тайл объекта может быть интерактивным (обычно это клетка-вход в объект: ворота города/замка, вход в шахту и т.д.). Многие одноклеточные объекты являются интерактивными: жилища существ, присоединяющихся бесплатно, сундуки с сокровищами, кучки ресурсов и т.д. В многоклеточных объектах обычно только одна интерактивная клетка. В девятом поле (ObjectID) любой интерактивной клетки объекта установлен бит 7. Клетка объекта, в поле ObjectID которого этот бит не установлен, не является интерактивной. Возвращаясь к примеру с "Лабораторией алхимика": любой тайл этого объекта, кроме входа, имеет поле ObjectID равное 1, вход - 1 or 80h = 81h (установлен бит 7).
Довольно интересным примером объекта - причём невидимого - являются клетки, на которых можно высадиться с корабля: они имеют ID = 1Fh (назовём такой объект "якорем").
Иногда на картах и вовсе встречаются ошибки. Например, такая: вроде как, высадиться по всем правилам на клетке можно, а на практике не получается. Смотрим поле ObjectID и видим, что там находится невидимый Маяк. Скорее всего, при его удалении в редакторе карт возникнул баг (клетка 58:56 на карте "Остров песка"). Также существует известная "багофича", когда после взятия кучки ресурсов/сундука с сокровищами/артефакта, лежащего на берегу, клетка становится недоступной для высадки. Если посмотреть на восьмое поле структуры такого тайла, то можно увидеть, что в нём не хранится "якорь" (1Fh), который должен помещаться в девятое поле тайла после исчезновения с карты объекта на переднем плане.
В последнем - десятом - поле структуры клетки карты хранятся различные характеристики объекта (иногда в запакованном виде). В общем случае каждый объект по-разному хранит свои характеристики. Например, десятое поле (поле PackedObjectInfo) тайла монстра хранит кол-во и лояльность отряда (отряд лоялен, если установлен бит 7), артефакта - тип его охраны или стоимость выкупа (1 - артефакт достанется бесплатно, 2 - придётся сразиться с 50 разбойниками, 3 - потребуется заплатить 2000 золотых) и т.п. В файле карты у тайлов объектов со случайным/переменным содержимым это поле остаётся пустым (00), оно заполняется уже игрой при загрузке карты.
Таблица 3. Идентификаторы и характеристики (содержимое) объектов
* * *
Вот как выглядит на карте неиспользуемый объект из OBJECT32.ICN и OVRLAY32.ICN, добавленный с помощью редактирования тайлов:
Вода во рву анимирована с помощью циклического сдвига цветов палитры. "Пощупать" этот объект можно, запаковав obj32-07.icn в heroes.agg и загрузив сейв Object32Demo.GM1 из следующего архива:
При желании к объекту можно привязать функционал и сменить название с помощью плагина.