Военное ремесло. Часть 2. Картография WarCraft III: Создание сценариев и кампаний
Редактор: WarCraft III World Editor Где взять: Устанавливается вместе с игрой Возможности: После этой статьи — ограничены лишь вашей фантазией. Сложность освоения: Ниже средней. С тонкостями — чуть выше. Документация: В комплекте Здравия желаю, товарищи стратеги! В прошлом номере “Мании” вы ознакомились со статьей о создании мультиплеерных карт для WarCraft III. И наверняка у вас возникал резонный вопрос — зачем нужны самопальные melee-карты, когда в комплекте игры их и так навалом? В этой статье вы сможете узнать, как создавать сюжетные варкрафтовские карты и связывать их в единые кампании. А учитывая то, что никаких дополнительных сюжетных сценариев в комплекте с игрой нет, у вас есть шанс представить всему миру свой вариант продолжения сюжета. Раньше, чем это успеют сделать разработчики. Итак, давайте рассмотрим основы создания сюжетных карт. Новые требования В WarCraft III , в отличие от StarCraft , нельзя указать при выборе карты, будет ли она запущена как мультиплеерная ( melee ) или как сценарий — игра самостоятельно определяет тип карты. И чтобы игра признала в ваших новых творениях не мультиплеерные карты, а сценарии, нужно особым образом изменить некоторые их свойства. После того как вы построите основу будущей карты (ландшафт, базы игроков), зайдите в меню Scenario\Player Properties. В открывшемся окне вы сможете задать все свойства отрядов, присутствующих на карте. На первой представшей вашему взору закладке — Players — вы задаете, какие отряды вообще присутствуют на карте (просто установите галочку напротив), их названия и расы, а также кто этими отрядами управляет — компьютер или игрок. На закладке Ally Priorities задаются союзники игрока. Следом идет закладка Forces , на которой вы определяете, кто против кого воюет. Первым делом необходимо установить галочку на параметр Use Custom Forces и Fixed Player Settings. В списке ниже все силы, участвующие в битве, объединены в одном формировании. Разумеется, отряды одного формирования сражаться друг с другом не будут, поэтому создайте как минимум еще одну “силу” (кнопка Add Force ) и распределите по ним враждующие отряды. На следующих трех закладках — Techtree , Abilities и Upgrades — вы можете установить, какие способности и апгрейды уже изучены у какого-либо игрока, а также какие юниты и здания доступны ему для постройки. Не будем на них задерживаться. Также в окне Map Properties (вызывается, напомню, в меню Scenario\Map Description ) на закладке Description обязательно включите параметр Hide minimap in preview screens и отключите Masked areas is partially visible. Триггеры После того как сама карта
будет полностью завершена, понадобится создать триггеры, определяющие условия победы и поражения, контролирующие AI и прочее. Стоит сказать, что здешние скрипты и триггеры больше напоминают упрощенный язык программирования. При желании вы сможете даже создавать игры другого типа на варкрафтовском движке. Конечно, гонки или файтинг создать вряд ли получится, но простенькую ролевку или аркаду сделать можно. Примером тому служит карта The Death Sheep , которая идет в комплекте с редактором. Мы же пока обойдемся лишь основными возможностями триггеров. Откройте редактор триггеров — клавиша F4. В появившемся окне вашему взору предстанет примерно следующая картина: **__**В левой части окна расположился список, в котором будут отображены все созданные триггеры. Справа снизу помещается список событий, условий и выполняемых каким-либо конкретным триггером действий. Оставшееся пространство занимает окно, в котором вы можете написать комментарии к триггеру. С самого начала здесь присутствует лишь триггер, задающий условия игры для melee -карт. Рассмотрим на его примере, каким образом эти триггеры устроены. Итак, триггер активизируется, когда в игре происходит какое-либо событие ( event ), и события эти задаются в разделе Events. В рассматриваемом триггере таким событием является Map Initialization — запуск карты. В следующем разделе — Conditions — задаются дополнительные условия выполнения триггера. Например, помимо инициализации карты в качестве активатора можно указать, что триггер будет выполняться, только если сложность игры установлена на Difficult. В разделе Actions задаются действия, которые произведет триггер. Порядок действий можно менять простым перетаскиванием, но, например, в рассматриваемом триггере в этом нет никакого смысла, так все действия выполняются одновременно и действуют на протяжении всей игры. Немного освоившись со структурой триггеров, приступим к созданию основных. Правила игры Для начала удалите триггер Melee Initialization — он нам не понадобится. Новый триггер будет инициализировать карту на “сценарный” лад. Щелкните правой кнопкой мыши по каталогу Triggers в списке триггеров и в контекстном меню выберите пункт New Category (там все равно ничего больше выбрать нельзя). Название новой директории ни на что не влияет, но лучше уж назвать ее так, чтобы было понятно, какого рода триггеры там будут находиться. Для создаваемой директории задайте имя, скажем, Initialization. Затем щелкните по созданной папке и выберите пункт New Trigger. Ему, разумеется, тоже желательно давать имя, характеризующее его назначение. Приступим к заданию событий и действий триггера. Щелкнув по разделу Events правой кнопкой мыши, выберите в меню пункт New Event. По умолчанию будет установлено событие Map Initialization — оно нам сейчас и нужно. Дополнительных условий ( Conditions ) в этом триггере задавать не нужно. Затем установим действия триггера. Неплохо было бы сделать так, чтобы компьютерный оппонент проявлял какие-нибудь признаки интеллекта. Щелкните правой кнопкой мыши по одному из разделов триггера и выберите пункт New Action. В списке выбора действий выберите AI — Start Campaign AI Script. После этого в поле под списком нужно установить дополнительные параметры скрипта. Щелкните по строке Player 1 (Red) и в появившемся окне, выбрав пункт Preset , установите, интеллект какого именно игрока будет запущен. Затем нужно выбрать подходящий для игрока скрипт AI. Щелкните по строке map.ai и в новом окне впишите в поле Value имя
AI-скрипта, соответствующее расе игрока. Имена могут быть такими: orc.ai для орков, elf.ai для ночных эльфов, human.ai для людей и undead.ai для мертвяков. Установив все параметры, щелкаем OK — первое действие триггера готово. Если вы планируете создавать скриптовые сценки на карте, то необходимо также установить небо (действие Environment — Set Sky ), иначе в кадре можно будет увидеть лишь черную бездну. Также можно установить туман ( Environment — Set Fog ), ограничивающий поле зрения, чтобы камера не экспонировала дальние участки карты, попадающие в кадр. Помимо этого, по запуску карты можно назначить, например, стартовое время суток и скорость его течения ( Game — Set Time Of Day и Game — Set Time Of Day Speed ). Необходимо назначить описание задания, которое должен выполнить игрок для завершения уровня ( Quest — Create Quest ). В настройках всех перечисленных действий достаточно легко разобраться, поэтому предлагаю вам сделать это самостоятельно. Еще по инициализации карты необходимо установить, какой уровень запустится после того, как вы одержите победу на текущем. Это делается с помощью действия Game — Set Next Level — понадобится просто указать путь к карте (например, Maps\NextLevel.w3m ). После инициализации карты зададим условия победы. Для первого раза достаточно будет стандартных условий — победа засчитывается, если уничтожены все здания противника. Для этого создайте новый триггер (желательно в новой категории). В качестве активатора установите событие Unit — Player-Owned Unit Event. Строка настроек события должна иметь примерно такой вид: A unit owned by [отряд противника] [dies]. Затем установите дополнительное условие триггера — Integer Comparison. В поле настроек щелкните по строке Number of units… и в новом окне в списке Function выберите параметр Player — Count Structures. В поле настроек измените строку Player1 (Red) так, чтобы в ней был указан отряд противника. Также, изменяя строку Exclude , вы можете установить, будут ли учитываться недостроенные здания. Закончив с этими параметрами, щелкните OK и в предыдущем окне (где вы выбирали дополнительное условие) проверьте, чтобы строки Equal to и 0 оставались без изменений. Наконец, установите действие ( Action ) триггера — Game — Victory. В его настройках нужно лишь изменить строку Player 1 (Red) на отряд, управляемый игроком. Если условие поражения в вашем сценарии — потеря всех зданий игроком, вы можете создать второй такой же триггер. Нужно лишь поменять местами игрока и противника и, конечно, действие Game — Victory сменить на Game — Defeat. Диалоги Если уж мы назвали наш уровень “сценарием”, то в нем должен быть сюжет. А как иначе донести сюжет до играющего, если не диалогами? Вот только создавать диалоги, да и вообще скриптовые сценки, мы пока не научились. Поэтому сейчас самое время рассмотреть их создание. Диалоги и сценки обычно состоят из двух компонентов. Это сами диалоги (то есть различные текстовые и звуковые сообщения, произносимые юнитами) и перемещения камеры. Следует создавать отдельный триггер для камеры и отдельный — для разговоров, так как, если юнит произносит какую-либо фразу, то игра ждет ее окончания и лишь затем приступает к выполнению следующего действия. Прежде чем создавать какие-либо скрипты, определитесь, где будет происходить диалог и какие юниты примут в нем участие, и лишь затем начинайте создавать триггеры. Сперва разберемся с управлением камерой. Изменение положения камеры в игре осуществляется специальными маркерами, которые создаются с помощью палитры Camera Palette , находящейся в окне Tool Palette. Камера как бы переключается между этими маркерами, принимая указанное ими положение. Если вы хотите, чтобы камера не просто принимала то одну позицию, то другую, а перемещалась по сложной траектории, вам нужно создать несколько маркеров, которые будут своеобразными вэй-пойнтами для камеры. Чтобы создать маркер камеры, нужно просто щелкнуть по кнопке Create Camera. Выделив созданный объект и дважды щелкнув по нему, вы, как и в случаях с другими объектами редактора, попадете в окно свойств. Нет смысла рассматривать в журнале, за что отвечает каждый параметр — здесь все элементарно. Единственное — установите галочку на параметр Preview Values in Main Window. Таким образом камера обзора в главном окне примет положение выбранного маркера, и вы будете смотреть на карту с позиции, заданной маркером. Создайте несколько маркеров так, чтобы, например, камера переключалась или поворачивалась то к одному участнику диалога, то к другому. Маркеры можно переименовывать — для этого в окне инструментов нужно щелкнуть правой кнопкой мыши по нужному маркеру и выбрать пункт Rename Camera. Сделайте несколько маркеров, а затем вернитесь в окно редактирования триггеров. Создайте новую директорию для триггеров, а затем и первый триггер — назовите его Camera. Чтобы сделать нормальную скриптовую сценку, недостаточно просто движений камеры. Нужно убрать различные посторонние звуки и перевести игру в соответствующий режим. Громкость звуков можно изменить с помощью действия Sound — Set Volume Channel. В настройках действия выберите канал User Interface Sounds и установите его громкость на 0. Чтобы перевести игру в режим Cinematic Mode , создайте действие Cinematic — Cinematic Mode — режим должен быть включен ( On ) для всех игроков ( All Players ). Затем создайте действие Cinematic — Letterbox Mode On — оно нужно, чтобы спрятать интерфейс игры и показать поля, на которых отображается портрет говорящего юнита и текст, который он произносит. Это действие тоже можно назначить для All Players. Также в свойствах действия можно указать промежуток времени, за который поля скроют интерфейс. После всех этих приготовлений можно приступить к работе непосредственно с камерой. Перемещение камеры между маркерами осуществляется действием Camera — Apply Camera Object (Timed). В его свойствах щелкните по строке Camera Object , в появившемся окне выберите пункт Variables и имя той камеры, с которой вы хотите начать движение. Затем выберите отряд, камера которого будет менять свою позицию (в нашем случае это отряд игрока), а также укажите временной промежуток в секундах, за который камера преодолеет расстояние между своей исходной позицией и маркером. Вам нужно создать несколько подобных действий, последовательно переключающих камеры между маркерами. При этом имейте в виду, что игра не дожидается, пока камера преодолеет путь между соседними маркерами, и сразу начинает перемещать камеру к следующей точке. Получается, что камера летит от первого маркера сразу к последнему. Чтобы этого избежать, используйте действие Wait. Просто вставляйте его между действиями, перемещающими камеру. При этом установленное время ожидания должно быть равным тому времени, за которое камера проходит очередной отрезок траектории между маркерами. Если при создании действий вы поставили их в неправильном порядке, вы можете все исправить простым перетаскиванием. Задав движения камеры, нужно завершить скриптовую сценку. Завершение заключается в установке громкости User Interface Channel на прежнюю величину, отключении Cinematic Mode и возвращении игровой камеры на ее обычную позицию (действие Camera — Reset Game Camera ). На этом работу с камерой можно считать завершенной. Теперь займемся звуками. Прежде чем создавать действия триггера, нужно выбрать фразы, которые будут произносить юниты. Нажмите клавишу F5 — откроется окно редактора звуков. **__**В левой части окна находится структурированный список практически всех звуков, производимых юнитами, включая все сюжетные диалоги. Справа — список тех звуков, которые вы будете использовать в диалогах и сценках на своей карте — он пока пустой. Разумеется, никто не заставляет вас использовать лишь те записи, что есть в игре. Вы можете импортировать свои собственные фразы и музыкальные файлы, используя комбинации, соответственно, Ctrl+I и Ctrl+P. Файлы могут быть как в формате *.wav , так и в *.mp3. Допустим, вы определились, какие звуки будут использованы, и **
уже импортировали их. Выделите один из файлов, который предстоит использовать на карте, и нажмите клавишиCtrl+U**—выбранный звук появится в списке справа. Таким образом вы создали переменную, обозначающую звуковой файл, которую сможете указывать в триггерах. Повторите эту процедуру со всеми звуками, которые будете использовать в диалогах. При создании переменной ей присваивается имя файла, который она обозначает. Но возможно, это имя будет не очень удобно использовать при создании триггеров (например, оно слишком длинное и к тому же похоже на имя какого-то иного файла). Чтобы изменить название переменной, нужно дважды щелкнуть по ней и в открывшемся окне указать желаемое имя. В нем также можно изменить некоторые свойства воспроизведения, но ничего критичного среди них нет. Обращайте внимание на длительность звуков — она указана в том же списке переменных. Время, в течение которого камера будет показывать скриптовую сценку, должно совпадать с общей длительностью звуков создаваемого диалога. В противном случае скриптовая сценка закончится раньше, чем будут произнесены все фразы, или, наоборот, будет продолжаться, когда все слова уже давно были сказаны. Указав переменные для всех звуков, вернитесь в окно редактирования триггеров. В той же директории, где расположен триггер, управляющий камерой, создайте триггер с именем, скажем,Talk. В триггере создайте действиеCinematic — Transmission From Unit. В его многочисленных свойствах надо установить следующее: в строкеAll Playersукажите отряд игрока (того, которому предназначено сообщение). В строкеUnitукажите персонаж, который будет говорить. Для этого в открывшемся окне щелкните по кнопкеSelect a Unitи выберите нужный юнит прямо на карте. В строкеNameвпишите имя персонажа, которое будет отображаться рядом с портретом во время его разговоров. Затем щелкните по строкеNo Soundи в пунктеVariableукажите переменную того файла, который вы хотите воспроизвести. В строкеMessageнадо вписать отображаемый текст сообщения. Желательно, чтобы он повторял слова, которые произносятся в звуковом сообщении. Как уже говорилось выше, игра будет дожидаться, когда закончится звуковое сообщение, и лишь затем приступает к выполнению следующего действия. Если по какой-то причине вы решили обойтись без звукозаписи, то следующими тремя строчками нужно указатьAdd ## seconds and Wait, где “##” — время в секундах, в течение которого будет отображаться текст. Повторяйте описанные выше действия для каждой фразы диалога. Чтобы синхронизировать триггеры речи и движений камеры, используйте действиеWait, вставляя его, например, между перемещениями камеры.__Осталось указать события, которые активируют скриптовую сценку. На моей карте, например, сценка запускалась по инициализации карты с задержкой в две секунды. Для этого был создан отдельный скрипт, в котором запуск триггеров диалога осуществлялся действиямиTrigger — Run. Вообще различных способов запуска диалога десятки, поэтому вам, вероятно, придется решить эту задачу самостоятельно.
Полученных знаний вам хватит, чтобы изучить все тонкости создания сценариев и их триггеров самостоятельно. И, не устану повторять, лучшие ваши творения будут навсегда выбиты печатной матрицей на пластиковых боках нашего компакта. Присылайте свои работы по адресу gamezone@igromania.ru. К карте или сценарию обязательно нужно приложить текстовый файл с описанием.