Добавлен , опубликован
Статья
Раздел:
Объекты
Версия варкрафта для которой подходит статья: 1.32 и ниже
byte - 1 байт
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
Номера значков
0 Рудник
1 Нейтральное здание
2 Исходная позиция
3 Легкие нейтралы
4 Легкие нейтралы 2?
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
R - Ходьба
G - Полет
B - Постройка
00 - можно
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 текстовик
war3map.lua
Скрипт карты на языке Lua
Обыкновенный 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
h раз:
w раз:
byte 0 = тени нету, больше 0 = тень есть
Из war3map.shd тени читаются начиная слева-снизу, а заканчивается вверху-справа
Тени рисуются по большим квадратам сетки (см. скриншоты), формула прилагается:
Формула составлялась по глазомеру и много раз проверялась методом научного тыка!
Поэтому не гарантирую на 100% что эта формула верная!
Где "indexX" это индекс тени по оси X внутри большого квадрата сетки (от 0 до 15)
Где "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
Тени которые находятся по краям (имеют координаты 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, а в скрипте карты на его месте должен появляться клон с выпадающими предметами
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 файл
Парсится он просто, в данном случае нужно всего лишь узнать количество параметров:
Если ключ начинается с '_', то он игнорируется
Кол-во параметров - это кол-во значений ключа через запятую
Параметр игнорируется если:
  1. Пустой
  2. Число
  3. 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 параметр
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 файл
`
ОЖИДАНИЕ РЕКЛАМЫ...
25
Для war3mapPath.tga мне кажется надо бы добавить точные коды цветов
26
Супер! Даже не верил, что эта полезная вещь когда-нибудь появится
21
Maniac_91:
Закодированный цвет и возможность ходьбы/строительства/полёта совпадают следующим образом:
# ходить летать строить
Если символы равны 00, то можно, если FF - нельзя.
28
Hodor, объясни выделенный момент.
раскрыть
Загруженные файлы
18
PT153, в 1.31 зачем-то ввели эту штуку:
если триггер является комментарием, то он не содержит кода в .wct
(комментарий к триггеру, скрипт, триггер - всё это считается триггером, но с особыми флагами)
у всех остальных код присутствует, даже если это GUI (код конечно же будет пустым)
Пример
if( version == WCT_ROC )
{
	swct.customComment = "";
	swct.customScriptSize = 0;
} else
{
	swct.customComment = file.readStr();
	swct.customScriptSize = file.readInt();
	if( swct.customScriptSize )
	{
		swct.customScript = file.readStr();
	}
}

swct.trigCount = swtg.trgCount;
swct.trigs.resize(swct.trigCount);
for(int i=0;i<swct.trigCount;i++)
{
	TriggerScript& ts = swct.trigs[i];

	if( swtg.trgs[i].isComment )
		ts.size = 0;
	else
	{
		ts.size = file.readInt();
		if( ts.size )
			ts.script = file.readStr();
	}
}
Загруженные файлы
15
А софта работы с .wtg для конвертации JNGP триггерных элементов в кастом скрипт вставки еще никто не написал? Чтобы сделанную в JNGP карту новый редактор открывал.
18
GetLocalPlayer, там будут проблемы с событиями (их же в кастом код не сконвертишь)
А так, конвертер можно настроить в обратную сторону, чтобы он отключал и помечал всё что есть только в JNGP
Надо содержимое TriggerData_JNGP_26.txt заменить на TriggerData.txt из 1.31 ("UI\TriggerData.txt")
TriggerData.txt
Загруженные файлы
24
Я очень надеюсь на то, что можно будет кастомную триггер дату скармливать редактору в рефорже, без включения локальных файлов. Шансы на это не велики, но есть. Тогда можно будет достать актуальную триггер дату, пропатчить её вещами из JNGP и скормить редактору. Так, например, в 1.31 можно делать с данными о способностях - я редактировал эти данные чтобы в редакторе отображались все скрытые способности и потом просто импортировал файл в карту, в результате чего редактор подхватывал его и показывал скрытые способности (при сборке релизной версии карты этот файл просто удаляется, в игре он не нужен, только чтобы обманывать редактор). К сожалению, тот-же финт ушами с триггерами в 1.31 мне провернуть не удалось, но есть небольшой шанс что в рефорже можно будет.
15
(их же в кастом код не сконвертишь)
Такие проблемы решаются полным ковертированием триггера в текст, либо (что лучше) генерацией блока триггера, в котором создается событие инициализации и в действиях скрипт-вставками устанавливается событие несвоейственное стандартному редактору. Перед каждой такой скрип-вставкой генерировать комментарий, дублирующий в текстовой форме как выглядело действие до обработки и откуда оно пришло.
18
Нашел серьезный косяк в алгоритмах чтения war3map.wct
Тут просто без слов, откройте карту и проверьте оба триггера, запомните что там было написано
Закройте карту и откройте ещё раз (если не будет никаких изменений - то ещё раз закройте/откройте)
P.S. открывать желательно в редакторе 1.31, т.к есть шанс что не увидите этого бага
Загруженные файлы
16
Hodor:
Нашел серьезный косяк в алгоритмах чтения war3map.wct
зарепортил близзарду? если нет, скажи, что должно получиться, я скину
18
DracoL1ch, грубо говоря:
берется размер, по этому размеру читается вектор
"Выводилка текста" читает как раз тот самый вектор и мусор до нуля
Проверял память, действительно всё совпадает
Вот как в хексе, не смотри что это конец файла (такое бывает и у первого триггера)

Это не зависит от версии редактора, но пока что у меня в 1.31 наблюдается такое
Но и в 1.26 несколько раз видел

P.S. после //ok и //ko должен стоять '\0' и конечно же размер 5 вместо 4
Просто я вручную редактировал, а так, такое в быту не встречается
Загруженные файлы
24
Это достаточно стандартное поведение у программ на ц-костылях, особенно у таких старых как вар. Когда-то этим даже сетевые протоколы болели, не то что десктопные приложения.
И да, я знаю что сформулировал фразу крайне криво, можете кидаться тапками, а я пойду спать...
25
Собственно я уже говорил, что это классическая ошибка. Никто это фиксить явно не будет.
18
WriteCoin, текстовики нормально грузятся
Но ладно) Залью их на xgm
18

Обновление до Warcraft 3 Reforged 1.32

  1. Добавлены скины
  2. В информацию о карте добавлено два неизвестных параметра
  3. В информацию об игроке добавлено два неизвестных параметра
6
В war3map.i 1.32+, неизвестные сразу после Jass/Lua это:
int = Настройка графики в опциях карты (1=SD, 2=HD, 3=SD+HD)
int = Базовые игровые данные, по-английски: Game data version (0=ROC, 1=TFT). Тоже из настроек карты
Два новых int в конце у игроков, это вроде Высокие/Низкие приоритеты противников, но я не проверяла.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.