WarCraft 3: Inside W3M Files

» Раздел: Работа с MPQ и импортом

Внутреннее устройство файла w3m (карты).

Архив содержит следующие файлы:
  • (listfile)
  • (attributes)
  • war3map.w3e
  • war3map.w3i
  • war3map.wtg
  • war3map.wct
  • war3map.wts
  • war3map.j
  • war3map.shd
  • war3mapMap.blp
  • war3map.mmp
  • war3map.wpm
  • war3map.doo
  • war3mapUnits.doo
  • war3map.w3r
  • war3map.w3c
  • war3map.w3u
  • war3mapImported (папка)

Назначение файлов:

(listfile)

Список всех входящих в архив файлов, представлен в обычном текстовом виде.

war3map.j

Здесь, на языке JASS2, который придумали в Blizzard, записаны все тригеры, которые есть в карте. Для получения информации о синтаксисе языка читайте статью Sergey-я о текстовых тригерах.

war3map.w3e

Здесь содержится информация о текстурировании поверхности. В этом и остальных последующих файлах для редактирования надо открыть не обычным блокнотом (он покажет всякую ерунду), а в шестнадцатеричной кодировке (Hex). Вся поверхность разбивается на одинаковые квадраты и каждой из четырёх точек квадрата присваивается определённый тип текстуры. При этом точка отвечает за прилегающую к ней четверть квадрата. Заголовок:
ТипЗначениеОписание
символW3E!символьное значение, обязательный элемент, обозначающий тип файла
целое0B 00 00 00версия формата 11 (целое число всегда занимает 4 байта)
символглавная текстура. Возможны следующие варианты:
AAshenvale
BBarrens
CFelwood
DDungeon
FLordaeron Fall
GUnderground
LLordaeron Summer
NNorthrend
QVillage Fall
VVillage
WLordaeron Winter
XDalaran
YCityscape
целое0 или 1используются ли custom tilesets
целое1..16количество используемых текстур земли
строкаID используемых текстур земли. Например "Ldrt" означает "Lordaeron Summer Dirt". Для получения полного списка ID текстур земли, откройте файл Terrain.slk, находящийся в директории TerrainArt в war3.mpq.
целое1..16количество используемых текстур утёсов
строкаID используемых текстур утёсов. Например "CLdi" означает "Lordaeron Cliff Dirt". Для получения полного списка ID текстур утёсов, откройте файл CliffTypes.slk, находящийся в директории TerrainArt в war3.mpq.
целоеширина карты + 1
целоевысота карты + 1
дробное десятичноесмещение центра карты по X
дробное десятичноесмещение центра карты по Y
Эти параметры определяют местоположение центра карты, который нужен для технических целей. Начало координат находится в нижнем левом углу. По умолчанию центр координат сдвигается в геометрический центр карты.
Далее идёт непосредственно сама информация о текстурировании карты. Там в принципе ничего интересного нет, так как всё, что можно сделать вручную в этом файле, можно сделать и в самом редакторе.

war3map.shd

Не содержит заголовка, только рабочую информацию. Размер файла = 16x<ширина_карты>x<высота_карты>. Один байт может иметь значение: 00 - нет тени, FF - есть тень. Каждый квадрат текстуры (земли или утёса) содержит 16 квадратов тени (4*4).

war3map.wpm

Обозначает на карте места с разной степенью проходимости. На каждый текстурный квадрат приходится по 16 квадратов проходимости. Заголовок:
ТипЗначениеОписание
символMP3Wсимвольное значение, обязательный элемент, обозначающий тип файла
целоеверсия файла
целое<ширина_текстурной_карты>x4ширина карты проходимости
целое<высота_текстурной_карты>x4высота карты проходимости
В главной части один за одним идут байты, соответствующие квадратам проходимости. Их значениям соответствуют:
  • 00 - мост
  • 08 - неглубокая вода
  • 0A - глубокая вода
  • 40 - нормальная земля
  • 48 - места, где нельзя строить
  • CA - места, где нельзя ходить и строить
  • CE - граница карты

war3map.doo

Информация по деревьям.

war3mapUnits.doo

Информация по предметам и дудадам.

war3map.w3i

