Версия варкрафта для которой подходит статья: 1.32 и ниже
byte - 1 байт
short - 2 байта Little Endian
int - 4 байта Little Endian
float - IEEE 32bit Little Endian
char - однобайтовый символ
string - порядок байтов, заканчивающийся на '\0' (обыкновенная Си строка
short - 2 байта Little Endian
int - 4 байта Little Endian
float - IEEE 32bit Little Endian
char - однобайтовый символ
string - порядок байтов, заканчивающийся на '\0' (обыкновенная Си строка
Какой файл за что отвечает
war3map.imp | Информация об импорте |
war3map.j | Скрипт карты JASS2 |
war3map.lua | Скрипт карты Lua |
war3map.w3e | Информация о ландшафте |
war3map.shd | Информация о тенях |
war3map.doo | Информация о декорациях на карте |
war3mapUnits.doo | Информация о юнитах (войска/здания/предметы) на карте |
war3map.w3u | Информация об юнитах, в W3M картах используется только .w3u и в нем хранится информация об юнитах и предметах |
war3map.w3t | Информация о предметах |
war3map.w3b | Информация о разрушаемых объектах |
war3map.w3d | Информация о декорациях |
war3map.w3a | Информация о способностях |
war3map.w3h | Информация о бафах |
war3map.w3q | Информация об улучшениях |
.w3o | Информация для импорта в редактор объектов (не хранится внутри карты) |
war3map.w3s | Информация о звуках |
war3map.w3r | Информация об областях |
war3map.w3c | Информация о камерах |
war3map.w3i | Информация о карте |
war3map.wtg | Информация о триггерах |
war3map.wct | Информация о текстовых триггерах и нестандартном коде карты |
war3map.wts | Информация о строках |
war3mapMap.blp/.tga/.b00 | Изображение мини-карты |
war3mapPreview.tga | Превью карты |
war3mapMisc.txt | Информация об игровых константах |
war3mapSkin.txt | Информация об игровом интерфейсе |
war3mapExtra.txt | Дополнительная информация о карте |
war3map.mmp | Информация о значках мини-карты на стандартном загрузочном экране |
war3map.wpm | Информация о проходимости |
war3mapPath.tga | Информация о проходимости (устарела) |
war3map.mmp
Координаты значков начинаются сверху слева ((x=0,y=0) - это верхний левый угол)
int | Версия формата | 0 |
int | Кол-во значков | Переменная i |
i раз: | ||
int | Номер значка, см. номера значков | |
int | X координата (от 0 до 255) | |
int | Y координата (от 0 до 255) | |
byte | Цвет B | |
byte | Цвет G | |
byte | Цвет R | |
byte | Цвет A |
war3map.wpm
char[4] | Магическое число | MP3W |
int | Версия формата | 0 |
int | Ширина (ширина карты*4) | Переменная w |
int | Высота (высота карты*4) | Переменная h |
h раз: | ||
w раз: | ||
byte | Флаги, см. флаги |
Флаги
0x01 | Не используется, можно ставить 0 |
0x02 | Нельзя ходить |
0x04 | Нельзя летать |
0x08 | Нельзя строить |
0x10 | Не используется, можно ставить 0 |
0x20 | Порча |
0x40 | Нельзя плавать |
0x80 | Граница |
Чтение начинается слева снизу и заканчивается справа сверху
war3mapPath.tga
Ширина = ширина карта * 4
Высота = высота карты * 4
Высота = высота карты * 4
R - Ходьба
G - Полет
B - Постройка
G - Полет
B - Постройка
00 - можно
FF - нельзя
FF - нельзя
Цвет | Ходьба | Полет | Постройка |
---|---|---|---|
Белый (R=FF, G=FF, B=FF) | Нельзя | Нельзя | Нельзя |
Красный (R=FF, G=00, B=00) | Нельзя | Можно | Можно |
Желтый (R=FF, G=FF, B=00) | Нельзя | Нельзя | Можно |
Зеленый (R=00, G=FF, B=00) | Можно | Нельзя | Можно |
Бирюзовый (R=00, G=FF, B=FF) | Можно | Нельзя | Нельзя |
Синий (R=00, G=00, B=FF) | Можно | Можно | Нельзя |
Розовый (R=FF, G=00, B=FF) | Нельзя | Можно | Нельзя |
Черный (R=00, G=00, B=00) | Можно | Можно | Можно |
Альфа-канал используется для установки порчи (0x00 - порчи нету, 0xFF - порча есть)
war3map.imp
int | Версия формата | ROC=0, TFT=1 |
int | Количество импортированных файлов | Переменная i |
i раз: | ||
IF( Версия формата == 1 ) | ||
byte | Флаги, см. флаги | |
ENDIF | ||
string | Полный путь импортированного файла (если флагов нету, то нужно будет из пути извлечь только имя файла и дописать war3mapImported\) |
Флаги
0x01 | 0=нужно будет из пути извлечь только имя файла и дописать war3mapImported\, 1=будет отображаться полный путь импортированного файла (т.е нестандартный) |
0x02 | 0=ничего не значит, 1=пункт byte и string обнуляются при чтении |
0x04 | Неизвестно (можно игнорировать) |
0x08 | Неизвестно (можно игнорировать) |
0x10 | Неизвестно (можно игнорировать) |
При чтении нужно учитывать флаги, а при записи можно просто записать 1 вместо флагов
war3map.w3c
int | Версия формата | 0 |
int | Количество камер | Переменная i |
i раз: | ||
float | X | |
float | Y | |
float | Z | |
float | Поворот (в градусах) | |
float | Угол атаки (в градусах) | |
float | Расстояние | |
float | Крен | |
float | Поле зрения (в градусах) | |
float | Дальняя граница | |
float | Ближняя граница | |
IF( Версия варкрафта >= 1.31 ) | (см. в war3map.w3i) | |
float | Тангаж | |
float | Рыскание | |
float | Крен | |
ENDIF | ||
string | Название |
war3map.w3r
int | Версия формата | 5 |
int | Количество областей | Переменная i |
i раз: | ||
float | Влево | |
float | Вниз | |
float | Вправо | |
float | Вверх | |
string | Название | |
int | Номер области | |
char[4] | Равкод погоды | |
string | Фоновый звук | |
byte | Синий | |
byte | Зеленый | |
byte | Красный | |
byte | Прозрачность |
war3map.w3s
int | Версия формата | 1 |
int | Количество звуков | Переменная i |
i раз: | ||
string | Название глобальной переменной, пример: gg_snd_AltarOfKingsWhat1 | |
string | Путь до звука, пример: Buildings\Human\AltarOfKings\AltarOfKingsWhat1 | |
string | EAX эффект, см. EAX эффекты | |
int | Флаги, см. флаги | |
int | Усиление | |
int | Затухание | |
int | Громкость | |
float | Шаг | |
float | Неизвестно | |
int | Неизвестно | |
int | Канал, см. каналы | |
float | Мин. дистанция | |
float | Макс. дистанция | |
float | Дист. затухания | |
float | Неизвестно | |
float | Неизвестно | |
int | Неизвестно | |
float | Неизвестно | |
float | Неизвестно | |
float | Неизвестно |
EAX эффекты
DefaultEAXON или отсутствие строки | По умолчанию |
CombatSoundsEAX | Бой |
KotoDrumsEAX | Барабаны |
SpellsEAX | Заклинания |
MissilesEAX | Выстрелы |
HeroAcksEAX | Речь героя |
DoodadsEAX | Декорации |
Флаги
0x01 | Повтор |
0x02 | Позиционный звук |
0x04 | Останавливаться при выходе за пределы |
0x08 | Музыка |
0x10 | Звук импортированный |
Каналы
-1 | По умолчанию |
0 | Общий |
1 | Выбор |
2 | Подтверждение |
3 | Перемещение |
4 | Готовность |
5 | Бой |
6 | Ошибка |
7 | Музыка |
8 | Интерфейс пользователя |
9 | Повтор звука перемещения |
10 | Повтор фонового звука |
11 | Анимация |
12 | Постройка |
13 | Рождение |
14 | Огонь |
Если float равен этой константе:
const float DEFAULT = 4294967296.00; //0x4F800000
То должно использоваться значение по умолчанию
war3map.j
Скрипт карты на языке JASS2
Обыкновенный UTF-8 текстовик
Обыкновенный UTF-8 текстовик
war3map.lua
Скрипт карты на языке Lua
Обыкновенный UTF-8 текстовик
Обыкновенный UTF-8 текстовик
war3map.w3e
char[4] | Магическое число | 'W3E!' |
int | Версия формата | 11 |
char | Базовый тип ландшафта | см. типы ландшафта |
int | Нестандартный тип ландшафта | 0 = не используется, 1 = используется |
int | Количество используемых тайлсетов | Переменная i |
char[i*4] | Равкоды используемых тайлсетов | Список см. в "TerrainArt\Terrain.slk" |
int | Количество используемых тайлсетов склонов | Переменная i |
char[i*4] | Равкоды используемых тайлсетов склонов | Список см. в "TerrainArt\CliffTypes.slk" |
int | Ширина карты +1 | Переменная x |
int | Высота карты +1 | Переменная y |
float | Смещение влево от нулевых координат (0.00,0.00) по оси X | Переменная left. В редакторе это "граница карты влево", "граница карты вправо" вычисляется по формуле (x-1)*128+left |
float | Смещение вниз от нулевых координат (0.00,0.00) по оси Y | Переменная bottom. В редакторе это "граница карты вниз", "граница карты вверх" вычисляется по формуле (y-1)*128+bottom |
y раз: | ||
x раз, см. информация о точках тайлов |
Типы ландшафта
'A' | Ашенваль |
'B' | Пустоши |
'K' | Темная Цитадель |
'Y' | Город |
'X' | Даларан |
'J' | Развалины Даларана |
'D' | Подземелье (темница) |
'C' | Фелвуд |
'I' | Ледяная Корона |
'F' | Осенний Лордерон |
'L' | Летний Лордерон |
'W' | Зимний Лордерон |
'N' | Нортренд |
'O' | Глушь |
'Z' | Затонувший город |
'G' | Подземелье |
'V' | Деревня |
'Q' | Осенняя деревня |
Информация о точках тайлов
short | Высота земли | 8192 (0x2000) = нулевая высота |
short | Высота воды и флаг границы обзора | Высота воды = первые 14 бит (начиная с младшего), флаг = 0x4000. Код: water_height=val&0x3FFF; edge_flag=val&0x4000 |
byte | Текстура земли и флаги | Текстура земли = номер текстуры в списке тайлсетов, флаги = см. флаги. Код: texture=val&0x0F |
byte | Вариация земли и склона | Код: ground_variation=val&0x1F; cliff_variation=(val&0xE0)>>5 |
byte | Высота слоя и текстура склона | Высота слоя меняется командами: Увеличить на 1/Уменьшить на 1/и т.д. Код: layer_height=val&0x0F; cliff_texture=(val&0xF0)>>4 |
Флаги
0x0010 | Уклон (чтобы юниты могли подниматься с одного слоя на более высокий) |
0x0020 | Порча |
0x0040 | Вода |
0x0080 | Граница (в панели рельефа => справа от текстур земли => под порчей) |
war3map.shd
Размер файла всегда должен быть равен 16*ширина*высота, даже если теней нету
Возьмем ширину как переменную w, а высоту как переменную h
Возьмем ширину как переменную w, а высоту как переменную h
h раз: | ||
w раз: | ||
byte | 0 = тени нету, больше 0 = тень есть |
Из war3map.shd тени читаются начиная слева-снизу, а заканчивается вверху-справа
Тени рисуются по большим квадратам сетки (см. скриншоты), формула прилагается:
Формула составлялась по глазомеру и много раз проверялась методом научного тыка!
Поэтому не гарантирую на 100% что эта формула верная!
Поэтому не гарантирую на 100% что эта формула верная!
Где "indexX" это индекс тени по оси X внутри большого квадрата сетки (от 0 до 15)
Где "indexY" это индекс тени по оси Y внутри большого квадрата сетки (от 0 до 15)
Где "x" это будет координата тени внутри большого квадрата сетки
Где "y" это будет координата тени внутри большого квадрата сетки
Где "indexY" это индекс тени по оси Y внутри большого квадрата сетки (от 0 до 15)
Где "x" это будет координата тени внутри большого квадрата сетки
Где "y" это будет координата тени внутри большого квадрата сетки
const float shadowOffset = 512.00/15.00
После нескольких часов тестов я понял, что 512.00/15.00, потому что именно так достигается смещение теней как на скриншотах (см. скриншоты)
float x = indexX*shadowOffset
float y = indexY*shadowOffset
float y = indexY*shadowOffset
Тени которые находятся по краям (имеют координаты 0 или 15 по любой из осей внутри большого квадрата) - должны быть меньше обычной тени (как на скриншотах), а при пересечении с пограничными тенями из других квадратов должны становиться обычной тенью
war3map.doo
char[4] | Магическое число | 'W3do' |
int | Версия формата | ROC=7, TFT=8 |
int | Доп. версия формата | ROC=9/7, TFT=11 |
int | Кол-во декораций | Переменная i |
i раз: | ||
char[4] | Равкод | |
int | Вариация | |
float | X | |
float | Y | |
float | Z | |
float | Угол поворота (в радианах) | |
float | Масштаб X | |
float | Масштаб Y | |
float | Масштаб Z | |
IF( Версия варкрафта >= 1.32 ) | (см. в war3map.w3i) | |
char[4] | Скин | |
ENDIF | ||
byte | Флаги, см. флаги | |
IF( Версия варкрафта >= 1.32 ) | (см. в war3map.w3i) | |
byte | Здоровье (от 0 до 255, 255 - это 100%) | |
ELSE | ||
byte | Здоровье (в процентах от 0% до 100%) | |
ENDIF | ||
IF( Версия формата == 8 ) | ||
int | Номер таблицы случайных предметов (-1 = нету) | |
int | Количество наборов выпадаемых предметов (переменная j) | |
j раз, см. war3mapUnits.doo=>Выпадающие предметы | ||
ENDIF | ||
int | Номер декорации | |
int | Версия формата декораций склонов и рельефов | 0 |
int | Количество декораций склонов и рельефов | Переменная i |
i раз: | ||
char[4] | Равкод | |
int | Вариация | |
int | X (.w3e координата) | |
int | Y (.w3e координата) |
Флаги
0 | Невидимый и проходимый (на нем можно строить и ходить через него) |
1 | Видимый и проходимый (становится полу-прозрачным, если за ним находится юнит, так же на нем можно строить и ходить через него) |
2 | Обычный разрушаемый объект/обычная декорация |
При флагах 0 и 1 - разрушаемый объект больше не является разрушаемым (т.е его нельзя сломать и т.д)!
Важно!
Если разрушаемый объект имеет выпадающие предметы, то он должен иметь флаг 0, а в скрипте карты на его месте должен появляться клон с выпадающими предметами
Если разрушаемый объект имеет выпадающие предметы, то он должен иметь флаг 0, а в скрипте карты на его месте должен появляться клон с выпадающими предметами
war3mapUnits.doo
char[4] | Магическое число | 'W3do' |
int | Доп. версия формата | ROC=7, TFT=8 |
int | Версия формата | ROC=9, TFT=11 |
int | Кол-во объектов на карте | Переменная i |
i раз, см. данные об объектах на карте |
Данные об объектах на карте
char[4] | Равкод | Равкод объекта на карте, примеры: 'hfoo'=Пехотинец, 'bDNR'=Случайное здание, 'uDNR'=Случайный юнит, 'iDNR'=Случайный предмет, 'sloc'=Исходная позиция |
int | Вариация | Игнорируется (тут всегда 0, но можно ставить что угодно) |
float | Координата X | |
float | Координата Y | |
float | Координата Z | |
float | Угол поворота | В радианах |
float | Масштаб X | Игнорируется (тут всегда 1.00, но можно ставить что угодно) |
float | Масштаб Y | Игнорируется (тут всегда 1.00, но можно ставить что угодно) |
float | Масштаб Z | Игнорируется (тут всегда 1.00, но можно ставить что угодно) |
IF( Версия варкрафта >= 1.32 ) | (см. в war3map.w3i) | |
char[4] | Скин | |
ENDIF | ||
byte | Флаги | Игнорируется (тут всегда 2, но можно ставить что угодно), флаги как в war3map.doo |
int | Номер игрока-владельца | |
byte | Неизвестно | |
byte | Неизвестно | |
int | Здоровье | -1=по умолчанию |
int | Мана | -1=по умолчанию |
IF( Версия формата == 11 ) | ||
int | Номер таблицы случайных предметов | -1=не используется |
ENDIF | ||
int | Кол-во наборов выпадающих предметов | Переменная j |
j раз, см. выпадающие предметы | ||
int | Количество золота в шахте | По умолчанию = 12500 |
float | Получение цели | -1.00=Норма, -2.00=Лагерь |
int | Уровень героя | 1 для негероев и предметов |
IF( Версия формата == 11 ) | ||
int | Сила героя | 0=по умолчанию |
int | Ловкость героя | 0=по умолчанию |
int | Разум героя | 0=по умолчанию |
ENDIF | ||
int | Кол-во предметов в инвентаре | Переменная j |
j раз, см. предметы в инвентаре | ||
int | Кол-во измененных способностей | Переменная j |
j раз, см. измененные способности | ||
int | Случайная боевая единица (у всех кроме 'uDNR'/'bDNR'/'iDNR' тут 0) | Переменная r |
IF( r == 0 ) | ||
byte[3] | Уровень случайной боевой единицы, -1 = любой (интерпретируется как 24-битное число) | |
byte | Класс предмета: 0=любой,1=постоянные,2=Имеющие заряды,3=Усиливающие,4=Артефакты,5=Подлежащие продаже,6=Только для кампании,7=Разные (только у iDNR, у остальных тут 0) | |
ELSEIF( r == 1 ) | ||
int | Номер случайной группы (случайные группы определяются в war3map.w3i) | |
int | Номер позиции (колонны). Позиция должна иметь тип соответствующий случайной боевой единице (Войска для 'uDNR', Здания для 'bDNR', Предметы для 'iDNR') | |
ELSEIF( r == 2 ) | ||
int | Количество случайных боевых единиц (переменная j) | |
j раз, см. структура случайных боевых единиц | ||
ENDIF | ||
int | Кастомный цвет | -1 = нету, 0 = красный, 1=синий, ... , 11=коричневый |
int | Портал | Номер области в war3map.w3r, -1=нету |
int | Номер объекта |
Выпадающие предметы
int | Кол-во предметов в наборе | Переменная k | |
k раз: | |||
char[4] | Равкод предмета (0 = нету) | Это может быть равкод случайного предмета (см. равкод случайного предмета) | |
int | Шанс выпадения в процентах |
Предметы в инвентаре
int | Слот инвентаря | Нумерация с нуля |
char[4] | Равкод предмета | Это может быть равкод случайного предмета (см. равкод случайного предмета) |
Измененные способности
char[4] | Равкод способности | |
int | Автокаст включен | 0 = не включен, 1 = включен) |
int | Уровень способности |
Структура случайных боевых единиц
char[4] | Равкод объекта | Это также может быть рандомный объект (для 'uDNR' см. равкод случайного юнита, для 'bDNR' см. равкод случайного здания, для 'iDNR' см. равкод случайного предмета) |
int | Шанс в процентах | |
Равкод случайного юнита
[0] | 'Y' | Говорит о том, что это равкод случайного объекта |
[1] | 'Y' | Любой тип |
[2] | 'U' | Говорит о том, что это равкод случайного юнита |
[3] | '/' (0x2F) | Любой уровень |
'0' (0x30) | 1 уровень | |
'1' (0x31) | 2 уровень | |
... | ||
':' (0x3A) | 10 уровень |
'YYU:' = случайный юнит 10 уровня
Равкод случайного здания
[0] | 'Y' | Говорит о том, что это равкод случайного объекта |
[1] | 'Y' | Любой тип |
[2] | 'B' | Говорит о том, что это равкод случайного здания |
[3] | '/' (0x2F) | Любой уровень |
По идее здесь всегда будет 'YYB/', т.к здания не могут иметь уровней или типов
Равкод случайного предмета
[0] | 'Y' | Говорит о том, что это равкод случайного объекта |
[1] | 'Y' | Любой тип |
'i' | Постоянные | |
'j' | Имеющие заряды | |
'k' | Усиливающие | |
'l' | Артефакты | |
'm' | Подлежащие продаже | |
'n' | Только для кампании | |
'o' | Разные | |
[2] | 'I' | Говорит о том, что это равкод случайного предмета |
[3] | '/' (0x2F) | Любой уровень |
'0' (0x30) | 1 уровень | |
'1' (0x31) | 2 уровень | |
... | ||
':' (0x3A) | 10 |
'YkI:' = случайный усиливающий предмет 10 уровня
war3map.w3u/.w3t/.w3b/.w3d/.w3a/.w3h/.w3q
int | Версия формата | 1 или 2 |
int | Кол-во измененных стандартных объектов | Переменная i |
i раз, см. формат таблицы | ||
int | Кол-во нестандартных объектов | Переменная i |
i раз, см. формат таблицы |
Формат таблицы
char[4] | Равкод стандартного объекта | |
char[4] | Равкод нестандартного объекта (игнорируется если объект стандартный) | |
int | Кол-во измененных полей объекта | Переменная j |
j раз: | ||
char[4] | Название поля объекта | |
int | Тип значения, записанного в поле: 0=int, 1=float, 2=float, 3=string | |
int Только у .w3d/.w3a/.w3q | Уровень(.w3a/.w3q) или вариация(.w3d) поля, 0=поле не может иметь уровней/вариаций, у полей которые могут иметь уровни/вариации тут всегда как минимум 1 | |
int Только у .w3d/.w3a/.w3q | 0=Обыкновенное поле,1=A,2=B,3=C,4=D и т.д, пример: DataA5/DataC2/DataE8/..., у .w3d/.w3q тут обычно 0 | |
type | Записанное значение | |
char[4] | Не используется (при чтении игнорировать, при записи просто 0000 писать) |
.w3o
int | Версия формата | 1 |
int | Содержит war3map.w3u | 0=нет, 1=да |
IF( да ) | ||
см. war3map.w3u | ||
ENDIF | ||
int | Содержит war3map.w3t | 0=нет, 1=да |
IF( да ) | ||
см. war3map.w3t | ||
ENDIF | ||
int | Содержит war3map.w3b | 0=нет, 1=да |
IF( да ) | ||
см. war3map.w3b | ||
ENDIF | ||
int | Содержит war3map.w3d | 0=нет, 1=да |
IF( да ) | ||
см. war3map.w3d | ||
ENDIF | ||
int | Содержит war3map.w3a | 0=нет, 1=да |
IF( да ) | ||
см. war3map.w3a | ||
ENDIF | ||
int | Содержит war3map.w3h | 0=нет, 1=да |
IF( да ) | ||
см. war3map.w3h | ||
ENDIF | ||
int | Содержит war3map.w3q | 0=нет, 1=да |
IF( да ) | ||
см. war3map.w3q | ||
ENDIF |
war3map.w3i
int | Версия формата | ROC=18, TFT=25, 1.31=28, 1.32=31 |
int | Кол-во сохранений | |
int | Версия редактора | |
IF( Версия формата >= 28 ) | ||
int | Версия варкрафта A | |
int | Версия варкрафта B | |
int | Версия варкрафта C | |
int | Версия варкрафта D | A.B.C.D = 1.31.1.12173 |
ENDIF | ||
string | Название карты | |
string | Автор карты | |
string | Описание карты | |
string | Рекомендовано игроков | |
float[8] | Границы камеры | Лево, вниз, вправо, вверх, лево, вверх, вправо, вниз |
int[4] | Размеры неигровой области карты | Переменные A, B, C, D см. ниже |
int | Ширина игровой области карты | E, ширина карты = A+E+B |
int | Высота игровой области карты | F, высота карты = C+F+D |
int | Флаги | см. флаги карты |
char | Основной тип ландшафта карты | Пример: 'A' - Ашенваль, 'L' - Летний Лордерон |
int | Номер загрузочного экрана от стандартных кампаний | -1 = нету или используется импортированный загрузочный экран |
IF( Версия формата >= 25 ) | ||
string | Путь импортированного загрузочного экрана | |
ENDIF | ||
string | Текст загрузочного экрана | |
string | Заголовок загрузочного экрана | |
string | Подзаголовок загрузочного экрана | |
int | Используемый набор игровых данных | Номер предустановки, 0=Стандартный |
IF( Версия формата >= 25 ) | ||
string | Путь импортированного экрана пролога | |
ENDIF | ||
string | Текст экрана пролога | |
string | Заголовок экрана пролога | |
string | Подзаголовок экрана пролога | |
IF( Версия формата >= 25 ) | ||
int | Туман на местности | 0=Не используется, больше нуля = номер в списке стилей тумана |
float | Начальная Z-высота тумана | |
float | Конечная Z-высота тумана | |
float | Плотность тумана | |
byte | Цвет тумана R | Красный |
byte | Цвет тумана G | Зеленый |
byte | Цвет тумана B | Синий |
byte | Цвет тумана A | Прозрачность |
char[4] | Равкод глобальной погоды на карте | 0=нету |
string | Нест. звуковое окружение | |
char | Нестандартное освещение | Пример: 'A' - Ашенваль, 'L' - Летний Лордерон |
byte | Фоновый цвет воды R | Красный |
byte | Фоновый цвет воды G | Зеленый |
byte | Фоновый цвет воды B | Синий |
byte | Фоновый цвет воды A | Прозрачность |
ENDIF | ||
IF( Версия формата >= 28 ) | ||
int | JASS или Lua | 0=JASS, 1=Lua |
ENDIF | ||
IF( Версия формата >= 31 ) | ||
int | Неизвестно | |
int | Неизвестно | |
ENDIF | ||
int | Кол-во игроков | Переменная i |
i раз, см. данные об игроках | ||
int | Кол-во кланов | Переменная i |
i раз, см. данные о кланах | ||
int | Кол-во нестандартных улучшений | Переменная i |
i раз, см. данные о нестандартных улучшениях | ||
int | Кол-во нестандартных технологий | Переменная i |
i раз, см. данные о нестандартных технологиях | ||
int | Кол-во случайных групп | Переменная i |
i раз, см. данные о случайных группах | ||
IF( Версия формата >= 25 ) | ||
int | Кол-во таблиц предметов | Переменная i |
i раз, см. данные о таблицах предметов | ||
ENDIF |
Флаги карты
0x000001 | Скрыть мини-карту на экранах предпросмотра |
0x000002 | Изменить приоритеты союзников |
0x000004 | Карта подходит для режима "Сражения" |
0x000008 | Использовать нестандартный тип ландшафта |
0x000010 | Скрытые области частично видимы |
0x000020 | Фикс. параметры игрока |
0x000040 | Нестандартные кланы |
0x000080 | Нестандартные технологии |
0x000100 | Нестандартные способности |
0x000200 | Нестандартные улучшения |
0x000400 | Неизвестно |
0x000800 | Показывать волны на крутых берегах |
0x001000 | Показывать волны на пологих берегах |
0x002000 | Используется туман на местности |
0x004000 | Требуется дополнение |
0x008000 | Классификация предметов |
0x010000 | Фоновый цвет воды |
Данные об игроках
int | Номер игрока | |
int | Тип игрока | 1=Человек, 2=Компьютер, 3=Нейтрал, 4=Резерв |
int | Раса игрока | 0=Случайная раса, 1=Альянс, 2=Орда, 3=Нежить, 4=Ночные эльфы |
int | Фиксированная исходная позиция | Самый младший бит (0=нет, 1=да) |
string | Имя игрока | |
float | X координата стартовой позиции | |
float | Y координата стартовой позиции | |
int | Низкие приоритеты союзников | От младшего бита к старшему (0=приоритета на игрока нету, 1=приоритет на игрока есть) |
int | Высокие приоритеты союзников | От младшего бита к старшему (0=приоритета на игрока нету, 1=приоритет на игрока есть) |
IF( Версия формата >= 31 ) | ||
int | Неизвестно | |
int | Неизвестно | |
ENDIF |
Данные о кланах
int | Флаги | см. флаги клана |
int | Игроки | От младшего бита к старшему (0=игрока нету в клане, 1=игрок есть в клане), но надо учитывать наличие самого игрока в игре, т.к в первом клане по умолчанию присутствуют все игроки (от 0 до 31), которых нету в других кланах |
string | Название клана |
Флаги клана
0x0001 | Союзник |
0x0002 | Общая победа |
0x0004 | Неизвестно |
0x0008 | Общее поле зрения |
0x0010 | Общие войска |
0x0020 | Общие войска:все |
Данные о нестандартных улучшениях
int | Игроки | От младшего бита к старшему (0=на игрока не действует улучшение, 1=на игрока действует улучшение) |
char[4] | Равкод улучшения | |
int | Уровень улучшения | |
int | Доступность улучшения | 0=Недоступно, 1=Доступно, 2=Исследовано |
Данные о нестандартных технологиях
int | Игроки | От младшего бита к старшему (0=игроку ДОСТУПНА технология, 1=игроку НЕ ДОСТУПНА технология) |
char[4] | Равкод технологии | Это может быть: предмет, юнит, способность |
Данные о случайных группах
int | Номер группы | |
string | Название группы | |
int | Кол-во позиций (колонн) | Переменная j |
int[j] | Тип позиций | 0=Войска, 1=Здания, 2=Предметы |
int | Кол-во наборов (рядов) | Переменная k |
k раз: | ||
int | Шанс (в процентах) | |
char[j*4] | Равкоды |
Данные о таблицах предметов
int | Номер таблицы | ||
string | Название таблицы | ||
int | Кол-во наборов предметов | Переменная j | |
j раз: | |||
int | Кол-во предметов в наборе | Переменная k | |
k раз: | |||
int | Шанс в процентах | ||
char[4] | Равкод предмета |
war3map.wtg
ДУС - Действия-Условия-События
Версия до 1.31
char[4] | Магическое число | WTG! |
int | Версия формата | ROC=4, TFT=7 |
int | Количество категорий | Переменная i |
i раз, см. данные о категориях | ||
int | Редакция варкрафта | ROC=1, TFT=2; |
int | Количество переменных | Переменная i |
i раз, см. данные о переменных | ||
int | Количество триггеров | Переменная i |
i раз, см. данные о триггерах |
Данные о категориях
int | Индекс |
string | Название |
IF( Версия формата == 7 ) | |
int | Коментарий или нет (0/1) |
ENDIF |
Данные о переменных
string | Название |
string | Тип |
int | Неизвестно (если тут 0, то редактор удалит эту переменную при открытии карты) |
int | Массив или нет (0/1) |
IF( Версия формата == 7 ) | |
int | Размер массива |
ENDIF | |
int | Есть начальное значение (0/1) |
string | Начальное значение |
Данные о триггерах
string | Название | |
string | Описание | |
IF( Версия формата == 7 ) | ||
int | Комментарий или нет (0/1) | |
ENDIF | ||
int | Включен или нет (0/1) | |
int | Текстовый или нет (0/1) | |
int | Изначально включен !(0/1) | |
int | Инициализация при старте карты (0/1) | |
int | Индекс категории | |
int | Количество ДУС | Переменная i |
i раз, см. данные о ДУС (аргумент false) |
Версия начиная с 1.31
char[4] | Магическое число 1 | WTG! |
int | Магическое число 2 | 0x80000004 |
int | Версия формата | ROC=4, TFT=7 |
int | Неизвестно A | |
int | Неизвестно B | |
int | Неизвестно C | |
int | Неизвестно D | Похоже на A.B.C.D в .w3i, только тут 1.0.0.0 |
int | Количество категорий | |
int | Количество удаленных категорий | Переменная i |
i раз: | ||
int | Индекс удаленной категории (нумерация с 0) | |
int | Количество триггеров | |
int | Количество удаленных триггеров | Переменная i |
i раз: | ||
int | Индекс удаленного триггера (нумерация с 0) | |
int | Количество триггеров-комментариев | |
int | Количество удаленных триггеров-комментариев | Переменная i |
i раз: | ||
int | Индекс удаленного триггера-комментария (нумерация с 0) | |
int | Количество скриптов | |
int | Количество удаленных скриптов | Переменная i |
i раз: | ||
int | Индекс удаленного скрипта (нумерация с 0) | |
int | Количество переменных | |
int | Количество удаленных переменных | Переменная i |
i раз: | ||
int | Индекс удаленной переменной (нумерация с 0) | |
int | Неизвестно | |
int | Неизвестно | |
int | Редакция варкрафта | ROC=1, TFT=2; |
int | Количество переменных | Переменная i |
i раз, см. данные о переменных 1.31 | ||
int | Количество элементов | Переменная elemCount |
int | Неизвестно | |
int | Неизвестно | |
string | Название файла карты | Типа "map.w3x", параметр можно игнорировать и при записи писать пустую строку |
int | Неизвестно | |
int | Неизвестно | |
IF( Версия формата == 7 ) | ||
int | Неизвестно | |
ENDIF | ||
(elemCount-1) раз: | ||
int | Тип элемента | Переменная elemType |
IF( elemType == 4 ) | ||
Категория: | ||
int | Идентификатор | |
string | Название категории | |
IF( Версия формата == 7 ) | ||
int | Коментарий или нет (0/1) | |
ENDIF | ||
int | Содержит дочерние объекты (0/1) | |
int | Родительский идентификатор | |
ELSEIF( elemType == 8 ) | ||
Триггер: | ||
см. данные о триггерах 1.31 | ||
ELSEIF( elemType == 16 ) | ||
Комментарий: | ||
см. данные о триггерах 1.31 | ||
ELSEIF( elemType == 32 ) | ||
Скрипт: | ||
см. данные о триггерах 1.31 | ||
ELSEIF( elemType == 64 ) | ||
Переменная: | ||
int | Идентификатор | |
string | Название | |
int | Родительский идентификатор | |
ENDIF |
Данные о переменных 1.31
string | Название |
string | Тип |
int | Неизвестно (если тут 0, то редактор удалит эту переменную при открытии карты) |
int | Массив или нет (0/1) |
IF( Версия формата == 7 ) | |
int | Размер массива |
ENDIF | |
int | Есть начальное значение (0/1) |
string | Начальное значение |
int | Идентификатор |
int | Родительский идентификатор |
Данные о триггерах 1.31
string | Название | |
string | Описание | |
IF( Версия формата == 7 ) | ||
int | Комментарий или нет (0/1) | |
ENDIF | ||
int | Идентификатор | |
int | Включен или нет (0/1) | |
int | Текстовый или нет (0/1) | |
int | Изначально включен !(0/1) | |
int | Инициализация при старте карты (0/1) | |
int | Родительский идентификатор | |
int | Количество ДУС | Переменная i |
i раз, см. данные о ДУС (аргумент false) |
Данные о параметрах
int | Тип, см. типы параметров | |
string | Значение | |
int | Есть подфункция (0/1) | Переменная b1 |
IF( b1 == true ) | ||
int | Тип подфункции | см. типы подфункций |
string | Название | |
int | Имеет параметры (0/1) | Переменная b2 |
IF( b2 == true ) | ||
Количество параметров (см. Данные о ДУС=>Кол-во параметров ДУС) | Переменная i | |
i раз, см. данные о параметрах | ||
ENDIF | ||
ENDIF | ||
IF( Версия формата == 7 && b1 == true ) | ||
int | Неизвестно | |
ENDIF | ||
int | Массив или нет (0/1) | Переменная b3 |
IF( b3 == true ) | ||
1 раз, см. данные о параметрах | ||
ENDIF |
Типы параметров
0 | Предустановка |
1 | Переменная |
2 | Функция |
3 | Строка |
Типы подфункций
0 | Событие |
1 | Условие |
2 | Действие |
3 | Функция которая возвращает значение |
Данные о ДУС (принимает аргумент "bool isChild")
int | Тип, см. типы ДУС | |
IF( isChild == true ) | ||
int | Номер группы | |
ENDIF | ||
string | Название | |
int | Включено или нет (0/1) | |
Количество параметров (см. кол-во параметров ДУС) | Переменная i | |
i раз, см. данные о параметрах | ||
IF( Версия формата == 7 ) | ||
int | Количество дочерних ДУС | Переменная i |
i раз, см. данные о ДУС (аргумент true) | ||
ENDIF |
Типы ДУС
0 | Событие |
1 | Условие |
2 | Действие |
Кол-во параметров ДУС
Смотреть в "UI\TriggerData.txt"
Это обычный .ini файл
Парсится он просто, в данном случае нужно всего лишь узнать количество параметров:
Если ключ начинается с '_', то он игнорируется
Кол-во параметров - это кол-во значений ключа через запятую
Параметр игнорируется если:
Это обычный .ini файл
Парсится он просто, в данном случае нужно всего лишь узнать количество параметров:
Если ключ начинается с '_', то он игнорируется
Кол-во параметров - это кол-во значений ключа через запятую
Параметр игнорируется если:
- Пустой
- Число
- nothing
Код пример C++
class CFuncParam
{
private:
map<string, size_t> funcParams;
public:
static const size_t ERR = (size_t)-1;
size_t operator[](string s)
{
if( funcParams.find(s) == funcParams.end() )
return ERR;
else
return funcParams[s];
}
CFuncParam(ifstream& file)
{
string line;
string section;
while(getline(file, line))
{
if( line[0] == '/' || line.empty() || line[0] == ';' )
continue;
if( line[0] == '[' )
section = line.substr(1, line.find(']')-1);
else
{
size_t find = line.find('=');
string key = line.substr(0, find);
istringstream values( (line.substr(find+1)) );
if( key[0] == '_' ) continue;
int i = 0;
string value;
while( getline(values, value, ',') )
{
if( !value.empty() && !(value[0] >= '0' && value[0] <= '9') && value != "nothing" )
i++;
}
if( i > 0 && section == "TriggerCalls" )
i--;
if( funcParams.find(key) == funcParams.end() )
funcParams[key] = i;
}
}
}
};
У секции "TriggerCalls" кол-во параметров всех ключей декрементируется
Примеры:
DoNothing будет иметь 0 параметров
PolledWait будет иметь 1 параметр
GetSpellAbilityId будет иметь 1 параметр
DoNothing будет иметь 0 параметров
PolledWait будет иметь 1 параметр
GetSpellAbilityId будет иметь 1 параметр
war3map.wct
Версия до 1.31
int | Версия формата | ROC=0, TFT=1 |
IF( Версия формата == 1 ) | ||
string | Комментарий к нестандартному коду | |
Нестандартный код: | ||
1 раз, см. данные о коде | ||
ENDIF | ||
int | Количество триггеров | Переменная i |
i раз, см. данные о коде |
Версия начиная с 1.31
int | Магическое число | 0x80000004 |
int | Версия формата | ROC=0, TFT=1 |
IF( Версия формата == 1 ) | ||
string | Комментарий к нестандартному коду | |
Нестандартный код: | ||
1 раз, см. данные о коде | ||
ENDIF | ||
Количество триггеров определяется в .wtg | Переменная i | |
i раз: | ||
IF( триггер[i].комментарийИлиНет == false ) | ||
см. данные о коде | ||
ENDIF |
Данные о коде
int | Размер кода (считая '\0') | Переменная size |
IF( size > 0 ) | ||
string | Код | |
ENDIF |
war3map.wts
Текстовый формат данных
Пример
STRING 1
{
Игрок 1
}
STRING 2
{
Клан 1
}
STRING 4
{
Еще одна карта
}
К примеру если из скрипта карты сделать запрос "TRIGSTR_001", то будет получена строка "Игрок 1" (как в примере)
war3mapMisc.txt
Обычный .ini файл
war3mapSkin.txt
Обычный .ini файл
war3mapExtra.txt
Обычный .ini файл
Ред. MpW
Ред. PT153
Ред. Hodor
если триггер является комментарием, то он не содержит кода в .wct
(комментарий к триггеру, скрипт, триггер - всё это считается триггером, но с особыми флагами)
у всех остальных код присутствует, даже если это GUI (код конечно же будет пустым)
Ред. Hodor
А так, конвертер можно настроить в обратную сторону, чтобы он отключал и помечал всё что есть только в JNGP
Надо содержимое TriggerData_JNGP_26.txt заменить на TriggerData.txt из 1.31 ("UI\TriggerData.txt")
TriggerData.txt
Ред. GetLocalPlayer
Тут просто без слов, откройте карту и проверьте оба триггера, запомните что там было написано
Закройте карту и откройте ещё раз (если не будет никаких изменений - то ещё раз закройте/откройте)
Ред. Hodor
берется размер, по этому размеру читается вектор
"Выводилка текста" читает как раз тот самый вектор и мусор до нуля
Проверял память, действительно всё совпадает
Это не зависит от версии редактора, но пока что у меня в 1.31 наблюдается такое
Но и в 1.26 несколько раз видел
P.S. после //ok и //ko должен стоять '\0' и конечно же размер 5 вместо 4
Просто я вручную редактировал, а так, такое в быту не встречается
И да, я знаю что сформулировал фразу крайне криво, можете кидаться тапками, а я пойду спать...
Ред. Раскольник
http://www.wc3c.net/tools/specs/MagosBlpFormat.txt
Но ладно) Залью их на xgm
Ред. Hodor
Обновление до Warcraft 3 Reforged 1.32
Ред. Lasto4ka
int = Настройка графики в опциях карты (1=SD, 2=HD, 3=SD+HD)
int = Базовые игровые данные, по-английски: Game data version (0=ROC, 1=TFT). Тоже из настроек карты
Ред. host_pi
https://xgm.guru/files/100/244692/MagosBlpFormat.txt
http://web.archive.org/web/20191226191417/http://www.wc3c.net/to...