Добавлен , опубликован
Раздел:
Основы
Миниатюра 256px
Автор статьи: Steal nerves
Автор вёрстки для ресурса xgm: Firstrun70
Оригинальная статья wc3maps.com/InsideTheW3M.html
W3M and W3X Files Format
Последнее обновление: 9/03/2006
Вступление:
Эта документация содержит почти все спецификации файлов карт Warcraft III (* .w3m и * .w3x). Это было сделано без какой-либо помощи от Blizzard Entertainement (разработчика игры), который не предоставил никакой информации. И не применялся никакой "reverse engineering" на движке игры Warcraft III, чтобы исследовать структуру игры. Спецификация каждого вида файла зависит от его версии. Я задокументировал здесь текущую версию, используемую Warcraft III Retail (начальная версия); убедитесь, что файл, который вы просматриваете или изменяете, использует ту же версию / формат, что и описанный. Я француз, поэтому, пожалуйста, простите за мой английский! Наконец, используйте эту информацию, полученную из документации, на свой страх и риск: я не несу ответственность, если вы испортите свои карты.
1.1 Основы. Ваше окружение
Вам понадобится сама игра Warcraft III Retail, которая, скажем, находится по пути в "C:\Program Files\Warcraft III\".
Я расскажу о файлах Warcraft 3 Retail (начальная версия) здесь:
Некоторые файлы могут различаться в зависимости от версии игры. Вам придется выяснить некоторые различия в форматах файлов. Я также опишу новый формат в расширении The Frozen Throne, если формат файла изменился. Если ваш Warcraft III чист (без всяких модификации), вы должны иметь эти файлы (конечно, другие файлы есть, но я буду использовать их для примеров):
в папке игры "C:\Program Files\Warcraft III\" находится архив игры The Reign of Chaos (их можно открыть mpq-редактором):
  • war3.mpq
и в папке maps "C:\Program Files\Warcraft III\Maps\" лежат карты с расширением .w3m от игры The Reign of Chaos:
  • (4) Lost Temple.w3m (перевод карты "Потерянный храм". И многие другие карты, конечно, с расширением w3m)
Если вы также установили дополнение "Frozen Throne", у вас будут в папке игры добавлены дополнительные архивы с новыми файлами. Это:
  • war3x.mpq
  • war3xlocal.mpq
и в папке maps "C:\Program Files\Warcraft III\Maps\FrozenThrone\__" лежат карты с расширением .w3x от дополнения Frozen Throne:
  • (2) Circumvention.w3x (перевод карты "Военная хитрость".)
и в папке campaigns "C:\Program Files\Warcraft III\Campaigns\" лежат кампании с расширением .w3n:
  • DemoCampaign.w3n
Также при установке обновлений будет добавлен новый архив, который содержит самые свежие файлы из патча, а именно
  • war3patch.mpq
Для редактирования карт "W3M" и "W3X", а также файлы кампании "W3N" используется редактор карт WorldEdit, им можно открывать и редактировать. Также можно скачать и установить JNGP (модифицированный редактор варкрафта)
Для открытия карт "W3M" и "W3X", а также файлы кампании "W3N" используется любой архиватор MPQ, поддерживающий Warcraft 3. Также этими архивами легко открыть архив игры с форматом .mpq. Сами карты и файлы кампании тоже являются небольшими архивами. Эти архиваторы удобны тем, что можно экспортировать или импортировать целые файлы или папки из архивов.
Предлагаются некоторые варианты архиваторов, которые вы можете скачать:
Этот также позволяет создавать исполняемые патчи, для которых требуется MPQDraft в том же каталоге.
Если при открытии карт или других архивов вы видите только неизвестные файлы (закодированы, пример скрина внизу)
Тогда вам нужно обновить список файлов Listfiles, которые лежат в архиве. В них указаны пути всех этих файлов. Эти Listfiles нужно в архив закинуть, заменяя старые.
Не исключено: что карты защищены от взлома. Обычно, в картах специально удаляют Listfile, и когда архиватором пробуют открыть, то не можете просматривать содержимое. Приходится взламывать xDeprotect
Вы можете получить последние списки файлов для Warcraft на www.wc3campaigns.net/tools/weu/stuff.html
Все вышеперечисленные mpq-архиваторы имеют настройки (в папке архиватора лежат списки), вы можете заменить или указать на новые списки listfiles. С помощью них будут открыты для просмотра имена файлов. Возможно в mpq-редакторе лежат устаревшие списки, и их надо заменить. Просто добавьте все свои списки в этот список и самые неизвестные файлы должны быть определены сейчас.
Если вы хотите "поиграть" с файлами карт, вам также понадобится шестнадцатеричный редактор.
Мой любимый - HexWorkshop (www.bpsoft.com).
Бесплатная альтернатива - XVI32, найденная на www.chmaas.handshake.de, но в ней отсутствует множество полезных функций.
1.2.1 Файлы Warcraft 3. О файлах MPQ
MPQ похожи на "zip" или "rar" архивы, так как они содержат похожую структуру каталогов со сжатыми файлами.
Я не буду говорить о формате MPQ здесь, поскольку Quantam уже сделал это. Если вы хотите узнать больше об этом, я предлагаю вам пойти туда: www.zezula.net
Если вы хотите редактировать архивы MPQ, я предлагаю вам получить SFmpqapi для вашего любимого языка программирования. Это доступно в shadowflare.samods.org/dwnload.html для несколько языков программирования, включая Delphi, C++ и Visual Basic.
Вы также можете скачать исходный код WinMPQ там, чтобы узнать, как используйте SFmpqapi.
1.2.2 Файлы Warcraft 3. Файловая структура Warcraft III
Игра Warcraft III имеет в реестре вот такие настройки, которые вы можете увидеть в Windows Explorer:

Path (Путь): HKEY_CURRENT_USER\Software\Blizzard Entertainment\Warcraft III\
Key name (Имя ключа): "Allow Local Files" (Разрешить локальные файлы)
Key Type (Тип ключа): dword
Key value (Ключевое значение): 1
Если ключ регистрации не задан или файл не найден в "реальном" каталоге, то это повлияет на работу таких файлов как (некоторые функции/данные/файлы будут не доступны, или не видимы):
  • файл w3m (ваша карта)
  • War3Patch.mpq (последний патч mpq-архив с обновлением)
  • War3x.mpq или War3xlocal.mpq (основные mpq-архивы дополнения, если само дополнение игры Frozen Throne установлена)
  • War3.mpq (основной mpq-архив)
Вам не обязательно изменять официальные MPQ-архивы (Примечание: не советую изменять ваш War3.mpq-архив, иначе может повлиять на игру, и на некоторые другие карты), достаточно использовать ту же структуру каталогов/файлов из папки игры:
"C:\Program Files\Warcraft III\".
Созданные объекты в карте (.w3m файл) взаимодействует с большим кол-вом файлов из игры, но не со всеми. Помните, что редактор WorldEditor читает локальные файлы из реальных каталогов, даже если "Allow Local Files" (Разрешить локальные файлы) не включен в реестре.
Это работает (например) для:
  • Units\unitUI.slk Units\AbilityData.slk
  • UI\MIDISounds.slk
  • Units\HumanUnitFunc.txt
  • Units\HumanUnitStrings.txt
  • Units\HumanAbilityFunc.txt
  • Units\HumanAbilityStrings.txt
  • Units\HumanUpgradeFunc.txt
  • Units\HumanUpgradeStrings.txt
Но это не очень хорошо работает для:
  • Units\UnitMetaData.slk
  • Scripts\blizzard.j
И это совсем не работает для:
  • TerrainArt\CliffTypes.slk
  • Units\MiscData.txt
Если вам действительно нужно изменить файл, который должен быть загружен или заменен импортным снаружи, то рекомендую вам создать исполняемый патч с встроенным MPQ-архивом с использованием программы MPQDraft, который вы можете скачать. Эта опция также используется третьей стороной - редакторами, такие как UMSWE.
Пример:
Вы хотите использовать более двух типов скал по умолчанию на карте. Редактируя файл w3e или используя WE Unlimited или Zepir's Editor, вы можете технически добавьте больше типов скал на вашу карту.
Проблема в том, что чтобы они правильно отображались в игре, потребуется изменение файла TerrainArt\CliffTypes.slk (эта таблица с настройками, указаны в ней путь иконки и прочие параметры). Чтобы сделать эту работу, вам придется создать новый MPQ-архив и импортировать измененный файл с тем же путем TerrainArt\CliffTypes.slk.
Помните: При слиянии двух архивов, даже, если имеются два одинаковых файла с одним и тем же путем, заменяется на последний указанный файл.
Также позаботьтесь о том, чтобы был указан путь этого slk файла в файле (listfiles). Затем запустите MPQDraft и создайте новый mpq-архив. Вот и все, архив будет создан для вас (не забудьте добавить listfiles). Этот новый mpq-архив необходимо добавить в папку с игрой. Теперь, если вы запустите игру, в Warcraft файл будет заменен на новый.
Предупреждение!
Если вы играете с другими игроками, у остальных игроков тоже должен быть загружен в папку с игрой этот архив. Иначе будут иметь последствия, например:
  • новые замененные файлы будут возвращены к стандартным (если станд файлы были заменены на новые, у новых указан путь станд файлов)
  • не будут отображаться в игре (новые файлы указан не станд путь) или за измененные файлы вы получите ошибку (например, "netsync error").
  • Некоторые файлы вне War3.mpq и War3Patch.mpq не будут использоваться Warcraft
