Добавлен , опубликован
Раздел:
Основы
Версия варкрафта для которой подходит статья: 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Номер значка, см. номера значков
intX координата (от 0 до 255)
intY координата (от 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\)
Флаги
0x010=нужно будет из пути извлечь только имя файла и дописать war3mapImported\, 1=будет отображаться полный путь импортированного файла (т.е нестандартный)
0x020=ничего не значит, 1=пункт byte и string обнуляются при чтении
0x04Неизвестно (можно игнорировать)
0x08Неизвестно (можно игнорировать)
0x10Неизвестно (можно игнорировать)
При чтении нужно учитывать флаги, а при записи можно просто записать 1 вместо флагов
war3map.w3c
intВерсия формата0
intКоличество камерПеременная i
i раз:
floatX
floatY
floatZ
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
stringEAX эффект, см. 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 раз:
byte0 = тени нету, больше 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Вариация
floatX
floatY
floatZ
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Вариация
intX (.w3e координата)
intY (.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/.w3q0=Обыкновенное поле,1=A,2=B,3=C,4=D и т.д, пример: DataA5/DataC2/DataE8/..., у .w3d/.w3q тут обычно 0
typeЗаписанное значение
char[4]Не используется (при чтении игнорировать, при записи просто 0000 писать)
.w3o
intВерсия формата1
intСодержит war3map.w3u0=нет, 1=да
IF( да )
см. war3map.w3u
ENDIF
intСодержит war3map.w3t0=нет, 1=да
IF( да )
см. war3map.w3t
ENDIF
intСодержит war3map.w3b0=нет, 1=да
IF( да )
см. war3map.w3b
ENDIF
intСодержит war3map.w3d0=нет, 1=да
IF( да )
см. war3map.w3d
ENDIF
intСодержит war3map.w3a0=нет, 1=да
IF( да )
см. war3map.w3a
ENDIF
intСодержит war3map.w3h0=нет, 1=да
IF( да )
см. war3map.w3h
ENDIF
intСодержит war3map.w3q0=нет, 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 )
intJASS или Lua0=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Имя игрока
floatX координата стартовой позиции
floatY координата стартовой позиции
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]Магическое число 1WTG!
intМагическое число 20x80000004
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 файл
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
26
4 года назад
0
Для war3mapPath.tga мне кажется надо бы добавить точные коды цветов
0
26
4 года назад
0
Супер! Даже не верил, что эта полезная вещь когда-нибудь появится
1
18
4 года назад
1
Ждем выхода рефорджа)))
0
21
4 года назад
0
Maniac_91:
Закодированный цвет и возможность ходьбы/строительства/полёта совпадают следующим образом:
# ходить летать строить
Если символы равны 00, то можно, если FF - нельзя.
1
18
4 года назад
1
JaBeN_Симфер, спасибо) Добавил
0
27
4 года назад
Отредактирован MpW
0
Супер =))
0
28
4 года назад
Отредактирован PT153
0
Hodor, объясни выделенный момент.
раскрыть
Загруженные файлы
0
18
4 года назад
Отредактирован Hodor
0
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();
	}
}
Загруженные файлы
0
17
4 года назад
0
А софта работы с .wtg для конвертации JNGP триггерных элементов в кастом скрипт вставки еще никто не написал? Чтобы сделанную в JNGP карту новый редактор открывал.
0
18
4 года назад
Отредактирован Hodor
0
GetLocalPlayer, там будут проблемы с событиями (их же в кастом код не сконвертишь)
А так, конвертер можно настроить в обратную сторону, чтобы он отключал и помечал всё что есть только в JNGP
Надо содержимое TriggerData_JNGP_26.txt заменить на TriggerData.txt из 1.31 ("UI\TriggerData.txt")
TriggerData.txt
Загруженные файлы
0
24
4 года назад
0
Я очень надеюсь на то, что можно будет кастомную триггер дату скармливать редактору в рефорже, без включения локальных файлов. Шансы на это не велики, но есть. Тогда можно будет достать актуальную триггер дату, пропатчить её вещами из JNGP и скормить редактору. Так, например, в 1.31 можно делать с данными о способностях - я редактировал эти данные чтобы в редакторе отображались все скрытые способности и потом просто импортировал файл в карту, в результате чего редактор подхватывал его и показывал скрытые способности (при сборке релизной версии карты этот файл просто удаляется, в игре он не нужен, только чтобы обманывать редактор). К сожалению, тот-же финт ушами с триггерами в 1.31 мне провернуть не удалось, но есть небольшой шанс что в рефорже можно будет.
0
17
4 года назад
Отредактирован GetLocalPlayer
0
(их же в кастом код не сконвертишь)
Такие проблемы решаются полным ковертированием триггера в текст, либо (что лучше) генерацией блока триггера, в котором создается событие инициализации и в действиях скрипт-вставками устанавливается событие несвоейственное стандартному редактору. Перед каждой такой скрип-вставкой генерировать комментарий, дублирующий в текстовой форме как выглядело действие до обработки и откуда оно пришло.
2
18
4 года назад
2
Нашел серьезный косяк в алгоритмах чтения war3map.wct
Тут просто без слов, откройте карту и проверьте оба триггера, запомните что там было написано
Закройте карту и откройте ещё раз (если не будет никаких изменений - то ещё раз закройте/откройте)
P.S. открывать желательно в редакторе 1.31, т.к есть шанс что не увидите этого бага
Загруженные файлы
0
16
4 года назад
0
Hodor:
Нашел серьезный косяк в алгоритмах чтения war3map.wct
зарепортил близзарду? если нет, скажи, что должно получиться, я скину
0
18
4 года назад
Отредактирован Hodor
0
DracoL1ch, грубо говоря:
берется размер, по этому размеру читается вектор
"Выводилка текста" читает как раз тот самый вектор и мусор до нуля
Проверял память, действительно всё совпадает
Вот как в хексе, не смотри что это конец файла (такое бывает и у первого триггера)

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

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

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

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