Различная информация по карте, которая задаётся в едиторе в разделе сценарий.

war3map.wts

Здесь хранятся строковые значения введённые в некоторых полях тригеров.

war3mapMap.blp

Изображение миникарты.

war3map.mmp

The menu minimap - оформление значками миникарты, появляющейся при загрузке карты. Заголовок:
ТипЗначениеОписание
целое0неизвестно, что означает, но обычно = 0
целоеколичество значков
Главная часть. На каждый значок приходится по 16 байт:
ТипЗначениеОписание
целоетип значка
00золотая шахта
01нейтральное здание
02стартовая точка игрока
целоекоодината значка по Х
целоекоодината значка по Y
Примеры:
10, 10сверху слева
80, 80по центру
F0, F0снизу справа
целоеПоследние 4 байта блока первого значка - цвет в формате СС ЗЗ КК АА = синий, зелёный, красный, альфа канал.
03 03 FF FFкрасный
FF 42 00 FFсиний
B9 E6 1C FFголубой
81 00 54 FFпурпурный
00 FC FF FFжёлтый
0E 8A FE FFоранжевый
00 C0 20 FFзелёный
B0 5B E5 FFрозовый
97 96 95 FFсветло серый
F1 BF 7E FFсветло голубой
46 62 10 FFголубой
04 2A 49 FFкоричневый
FF FF FF FFнет цвета

war3map.w3u

Здесь хранятся данные о всех самодельных юнитах (custom units).

war3map.wtg

Здесь хранятся все внутренние имена тригеров и переменных, которые редактор автоматически генерирует.

war3map.w3c

Здесь задаются все те параметры камеры, которые доступны в редакторе при открытии свойств камеры.

war3map.w3r

Параметры регионов. Тоже ничего новенького, интересного или чего-то такого, чего нельзя было бы задать через редактор.

war3map.w3s

Задаются звуки. Стандартные параметры.

war3map.wct

Здесь записываются текстовые тригеры. Так как они отличаются по своей структуре от обычных тригеров, то для их описания был создан специальный файл - это он. В текстовом виде они и задаются в этом файле. Или что-то в этом роде.

war3map.imp

А вот этот файл уже кое-чем интересен. Он появляется внутри архива w3m только если в едиторе был экспортирован в карту хотя бы один звук или музыка. Если это было сделано, то в w3m появляется экспортированный файл в папке war3mapImported, а также создаётся файл war3map.imp, в котором делается запись об экспортированном объекте. Структура записи:
ТипЗначениеОписание
целое0 или 1версия файла, это несущественный параметр, дающий только информацию для пользователя (не так уж и нужную на мой взгляд).
целоеколичество импортированных файлов.
Главная часть.
ТипЗначениеОписание
целое5, 8, 10, 13Если 5 или 8, то файл имеет стандартный путь war3mapImported\<имя_файла>, если 10 или 13, то нестандартный.
строкаПуть к импортированному файлу.
символ#0в конце строки нулевой символ.

Автор оригинала: Zepir

Просмотров: 16 936

» Лучшие комментарии