Это исключения.
1.2.3 Карты (имеют формат W3M/W3X)
Карты это обычные архивы, ни чем не отличающие от rar или zip. И немного отличаются от MPQ. Чтобы редактировать карту, вам нужно будет использовать редактор WorldEdit или модифицированный пользовательский JNGP. При изменений сохраняется в формате "w3m". При наличии фишек в карте, которые могут быть доступны только в дополнении Frozen Throne, игра решает сохранить в формате "w3x".
Карты сохраняются по пути:
"C:\Program Files\Warcraft III\Maps\"
1.3 Типы данных Warcraft 3
Blizzard использует несколько способов хранения данных в своих файлах. Однако они часто используют универсальные типы.
-Integers (англ. integer - целое число)
Целочисленные числа хранятся с использованием 4 байтов в порядке "Little Endian". Это значит, что первый прочитанный байт является младшим байтом. Они похожи на тип C++ "int" (signed) type. В некоторых других документациях такого рода вы можете увидеть их под названием "long" (длинный).
Размер: 4 байта
Пример: 1234 десятичных = [00 00 04 D2] будет храниться в следующем порядке: [D2 04 00 00]
Для понимания целых чисел и действительных чисел:
-Short Integers (Короткие целые числа)
Короткие целые числа хранятся с использованием 2 байтов в порядке "Little Endian". Они близки к короткому знаку C++, но их диапазон от -16384 до 16383. Это означает, что 2 старших бита не используются, например, используются для флага.
Размер: 2 байта
-Floats (англ. Float - плавающая точка, реальное число или действительное число)
Float использует стандартный формат IEEE 32bit float. Они хранятся с использованием 4 байты и порядок "Little Endian". Они похожи на C++ "float".
Размер: 4 байта
Пример: 7654.32 десятичное, это число не может быть сохранено с использованием этого формата, поэтому система примет ближайшее значение, которое может быть представлено с помощью двоичных цифр. Наиболее близким является:
7654,319824 десятичный = [45 EF 32 8F] и будет храниться как [8F 32 EF 45]
-Chars and Array of Chars (Чар или массив чаров. Чар - символ 256 системы счисления ASCII)
Они просто хранятся как стандартные символы (1 char = 1 byte) и массив символов (нет необходимости в нулевом завершающем символе).
Размер (char): 1 байт
Размер (array of chars): обычно 4 байта
Вот здесь описывал как конвертировал числа xgm.guru/p/blog-steal-nerves/208854
-Trigger Strings and Strings (Trigger-строки и строки)
Строки - это просто массивы символов, оканчивающиеся нулевым символом (C++ '\ 0'). Тем не менее Blizzard иногда использует специальные управляющие коды, чтобы изменить отображаемый цвет строки и др. Эти коды похожи:
"|c00BBGGRR", где "00", "BB", "GG" и "RR" - шестнадцатеричные значения (используя 2 символа на каждую характеристику, можно ввести значение цвета от 0 (0x00) до 255 (0xff) ). Прозрачность (00-alpha), для синего цвета (BB - blue), зеленый (GG-green) и красный (red) значения.
"|c… " - начало цветового кода, "…|r" - завершение цветового кода, "|n" - перенос на следующую строку.
"<Amil,Dur1> сек" - ссылка к ячейки, таким образом можно получить данные из ячейки. Например, способность "К оружию (работник) Amil" в настройках имеет длительность (duration) = 45 сек. Эта ячейка имеет короткое название Dur1, на первом уровне имеет Dur1, на втором уровне будет иметь Dur2, на третьем Dur3 итд. При автозаполнении уровней способностей, в описании изменяется цифра автоматически. В описании способности этот код автоматически преобразовывается в строку, то есть вместо "<Amil,Dur1> сек" вам отобразится "45 сек".
Поговорим о "TRIGSTR_". Это часто встречаемый код можно заметить в jass-коде, например при конверте какой либо строки, вы не увидите текста, а в встретите код "TRIGSTR_". Считается, что это адрессной-ссылочной строкой триггера. Все записи от триггера сохраняются в .wts файле карты, если в этот файлик заглянуть (открыв блокнотом) не только все записи триггеров, но и названия и описания способностей, горячие клавиши и пр.
Если записать какую-нибудь строку в GUI, и сохранить, эта строка записывается в наш .wts файлик и автоматически редактор WorldEdit задает номер.
Этот код строк может быть указан в таких файлах карт как:
.j файл - скрипт или код записанный на jass-языке
w3i файл - информация по карте, которая задаётся в едиторе в разделе сценарий
и др
Разбор:
Если после "TRIGSTR_" следует текст (пример "TRIGSTR_qwer" или "TRIGSTR_abc7"), то преобразуется в "TRIGSTR_000", то автоматом превращает в ноль.
Если число после "TRIGSTR_" отрицательно, то ссылается на пустую строку. Пример: "TRIGSTR_-7" отрицательно, и не может ссылаться на строку триггера; это будет отображено как "".
Если задано число 07, или 007, или задан какой-то текст, пример: 7ab, то автоматически число приравнивается к №7. Например, "TRIGSTR_7", "TRIGSTR_07", "TRIGSTR_007" и "TRIGSTR_7abc" представляет строку триггера "TRIGSTR_7"
Ссылки "TRIGSTR_ab7", "TRIGSTR_abc" и "TRIGSTR_" вызывают строку №0 ("TRIGSTR_0")
Размер (строка): разные (зависит от длины строки). Длина строки + 1 (нулевой завершающий символ).
Размер (строка триггера): 12 байт

В строках Warcraft используется формат Unicode под названием UTF-8. Они делают это потому что файлы должны быть локализованы на много разных языков. Этот формат использует один байт для наиболее распространенных символов, который равен к значению символа (чара) ASCII.
ASCII (American Standard Code for Information Interchange), каждый символ называется "чар" (char). Все символы не влезут, если буду печатать сейчас, их очень много. Таблица большая у 256-ричной системы. У каждого языка есть своя таблица, обычно 126 символов - стандартная, а остальная отличается.
Например, A = 65 или 0x41.
Здесь (выше на скрине) предоставлена стандартная таблица из 128 символов. Для английского языка нормально.
Более необычные символы могут занимать от 2 до 6 байт на символ. К примеру, есть очень много других алфавитов, например, символ (чар) из русского алфавита (кириллицы) тратится 2 байта.
Источник: habr.com/ru/post/138173
Символы с кодами меньше 128 представляются одним байтом, а так как в Юникоде они повторяют ASCII, то текст написанный только этими символами будет являться текстом в ASCII. Символы же с кодами от 128 кодируются 2-мя байтами, с кодами от 2048 - 3-мя, от 65536 - 4-мя. Так можно было бы и до 6-ти байт дойти.
0x00000000 - 0x0000007F: 0xxxxxxx
0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Например, немецкая буква Д будет представлена 195 и 164 или 0xC3A4. Чем выше порядковый номер чара (char), тем больше байтов требуется чару (char). Простых вычислений по модулю достаточно для того, чтобы конвертировать UTF в обычный Unicode (UCS), и обратно.
Описано про строки тут xgm.guru/p/wc3/jass-crash-course
Для конвертации UTF в UCS (Unicode) используйте этот шаблон:
If  FirstByte <= 191
	return FirstByte
If 192 <= FirstByte <= 223
	return (FirstByte - 192) * 64 + (SecondByte - 128)
If 224 <= FirstByte <= 239   
	return (FirstByte - 224) * 4096 + (SecondByte - 128) * 64 + (ThirdByte - 128)
If 240 <= FirstByte <= 247 
	return (FirstByte - 240) * 262144 + (SecondByte - 128) * 4096 + (ThirdByte - 128) * 64 + (FourthByte - 128)
If 248 <= FirstByte <= 251 
	return (FirstByte - 248) * 16777216 +	(SecondByte - 128) * 262144 + (ThridByte - 128) * 4096 + (FourthByte - 128) * 64 + (FifthByte - 128)
If 252 <= FirstByte 
	return (FirstByte - 252) * 1073741824 +(SecondByte - 128) * 16777216 + (ThirdByte - 128) * 262144 +(FourthByte - 128) * 4096 + (FifthByte - 128) * 64 + (SixthByte - 128)

Чтобы преобразовать UCS (Unicode) обратно в UTF, используйте это:
If ASCII <= 127   
	FirstByte = ASCII
If 128 <= ASCII <= 2047   
	FirstByte = 192 + (ASCII \ 64) 
	SecondByte = 128 + (ASCII Mod 64)
If 2048 <= ASCII <= 65535 
	FirstByte = 224 + (ASCII \ 4096)
	SecondByte = 128 + ((ASCII \ 64) Mod 64) 
	ThirdByte = 128 + (ASCII Mod 64)
If 65536 <= ASCII <= 2097151 
	FirstByte = 240 + (ASCII \ 262144)
	SecondByte = 128 + ((ASCII \ 4096) Mod 64) 
	ThirdByte = 128 + ((ASCII \ 64) Mod 64) 
	FourthByte = 128 + (ASCII Mod 64)
If 2097152 <= ASCII <= 67108863 
	FirstByte = 248 + (ASCII \16777216) 
	SecondByte = 128 + ((ASCII \ 262144) Mod 64) 
	ThirdByte = 128 + ((ASCII \ 4096) Mod 64) 
	FourthByte = 128 + ((ASCII \ 64) Mod 64)
	FifthByte = 128 + (ASCII Mod 64)
If 67108864 <= ASCII <= 2147483647 
	FirstByte = 252 + (ASCII \ 1073741824) 
	SecondByte = 128 + ((ASCII \ 16777216) Mod 64) 
	ThirdByte = 128 + ((ASCII \ 262144) Mod 64) 
	FourthByte = 128 + ((ASCII \ 4096) Mod 64) 
	FifthByte = 128 + ((ASCII \ 64) Mod 64) 
	SixthByte = 128 + (ASCII Mod 64))
