Warcraft III: "Редактор миров" для начинающих. Часть 2
АрхивГидПродолжение рассказа о World Editor - самом открытом и богатом по возможностям редакторе из всех, какие компания Blizzard выпускала до сих пор.
Продолжение статьи Романа Георгиева о мощнейшем редакторе для Warcraft 3. Первую часть читайте здесь.
Начать следует с того, чтобы задать количество игроков и сил: Scenario -> Forces (появляется таблица Scenario Properties). Игрок, на самом деле, один, - вы, но расы, управляемые компьютером, также считаются отдельными игроками, и следовательно, по количеству запланированных рас нужно их и выставлять.
Стоит иметь в виду, что любые Creeps, по умолчанию нейтрально-агрессивные, то есть, готовые разить каждого встречного-поперечного, могут быть приписаны к любому игроку. Это даёт некоторые преимущества, поскольку, например, Creeps, принадлежащие какому-нибудь игроку, а не просто нейтральные, не будут спать по ночам. Во-вторых, им можно указать, кого трогать, а кого нет. Во втором эпизоде - с троллями, - это как раз то, что надо.
Forces - это союзные армии. В одну Force может входить сколько угодно игроков.
После того, как мы в редакторе расставляем нужные нам юниты по изначальным их позициям и устанавливаем (обязательно) Start Points для каждого игрока. А дальше начинаем разворачивать "регионы" (вызываются буквой R) - второго "слона", на котором держится игра.
Регионы - это участки на карте произвольного размера, которые, помимо сугубо утилитарных функций, могут выполнять и самый что ни на есть функции эстетические: например, в их пределах можно запустить лучи света, снег, метель и прочие красивости.
Но первая их функция связана, конечно, с триггерами.
Если посмотрим на скриншот редактора (regions.jpg), то мы увидим, что гном-стрелок перебегает из одного региона в другой, а затем обратно, и что нежить, и наш отряд тоже располагаются в своих регионах.
Собственно, самый простой способ заставить контролируемого компьютером юнита (или группу, если таковая создана) перебежать откуда-то куда-то - это как раз установить регионы и в Trigger Editor (клавиша F4) выбрать из списка триггеров следующий:
Action -> Unit - Issue Order Targeting a Point (отдать приказ с указанием на пункт на карте). Дальше вам предложат выбрать, какой именно Unit, какой именно Order (в данном случае - Move To) и в какую именно точку в каком регионе.
И побежали.
Если речь идёт о групповых действиях, то очень невредно будет задать специальную переменную (variable) - пустую группу. Это делается при выборе команд в Trigger Editor, при задании инструкций по Actions (в одной из вкладок появляется опция Edit Variables) или через Object Manager -> Variables, дальше клик правой кнопкой и в меню выбираем View Object, появляется меню редактирования переменных.
Для создания "пустой" группы юнитов надо указать Variable Type: Unit Group, Initial Value: Empty Unit Group (Default), и присвоить название этой переменной.
В нашем случае создаётся группа нежити, поэтому она обозначена "undead_band"
После чего в Trigger Editor, в самом первом триггере, "событием" (Event) для которого выступает инициализация карты (Map Initialization), в разделе Actions указываем:
Add Unit Group -> Units in Region owned by Player.
Всё, что подчёркнуто, в редакторы обозначено как ссылки на соответствующие пункты меню, так что вы выбираете нужный регион и нужного игрока. После выбора строка команды выглядит так:
Unit Group - Add all units of (Units in Undead Start <gen> Owned by Player 2 (Blue) to undead_band.
Расшифруем: Unit Group - это категория команд для раздела Actions; все они распределены по алфавиту, и для простоты помечено, что к чему относится. Add all units - это текст команды Unit Group - Add Unit Group (см. выше). Как нетрудно понять при знании английского, все юниты, располагающиеся в указанном регионе (под названием Undead Start, в данном случае) и принадлежащие Player 2 (Blue) - синему игроку, контролируемому компьютером, присоединяются к другой группе, обозначенной переменной undead_band. Как ни парадоксально, но с помощью "переменной" обеспечивается постоянство этой группы, вне зависимости от региона, в котором эти нежити все пребывают.
Если этого не сделать, то, в случае необходимости дать единое указание всем представителям нежити, придётся постоянно пользоваться командами, связанными с пребыванием юнитов, принадлежащих определённому игроку в определённом регионе. По сути, придётся каждый раз собирать всех этих пауков и трупоедов в группу по новой, а это неудобно.
Вообще, в триггере, где в качестве Event выставлено Map Initialization, указываются все действия, которые должны совершиться сразу после начала игры, без участия игрока - от указания, кто кому враг, а кто союзник (см. скриншот или откройте карту в World Editor), до манипуляций с камерой и режимом Cinematic (в котором управление отсутствует). Там же задаются первые движения.
Для последующих триггеров необходимо задавать уже совсем другие Events, либо не задавать их вовсе, если в каком-либо триггере содержится инструкция к запуску другого триггера (Run Trigger).
Наиболее часто используются такие триггеры, как Unit Enters Region - юнит входит в регион, или Unit Leaves Region - юнит покидает регион. В принципе, список возможных "событий" довольно велик, но не конкретен, конкретика вводится в Conditions или непосредственно в Actions.
Простота синтаксиса (по сути, это просто английский язык, всё вполне визуально) иногда играет сама против себя. Например, есть в списке Conditions очень сходные, казалось бы, по смыслу пункты:
Unit in Region и Event Response - Entering Unit
Другое дело, что размещаются они в разных категориях. Unit in Region располагается в Conditions -> Boolean Comparison -> Unit in Region -> Region X contains Triggering Unit (такой-то регион содержит такой-то юнит).
А Entering Unit находится здесь:
Conditions -> Unit Comparison -> Event Response - Entering Unit.
Не дай бог спутать: если у вас в Events указано Unit Enters Region, и надо указать, какой именно, то тут необходимо задать в Conditions Entering Unit equal to <нужный персонаж>, в противном случае, т.е. если вы укажете, что Region X содержит <нужный персонаж>, триггер просто не сработает.
Ещё один подводный камень - это повторяемость или неповторяемость триггеров. Если при входе в регион какой-то персонаж делает какое-нибудь мудрое изречение (Строка триггера в целом будет выглядеть так: Cinematic - Send transmission to (All players) from <заданный персонаж> <gen> named <имя персонажа>: Play No sound and display <нужная фраза> Modify duration: Set to <продолжительность в секундах> and Wait <или Don't Wait>), то если он повторно войдёт в этот же регион, его фраза снова появится на экране. Тут, во-первых, необходимо ввести ограничение в Conditions (чтобы только при входе одного юнита выводилась его фраза), а во-вторых, в конце списка команд в Actions требуется ввести команду Trigger - Turn Off (This Trigger). Тогда триггер будет исполняться только один раз.
Ну и ещё несколько потенциально неприятных особенностей
Как известно, некоторых юнитов есть свои специальные способности. Например, во Frozen Throne "пауки" у нежити (Crypt Fiends) получают возможность зарываться в землю. Очень хорошо для обеспечения засад (в приложенной карте такая засада есть).
Проблема в том, что эта Ability - Burrow по умолчанию отсутствует. Это развиваемая способность, поэтому необходимо в Scenario ->Ability Properties, выбрав нужную расу, указать, что у Crypt Fiends способность Burrow является "исследованной" (Researched), в противном случае игра проигнорирует любые команды, с этим связанные. То же касается любых других специальных способностей.
Особенность AI: если юниты под управлением компьютера преследуют кого-то, то погоня прерывается, как только преследуемые отходят достаточно далеко. Единственный способ "лечения" этого, который удалось найти автору, - постоянные указания нежити атаковать такой-то регион или такие-то юниты (гномов или троллей, попадающихся на пути), по мере того, как эти юниты, или сами представители уважаемой нежити, входят в определённые регионы. Наверняка есть способы более рациональные - дерзайте.
Даже если указать какому-нибудь юниту (в нашем случае - гигантскому Wendigo), чтобы он атаковал конкретного персонажа (нашего горного короля, стоящего на краю скалы), если этот юнит по ходу атаки получит пулю от другого персонажа (стрелка), он может развернуться и напасть на того, кто его атаковал, вопреки инструкции в триггерах. Методы борьбы: приказать юнитам, которые могут атаковать без спросу, перебежать в другое место (куда угодно, особенно, если в камеру это не видно).
Что же касается камер, то, к счастью, управление камерой - сугубо визуальное. После её создания (режим камеры вызывается клавишей "M") вы видите изображение как раз самой камеры, а при двойном нажатии на неё появляется панель характеристик камеры, в которой можно указать "Preview Values in Main Window", так что как располагается камера и куда что через неё будет видно, сразу же наглядно отображается в главном окне, и всё можно подстроить "на глазок". Переключение камер осуществляется плавно, при этом в Trigger Editor -> Actions -> Apply Camera можно задать время, за которое это переключение будет происходить.