ДейЛак #1 - 9 лет назад 1
А как скопировать файл из одной карты в другую?
RazArt #2 - 9 лет назад 1
Чераз WinMPQ можно
Vellear #3 - 9 лет назад 1
Сначало извлекаешь из одной карты, потом добавляешь в другую через Add File.
2 комментария удалено
Sauron911 #6 - 8 лет назад 3
МММ помогло чем то
PlayerDark #7 - 8 лет назад 3
здесь кстати не пояснен формат imp. там перед началом имени каждого импортированного файла записан один байт. Если 08, значит файл имеет стандартный путь, если 0D - значит нестандартны (галочка в редкаторе).
Rehan #8 - 7 лет назад 1
war3map.w3e
Там на все целочисленные значения уделяется 4 байта?
Подскажите прогу, которой можно извлекать файлы из архива.
Есть информация о файле, содержащем высоты ландшафта и о том, как эди данные считывать?
SDreary #9 - 7 лет назад 1
В каком файле находятся способности героя (магия) если war3map.w3u файла нет?
grinja88 #10 - 6 лет назад 1
Спасибо, очень помогло, делал протект карты, без этой статьи было бы сложно!
Cancel #11 - 3 года назад 0
Как можно получить доступ к карте высот? Дабы изменять высотку различных ячеек ландшафта.
J64_ #12 - 3 года назад 1
Cancel:
Как можно получить доступ к карте высот? Дабы изменять высотку различных ячеек ландшафта.
Вот ссылка, там подробно описано на английском world-editor-tutorials.thehelper.net/cat_usersubmit.php?view=427...
Cancel #13 - 3 года назад 0
Вот ссылка, там подробно описано на английском
Спасибо!
Этот не ловкий момент когда ты ноль в английском...
alexprey #14 - 3 года назад (отредактировано ) 1
Cancel, в общем вот:
там где идет речь про w3e файл:
» Англ
Data:
Each tilepoint is defined by a block of 7 bytes.
The number of blocks is equal to Mx*My.
short: ground height
C000h: minimum height (-16384)
2000h: normal height (ground level 0)
3FFFh: maximum height (+16383)
short: water level + map edge boundary flag*(see notes)
4bit: flags*(see notes)
4bit: ground texture type (grass, dirt, rocks,...)
1byte: texture details (of the tile of which the tilepoint is the bottom left corner) (rocks, holes, bones,...). It appears that only a part of this byte is used for details. It needs more investigations
4bit: cliff texture type
4bit: layer height

