Версия варкрафта для которой подходит статья: 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 файл

WC3





















Но ладно) Залью их на 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://www.xgm.guru/files/100/244692/MagosBlpFormat.txt
http://web.archive.org/web/20191226191417/http://www.wc3c.net/to...
Ред. Makeba
Если он установлен (при сохранении всегда включается), то читаются int[4] Размеры неигровой области карты Переменные A, B, C, D см. ниже
При этом float[8] Границы камеры Лево, вниз, вправо, вверх, лево, вверх, вправо, вниз игнорируются
Если выключен то наоборот.
int Ширина игровой области карты E, ширина карты = A+E+B
int Высота игровой области карты F, высота карты = C+F+D
Судя по всему никогда не используются, также из float[8] Границы камеры читаются только первые 4 числа