Преобразование будет необходимо, только если вы хотите отобразить текст в вашем приложении или записать пользовательский ввод в файлы. Для всех других целей вы может внутренне обрабатывать UTF-строки как обычные строки.
-Flags (Флаг, галочка, это что-то вроде булевой алгебры boolean)
Флаги - это логические значения (true или false, 1 или 0). Они могут быть сохранены с использованием 4 байт. Каждый бит является флагом (4 байта = 32 бита = 32 флага). Blizzard использует целые числа для хранения своих флагов.
в качестве примера показан двоичный код из 32 символов
1000 0000 0000 0000 0000 0000 0000 0000 = 10 0 0 0 0 0 0 0 oct = 8 0 0 0 0 0 0 0 0 hex
Специально разделил двоичный код на 4 разряда, но в вакрафте лучше писать слитно.
10000000000000000000000000000000 = 2^31=2147483648
Размер: обычно 4 байта
-Boolean
Это целое число, в него можно засунуть несколько флагов (максимум 32). Такая алгебра может применяться, где угодно.
Допустим, мы имеем 4 флага (выдумаю такую картину):
a1 a2 a3 a4 (это не существующие параметры взяты для примера), где:
a1 - может ли двигаться юнит (1=да, 0=нет),
a2 - застанен ли юнит (1=да, 0=нет),
a3 - спит ли юнит (1=да, 0=нет),
a4 - запаузен юнит (1=да, 0=нет)
пример задачи: мой юнит не может двигаться, как будто к земле прилип. Указываю мышкой идти туда, а он только поворачивается лицом к точке. Определить boolean
Ответ: юнит может двигаться, иначе не смог поворачиваться никак. Стана и паузы нет, сон вряд ли действует.
1000 - наш boolean
0000 0000 0000 0000 0000 0000 0000 1000 <= используется 4 флага, могли бы 32 флага записать в ячейку
по такому же принципу построена наша карта путей xgm.guru/p/wc3/pathing-alternate, только там пишут 8 бит вроде, там каждая точка имеет несколько флагов:
-может ходить/не может ходить
-можно строить/не может строить
-может летать/не может летать
Всего 8 типов проходимости
-Custom Types (типы данных)
Иногда целое число, или один-несколько флагов могут совместно использовать байты. Как в случае с файлом w3e, который содержит информацию о текстурировании поверхности, прочитать можно здесь xgm.guru/p/wc3/insidew3mfiles
Формат: уровень воды и 2 флага используют одну группу из 4 байтов. Как? 2 старших бита используются для флагов, остальное зарезервировано для уровня воды (диапазон значений просто поменьше). Иногда байт может содержать две или более разных данных.
-Structures (структуры):
Warcraft 3 также использует структурированные типы различного размера.
2. Формат W3M / W3X (карта)
Файл W3M или W3X - карта Warcraft III (Сценарий AKA Warcraft III в редакторе мира). Это по сути мини MPQ-архив, использующий "новый" формат сжатия.
Заголовок экрана загрузки - заголовок, показанный на экране загрузки. Имеет размер 512 байтов.
Подзаголовок экрана загрузки - подзаголовок, показанный на экране загрузки. Имеет размер 260 байт
Текст экрана загрузки - здесь можно добавить текст описания вашей карты.
По умолчанию - восстановление экрана загрузки, предлагаемого по умолчанию.
Вот формат заголовка (фиксированный размер = 512 байт):
char [4]: идентификатор файла (должен быть "HM3W")
int: неизвестно
string: название карты
Далее внизу пойдут параметры, описание взял из xgm.guru/p/wc3/worldedit_guide_2
int: map flags (они точно такие же, как в файле W3I)
  • 0x0001: 1 = скрыть мини-карту на экранах предпросмотра - это не дает возможности игрокам видеть открытую карту на экранах предварительного просмотра. Если галочка напротив этого пункта установлена, то мини-карту невозможно увидеть, находясь в системе общения или при выборе карты для создания коллективной либо индивидуальной игры. "Сценарий => Параметры карты => Скрыть мини-карту на экранах предпросмотра"
  • 0x0002: 1 = изменить приоритеты союзников. Найти можно в разделе "Сценарий => Приоритеты союзников => включить галочку изменить приоритеты союзников, и смело редактируйте" В этом разделе можно установить исходную позицию для каждого игрока, что позволит разместить команды рядом друг с другом. Например, если ваша карта разработана для игры двое на двое, вы наверняка захотите, чтобы члены каждой команды при начале игры оказались рядом друг с другом. Для этого нужно, чтобы члены одной команды поместили своего союзника в окошко "Высокий приоритет", а всех остальных игроков - в окошко "Нет". Категория "Низкий приоритет" оценивается ниже категории "Высокий приоритет", но выше, чем "Нет". Перед изменением этих параметров проставьте галочку напротив "Изменить приоритеты союзников".
  • 0x0004: 1 = melee map (карта ближнего боя), "Сценарий => Параметры карты => Набор игровых" xgm.guru/p/wc3/210540 (Переводчик: Точно не уверен этот ли параметр, просто со временем сильно изменилось, столько патчей вышло)
  • 0x0008: 1 = playable map size was large and has never been reduced to medium (размер игровой карты был большим и никогда не уменьшался до среднего) (Переводчик: я не знаю, что это за параметр, и где такой находится. Но не кажется ли, что это "Сценарий => карты и граница обзора => снизу стоят поля для галочек" ??
  • 0x0010: 1 = замаскированная область видна частично. "Скрытые области частично видимы" - области, не пройденные игроком, будут ему слегка видимы (не полностью скрыты, как при выбранной "Черной маске"), хотя и гораздо темнее, чем при выбранном "Тумане войны". "Сценарий => Параметры карты => Скрытые области частично видимы"
  • 0x0020: 1 = фикс параметры игрока. Включение параметра "Фикс. параметры игрока" имеет следующий эффект: игрок теряет возможность изменять расу и цвет, указанный в свойствах игрока, а также не может устанавливать любые параметры кланов. Т.е. какие настройки задал в редакторе, такие и будут в игре (нельзя будет изменить расу, цвет, союзы). "Сценарий => Свойства клана => фикс параметры игрока"
  • 0x0040: 1 = использовать "Нестандартные кланы" Клан - то же самое, что и команда. Вы можете сделать так, что несколько игроков будут принадлежать к одному клану. Это может означать, что они начнут игру в качестве союзников, им будет разрешена союзная победа и общее поле зрения. Чтобы внести изменения в состав кланов, сначала поставьте галочку напротив пункта "Нестандартные кланы". Вы можете назначить следующие параметры для членов клана: Союзник, Общая победа, Общее поле зрения, Общие войска, Полностью общие войска. "Сценарий => Свойства клана => Нестандартные кланы"
  • 0x0080: 1 = использовать пользовательское дерево технологий. Здесь можно определить, какие игроки могут строить какие войска, использовать способности и др. Боевая единица может быть построена, если рядом с ее названием проставлена галочка "Доступно". Если галочка не проставлена, эту боевую единицу нельзя ни построить, ни нанять. Для использования этой функции нужно проставить галочку напротив "Нестандартные технологии". (Внимание: простановка этой галочки делает вашу карту не подходящей для режима сражения). "Сценарий => Технологии => Нестандартные технологии"
  • 0x0100: 1 = использовать пользовательские способности. Здесь можно запретить одному или нескольким игрокам использовать определеные индивидуальные способности. Например, можно разрешить игроку обучать волшебниц, но запретить способности Замедление, Невидимость или Полиморф. Для использования этого пункта нужно проставить галочку напротив пункта "Нестандартные способности". (Внимание: простановка этой галочки делает вашу карту не подходящей для режима сражения). "Сценарий => Способности => Нестандартные способности"
  • 0x0200: 1 = использовать пользовательские апгрейды (улучшения). Здесь можно решить, в каком состоянии на момент начала игры находятся исследования игроков. Если улучшение в списке помечено как "Исследовано", то игрок начнет игру с данным улучшением. Если улучшение помечено как "Недоступно", его нельзя исследовать, если оно помечено как "Доступно" - можно. Для использования этого пункта нужно проставить галочку напротив пункта "Нестандартные улучшения". (Внимание: простановка этой галочки делает вашу карту не подходящей для режима сражения). "Сценарий => Улучшения => Нестандартные улучшения"
  • 0x0400: 1 = меню свойств карты открывается хотя бы один раз с момента создания карты (Переводчик: мне неизвестен этот параметр, за что отвечает не ясно, все просмотрел в редакторе. Возможно, нельзя изменять хосту параметры при создании карты в локальной сети)
  • 0x0800: 1 = показывать волны воды на скалах. Показывать волны на крутых берегах - включение и отключение показа волн на крутых берегах. "Сценарий => Параметры карты => Показывать волны на крутых скалах"
  • 0x1000: 1 = показывать волны воды на холмистых берегах. Показывать волны на пологих берегах - включение и отключение показа волн на пологих берегах. "Сценарий => Параметры карты => Показывать волны на пологих скалах"
int: максимальное количество игроков
затем следуют 00 байтов, пока 512 байтов заголовка не будут заполнены.
Вот формат подзаголовка (необязательно):
char [4]: идентификатор знака подзаголовка (должен быть "NGIS" == "знак" перевернут)
байт [256]: 256 байтов данных для аутентификации. Я не знаю как они используются в данный момент.

MPQ-архив может содержать следующие файлы
(если открывать карту или архивы игры mpq-архиватором, вы часто будете встречать такие файлы):
О форматах карт W3M / W3X (<= в пункте 2 подробно рассказано про бинарный код основной карты)
  • (listfile) (<=пункт 3)
  • (signature) (<=пункт 3)
  • (attributes) (<=пункт 3)
  • war3map.w3e (<= "данные об ландшафте карты" пункт 5)
  • war3map.w3i (<=краткая инфа о карте, пункт 3)
  • war3map.wtg (<=запись о триггерах и переменных, пункт 3)
  • war3map.wct (<= текстовая инфа о триггерах, пункт 3)
  • war3map.wts (<=описание всех текстов: триггеров, способностей, полей карты и прочее пункт 3)
  • war3map.j (<= скрипты, краткая инфа в пункте 3, в пункте 4 подробный разбор)
  • war3map.shd (<= "карта теней" пункт 6)
  • war3mapMap.blp (<=пункт 8)
  • war3mapMap.b00 (<=пункт 8)
  • war3mapMap.tga (<=пункт 8)
  • war3mapPreview.tga (<=пункт 9)
  • war3map.mmp
  • war3mapPath.tga
  • war3map.wpm
  • war3map.doo
  • war3mapUnits.doo
  • war3map.w3r
  • war3map.w3c
  • war3map.w3s
  • war3map.w3u
  • war3map.w3t
  • war3map.w3a
  • war3map.w3b
  • war3map.w3d
  • war3map.w3q
  • war3mapMisc.txt
  • war3mapSkin.txt
  • war3mapExtra.txt
  • war3map.imp
  • war3mapImported\*.*
Вы сможете подробно изучить, что делает каждый из перечисленных выше файлов. Что за формат, что делает, как открыть. (Примечание переводчика: изначально, я всю информацию не читал и не изучал. И начал самостоятельно пробовать изучать и искать информацию на сайтах, и добавлять заметки. Об этом можно прочитать ниже)
(для понимания скину ссылку на русском, в ней подробно описано xgm.guru/p/wc3/insidew3mfiles ):
3. Основная информация карты
  • (listfile) <= Список всех входящих в архив файлов, представлен в обычном текстовом виде. Можно открыть блокнотом. В них указаны пути всех этих файлов, название и формат. Позволяют некоторым программам, такие как mpq-архиваторы и редакторам, видеть списки в архиве. Обычно, в картах специально удаляют Listfile, и когда архиватором пробуют открыть, то не можете просматривать содержимое. Приходится взламывать xDeprotect. Вы можете получить последние списки файлов для Warcraft на www.wc3campaigns.net/tools/weu/stuff.html
  • (signature) <= Примечание переводчика: неизвестно, не встречал такое. Переводится как подпись.
  • (attributes) <= в (attributes) записаны контрольные суммы и даты модификации всех файлов.
Примечание ShadoW DaemoN xgm.guru/forum/showthread.php?t=18840&highlight=%28attribute... : В основном, этот файл является головной болью для тех, кто редактирует архивы вар3, так как перестают совпадать контрольные суммы и, следовательно, архив перестает быть дееспособным. В большинстве случаев решается удалением этого файла из архива. В редких случаях удаление не помогает, тогда нужно создать правильный пустой файл атрибутов (8 байт):
00 01 00 00 00 00 00 00
  • war3map.w3i <= Различная информация по карте, которая задаётся в едиторе в разделе сценарий. Открывается легко блокнотом. Однако, особой какой-то информации не увидите, тк закодировано. Там текста не так уж и много. Можно белеберду увидеть с параллельно с ссылками на текст "TRIGSTR_XXX". А все записи хранятся в wts файле. В основном лежат описания заголовок названия карты, описания карты и прочее.
  • war3map.wtg <= Здесь хранятся все внутренние имена тригеров и переменных, которые редактор автоматически генерирует. Этот файлик можно открыть блокнотом
  • war3map.wct <= Здесь записываются текстовые тригеры. Так как они отличаются по своей структуре от обычных тригеров, то для их описания был создан специальный файл - это он. В текстовом виде они и задаются в этом файле. Или что-то в этом роде. Это файлик тоже открывается блокнотом
  • war3map.wts <= Здесь хранятся строковые значения введённые в некоторых полях тригеров. Открывается в блокноте
  • war3map.j <= Здесь, на языке JASS2, который придумали в Blizzard, записаны все тригеры, которые есть в карте. Отредактировать можно в редакторе JassCraft и др. Неплохо открывается в блокноте
4."war3map.j" JASS2
Скрипт (script). Это основной файл сценария карты. Это текстовый файл, и вы можете открыть его с помощью блокнота.
В карте этот файл имеет название war3map.j, его основной путь:
"war3map.j" - это основной код карты, все триггеры конвентируются в этот код
Иногда он может изменить свой путь в карте:
"Scripts\war3map.j" - это сделано с помощью средств защиты карт, чтобы вы не могли его использовать. По идее все скрипты игры в самих архивах находятся в этой же папке "Scripts\название скрипта.j" Кроме кода карты war3map.j, существуют другие файлы (коды по управлению ИИ ai, common.j blizzard.j - списки функции и переменных и др):
  • Все нативки, используемые в скрипте карты, также указаны в файле "Scripts\Common.j" - в этом файле объявляются и инициируются список нативок и констант, которые используются в редакторе триггеров, без них не возможна работа любой карты.
  • Также можете использовать функции из "Scripts\Blizzard.j" - в этом файле указан список функции (оберток) и переменных, и константв, которые можно использовать в редакторе триггеров. Облегчают работу, обертки укорачивают код или используют в гуи.
  • Язык также используется для файлов AI в warcraft. В AI-скриптах вы можете использовать функции из "Scripts\Common.j" и "Scripts\Common.ai" - в этом файле объявляются и иницируются нативки, константы, и функции. Все это для работы с ИИ. Правда, с редактором триггером это никак не пересекается, триггеры или точнее обработчик игры работает только с war3map.j. Для этого, чтобы обработчик видел нативку, ее нужно объявить.
xgm.guru/p/wc3/sell-unit <= пример как нужно объявлять нативку (ее нужно в гуи в шапку засунуть в редакторе триггеров)
Используемый язык называется JASS2 и был разработан Blizzard. Это чувствительный к регистру язык.
Когда загружаете карту, то jass-скрипт war3map.j загружается, и начинает загружать и читать код игры.
В игре Warcraft III в меню выбора карт, когда вы просматриваете карту, выбирая так. То при выборе карты программа сперва находит функцию "config" (в ней записаны название карты и настройки игроков, союзов), и благодаря этой функции вам отображается все в меню игры (показывают мини-карту, название, слоты игроков)
Затем, когда выберете карту, и ее запустите. Warcraft III начнет искать функцию "main", и запустит настройки карты. В этой функции указано самое основное, по сути запускает все остальное. В ней указаны размеры обзора камеры, модель неба, звук. Инициирует глобалки, создает объекты на карте. Запускает некоторые начальные триггеры.

Язык использует несколько ключевых слов, как описано здесь:
Key word (ключевые слова в языке) Описание и значения:
function
Эта функция открывает участок кода. Обычно после function пишут название функции. Пример function A, здесь функция имеет имя A
takes
Эта указатель функции (вставка). Используется для указания параметров. В один параметр обычно указывают тип переменной (integer, real, boolean и др) и названия. Можно указать несколько параметров в функции. Эти все создано для передачи аргумента, и работы с ним.
Таким образом, после takes вы указываете аргументы пример real x, real.
function A, takes real x, real y .....
//внутри можете работать с переменными x,y
endfunction
Обычно при вызове можно указать, передать аргументы в функцию, пример:
call A(55.0, 66.00) //передал в аргумент координату x=55 и y=66
Так вы объявляется внутри функции локальные переменные x, y. Конечно, эти переменные видимы только внутри функции. В отличии от локальных переменных, объявленных через local , здесь не нужно обнулять хэндл.
Если вы не хотите объявлять аргументы, то пропишите takes nothing. Пример:
function B, takes nothing .....
//код (иначе этот код называют телом функции)
endfunction
вызывается код так:
call() //внутри скобки ничего не указываем, пусто. Тк nothing - ничего.
returns
Это еще один указатель функции. Здесь указываем тип переменной (объекта), которого функция должна принять. Благодаря этой штуке, можно принимать значения:
function B5 takes nothing returns integer
return 5 <= должно бы вернуть целое число, тут вернет 5
endfunction
что нам дает этот returns, практически можно написать функции, после каких-то вычислений можем получить любой аргумент. И записать его в переменную. Например:
set i = B5() //тк функция B5 нам вернет 5, и запишем в переменную i 
call B5() //по идее можно еще вызвать напрямую через call. Однако, вы не сможете так принять значение, оно будет утеряно. Поэтому такое действие бесполезное
если вам ничего возвращать не нужно, просто запишите nothing
function C takes nothing returns nothing
//код, тк функция ничего не принимает nothing, то и возвращать return ничего не надо
endfunction
return
Это одно из действий функции. Что оно делает? Возвращает аргумент (число, объект handle, строку и пр). Работает строго внутри функции. Вы возвращаете тот тип аргумента, который указан в returns, иначе выдаст ошибку.
Пример понимания как работает ретурн в функции, в результате процесса возвращает Boolean (логическое значение: да или нет):
function D takes nothing returns boolean
//...первая часть кода
return true
//...вторая часть кода, эта вторая часть кода никогда не будет работать. Тк действие прервется. Поток обрубается после return. Такая особенность, стоит учитывать, особенно при обнулении локалок. Обычно пользователи обнуляют локалки во второй части кода
endfunction
Если функция ничего не принимает returns nothing, то return по идее не должен работать. Вообще-то это ошибочное мнение, просто нельзя указать ей какой-то аргумент. Но иногда бывает нужно обрубить поток, нужно сделать так что дальше кусок кода функции не обрабатывался. Как это сделать? Вот так:
function E takes nothing returns nothing
//…первая часть кода
return
//…вторая часть кода, которая не запустится. Да именно после return ничего не вводим, достаточно "return" ввести. Тк принимает тип аргумента nothing, то есть ничего. Это норм. Теперь знаете как обрубать действия
endfunction 
endfunction
Закрывает функцию. Если это не прописывать в конец функции, это естественно, вернет ошибку. Оно заканчивает действие функции.
call
Используется для вызова функции, которая ничего не возвращает. call()
globals
Используется для определения списка (блока) глобальных переменных (list of global variables). Внутри скрипта в самом верху содержится список всех глобалок, которые объявляются в самом начале игры.
globals
    integer hhh =0
    real ddd = 0
    integer array ew //array - массив переменной
endglobals
Глобальные переменные работают везде.
endglobals
Закрывает список глобальных переменных (list of global variables)
local
Локальные переменные. Что касается локальных переменных, то это переменные, которые создаются внутри функции. Создаются в начале функции, обычно в функции прописывают:
function F1 takes nothing returns nothing
local integer a = 0 //<= объявляют тип аргумента и название переменной
//… код
endfunction
Создаются они в тот момент, когда функция запускается на исполнение, и перестают существовать, когда действие окончено. Если триггер запущен на исполнение несколько раз, то при каждом запуске функции создается свою набор локальных переменных, никак не связанный с другими наборами.
Об этом много написано в статьях:
set
Оператор присваивания. Устанавливает значение переменной
set a = 5
set a = a+b
if, elseif, else, then, endif
Условный оператор - с его помощью можно "разветвлять" алгоритм, чтобы в одном случае он сработал одним образом, а в другом - другим. Для этого есть условный оператор, у которого есть "условие" (как условие в триггере) - если оно истинно, то алгоритм "пойдет" по одному ветвлению, если оно ложно - по другому. Ветвления называются then (в случае истинны) и else (в ложном).
Блок условий. Бывает нужно запускать код, после определенной проверки. Пример:
Если "воин ранен" тогда,
     Действие: Восстановить здоровье
Конец
"воин ранен" - условие, внутрь ставят Boolean. Есть множество условии и нативок. Проверяют. Boolean возвращает истину или ложь. При истине запускают действие.
Если (…) тогда - конец - конструкция, блок кода выполняемый в триггерах. Это действие аналогично jass:
If (…) then
    //…код (пишут действие, если вернет истину)
endif
Есть разные конструкции:
Если (…) - иначе - конец - это конструкция позволяет выбрать только одно из 2-х действии
If (…) then
    //одно действие
Else
    //или другое
Endif
Если (…) - иначе Если (…) - конец - это конструкция поможет перебрать из нескольких условии нужное действие
If (…)then
    //действие
elseIf (…)then
   //действие
Endif
Loop
Exitwhen (…)
endloop
Существует еще блок цикла.
Цикл - разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Также циклом может называться любая многократно исполняемая последовательность инструкций, организованная любым способом (например, с помощью условного перехода).
Loop - открывает блок цикла
 //сюда пишем код, который будет повторяться. Этот код называется телом цикла. Будет идти сверху вниз, дойдя до низа, конца повторяет действие снова сверху-вниз
Endloop - закрываем блок цикла
Для цикла еще важно внутри блока цикла написать условие выхода из цикла (exitwhen …), иначе код внутри не может бесконечно повторяться, компьютер имеет лимит операции. В варкрафте есть защита от подвисания, при достижении лимита действии (операции) поток обрывается.
Loop
 Exitwhen (…) - условие выхода из цикла, указываем boolean
 //код (тело цикла)
endloop 
условие выхода может находиться так и посередине между частями тела цикла, или в конце тела цикла.
Loop
      //код (часть тела цикла)
      Exitwhen (…)
      //код (часть тела цикла)
endloop 
Loop
      //код (тело цикла)
      Exitwhen (…)
endloop 
Чтобы оборвать цикл, нужно сделать так, чтобы условие вернуло истину. Как это сделать? Написать true. Примерно так:
Exitwhen true - завершит цикл. Можно использовать конструкцию if-then-endif для того чтобы выйти из цикла.
Loop
    //код (часть тела цикла)
    If(…)then
         Exitwhen true
    Endif
    //код (часть тела цикла)
endloop
Источник: xgm.guru/p/wc3/jass-crash-course (см. раздел Циклы)
constant
Определяет константу, то есть нельзя изменить никак. Существуют так константы, так и константные функции и нативки. экономит память и дополнительно защищает переменную от изменения. Указывают в list of global variables
type
определяет тип/класс объекта. Обычно в аргументах функции указывают тип аргумента, или при объявлении переменных указывают тип переменной (integer,real,boolean,string,handle,unit и др). В игре существует очень много типов, источник xgm.guru/p/wc3/jass-crash-course
Существует только два родительских "native types":
nothing и "handle". Все остальные типы являются производными handle (ключевое слово "extends"). Вы можете получить полный список типов и нативных функций из файла с именем "Scripts\Common.j" в вашем файле War3.mpq.
extends
Ключевое слово extends используется в объявлении класса или в выражениях класса для создания дочернего класса. Вкратце, существует родительский (основной) класс "extend" благодаря которому существуют доп классы. Пример:
unit => widget => agent => handle
источник xgm.guru/p/wc3/jass-crash-course (инфа в разделе производные от handle)
просмотреть можно еще в файле common.j где объявляются все типы и их производные.
Вместо widget можно указать юнита unit, вместо handle можно указать юнита unit
Пример нативках SetWidgetLife/GetWidgetLife можно вместо widget указать юнита, декор или итем
native
Нативка (англ. Native - родной), можно дословно перевести как родная функция. В редакторе триггеров сшиты в движок основные родные функции игры. Является заголовком внешней встроенной функции, реализованной в Game.DLL
Пример родная функция передачи предмета юниту:
native UnitAddItem takes unit whichUnit, item whichItem returns Boolean
все родные функции записаны в common.j, blizzard.j файлах
не все функции доступны в редакторе, например нативки из common.ai не доступны в редакторе триггеров. Некоторые нативки нужно объявить, указать в самом war3map.j файле

array
Используется для объявления массивных переменных
local unit array u
set u[0]=юнит 1 //используют квадратные скобки
set u[1]=юнит 2
и др
globals
      integer array AAA
endglobals
set AAA[0]=5
set AAA[1]=6
и др
Не обязательно, чтобы индексы (эти самые номера) шли по порядку. Можно использовать отрицательные индексы. Однако массив ограничен - [-8192...8192]. То есть, элемента с номером 8193 существовать не может, а при попытке присвоить / читать такой элемент он просто вернет 0 (а значение не будет присвоено, никаких предупреждений об ошибках). Подробнее о массивах мы поговорим позже. Особенно их удобно применять в паре с циклами.
В GUI триггерах можно указать размерность массива, то есть в нескольких массивов будет указано одно и то же число:

Эти все переменные из редактора триггеров инициируются в функции InitGlobals в war3map.j файле (не только массивы, но и глобалки)
function InitGlobals takes nothing returns nothing
    local integer i= 0

    set i=0
    loop
        exitwhen ( i > 1 )
        set udg_AAA[i]=0
        set i=i + 1
    endloop
endfunction
Основные типы данных в Jass
Существует несколько основных типов для дескриптора:
Null <= общее нулевое значение
Integer <= целое число
Real <= плавающее число (действительное число)
String <= строка
Boolean <= логическая алгебра
Handle
Code
Вот список операторов, распознаваемых языком:
Operator (оператор)meaning (значение)Типы данныхИспользование
( … )скобки для приоритетовInteger, real, string, booleana*(b+c) <= изменен порядок действии при сложении. a or (b and c) <= работа с boolean, укорачиваем действия.
+Сложение чисел.Integer, reala+b <= сложение чисел
+Cложение строк (конкатенация - сцепление, присоединение строк)stringstring_1 + string_2 <=присоединение строки 2 к строке 1. Например, конкатенация слов "микро" и "мир" даст слово "микромир"
-ВычитаниеInteger, reala-b
*УмножениеInteger, reala*b
/ДелениеInteger, reala/b
=Оператор присваиванияЛюбой тип set a = a + 1 целочисленная переменная a значения. запись объектов-таблиц в переменную (в JASS за исключением типов integer, boolean и real, все остальные типы являются табличными) производится не путём их переноса из одной области памяти в другую, не путём их копирования, а путём указания в переменной числа-идентификатора этих таблиц в памяти или других таблицах. set s = "Привет" переменная тип "строка" хранит не саму строку, а адрес её значения в строковой таблице. set u = unit переменная тип "юнит" записывает юнита. А точнее число (ссылку), в котором указан адрес в таблице
= =, <, <=, >, >=, != Оператор сравнения ( англ. comparison)В зависимости от знаковПример ниже
Для того, чтобы работать с условиями, необходимо понять, как принцип работы с логическим типом boolean. Ранее о нём говорилось, но вот о работе с ним - нет. Логический параметр может быть переменной, а может быть и функцией, возвращающей булевое значение (true или false, т.е. "истина" или "ложь").
При помощи логических параметров можно сравнивать, что угодно, проверяя истинность или ложность выражения. Всё, что происходит при сравнении логического типа - это сведение выражения к одному определённому результату - истине (true) или лжи (false). Для этого есть приставка not ("не"), связки and ("и") и or ("или").
Также для сравнений разных параметров, логических и не логических, можно использовать операторы, которые для удобства сведены в одну таблицу ниже.
Любой оператор сравнивает два одинаковых типа или два неявно приводимых к одинаковым.
Договоримся условно, что a и b в таблице ниже - это переменные любого типа. Вместо переменных можно также подставлять вызов функции, возвращающей соответствующий тип, либо постоянное значение (т.е. готовый результат).
НазваниеРеализация в JASSТипы, с которыми работает операторПринцип работы
Равноa == bЛюбой типЕсли значение переменной а соответствует значению переменной b, то операция вернёт результат true (истина), иначе она вернёт результат false (ложь).
Не равноa != bЛюбой типЕсли значение переменной а не соответствует значению переменной b, то операция вернёт результат true (истина), иначе она вернёт результат false (ложь).
Большеa > binteger, real, stringЕсли значение переменной а больше, чем значение переменной b, то операция вернёт результат true (истина), иначе она вернёт результат false (ложь).
Меньшеa < binteger, real, stringЕсли значение переменной а меньше, чем значение переменной b, то операция вернёт результат true (истина), иначе она вернёт результат false (ложь).
Больше или равноa >= binteger, real, stringЕсли значение переменной а больше, чем значение переменной b, либо соответствует её значению, то операция вернёт результат true (истина), иначе она вернёт результат false (ложь).
Меньше или равноa <= binteger, real, stringЕсли значение переменной а меньше, чем значение переменной b, либо соответствует её значению, то операция вернёт результат true (истина), иначе она вернёт результат false (ложь).
Помимо операторов существуют логические операции, которые заметно упрощают построение действий, где нужно получить определённый результат работы на выходе. Если Вы - несведущий в логике человек или же хотите посмотреть, как базовые логические функции реализовываются в JASS, откройте спойлер, расположенный ниже.
Чтобы упростить понимание, все логические функции сведены в удобную таблицу.
Договоримся условно, что a и b в таблице ниже - это логические переменные (типа boolean).
НазваниеСинтаксис в JASSПринцип работы
Отрицаниеnot a"Меняет знак" логического выражения. Если в переменной а получается значение true (истина), то выражение not a даст в результате false (ложь) и наоборот.
Конъюнкцияa and bЕсли переменные a и b обе истинны, то конъюнкция даст в результате значение true (истина), иначе она даст в результате значение false (ложь).
Дизъюнкцияa or bЕсли хотя бы одна из переменных a и b содержит значение true, то дизъюнкция в результате даст значение true (истина), если же обе содержат значение false, то и дизъюнкция даст в результате значение false (ложь).
Импликация(not a) or bУсловная конструкция формы "посылка - следствие". Возвращает true (истина) во всех случаях, кроме того, когда переменная а содержит значение true (истина), а переменная b содержит значение false (ложь).
Эквиваленция((not a) or b) and (a or (not b))Не путайте эквиваленцию с конъюнкцией - они похожи, но это на самом деле разные операции. Если конъюнкция для возврата значения true (истина) требует, чтобы обе переменные a и b содержали значение true (истина), то эквиваленции для возврата значения true (истина) достаточно того, чтобы a и b содержали одинаковое значение, то есть либо обе были истинны, либо обе были ложны.
Строгая дизъюнкцияnot (a and b) and (a or b)Забавная вещь. Более известна под названиями "сложение по модулю 2", "исключающее <или>", а также XOR. Так как оператора xor (или ^) в JASS нет, обходимся без него, используя правило "одно или другое, но не оба". Возвращает значение true (истина), если у переменных a и b значения разные (одна из них истинна, а другая - ложна) и значение false (ложь) в других случаях.
Штрих Шеффераnot (a and b)Эта операция также известна под названием NAND. Если значения переменных a и b оба истинны, то эта операция вернёт в результате значение false (ложь). В любом другом случае она вернёт значение true (истина).
Стрелка Пирсаnot (a or b)Эта операция также известна под названием NOR. Фактически, это отрицание штриха Шеффера, то есть, эта операция вернёт значение true (истина) только в одном случае - если значения переменных a и b ложны.
Это все основные логические функции. Существуют ещё основные логические аксиомы и тождества, которые придут Вам на помощь при упрощении логических выражений. О них Вы сможете узнать здесь.
Основные типы данных в JASS
В языке известны следующие шесть примитивных типов:
НазваниеРодительский типДопустимые значенияЗначение по умолчаниюКомментарий
integer __int32 в C [ -2147483648 ; 2147483647 ] 0 Целочисленная. Хранит в себе любые целые числа в своей области допустимых значений (32-битные числа). Аналогична типу __int32 языка программирования С.
real float в C [ -3.4 * 10^38 ; 3.4 * 10^38 ] 0.0 Реальная. Хранит в себе любые целые числа в своей области допустимых значений. Аналогична типу float языка программирования С.
string Ссылка на массив символов char до 1023 байтов (до 1013 для совместимости с сохранением и загрузкой игры) null Строка, принимающая символы UTF-8. В памяти содержится как хеш-таблица строк, которые не удаляются из памяти до окончания игры.
boolean __int32 в C [ -2147483648 ; 2147483647 ], константы true и false false Логическая (булевая) (ru.wikipedia.org/wiki/Логический_тип). Несмотря на то, что технически обрабатываются только значения 1 и 0 (истина и ложь), можно использовать весь доступный диапазон чисел. Аналогична типу bool языка программирования С++ ru.wikipedia.org/wiki/C%2B%2B
handle __int32 в C [ -2147483648 ; 2147483647 ] null Указатель, но не на ячейку памяти напрямую, а на адрес в хеш-таблице ссылок. По своей сути это обычное число, представленное в виде, похожем на pointer языка программирования С++ ru.wikipedia.org/wiki/C%2B%2B, но со своими отличиями - об этом позже.
code handle Существующие функции 0 Указатель на функцию. Единственный тип в JASS, который не поддерживает массивы и формально не может быть задан локальной переменной, только напрямую в параметрах функции. Работает аналогично с указателем на функцию в языках С и С++.
Доступное новичку объяснение того, что такое ссылки, указатели и объекты
В самом понятном определении, объекты - это таблицы с данными специфического содержания.
Адресацию объектов можно объяснить так: есть стол, который стоит в определённой квартире. Квартира - это объект в доме. Дом - это объект на улице. Улица - это объект в городе. Город - это объект в стране. Страна - это объект на материке. Материк - это объект на планете. Планета - это объект в системе. Система - это объект в галактике. Галактика - это объект во Вселенной.
Таким образом, чтобы обратиться к объекту "стол", сначала надо узнать галактику его нахождения, в галактике - систему, в системе - планету, на планете - материк, на материке - страну, в стране - город, в городе - улицу, на улице - дом, в доме - квартиру.
Чтобы избежать такой долгой адресации, каждому экземпляру объекта присваивается уникальный идентификатор во Вселенной (или же в программе). Этот идентификатор - номер ячейки памяти, в которой содержится определённый экземпляр объекта.
Присвоим этот идентификатор нашему столу. Теперь вместо того, чтобы говорить "стол в таком-то доме на такой-то улице такого-то города в такой-то стране такого-то материка на такой-то планете такой-то системы в такой-то галактике во Вселенной", мы можем сказать "стол с таким-то идентификатором". Обращение получается короче и выполняется быстрее. Такое обращение называется ссылкой, потому что указывает на определённый объект в определённой ячейке памяти.
Отличайте указатели от ссылок!
Указатель - это тип переменной, которая может принимать значение любого адреса в памяти, либо нулевое. Благодаря указателям можно получать объекты прямо из памяти и читать их с жёсткого диска без загрузки в оперативную память. В связи с этим указатели существенно экономят расход памяти.
Ссылка - это объект, который при обращении к себе "перенаправляет" на другой объект, на который он ссылается. Обращение к объекту по ссылке называют разыменовыванием ссылки. Ссылка - своеобразный посредник между пользователем и объектом, к которому он хочет обратиться и реализуется разными способами в каждом языке программирования.
Вся эта информация была взята из источника xgm.guru/p/wc3/jass-crash-course (см. раздел типы данных и их наследование). Выше было указано основных 6 типов, остальные типы (более 89) являются производными (эту информацию тоже можете посмотреть по этой же ссылке. Таблица большая, поэтому не стал копировать)
Один интересный факт заключается в том, что все типы данных имеют одинаковую длину = 4 байта. Это позволяет "type casting" (с англ. менять один тип на другой), злоупотребляя дырой в syntax checker (эта программа, которая проверяет код war3map.j на предмет синтаксических ошибок). Что это за дыра? Конечно, это return (указатель), возвращающий значение функции с конкретным типом.
Обычно, если указать неправильный тип, то система выдаст ошибку (пример: функция принимает тип item, а пытаемся возвратить юнита unit):
function A1 takes nothing returns item
local unit u = …
return u
endfunction
Если правильно все сделать, такой ошибки не будет. Типы должны соответствовать: принимающий и возвращающий. В старых версиях игры можно использовать handle, так и integer. Принимающий handle == возвращающий integer (так и наоборот) - система не будет считать это за ошибкой.
В старых версиях игры использовали этот баг return bug с handle (тупо конверт типов), handle - это просто число (адрес хэш-таблицы). Можно использовать тип, так и возвратить его число handle (адрес), или наоборот.
A => Integer H возвращает адрес хэш-таблицы H, где хранится A. Если в переменной A ничего не указано, вернет 0. Нужно было дополнительно обнулять значение переменной H, иначе, если дальше работать с H, то возникал вылет. Поэтому прописываем return 0
Integer H => A возвращает объект A, хранящийся по адресу ячейки H. Если ничего не записано в этой ячейке, или указан не тот тип, вернет null. Нужно для каждого типа писать свою конверт-функцию. Нужно было дополнительно обнулять значение переменной A, иначе, если дальше работать с A, то возникал вылет. Поэтому прописываем return null
Можно указать одновременно несколько return, лишь в одном из этих типов указать соответствующий тип с принимающим типом. Это обязательно нужно указать соответствующий тип, иначе syntax checker выдаст ошибку. Мы так обманываем систему syntax checker.
function Int2Handle takes integer I returns handle
return I
return null
endfunction
function Handle2Int takes handle H returns integer
return H
return 0
endfunction
Конечно, это доступно в ранних версиях игры (до патча 1.24). Близзард переписали код, добавив хэш-таблицу и нативки для работы с ней.
зачем нам нужны эти handle? Дело в том, что каждый объект на карте, каждый юнит, каждое дерево, каждый итем имеют свой номер (адрес хэш-таблицы). Ни у кого такой не сможет совпасть. Эти номера используют в качестве ключей. Вы можете записать на этот объект очень много информации. Или наоборот доставать информацию по этому ключу.
5. Файл ландшафта
war3map.w3e <= Здесь содержится информация о текстурировании поверхности. Обычно открывается Hex-редактором. Для редактирования поверхности (w3e) рекомендуем программу w3e-injector (очень старая программа)
еще можно zepir для ландшафта (в принципе тоже самое)
Ниже скрин, показан как просматривался hex-редактором (источник xgm.guru/p/wc3/insidew3mfiles ):
Рассмотрим пример того, что какая информация записано насчет текстурировании карты.
Возьмем пример карту, карта имеет размер 32х32 тайлов
32х32=1024 всего тайлов
Примечание: хотел взять размер карты 64х64, но отказался. В hex-файле тогда бы записи было в 2 раза больше, и искать их же дольше пришлось бы, тк была запись длиннее. Поскольку в самом варкрафте, в hex-редакторе я не нашел порядкового номера в варкрафте. Записи как таковой не ведут. Но возможно существует возможность с помощью offset-ов как-то находить. Это в hex-редакторе должны быть такие функции, мне это неизвестно.
Размер одного тайла, короче размер картинки составляет 64x64. Он собирается из различных кубиков. xgm.guru/p/wc3/tiling
Нумерации в war3map.w3e это в hex-файле нет, там содержит сверху сначала основную информацию карты. Затем информация каждого тайла, там код из 7 байтов чередуется по порядку.
На картинке ниже показан нижний левый угол карты, с него начинается чередовать 7-байтовая кодировка тайлов в war3map.w3e.
Нумерация должна по логике начинаться с 0, то есть с координат (0,0) - нижний левый угол. Не путать с реальными координатами карты, там точка (0,0) - центр карты. Это привел для примера другую систему координат, где центр (0,0) нижний левый угол. И увеличиваться по оси x+32 (0+32,0), (0+64,0), и тд пока добьет первый ряд. Потом переключаются на следующую строку. Пример:
Если я беру и редактирую узел 4, у меня изменяются 4 тайла: это 1,2 и 33,34. Информацию об этом можете рассмотреть ниже на карте. Об этом красочно расписано в статье xgm.guru/p/wc3/tiling
Если беру узел 1, у меня редактируется тайл 1, бывает вместе с ним и 2, 33, 34
Примечание: в зависимости от обстоятельств тайлов может изменяться гораздо больше. Максимум 8-9. Все зависит от соседних клеток-тайлов. Просто в обычном обстоятельстве редактор при пометке 1 точки размещает 4 тайла при условии что соседние клетки никак не изменены. В моем тестовом варианте, я беру угол карты, то есть 4 клетки.
Давайте рассмотрим на что влияет 7-ми байтовая кодировка в варике.
XX XX XX XX XX XX XX
Рассматриваем кодировку:
Первые 4 бита определяют текущую высоту точки (0xAABB где AA-старший разряд, отвечающий за знаки (00 - минус или FF - плюс) и BB - младший разряд, отвечающий за размер высоты. Можно поднять/опустить специальными командами возвышенность (когда берете прямоугольную область, и поднимаете/опускаете центр прямоугольника).
map edge boundary flag - лимиты, границы высоты карты (это важные константы для определения высоты):
minimum height = 000С -> 0xC000 => -16384 минимальная высота, которую вообще можно задать точкам. Эта минималка помогает определить флаг boundary_flag от текущей точки. У каждой точки это значение boundary_flag различно
maximum height = FFF3 -> 0x3FFF => +16383 максимальная высота, которую можно задать точкам. Максималка помогает определить значение water_data. Это тоже значение water_data у каждой точки различно.
ground zero height или normal height = 0002 -> 0x2000 => 8192 стандартная высота (уровень высоты = 0). Когда вы создаете карту, у вас в редакторе высота ландшафта (земли) изначально принимает высоту 0. От нее отталкиваются все высоты (деревьев, юнит и др объектов). С помощью этого значения каждой точке находят свою высоту
Когда вы в редакторе WorldEdit водите курсор мыши, вы видите координаты мыши. По ней сложно определить реальную высоту ландшафта. Она показывает высоту мыши над землей. Это меня сбивало от реальных значений. Согласитесь, что 8192 - это слишком большое значение. Покопался, и просмотрел в редакторе zepir высоту. Только там можно просмотреть высоту.
Даже в триггерах в дебагах нельзя реальное значение выявить, тк высоту юнитов по такому же принципу выявляет, что и мышка.
default water level = 0x0200 = 512 стандартный уровень высоты воды. В реальном значений условились, что "глубокая вода" находится на 2 уровня ниже земли. Когда вы создаете воду в редакторе, вокруг нее создается утесы и она у вас опускаете на n-уровней ниже. Примечание переводчика: Здесь с этими вычислениями выходит очень запутанная хрень, когда я первый раз читал статью. Реальная высота земли в вычисления по формулам почему-то ниже, поэтому, надеюсь, картинка разъяснит вам все "почему так"
Вторые 4 бита определяют границы карты. Флаг границы (тень, сгенерированная редактором мира граница по краю карты).
Следующие 4 бита определяют основные флаги тайла (см подробный разбор ниже)
Основные флаги тайлов (4 бита):
XXXY
X - флаг (порча=2, вода=4, граница=8, спуск=1, вода или ramp = 5). Флаг граница = 8 обычно используется через панель инструментов (можно сгенерировать границы карты через "Сценарии => Размер карты и границы обзора", но это немного не то).
X - тип тайла (почва Ldrt, грубая почва Ldro, трава Ldrg, камень Lrok и пр. расположена в том порядке, в каком указано в war3map.w3e). Пример: W3E!....L........LdrtLdroLdrgLrokLgrsLgrd
Если вода: X - вид воды (0-мелкая вода около краев клиффов, 2 - глубокая вода, 4 - мелкая вода) , Y - вариация тайла, что проглядывается под водой (не воды).
Если земля: XY - вариация тайла земли (максимум 16, никто не пробовал больше 16)
Примечание: здесь пытаюсь задать различные настройки тайлу в данной точке. Можно навести порчу,
00 20 00 20 00 00 F2 без флагов = 0
00 20 00 20 11 04 F2 Флаг "уклон, спуск" = 1 на грубой почве = 1, вариация почвы = 4. Этот спуск/подъем образует мост (проход) между двумя уровнями высот (слоями)
00 20 00 20 21 04 F2 порча = 2 на грубой почве = 1, вариация почвы = 4. Порча деформирует изображения некоторых соседних клеток своей кляксой, мб на изображении текстур показаться "ямки". Преобразует декорации.
Ниже перечислена вода, этот тип тайла вызывает деформацию соседних точек. Обычно сразу образуется ряды утёсов вокруг воды.
00 20 00 20 40 07 11 флаг воды = 4 на почве Ldrt = 0, мелкая вода около клиффов (видны травинка/грунт по краям от клиффов. Обычно принимает либо грунт или трава, в зависимости от типа клиффа)= 0, вариация тайла (не воды!)= 7, 11 - тип клиффа = трава = 1, уровень высоты тайла (слоя) = 1
00 20 00 20 40 27 10 флаг воды = 4 на почве Ldrt = 0, глубокая вода около клиффов = 2, вариация тайла (не воды!) = 7. Земли под водой практически не заметно. 10 - тип клиффа = трава = 1, уровень высоты тайла (слоя) = 0
00 20 00 20 41 4D 11 флаг воды = 4 на грубой почве Ldro = 1, мелкая вода (от краев, водичка прозрачна, видна земля) = 4, под прозрачной водой видна грубая почва Ldro, которая имеет вариацию тайла (не воды!!) = 0x= 13, 11 - тип клиффа = трава = 1, уровень высоты тайла (слоя) = 1
00 20 00 20 41 2D 10 флаг воды = 4 на грубой почве Ldro = 1, глубокая вода (от краев) = 4, вариация тайла (не воды!!) = 0x= 13. Земли под водой практически не заметно. 10 - тип клиффа = трава = 1, уровень высоты тайла (слоя) = 1
00 20 00 20 85 0C F2 граница = 8 на темной траве = 5, вариация камня = 12. Через эту границу нельзя пройти войскам. Однако, ничто не мешает расстрелять через это препятствие, если цель, конечно, в зоне досягаемости находится.
Примечание: пытаюсь изменить тип текстуры, и потом сравнить.
00 20 00 20 00 00 F2 почва Ldrt, вариация почвы = 0
00 20 00 20 01 06 F2 грубая почва Ldro, вариация грубой почвы = 6
00 20 00 20 02 06 F2 почва с мелкой травинкой Ldrg , но на русском переводят как "почва", вариация этой почвы = 6
00 20 00 20 03 0C F2 камень Lrok 0x0C hex =12 dec вариация камушка = 12
00 20 00 20 04 0E F2 трава Lgrs 0x0E hex = 14 dec вариация травы = 14
00 20 00 20 05 0C F2 темная трава Lgrd , вариацию пометил как случайную
00 20 00 20 06 04 F2 нестандартная грубая почва. Мне пришлось добавить в список Летнего Лордерона тайл из другого пака. Эти изменения вносятся в war3map.w3e. Пример: W3E!....L........LdrtLdroLdrgLrokLgrsLgrdAdrd
Примечание: здесь пытаюсь менять текстуры почвы, у нее много различных вариации. И проверять изменения кодировок, чтобы затем сравнить. Также есть примеры выше насчет воды, там тоже вариация меняется.
00 20 00 20 00 00 F2 вариация почвы = 0
00 20 00 20 00 01 F2 вариация почвы = 1
00 20 00 20 00 02 F2 вариация почвы = 2
Последние 2 бита имеет дело с уклоном (другое определение клифф, утёс). Короче определяет тип уклона (грунт=0, трава=1, если не задан клифф, то вместо нее обычная земля = F) и уровень высоты тайла (имеет другое определение "уровень слоя" layer)
Примечание: ряд тайлов имеют вокруг точки землю, то есть эти 4 тайлов пока еще не являются клиффами. Утёсами. Я собираюсь их редактировать.
00 20 00 20 00 00 F2
00 20 00 20 00 11 F2
00 20 00 20 00 04 F2
00 20 00 20 00 04 F2
Примечание: ряд тайлов вокруг одной точки имеют траву
00 20 00 20 00 00 12
00 20 00 20 00 11 12
00 20 00 20 00 04 12
00 20 00 20 00 04 12
Примечание: ряд тайлов вокруг одной точки имеют грунт
00 20 00 20 00 20 02
00 20 00 20 00 40 02
00 20 00 20 00 41 02
00 20 00 20 00 0C 02
Теперь объяснил что значат все эти значения в 7-байтовой коде, поэтому далее будет дан пример как рассчитать высоты тайла и уровень глубины воды

Пример данных Tilepoint (Внимание: показан пример, как определяют высоту и прочее. Однако, не ручаюсь за ответы, но можно проверить данные формулы в редакторе zepir) :
51 21 00 62 56 84 13
  1. Определить высоту земли Ground_height
  2. 1.1) Взять первые 4 символа 51 21
  3. 1.2) Старший бит первого байта поменять местами с младшим битом. 5121=> 0x2151
  4. 1.3) Конвертировать число из 16 системы счисления (hex) в 10-чную систему счисления (dec) = 8529 dec
  5. Определить текущий флаг тайла Current_boundary_flag
  6. 2.1) Взять второй байт 0062
  7. 2.2) Старший бит байта поменять местами с младшим битом. 00 62 => 0x6200
  8. 2.3) Конвертировать число из 16 системы счисления (hex) в 10-чную систему счисления (dec) = 25088 dec
  9. 2.4) Извлечь флаг границы -> вкратце нужно извлечь число из битовой операции (Ground_height AND minimum height). Про битовые операции можно прочитать в интернете. Также можно пользоваться специальным калькулятором, например в встроенном калькуляторе Window 10 есть универсальный калькулятор: есть и инженерный, и программный, и чего там только нет. Нам нужен программный, там можно делать вычисления с другими системами счисления, и конвертирование, и побитовые операции.
    0x6200 & 0xC000 = 110 0010 0000 0000 & 1100 0000 0000 0000 = 100 0000 0000 0000 => 0x4000=16 384
