О статье
После статьи про клифы возникло желание написать похожую статью про воду, но тут будет скорее просто разбор характеристик стандартной воды и пример ее кастомизации (насколько мне известно нельзя юзать несколько типов воды, они привязаны к базовому ландшафту). Так же понадобится самоподключающийся .mix архив.
Тестировалось только на 1.26.
Подготовка
База
Вода это те же тайлы, только рисуются поверх тайлов ланда и могут быть всячески анимированы.
Текстуры воды лежат по пути ReplaceableTextures\Water во вложенных mpq (A.mpq, B.mpq, C.mpq и т.п) и как и в случае с клифами зависят от базового ланда, т.е. выборочно подгружаются; они имеют имена Water*.blp где * это номер (по дефолту от 00 до 44).
Текстуры из дополнения ROC так же есть и в самом war3.mpq по тому же пути но у них в имени есть приставка по типу A_ , где первая буква характеризует ланд.
Текстуры воды лежат по пути ReplaceableTextures\Water во вложенных mpq (A.mpq, B.mpq, C.mpq и т.п) и как и в случае с клифами зависят от базового ланда, т.е. выборочно подгружаются; они имеют имена Water*.blp где * это номер (по дефолту от 00 до 44).
Текстуры из дополнения ROC так же есть и в самом war3.mpq по тому же пути но у них в имени есть приставка по типу A_ , где первая буква характеризует ланд.
Данные о воде хранятся в файле TerrainArt\Water.slk.
Длинный список обозначений:
- waterID - идентификатор воды;
- height - высота воды, определяет на каком уровне по Z будет находится вода (0.0 это уровень рельефа, -1.0 это уровень мелководья, -2.0 это уровень глубоководья; положительные значения будут рисовать воду выше рельефа на котором она расположена);
- impassable - проходима ли вода (0 - проходима, 1 - непроходима; летать можно в любом случае);
- texFile - файл текстуры воды;
5-8 - Цвета на миникарте (от 0 до 255).
- mmAlpha - прозрачность;
- mmRed - красный;
- mmGreen - зеленый;
- mmBlue - синий;
9-14 - Эти поля связаны с текстурой и влияют на саму текстуру.
- numTex - количество задействуемых текстур;
- texRate - скорость смены текстур;
- texOffset - с какой текстуры начинать анимацию (или сдвиг при анимации, хз зачем оно надо);
- alphaMode - режим наложения текстуры (0 - Blend, 1 - Add, 2 - Mod, 3 - Mod 2X, 4 - Alpha Key);
- lighting - влияет ли освещение на текстуру (0 - не влияет, 1 - влияет);
- cells - размер текстуры, имеется ввиду сколько клеток будет занимать текстура;
15-25 - Эти поля влияют на движение тайлов.
- minX - минимальный предел движения по горизонтали;
- minY - минимальный предел движения по вертикали (по дефолту minX minY и прочие выставлены на 0 и вода сама по себе не движется, меняется только текстура);
- minZ - минимальный предел движения по высоте (угу, вода может быть анимирована по высоте, создавая эффект приливов и отливов);
- maxX - максимальный предел движения по горизонтали;
- maxY - максимальный предел движения по вертикали;
- maxZ - максимальный предел движения по высоте;
- rateX - скорость движения между пределами minX и maxX по горизонтали;
- rateY - скорость движения между пределами minY и maxY по вертикали;
- rateZ - скорость движения между пределами minZ и maxZ по высоте;
- revX - инвертировать ли горизонтальное направление движения воды rateX при достижении горизонтальных пределов minX или maxX (чтоб вода могла туда-сюда течь; 0 - не инвертировать, 1 - инвертировать);
- revY - инвертировать ли вертикальное направление движения воды rateY при достижении вертикальных пределов minY или maxY;
Пример где задействованы все эти поля.
26-13 - Эти поля связаны с волнами на стыке рельефа.
- shoreInFog - показывать ли волны в тумане войны (0 - не показывать, 1 - показывать);
- shoreDir - директория с моделями волн;
- shoreSFile - поддиректория и модель волны на стыке рельефа бег угла (станет ясно если глянуть на путь дефолтной волны Doodads\LordaeronSummer\Water\Shoreline\Shoreline0.mdx);
- shoreSVar - количество вариаций модели shoreSFile (по дефолту везде стоит 0, похоже за ненадобностью, т.к. в самой модели можно заюзать множество анимаций с разной редкостью);
- shoreOCFile - поддиректория и модель волны на стыке рельефа углом наружу;
- shoreOCVar - количество вариаций модели shoreOCFile;
- shoreICFile - поддиректория и модель волны на стыке рельефа углом внутрь;
- shoreICVar - количество вариаций модели shoreICFile;
Где какие углы.
34-49 - Эти поля связаны с цветом воды основываясь на разнице между высотой воды и высотой рельефа под ней (линейная цветовая интерполяция).
- Smin_A - мелководье, минимальная прозрачность;
- Smin_R - мелководье, минимальный красный;
- Smin_G - мелководье, минимальный зеленый;
- Smin_B - мелководье, минимальный синий;
- Smax_A - мелководье, максимальная прозрачность;
- Smax_R - мелководье, максимальный красный;
- Smax_G - мелководье, максимальный зеленый;
- Smax_B - мелководье, максимальный синий;
- Dmin_A - глубоководье, минимальная прозрачность;
- Dmin_R - глубоководье, минимальный красный;
- Dmin_G - глубоководье, минимальный зеленый;
- Dmin_B - глубоководье, минимальный синий;
- Dmax_A - глубоководье, максимальная прозрачность;
- Dmax_R - глубоководье, максимальный красный;
- Dmax_G - глубоководье, максимальный зеленый;
- Dmax_B - глубоководье, максимальный синий.
Нужный инструментарий
- Любой MPQ редактор (я юзаю Ladik's MPQ Editor).
- Любой редактор для работы с SLK таблицами (тот же Microsoft Excel).
Кастомизируем воду
В данной статье мы будем извращаться над дефолтной водой Подземелья (DSha), а именно переделаем воду в лаву.
Как и в случае с файлами тайлов и клифов, файл воды TerrainArt\Water.slk нет смысла кидать в импорт мапы, поэтому создадим пустой .mix архив по этой статье и назовем его WaterCustom.mix, закинем туда файл TerrainArt\Water.slk который мы будем редактировать по ходу дела.
1) Определимся с текстурой и цветом - в нашем случае подойдет и текстура воды самого подземелья так что оставим поле texFile дефолтным, однако чтобы это больше походило на лаву сделаем ее полностью непрозрачной изменив поля Smin_A и т.д. (все 16 штук), поставив значения:
- Прозрачность : 255
- Красный : 255
- Зеленый : 255
- Синий : 215
- mmAlpha : 128
- mmRed : 224
- mmGreen : 32
- mmBlue : 0
Как по мне так наша лава слишком жидкая и мелкая.
2) Воспользуемся хитрушкой-заманушкой и вместо динамической смены текстуры сделаем движение одной текстуры по горизонтали/вертикали, так же увеличим ее размер. Изменим следующие значения:
- numTex : 1
- texRate : 0
- cells : 4
- rateX : 4
- rateY : 4
- revX : 0
- revY : 0
Надо что-то сделать с этими морскими волнами...
3) Неплохо было бы заменить модели волн на что-то типа всплеска лавы или разлета искр, но чисто для пример возьмем модельки огня которые я фастом сварганил - одна для shoreSFile и вторая для shoreOCFile/shoreICFile (модельки по этим путям мы запихнем в наш WaterCustom.mix):
- shoreDir : Doodads\Dungeon\Water
- shoreSFile : DungeonShoreline
- shoreOCFile : DungeonShorelineCorner
- shoreICFile : DungeonShorelineCorner
Уже похоже на лаву, хотя огня кажется многовато.
4) Небольшие косметические изменения, например можно сделать так чтобы по лаве нельзя было перемещаться и чтобы ее было видно даже без источников света:
- impassable : 1
- lighting : 0
Для того чтобы лава так же отображалась в редакторе надо немного "пропатчить" .mpq вара таким же образом как и наш WaterCustom.mix.