*flags notes:
Flags values (shown as big endian):
 0x4000 --> boundary flag 1 (shadow generated by the world editor on the edge of the map)
 0x0010 --> ramp flag (used to set a ramp between two layers)
 0x0020 --> blight flag (ground will look like Undead's ground)
 0x0040 --> water flag (enable water)
 0x0080 --> boundary flag 2 (used on "camera bounds" area. Usually set by the World Editor "boundary" tool.)

Water level:
Water level is stored just like ground height. The highest bit (bit 15) is used for the boundary flag 1.

Tilepoint data example:
51 21 00 62 56 84 13
51 21 --(little endian)--> 0x2151 --(hex-->dec)--> height = 8529
00 62 --(little endian)--> 0x6200
 (extract boundary flag)--> (0x6200 & 0xC000) = 0x4000 boundary flag set
 (extract water data)--> (0x6200 & 0x3FFF) = 0x2200 --(hex-->dec)--> water level = 8704
56 --> 5 sets both water flag and ramp flag, 6 means tilepoint is using ground type #6 in the tilesets table
84 --> means tilepoint is using detail texture #132 (=0x084)
13 --> 1 means cliff type #1 (cliff tilesets table), 3 means tilepoint on layer "3"
The tilepoint "final height" you see on the WE is given by:
(ground_height - 0x2000 + (layer - 2)*0x0200)/4
where "0x2000" is the "ground zero" level, 2 the "layer zero" level and "0x0200" the layer height
 = (0x2151 - 0x2000 + 1*0x0200)/4
 = (8529 - 8192 + 512)/4
 = 212,25

The tilepoint "water level" you see on the WE is given by:
(water_level - 0x2000)/4 - 89.6
where "0x2000" is the "ground zero" level, -89.6 is the water zero level (given by the water.slk file height = -0,7 --> water_zero_level = -0,7*128):
 = 8704/4 - 89,6
 = 38,4

In this case, water flag is set and water level is below the ground level so we will not see the water. This is just an example and I don't think you can find such a tilepoint on a map. It was just here for demonstration purpose.
Русский чуть позже
awesomesk1ll #15 - 3 года назад (отредактировано ) 3
alexprey:
Русский чуть позже
» Русский
Данные:
Каждая точка ландшафта (tilepoint) состоит из блока 7 байтов.
Число таких блоков еквивалентно Mx*My. (число всех тайлов в карте)
В эти 7 байт записывается:
  • short int: Высота земли:
C000h: минимальная высота (-16384)
2000h: высота равная нулю (ground level 0)
3FFFh: максимальная высота (+16383)
short int - Это короткая целочисленная
Короткие целочисленные размещаются используя 2 байта в "Little Endian" (зеркальном или хм.. перевёрнутом?) порядке.
Они близки к C++ "signed short" типу но их диапазон чисел от -16384 до 16383. Имеется ввиду что 2 верхних бита свободны для использования под флаг, например.
пример little endian - число 0x2151 в хексе представляется как 51 21
  • short int: уровень воды + привязка края карты (map edge boundary flag) *(см заметки)
  • 4 бита: флаги*(см заметки)
  • 4 бита: тип текстуры земли (трава, почва, камни)
  • 1 байт: детали текстур (какая именно текстура из нескольких будет отрисовываться из нижнего левого угла квадрата тайла) (камни, дыры, кости,...). Получается что только часть этого байта используется для информации о деталях. Необходимо подробное изучение этого момента.
  • 4 бита: тип текстуры клиффа (склоны? или как их назвать, в общем обрамление разных этажей ландшафта)
  • 4 бита: высота слоя
*заметки:
Флаговые значения (выглядит как big endian):
0x4000 --> привязочный флаг 1 (тень генерируемая World Editor'ом на краях карты)
0x0010 --> флаг наклона (используется для установки наклона между двумя слоями)
0x0020 --> флаг проклятия (земля будет проклятой нежитью)
0x0040 --> флаг воды (включает воду)
0x0080 --> привязочный флаг 2 (используемый привязками камеры "camera bounds". Обычно устанавливается World Editor'ской привязочной "boundary" утилитой.)

Уровень воды:
Уровень воды хранится так же как уровень высоты земли. Высший бит (bit 15) используется для привязочного флага 1.

Пример информации одной точки тайла (Tilepoint):
51 21 00 62 56 84 13
51 21 --(little endian)--> 0x2151 --(hex-->dec)--> высота = 8529
00 62 --(little endian)--> 0x6200
(узнаем привязочный флаг)--> (0x6200 & 0xC000) = 0x4000 установка привязочного флага
(узнаем уровень воды)--> (0x6200 & 0x3FFF) = 0x2200 --(hex-->dec)--> уровень воды = 8704
56 --> 5 устанавливает оба флага воды и наклона (4+1), 6 говорит о том что тайлпоинт использует тайлсет земли #6 из набора тайлсетов (это подземелье)
84 --> означает что тайлпоинт использует детальную текстуру #132 (=0x084)
13 --> 1 означает тип клиффа #1 (из таблицы клиффов тайлсетов), 3 говорит о том что наша точка тайла располагается на 3ьем слое (layer)

Итоговая высота "final height" которую вы видите в редакторе WE расчитывается как:
(высота земли - 0x2000 + (слой - 2)*0x0200)/4
где "0x2000" это нулевой "ground zero" уровень земли, 2 это "layer zero" нулевой слой и "0x0200" это высота слоя
= (0x2151 - 0x2000 + 1*0x0200)/4
= (8529 - 8192 + 512)/4
= 212,25
ТайлсетОбозначение
AAshenvale
BBarrens
CFelwood
DDungeon
FLordaeron Fall
GUnderground
LLordaeron Summer
NNorthrend
QVillage Fall
VVillage
WLordaeron Winter
XDalaran
YCityscape
ZSunken Ruins
IIcecrown
JDalaran Ruins
OOutland
KBlack Citadel
Точка воды "water level" которую вы видите в WE расчитывается:
(уровень воды - 0x2000)/4 - 89.6
где "0x2000" это нулевой"ground zero" уровень земли, -89.6 это нулевой уровень воды (данный в water.slk файле, высота = -0,7 --> water_zero_level = -0,7*128):
= 8704/4 - 89,6
= 38,4
В данном конкретном случае, флаг воды установлен, но уровень воды будет ниже уровня земли, получается мы не увидим воду. Это всего лишь пример, и я думаю вы не найдёте такого тайлпоинта внутри карты. Это только для примера.
Перевод изложил со своей точки зрения.. местами дополнив информацией из других мест и своими соображениями. Возможно я что-то не так понял где-то...
Вообще информация довольно интересная).
Cancel #16 - 3 года назад 0
Ребята, спасибо, вы все очень помогли!
Пришлите мне в лс свои имена (или ники) которые можно будет вставить в благодарности генератора.
Cancel #18 - 3 года назад 0
ники как бы написаны вверху комента
"имена (или ники)" "как бы" пусть сами решают что из двух следует указать
Это сообщение удалено