_110 0010 0000 0000
1100 0000 0000 0000
_____________________
_100 0000 0000 0000
флаг границы определен 0x4000=16 384
  1. Определить текущий уровень воды water_date
Нужно извлечь число из битовой операции (Ground_height AND maximum height)
0x6200 & 0x3FFF = 110 0010 0000 0000 & 11 1111 1111 1111=0x2200=8704

110 0010 0000 0000
_11 1111 1111 1111
_____________________
_10 0010 0000 0000
Флаг water_date определен 0x2200=8704
  1. Извлечем и обработаем исходные данные из кодировки текущего тайла
XX XX 56 84 13
5 - флаг тайла, означает вода или ramp
6 - тип тайла (почва, грубая почва, трава, камень и пр). Мне неизвестно, что у автора за тип тайла, тк в Лордероне максимум можно 5 типов задать. Можно нестандартно изменить и добавить в ландшафт новые тайлы
84 -> означает, что tilepoint использует детальную текстуру # 132 (= 0x084). Если конвертировать из hex в dec, то получается №132. Не знаю, что за детальная текстура с номером 132, к чему номер 132 присобачить. Но маленько искал, и не нашел (возможно она где то записано, но это не так важно). Я тестировал (см. пример выше), у меня это отвечает за вариацию текстур и еще за тип водных тайлов, если задействована на воде.
13 -> 1 - означает тип скалы/клиффа (грунт=0, трава=1, земля = F), layer = 3 - текущий уровень высоты ландшафта (уровень слоя), у каждого тайла свой уровень высоты
Текущая "конечная высота" плитки (тайла), которую вы видите на WE (это с учётом глубины воды), определяется так (у каждого тайла своя высота):
final height=((Ground_height - normal height + (layer-2)* default water level ) )/4=((0x2151 - 0x2000 + (3-2)* 0x0200) )/4=((8529 - 8192 +512) )/4=212,25
Вышел я объяснял, что реальная высота земли ниже на 2 слоя, чем вода. Поэтому прибавляют default water level
Для определения уровня глубины воды для начала найдем water_zero_level:
water_zero_level = k * 128 = -0,7*128=-89,6
значение коэффициента "k" подбирают из файла water.slk = -0,7, а вот "128" откуда взято автором мне не ясно. Возможно это размер клетки или высота клетки, на 1 уровне уклона ландшафта высота = 0, на следующем уровне - оно либо больше/ниже на 128. Это можно проверить в редакторе, опуская или поднимая уровень уклона
Текущий "уровень глубины воды", которую вы видите на WE, определяется как:
water level = ((water_date - normal height)/4) - water_zero_level = ((8704-8192)/4)-89.6=128-89,6=38,4
В этом примере вы вычислили уровень глубины воды. Уровень воды обычно ниже высоты ландшафта, поэтому вряд ли вы увидите в игре такие значения. Эти расчеты были только в качестве демонстрации.
6. Карта теней
war3map.shd <= Не содержит заголовки, только рабочую информацию.
Размер файла .shd =16x<ширина_карты>x<высота_карты>.
Например, карта с размерами 64х64. 16х64х64= 65 536 - размер файла
Один байт может иметь значение: 00 - нет тени, FF - есть тень. Просмотреть можно в hex-редакторе.
Каждый квадрат текстуры (земли или утёса) содержит 16 квадратов тени (4*4).
Есть одна проблема с этими тенями, если в редакторе создать тип юнита или тип декорации, и поставить на карту, у вас прорисуются тени. Обычно с какими-нибудь изменениями вроде удаления юнита с карты, тень убирается. И бывает так, что вы удаляете тип юнита (не юнита, который на карте, а тип юнита!!), но сам юнит остался на карте вместе с тенью. Когда вы этого юнита удалите, тень все равно останется. Предположение: Возможно, это связано с моделью. Наверное, когда убираете модель, такое тоже происходит. Поэтому нужно удалять этот файл, и заново рассчитать тени на карте.
7. Формат BLP (текстура или иконка, короче изображение)
BLP означает "Blip"-файл, аббревиатура которого расшифровывается как "BLIzzard" picture (изображения)".
Сам файл BLP содержит нужную бинарную-информацию изображения: заголовок JPEG и данные JPEG. Все данные можете изучить с помощью программы с работой иконками - BLP Laboratory. Когда берете эту программу, и нажимаете "Файл => Сохранить как…" у вас выскакивает нужные параметры для редактирования. Можете отредактировать и сохранить, а позже проверить файл с помощью hex-редактора.
char [4]: 42 4C 50 31 = file ID ("BLP1") заголовок, идентификатор файла, этот код вначале везде прописывается во всех blp. Существует так BLP1, так и BLP2 (hex-код будет другой). В других форматах изображения (TGA,JPG,PNG и др) распорядок бинарного кода другой (все по-другому), и поэтому не увидите этого в начале.
В blp-файлах используется алгоритмы сжатие JPG изображения. Существует 2 разных типа сжатия JPG-BLP (см. разбор ниже про палитровый и сжатый форматы). У этих типов разная глубина сжатия цвета: либо используют 1 байт на пиксель (256 цветов) или 2 байта на пиксель (65536 цветов). ru.wikipedia.org/wiki/%D0%93%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D0%B0...
В программе BLP Laboratory в инструкциях пишут, что существуют:
  • Палитровый формат (0x00) - Изображение будет сохранено в качестве набора индексов с указанием на палитру. Палитра расположена сразу после заголовка BLP и имеет определенное число записей (256). В процессе обработки, если текущий цвет не будет найден в палитре, то он заменяется на приближенный цвет из палитры.
  • Сжатый формат (0x01) - Изображение будет сохранено в формате jpeg. Он наиболее применяем для изображений с большим количеством цветов. Размер файлов таких изображений практически не меняется, если поместить его MPQ (или любой другой архив). Поэтому формат и назван "сжатым". Изображение может быть сохранено с определенным качеством 1-100%. Spec рекомендует использовать 60-80%, что позволяет добиться хорошего качества при небольшом размере файла.
