!!Версия варкрафта для которой подходит статья: !! ++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++|Информация о проходимости (устарела) )) ((кат .mdx/.mdl https://xgm.guru/files/100/244692/MagosMdxFormat.txt )) ((кат .blp https://xgm.guru/files/100/244692/MagosBlpFormat.txt )) ((кат 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? https://xgm.guru/files/100/235701/minimap.png )) )) ((кат 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? равен этой константе!!: ((код cpp const float DEFAULT = 4294967296.00; //0x4F800000 )) !!То должно использоваться значение по умолчанию!! )) ((кат war3map.j Скрипт карты на языке JASS2 Обыкновенный UTF-8 текстовик Документация (http://jass.sourceforge.net/doc/) )) ((кат 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, потому что именно так достигается смещение теней как на скриншотах (см. скриншоты) ((кат Скриншоты https://xgm.guru/files/100/235701/1.jpg https://xgm.guru/files/100/235701/2.jpg https://xgm.guru/files/100/235701/3.jpg https://xgm.guru/files/100/235701/4.jpg https://xgm.guru/files/100/235701/5.jpg https://xgm.guru/files/100/235701/6.jpg https://xgm.guru/files/100/235701/7.jpg https://xgm.guru/files/100/235701/8.jpg https://xgm.guru/files/100/235701/9.jpg https://xgm.guru/files/100/235701/10.jpg https://xgm.guru/files/100/235701/11.jpg https://xgm.guru/files/100/235701/12.jpg https://xgm.guru/files/100/235701/13.jpg https://xgm.guru/files/100/235701/14.jpg https://xgm.guru/files/100/235701/15.jpg https://xgm.guru/files/100/235701/16.jpg )) ?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++ ((код cpp class CFuncParam { private: map 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 файл ))