Поэтому будет стоять флаг 0x00 или 0x01
int: 0x00000008 (8 бит) = имеет альфа-прозрачность изображение, 0x00000000 (0 бит) = не имеет альфа-прозрачность изображение обычно некоторые файлы должны иметь прозрачность, такие как ubersplat, image, даже большинство blp-иконок имеет. Такие файлы должны иметь в качестве обводки рамки небольшой альфа-слой вокруг изображения, иначе изображение получается смазанным или растягивающим xgm.guru/p/100/212944 К счастью, у BLP laboratory есть задавать прозрачную рамку вокруг иконки//
Может быть добавлено еще 2 байта. Что они значат, неизвестно. Например, текстура модели Rifleman.blp имеет доп. 2 байта после альфа-прозрачности 0x0000
int: ширина изображения: 0x00000040 = 64
int: высота изображения: 0x00000040 = 64
К примеру размер иконки равен 64x64. Для текстур моделей, картинок мини-изображении размер мб другим.
int: флаг для альфа-канала и командных цветов: 0x00000004 (обычно 3, 4 или 5), 3 и 4 означают информацию о цвете и альфе,5 означает только информацию о цвете. Короче если >= 5 для текстур "юнитов", цвет команды не будет отображаться (в BLP laboratory если выбрать пункт "очистить/удалить альфа канал, то в бинарный код ставится 5").
int: всегда 0x00000001, если 0x00000000, модель, которая использует эту текстуру, будет беспорядочный. Примечание переводчика: мне неизвестно и непонятно что за флаг
int [16]: смещение mipmap (смещение от начала файла)
int [16]: размер mipmap (размер mipmaps)
Что такое минимап? Это кол-во копии, которое может прорисовать видеокарта. Это влияет на качество картинки при приближении/отдалении камеры. На нужном расстоянии мы видим стандартный размер, при отдалении камеры от объекта создается копия изображения с меньшим качеством. Без минимапинга у вас осталось мерцание полосок.
Если это JPG-BLP, мы продолжаем:
int: размер заголовка jpg (размер заголовка) "h" (обычно 0x00000270)
байт [ч]: заголовок
затем 0 байтов до начала данных JPEG, мы можем безопасно
сотрите эти 0 байтов, если мы исправим смещение mipmap, указанное выше
байт [16, размер mipmap]: начиная с каждого из 16 адресов смещения mipmap, мы читаем необработанные байтовые данные jpeg "размер mipmap" до конца файла, имея заголовок и данные mipmap, и мы можем обрабатывать изображение как обычные файлы JPG
Если это палитра BLP, мы идем сюда:
байт [4, 255]: палитра BGRA, определяющая 256 цветов по значениям BGRA, каждый по 1 байту
byte [ширина x высота]: ColorIndex каждого пикселя сверху вниз слева направо, ColorIndex относится к определенной выше цветовой палитре
байт [ширина х высота]: альфа-индекс каждого пикселя в стандартной палитре оттенков серого для альфа-канала, где 0 полностью прозрачен, а 255 непрозрачен,
если флаг типа изображения установлен на 5, изображение не имеет альфа-канала, поэтому этот раздел будет опущен
Более подробные спецификации blp от Magos:
8. Картинка мини-карты
war3mapMap.blp или war3mapMap.b00 или war3mapMap.tga <= Изображение миникарты.
На предпросмотре, или при загрузке карты мы видим лишь мини-карту.
Как импортировать свою картинку вместо миникарты? (взят из faq XGM-форума)
Сохраните картинку в формате 32 бита с расширением .tga, импортируйте изображение с помощью Import Manager'a, два раза кликните на файл в окне импорта и сотрите весь путь до названия файла. Далее само название поменяйте на war3mapPreview.tga
Для замены игровой миникарты необходимо заменить файл war3mapMap.blp, причем возможны 2 варианта.
  • импортируется blp-текстура размером 2х2 пикселя, в таком случае игра не может ее открыть и полностью перекрывает обзор миникарты (если не задан war3mapPreview, то вместо миникарты на стандартном загрузочном экране будет знак вопроса на синем фоне, а в игре окно миникарты будет пусто и мертво, на нем даже ping-и не будут отображаться)
  • импортируется blp-текстура размером 256х256 пикселей, в таком случае просто фоновая картинка ландшафта будет замещена нашей текстурой, оставаясь фоновой (поверх видны иконки и ping-и)
9.Картинка превью
war3mapPreview.tga <= картинка (превью). В чем отличие от изображения мини-карты? Так в том, что на мини-карте эта превью не отображается.
war3map.mmp - этот файл открывается hex-редактором. (источник xgm.guru/p/wc3/insidew3mfiles)
The menu minimap - оформление значками миникарты, появляющейся при загрузке карты.
Заголовок.
int: неизвестно, что означает, но обычно = 0
int: количество значков - максимальное кол-во значков на карте, учитываются не только значки нейтральных домов и всяких магазинов. Но и исходные позиции игроков, хоть они и не отображаются на карте, но они берутся в расчет (в файле). Например, у меня на карте было 3 нейтральных магазина, откуда в файле на пустой карте взяться 0xF=15 точкам. Очевидно, это из-за 12 игроков. Подробно не тестировалось, возможно, еще как-то нейтрально-враждебные лагеря влияют на мини-карту.
Главная часть.
На каждый значок приходится по 16 байт
int: тип значка
00 - золотая шахта
01 - нейтральное здание
02 - стартовая точка игрока
int: коодината значка по Х (координаты на мини-карте от 0 до 255)
int: коодината значка по Y (координаты на мини-карте от 0 до 255)
Например:
10, 10 - сверху слева
80, 80 - по центру
F0, F0 - снизу справа
Последние 4 байта блока первого значка - цвет в формате СС ЗЗ КК АА = синий, зелённый, красный, альфа канал.
03 03 FF FF : красный
FF 42 00 FF : синий
B9 E6 1C FF : cyan
81 00 54 FF : пурпурный
00 FC FF FF : жёлтый
0E 8A FE FF : оранжевый
00 C0 20 FF : зелённый
B0 5B E5 FF : розовый
97 96 95 FF : светло серый
F1 BF 7E FF : светло голубой
46 62 10 FF : голубой
04 2A 49 FF : коричневый
FF FF FF FF : нет цвета
war3mapPath.tga - карта путей
war3map.wpm
war3map.doo
war3mapUnits.doo
war3map.w3r
war3map.w3c
war3map.w3s
war3map.w3u
war3map.w3t
war3map.w3a
war3map.w3b
war3map.w3d
war3map.w3q
war3mapMisc.txt
war3mapSkin.txt
war3mapExtra.txt
war3map.imp
war3mapImported\*.*
We'll see now what these files stand for.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
18
4 года назад
0
0x0008 это использовать нестандартный тип ландшафта,


UPD:
с тенями всё немного сложнее
я в своей статье делал исследование на эту тему
war3map.shd -> Скриншоты
Загруженные файлы
0
9
3 года назад
0
"Я француз, поэтому, пожалуйста, простите за мой английский!" - забавно XD
0
3
2 года назад
0
Вы забыли ещё файл war3mapMisc.txt - игровые константы.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.