Инструкция по использованию редактора/Защита завода
Миссия будет имитировать атаку немецких бомбардировщиков с истребителями прикрытия на завод в Сталинграде и защиту завода самолетами игрока.
Содержание
- 1 Создание миссии
- 2 Задание на взлет
- 3 Создание точки маршрута следования
- 4 Создание бомбардировщиков противника
- 5 Создание истребителей противника
- 6 Логическое объединение самолетов противника
- 7 Усыпление самолетов противника
- 8 Создание целей для бомбардировки на заводе Сталинграда
- 9 Создание зенитных орудий
- 10 Пробуждение самолетов противника
- 11 Задание на защиту завода
- 12 Проверка на гибель всех бомбардировщиков
- 13 Проверка открытого задания на защиту завода
- 14 Проверка достижения завода самолетами противника
- 15 Выдача задачи на бомбардировку бомбардировщикам противника
Создание миссии
Откройте редактор, и в качестве проекта откройте уровень «stalingrad». После этого на панели инструментов откройте закладку «Mission Editor», найдите кнопку «New mission...» и нажмите на нее. Теперь необходимо открыть окно свойств миссии. Для этого воспользуйтесь кнопкой «Properties and Trigger/MissionObj Info». После нажатия на нее откроется два окна: «Properties» и «Trigger / Mission Obj. Info».
В окне «Properties» щелкните по разделу «Mission Settings», для его раскрытия. В этом разделе найдите раздел «stars» и так же раскройте его. Вы увидите настройки даты и времени начала миссии. В поле «month» укажите «9»; в поле «day» - «15»; в поле «time» - «12» и в поле «year» - «1942». Таким образом миссия начнется 15 сентября 1942 года в 12 часов дня.
Сверните раздел «stars» и откройте раздел «mission», расположенный ниже. Если этого раздела не видно прокрутите окно «Properties» вниз или вверх, используя колесико мыши. В разделе «mission» будет необходимо заполнить несколько полей:
- в поле «name» укажите имя миссии на английском языке
- в поле «level» выберите уровень который будет использоваться миссией. Для данной миссии необходимо выбрать «stalingrad»
- в поле «type» необходимо указать тип миссии. Данное обучение затрагивает только «singleMission», поэтому необходимо выбрать именно ее
- в поле «restoreType» определяется что произойдет с игроком после гибели его самолета. Значение «attempts» позволит после гибели самолета сделать еще несколько попыток завершить миссию перед окончательным провалом миссии. Значение «tacticalControl» позволит игроку пересесть в следующий целый самолет крыла, под управлением игрока, в случае гибели его текущего самолета и так до тех пор, пока в крыле игрока остается хотя бы один целый самолет
- в поле «campaign» необходимо выбрать к какой военной кампании относится данная миссия. Так как битва за Сталинград проходила на Восточном фронте, необходимо выбрать «eastern»
- в поле «environment» указывается тип неба и интенсивность освещения. Это значение рекомендуется выставлять согласно полю «time», которое было заполнено ранее. Так как мы указывали в этом поле «12», то в «environment» стоит выбрать «day»
- поле «weather» отвечает за погодные условия в миссии. Выберем значение «hazy»
Свернем раздел «mission» и «Mission Settings» и обратимся к разделу «Triggers / Mission Obj. Navigation», расположенный ниже. Это будет вашим основным разделом этого окна, и далее, для простоты, этот раздел будет называться «Список триггеров».
Раздел состоит из окна, в котором находятся два, пока еще пустых, списка: «Triggers» и «Mission objectives». Под окном располагается несколько кнопок:
- «Trigger» - создает новый триггер
- «Mission Obj» - создает новое задание миссии
- «Copy» и «Paste» - позволяют скопировать элемент из списка со всеми условиями внутри них и вставить на новое место
- «Del» - позволяет удалить элемент из списка
- «Up» и «Down» позволяет перемещать элемент списка вверх или вниз по дереву списка.
Нажмем на кнопку «Trigger». В дереве «Triggers» появился новый элемент, с именем «Trigger_01». В соседнем окне, озаглавленном как «Trigger / Mission Obj. Info» изменим его имя в поле «Name» на «mission_start». В этом же окне, ниже, можно увидеть поле «Elements», в котором расположены три, пока еще пустых, дерева: «Events», указывающее на то когда срабатывает этот триггер; «Conditions», указывающее на то, какое условие необходимо для того чтобы триггер выполнился; и «Actions», указывающее на то, что именно должно выполниться, в случае если условия выполнения триггера было успешным. В тех случаях, когда условие триггера не было исполнено, триггер может вызваться еще раз, согласно тому, что прописано у него в дереве «Events». После того, как триггер выполнится он перестанет вызываться.
На данный момент для нашего триггера стоит «event» «periodicEvent», со значением «time» равным «1». Это означает, что триггер будут пытаться выполниться каждую секунду. Давайте выделим этот «event» и нажмем кнопку «Delete», внизу окна «Elements». После удаления «event» мы получили абсолютно пустой триггер, а нам необходимо, чтобы конкретно этот триггер запустился с началом миссии. Для этого необходимо добавить новый «Event», нажатием на соответствующую кнопку. Нажмите на кнопку «Event» и, в появившемся окне, выберите «initMission».
Создание игрока
Создание игрока заключается в создании его самолета и дальнейшем указании игре на то, что на этом самолете будет летать игрок. Миссия, в которой не выполнено оба этих пункта не сможет быть запущена.
Для начала создадим самолет игрока. Для этого воспользуемся кнопкой «Create unit» на панели инструментов «Mission Editor», предварительно выбрав в поле справа от кнопки значение «armada». Поместите самолет игрока в любом месте карты, затем выделите его и нажмите кнопку «Show / hide object props. panel». После нажатия на эту кнопку откроется новое окно «Object Properties». В нем нам будет необходимо изменить несколько параметров:
- в поле «name» введите «player». По этому имени в дальнейшем игра будет узнавать самолет игрока.
- в поле «class» выберите «yak-1b». Мы даем под управление игрока самолет «Як-1Б»
- в поле «weapon» выберите «Yak1b_default»
Ниже в этом окне находится раздел «Properties», где так же будет необходимо заполнить несколько полей:
- в поле «army» выберите значение «1». Возьмите себе за правило самолеты и юниты игрока относить к армии с индексом «1», а самолеты и юниты противника к армии с индексом «2»
- в поле «count» выберите «4». Это будет означать, что под управлением игрока окажется 4 самолета, включая непосредственно самолет игрока. Другими словами на поле боя будет присутствовать сам игрок и трое его подчиненных
- нажмите кнопку «+ numInWing», расположенную сразу под полем «count» и, в появившемся поле, введите значение «2». Это будет означать что самолеты, под руководством игрока будут поделены на пары
Теперь необходимо перейти к окну «Properties», которое открывается нажатием на кнопку «Properties and Trigger/MissionObj Info», расположенную на панели инструментов «Mission Editor». Нас интересует раздел озаглавленный как «player_teamA», в поле «wing» нажать на кнопку «<none>» и, в появившемся окне, выбрать «player». Таким образом мы явно указали игре, кого необходимо считать игроком.
Теперь миссию можно сохранить, нажатием на кнопку «Save mission» и запустить, нажатием на кнопку «Run mission». При сохранении миссии желательно чтобы имя файла миссии совпадало с ее названием, введенным в поле «name».
После запуска миссии вы обнаружите себя летящим на самолете «Як-1Б», а позади вас будут лететь еще три таких-же самолета.
Создание аэродрома
Усложним задачу: заставим игрока взлететь с аэродрома. Для этого необходимо создать сам аэродром. Для того, чтобы создать аэродром необходимо перейти в закладку «Landscape» на панели инструментов и нажать на кнопку «Select object by name». В появившемся окне введите «air», выберите из появившегося списка «stalingrad_airfield_2_009», нажмите кнопку «Ок», для закрытия окна, и сразу же нажмите клавишу «Z» на клавиатуре. Камера редактора переместится так, чтобы показать выделенное взлетное поле.
Теперь возвращаемся в закладку «Mission Editor» на панели инструментов и нажимаем на кнопку «Create box zone». С ее помощью создаем прямоугольную зону, размерами приблизительно совпадающую с размерами летного поля. После создания зоны открываем окно «Object Properties», нажатием на кнопку «Show / hide object props panel». В окне параметров изменяем параметр «name» на «airfield_area». Скорее всего, после создания «airfield_area» она будет расположена под углом к летному полю и ее нужно будет развернуть. Для этого выделяем созданную зону и нажимаем клавишу «Z» на клавиатуре, чтобы камера переместилась к этому объекту. Теперь, нажатием на кнопку «Rotate», перейдем в режим вращения объекта и начнем его вращать по зеленой дуге, добиваясь того, чтобы зона развернулась в направлении аэродрома. После того, как вращение объекта завершено, нажатием на кнопку «Move», перемещаем объект так, чтобы он занял положенное ему место на аэродроме. Если объект получился слишком большой или слишком маленький можно изменить его размеры. Для этого нажмите кнопку «Scale», и измените размеры объекта по одной из осей.
Логическая область аэродрома создана. Теперь необходимо указать начало взлетно-посадочной полосы и ее конец. Для этого с помощью кнопки «Create sphere zone» создайте две зоны. Одну в начале полосы, а другую в ее конце. Обе зоны должны находиться внутри «airfield_area». Нажмите на кнопку «Show / hide object props panel» и в окне «Object Properties» измените имя первой зоны на «airfield_start», а второй на «airfield_end».
Теперь необходимо создать точки, в которых появятся самолеты игрока и его напарников. С помощью все той-же «Create sphere zone» создайте четыре зоны, располагающиеся внутри «airfield_area», между «airfield_start» и «airfield_end» ближе к «airfield_start». Измените имя новым зонам на «spawn01» - «spawn04».
Появление самолета игрока на аэродроме
Аэродром создан. Теперь необходимо сделать так, чтобы игрок начинал игру не в воздухе, а на аэродроме.
Для этого выделим триггер «mission_start» и, нажатием на кнопку «Action» добавим ему новый «action», выбрав из списка «addAirfield». У этого «action» существует несколько параметров, которые необходимо отредактировать:
- в поле «runawayStart» необходимо указать «airfield_start»
- в поле «runawayEnd» необходимо указать «airfield_end»
- поле «runawayWidth» отвечает за ширину летного поля, рекомендуется оставить ее равной 10 метрам
- в поле «army» необходимо выбрать к какой армии будет относиться данное летное поле. Так как на нем будет появляться игрок, который относится к армии с индексом «1», то здесь так же выбираем «1»
- нажатием на кнопку «+ spawnPoint» необходимо добавить, ранее созданные нами зоны, с именами «spawn01» - «spawn04»
- кнопка «+ visibleOnHud» позволит включить или выключить галочку, отвечающую за отображение летного поля на радаре.
Для того чтобы на аэродроме появились самолеты игрока осталось сделать последний штрих. Давайте добавим еще один «action», выбрав из списка «spawnOnAirfield». У этого «action» так же необходимо настроить несколько параметров:
- в поле «runawayName» необходимо указать точку начала полосы «airfield_start»
- нажатие на кнопку «+ objects», позволит указать кого именно необходимо поместить на это поле. В появившемся окне выбираем «player».
Можно сохранить миссию и запустить ее ради проверки.
Задание на взлет
Теперь, когда игрок стоит на аэродроме, логичным было бы выдать ему первое задание: «взлететь». Для этого в разделе списка триггеров нажмите кнопку «Mission Obj» и, в появившемся окне, выберите «abstractMissionObjective». Будет создан новый «mission objective» с именем «MissionObj_01». В его свойствах нас интересует только три пункта:
- поле «name», в котором необходимо указать имя задания. Наберите «take_off»
- поле «Enabled», с включенной галочкой, которое означает, что при запуске триггера автоматически будет выдано задание. Так как триггер запускается в начале миссии, и мы хотим чтобы игроку сразу выдалось задание, оставляем галочку включенной
- поле «isPrimary» с включенной галочкой, которое означает, что задание будет основным. Выключение галочки приведет к тому, что задание будет считаться дополнительным. Оставим ее включенной.
Теперь в каталоге, в который вы сохранили миссию вам необходимо создать текстовый файл с тем же именем, что у файла миссии, но с расширением «csv». Например в данном примере миссия сохранена в файл «sample01_stalingrad.blk». Значит необходимо создать файл «sample01_stalingrad.csv». Откройте созданный файл и сохраните его в кодировке «UTF-8».
Теперь добавьте в этот файл строку: «"take_off";"Take off";"Взлетите"». Строка состоит из трех частей:
- «take_off» - идентификатор строки, должен совпадать с тем именем, который вы дали «mission objective»
- «Take off» - текст задания на английском языке. Вы можете оставить тут пустые кавычки, если по какой-то причине не хотите писать английский текст
- «Взлетите» - текст задания на русском языке.
Все три части заключены в кавычки и разделены между собой знаком «;». Сохраните файл еще раз и закройте его. Сохраните миссию и запустите ее. Теперь, сразу после старта игроку должно быть выдано новое задание «Взлетите».
Проверка успешности выполнения задания на взлет
Если вы проверяли миссию, то наверняка обнаружили, что после взлета задание на взлет так и осталось висеть в журнале и его статус не изменился. Для того, чтобы исправить сие недоразумение, необходимо создать новый триггер, назвав его «check_for_takeoff». Так как триггер должен начать проверку сразу после старта миссии, то галочку «Enabled» оставляем включенной. Периодичность проверки триггера в 1 секунду нас тоже устраивает, поэтому «Events» тоже оставляем без изменений. Но необходимо добавить проверку на то взлетел ли игрок, или нет. Для этого, в созданный триггер добавим новый «condition», выбрав из списка «unitWhenStatus» с параметрами:
- в поле «object» выберем «player»
- в поле «object_type» выберем «isInAir»
- поле «check_objects» оставим на «any», что позволит проверке выполниться в случае если хотя бы один самолет взлетит в воздух. Учитывая, что первым взлетает игрок, а остальные самолеты в его крыле ждут своей очереди, то это правильное решение.
Теперь в этот же триггер добавим новый «action», который изменит статус задания на «выполнено». Для этого из списка «actions» выберите «moSetObjectiveStatus» с параметрами:
- в поле «target» выберите «take_off»
- в поле «status» выберите «2», что соответствует успешному завершению задания.
Сохранитесь и проверьте выполнится ли задание после взлета самолета игрока.
Создание точки маршрута следования
Игрок взлетел, теперь необходимо указать ему точку следования. Для этого в панели инструментов «Mission Editor» выберите «Create point zone», найдите на карте завод рядом со Сталинградом и разместите зону прямо над заводом на высоте 2.000 метров. Измените имя зоны на «factory_point». Теперь игроку необходимо как-то показать эту точку, чтобы он видел куда ему необходимо лететь. Указать ее сразу на земле — неправильно, так как мы уже дали игроку задание на взлет. А вот после того, как игрок оказался в воздухе, и завершил первое задание будет вполне уместно дать ему новую цель миссии. Итак, переходим в триггер «check_for_takeoff» и добавляем в него новый «action», выбрав из списка: «missionMarkAsWaypoint», настроив параметры следующим образом:
- в поле «target» необходимо указать зону, которая будет помечена для игрока, и этой зоной является «factory_point»
- поле «visible» необходимо оставить включенным, чтобы игрок видел визуальное представление точки полета
- поле «primary» указывает на то, что данная точка является той самой точкой куда игроку надо прилететь согласно текущему заданию
Задание на достижение точки маршрута
Мы показали игроку точку которой он должен достичь, настала пора выдать ему и задание, которое отобразится в журнале. Для этого откроем наш текстовый «csv» файл и добавим в него строку «"reach_first_waypoint";"Follow to the checkpoint";"Проследуйте к отмеченной зоне"». Сохраним файл и добавим новый «Mission Onjective» в нашу миссию. Делаем это точно так же, как и в первый раз, но изменяем имя на «reach_first_waypoint» и выключаем галочку рядом с полем «Enabled», так как не хотим, чтобы задание выдалось сразу после старта миссии.
Когда вы все сделаете, переходите к триггеру «check_for_takeoff». Как вы видите в этом триггере мы уже изменяли статус одного задания, а, следовательно, если мы сразу же выдадим новое задание, то надписи на экране налезут друг на друга и будет не очень красиво. Было бы хорошо немного разнести эти два события во времени. И в этом нам поможет новый «action» с именем «wait», которому необходимо в поле «time» выставить значение «3». Теперь необходимая пауза создана, давайте выдадим игроку новое задание. Для этого добавьте еще один «action», выбрав из списка «moAddMissionObjective», и указав в поле «target» наш «reach_first_point». Сохраним миссию и проверим все ли правильно.
Проверка достижения точки следования
Раз мы выдали задание на полет к точке, необходимо проверить достиг ли игрок этой точки. Для этого необходимо создать новый триггер с именем «check_for_reach_point». Так как задание на достижение точки дается не сразу, то и проверку целесообразно начинать не сразу, а только после того, как игрок получит задание. Поэтому, в поле «Enabled» нашего триггера снимаем галочку. Теперь необходимо добавить новый «condition» в наш триггер, который будет проверять факт достижения игроком заданной точки. Выберите из списка «Conditions» нужный нам «unitDistanceBetween» и настройте ему параметры:
- в поле «object» выберем «player»
- в поле «target» выберем «factory_point»
- в поле «value» укажем дистанцию в 2.000 метров
- в поле «math» оставим «2D», что означает, что для выполнения условия дистанция между «object» и «target» по любой из осей должна быть не менее 2.000 метров. В случае, если выбрать «3D», это будет означать, что для успешной проверки и «object» и «target» должны быть в одной горизонтальной плоскости.
Условие проверки задано, теперь пора выдать реакцию. Для этого добавим новый «action», выбрав из списка, уже знакомый нам, «moSetObjectiveStatus», указав в качестве «target» «reach_first_point», а в качестве «status» - «2», для успешного завершения задания. Так как триггер проверки не запускается автоматически, необходимо запустить его самостоятельно из того триггера, где мы выдаем игроку задание на достижение заданной точки. Перейдем в триггер «check_for_takeoff» и добавим в него новый «action», выбрав из списка «tirggerEnable», и указав, в качестве «target» триггер проверки «check_for_reach_point».
Последний штрих — выключение отображения точки полета, после ее достижения. Для этого необходимо перейти в триггер «check_for_reach_point» и добавьте новый «action»: «missionMarkAsWaypoint», указав в качестве «target» зону «factory_point» и выключив галочку рядом с полем «visible».
Сохраните миссию, и проверьте, что все работает как задумано.
Создание бомбардировщиков противника
Настало время для создания бомбардировщиков противника. Для этого на закладке «Mission Editor» основной панели инструментов нажмите кнопку «Create unit», убедившись, что в поле справа выбрано «armada». Теперь поставьте самолет в нескольких километрах от Сталинграда на высоте 1500 метров, и дайте ему имя «enemy_bombers». В поле «class» укажите тип самолета «ju88a-4» и выберите ему вооружение по умолчанию. Обязательно проследите, чтобы поле «army» не совпадало с полем «army» игрока, и укажите количество самолетов «count» равным 24. Нажмите на кнопку «+ numInWing», расположенную ниже поля «count» и укажите там «3», что будет означать, что бомбардировщики, количеством 24 штуки будут группироваться по 3.
Создание истребителей противника
Теперь создадим истребители прикрытия. Можно опять воспользоваться кнопкой «Create unit», а можно выделить уже созданных бомбардировщиков, нажать на кнопку «Move» и, держа зажатой клавишу «Shift» на клавиатуре, перетащить самолет за зеленую стрелку вверх на 500 метров. В появившемся окне дайте новое имя самолету: «enemy_fighters». Выделите получившийся самолет, и выберите в качестве его «class» «bf-109f-4» и оружие по умолчанию. Число самолетов «count» выставьте в «6», а значение «numInWing» уменьшите до «2».
Логическое объединение самолетов противника
После создания бомбардировщиков и самолетов прикрытия мы получили две сущности. Между тем нам предстоит сделать несколько действий, одинаковых для обеих сущностей, а поэтому неплохо было бы их объединить. Для этого с помощью кнопки «Create unit», убедившись что в поле справа выбран «squad» создадим сквад неподалеку от самолетов противника, назвав его «enemy_squad». В окне свойств сквада необходимо указать ему «squad_members» добавив сначала «enemy_bombers», а затем и «enemy_fighters».
Усыпление самолетов противника
Самолеты противника будут созданы автоматически с началом миссии, но до некоторого этапа они нам не понадобятся. Будучи брошенными на произвол судьбы, самолеты скорее всего погибнут, столкнувшись с землей или друг другом, или просто улетев в неизвестном направлении. Чтобы этого не произошло надо их усыпить на время, и разбудить в тот момент, когда они нам понадобятся.
Перейдем в триггер «mission_start» и добавим новый «action», выбрав из списка «unitPutToSleep», и указав ему в качестве «target» недавно созданный «enemy_squad». Видите, мы оперируем всего с одним объектом, а засыпают и бомбардировщики и истребители. В дальнейшем, когда мы создадим сквад значительно большего размера вы сможете оценить удобство работы с ними.
Создание целей для бомбардировки на заводе Сталинграда
Для того, чтобы бомбардировщикам было что бомбить, необходимо добавить им цели. Для этого переместим камеру в область завода рядом со Сталинградом и нажмем кнопку «Create unit», убедившись, что в области справа выбрано «structures». Поместим структуру на крышу одного из зданий завода. Изменим имя структуры на «bomb_target01», в качестве «class» укажем «dummy», и обязательно выберем «army» совпадающую с «army» игрока. Теперь давайте сделаем копии этой структуры, так же как мы делали копии самолетов, когда создавали истребители прикрытия для бомбардировщиков, и расставим их по крышам зданий завода. Не переусердствуйте, не надо создавать больше 16 целей, так как вместимость одного сквада ограничена 16-тью элементами. Теперь выделим все созданные структуры, и поднимем их на 100 метров вверх. После этого нажмите кнопку «Drop unit», расположенную на панели инструментов «Mission Editor». Это поместит выбранные структуры ровно на поверхность уровня, чтобы бомбы могли их уничтожать.
Создание зенитных орудий
Для того, чтобы облегчить работу игроку, разместим в окрестностях завода несколько зенитных комплексов. Для этого опять воспользуемся кнопкой «Create unit», убедившись, что в поле справа выбрано «air_defence». Поместим одну зенитную пушку рядом с заводом и настроим ее. Поле «class» выставьте в «ussr_37mm_61k», поле «army» укажите то же, что и у игрока, а «accuracy» выставьте в «0.3» - нам же не надо, чтобы зенитки сделали всю работу за игрока. Скопируйте полученное зенитное орудие несколько раз и разместите копии вокруг завода.
Объединение целей и орудий
Так как целей для бомбардировки у нас получилось много, да и зенитные орудия так же существуют в нескольких экземплярах было бы неплохо их объединить в сквады. Создайте два новых сквада с именами: «bomb_targets» и «air_defence». В первый сквад занесите все структуры, а во второй все зенитные орудия.
Пробуждение самолетов противника
Вся подготовительная работа сделана. Теперь необходимо пробудить самолеты противника и отправить их в путь к заводу. Для этого перейдем в триггер «check_for_reach_point», и добавим туда новый «action», выбрав из списка «unitWakeUp». В качестве «target» укажите «enemy_squad». Самолеты противника пробудились, и их сразу необходимо чем-то занять. Хорошим решением будет отправка их к заводу, что делается путем добавления еще одного «action» в текущий триггер. Выберите «unitMoveTo» из списка и настройте параметры:
- в поле «object» выберите «enemy_squad»
- в поле «target» выберите «factory_point»
- в поле «speed» укажите 300. Это делается для того, чтобы все самолеты летели с одной скоростью и истребители не оторвались от бомбардировщиков
- найдите поле «shouldKeepFormation» и включите галочку, что позволит самолетам лететь, соблюдая строй
Настройка дополнительных параметров самолетов противника
Введем зависимость эффективности действия самолетов противника от эффективности действия игрока. В триггер «check_for_reach_point» добавим команду «unitSetProperties», указав в качестве «object» вражеские бомбардировщики «enemy_bombers». Распахнем раздел «plane», находящийся выше, а в нем, в свою очередь, распахнем раздел «targetDeviation». В поле «trigger» этого раздела выберем «bombs», и выставим «limits» в «0»-«2.5».
Добавим еще один «targetDeviation», но в поле «trigger» выберем «gunner», выставив ему параметр «limits» так-же, как и для бомб.
Добавим такую же команду со такими-же параметрами для вражеских истребителей. Только в качестве «object» для «unitSetProperties» выберите «enemy_fighters», а в поле «trigger» раздела «targetDeviation» выберите «mashine gun».
Задание на защиту завода
Теперь же надо объявить игроку цель его следующего задания. Для этого в нашем «csv» файле добавьте строку «"bombers_engaged";"Defend plant, attack enemy bombers";"Защитите завод от атак вражеских бомбардировщиков"». В саму миссию добавьте новый «Mission Objective» с именем «bombers_engaged», и снимите галочку «Enabled», так как мы добавим это задание в журнал самостоятельно в нужное время.
Теперь перейдем к триггеру «check_for_reach_point». Как можно увидеть в нем уже проводились операции с изменением статуса заданий, а значит, что перед выдачей нового задания необходимо сделать паузу, чтобы надписи не налезали друг на друга на экране. Добавим новый «action» «wait» на 3 секунды. Следом за ним добавим еще один «action», выбрав из списка «moAddMissionObjective», и указав ему в качестве «target» «bombers_engaged».
Помечаем бомбардировщики в качестве целей
Теперь можно пометить вражеские бомбардировщики как цели задания, а так же вывести информацию о бомбардировщиках вниз экрана, чтобы игрок видел их количество. Для этого в триггер «check_for_reach_point» добавляем новый «action», выбрав из списка «unitSetIndication», и указав в поле «target» немецкие бомбардировщики «enemy_bombers».
Показ счетчика бомбардировщиков
Для того, чтобы игрок видел сколько бомбардировщиков осталось необходимо создать новый триггер «update_indicator». Этот триггер должен выполняться каждую секунду, а после своего выполнения не закрываться, а продолжать работу. Таким образом счетчик бомбардировщиков будет изменяться раз в секунду. Каким же образом это сделать?
Сначала давайте создадим триггер «update_indicator», и снимем с него галочку «Enabled», так как показ счетчиков с начала миссии нам не нужен. Зато необходимо включить галочку поля «enableAfterComplete», что позволит триггеру работать до тех пор, пока мы сами его не выключим.
Теперь добавим этому триггеру новый «action», выбрав из списка «missionSetTargetsIndicator» и настроив его параметры:
- в поле «target» укажите «enemy_bombers»
- в поле «target_type» оставьте «isAlive», так как нам необходимо показывать количество еще живых бомбардировщиков
- в поле «icon» выберите «air», чтобы на счетчике отображалась иконка самолета
- в поле «icon_army» выберите индекс той армии, что назначена бомбардировщикам
Теперь перейдем в триггер «check_for_reach_point» и вызовем из него с помощью «action» «enableTrigget» триггер «update_indicator».
Показ счетчика строений завода
Однако, нас так же интересует информация о том насколько удачной будет защита завода. Для этого давайте выведем счетчик целых зданий. Таким образом игрок сможет оценивать свою эффективность в процессе миссии. Для этого в уже существующий триггер «update_indicator» добавим новый «action» «missionSetTargetsIndicator» и настроим его параметры:
- в поле «target» укажите «bomb_targets»
- в поле «target_type» оставьте «isAlive», так как нам необходимо показывать количество еще целых зданий
- в поле «icon» выберите «building», чтобы на счетчике отображалась иконка здания
- в поле «icon_army» выберите индекс той армии, что назначена игроку
Сохранитесь и проверьте, что все работает.
Проверка на гибель всех бомбардировщиков
Игрок может уничтожить всех вражеских бомбардировщиков еще до того, как они достигнут завода. Поэтому сразу после того, как игрок получает задание по защите завода, необходимо начать проверку количества оставшихся бомбардировщиков.
Для этого создадим новый триггер «check_for_mission_completed», и выключим ему галочку «Enabled». В поле «events» этого триггера изменим «periodicEvent», выставив «time» в 20 секунд, чтобы проверка на гибель всех бомбардировщиков вызывалась не очень часто.
Перейдем в триггер «check_for_reach_point». В списке созданных нами «action» этого триггера уже есть один «triggerEnable». Выделяем его и добавляем ему еще один аргумент: вызов триггера «check_for_mission_completed».
Возвращаемся в триггер «check_for_mission_completed» и добавляем ему условие проверки «condition» «unitWhenStatus», и настроив параметры:
- в качестве «target» необходимо указать немецкие бомбардировщики «enemy_bombers»
- в «object_type» необходимо указать «isKilled»
- в «check_object» необходимо указать «all»
Это позволит триггеру сработать только в том случае, если все бомбардировщики будут убиты.
Добавим новый «action», выбрав из списка «missionCompleted». Теперь, в случае если все бомбардировщики погибнут, миссия завершится. А что если последний бомбардировщик погиб, когда задание по защите завода оказалось проваленным? Получится, что игра сначала сообщит нам о провале миссии, а потом о ее выполнении. Чтобы этого не случилось, давайте добавим еще одно условие проверки «condition» «misObjStatus» в качестве «target» указав задание «bombers_engaged», а в качестве «status» выбрав «notFailed». Таким образом, помимо гибели всех бомбардировщиков будет так же проверяться статус задания, и если оно не провалено, миссия завершится успехом.
Проверка открытого задания на защиту завода
А что произойдет, если миссия завершилась, а задание по защите завода еще не завершено? Казалось бы, логичным будет добавить завершение задания в триггер проверки гибели всех бомбардировщиков. А если последний бомбардировщик погибнет уже после того как задание по защите будет выполнено? Игрок увидит повторное завершение задания? Ситуация не приятная. Для того, чтобы ее разрешить давайте создадим триггер, который будет проверять активно ли еще задание по защите завода, и если активно, помечать его исполненным.
Создадим триггер «check_for_protecting_complete», и выключим галочку «Enabled». Единственное условие проверки в этом триггере будет проверка статуса задания по защите завода. Добавим «condition» «misObjStatus» в качестве «target» указав задание «bombers_engaged», а в качестве «status» выбрав «notFailed». Таким образом мы проверяем не провалено ли задание по защите завода. И если оно не провалено, то выполняем «action», который следует добавить прямо сейчас. Это будет «moSetObjectiveStatus», в котором в качестве «target» указываем задание «bombers_engaged», а «status» выставляем в «2», что соответствует выполненному заданию. Теперь давайте вызовем этот триггер из триггера проверяющего уничтожение всех бомбардировщиков. Для этого в триггере «check_for_mission_completed» добавим «action» «triggerEnable», указав ему в качестве «target» наш «check_for_protecting_complete». С помощью кнопки «Up», расположенной под списком всех «actions» передвинем «triggerEnable» на строку выше чем «missionCompleted». Теперь необходимо сделать паузу между выставлением заданию статуса выполнено и завершением миссии. Добавим «action» с «wait» на 3 секунды, и разместим его между «triggerEnable» и «missionCompleted».
Если сейчас поиграть в миссию, то создастся впечатление, что она слишком короткая. Давайте дадим игроку немного порезвиться. Для этого добавим в триггер «check_for_mission_failed» новый «action» «wait» с временем, равным «120», и передвинем его так, чтобы он оказался после «tirggerDisable», но перед всеми остальными «action». Таким образом, в случае если бомбардировка была не успешной и завод устоял мы делаем паузу в 2 минуты перед тем, как закончить миссию, и отметить задание выполненным, что вполне достаточно для того, чтобы игрок сбил еще несколько самолетов противника. При этом, если игрок уничтожит все бомбардировщики противника произойдет выполнение триггера «check_for_mission_completed», и конец миссии наступит раньше, чем пройдет 2 минуты.
Проверка достижения завода самолетами противника
Самое время ввести проверку на то, достигли ли бомбардировщики противника территории завода, и не пора ли начинать его бомбить. Для этого создадим новый триггер «check_for_bombers_near_factory» и снимем галочку «Enabled». В качестве условия нам необходимо создать «condition» «unitDistanceBetween» и настроить его:
- в поле «object» выбираем «enemy_bombers»
- в поле «target» выбираем «factory_point»
- в поле «value» выставляем 5000 метров
- в поле «math» выбираем «2D»
Перейдем в триггер «check_for_reach_point» и добавим вызов триггера «check_for_bombers_near_factory» в уже существующий «triggerEnable».
Выдача задачи на бомбардировку бомбардировщикам противника
Мы только что создали триггер, проверяющий не достигли ли бомбардировщики своей цели, и теперь необходимо дать им задачу по атаке завода. В этот же триггер добавляем новый «action», выбрав из списка «unitAttacktarget» с параметрами:
- в поле «object» выбираем «enemy_bombers»
- в поле «target» выбираем «bomb_targets»
- нажимаем на кнопку «+ firerandom» и ставим галочку, что позволит бомбардировщикам атаковать цели не по списку а в случайном порядке
Эвакуация бомбардировщиков
Чтобы бомбардировщики, чьи боеприпасы закончились, не кружились над заводом, необходимо дать им команду к эвакуации. Для этого сначала необходимо создать точку эвакуации. С помощью кнопки «Create point zone», расположенной на панели инструментов закладки «Mission Editor» создайте новую зону, примерно там же, где находится начальная позиция бомбардировщиков, поднимите ее на высоту 500 метров и назовите «evacuate_point».
Теперь перейдем в триггер «check_for_bombers_near_factory» и добавим туда «action» «unitMoveTo» из списка, затем настроим параметры:
- в поле «object» выберите «enemy_bombers»
- в поле «target» выберите «evacuate_point»
- поле «speed» оставьте без изменений — каждый самолет будет лететь с максимально возможной для него скоростью
- найдите поле «shouldKeepFormation» и убедитесь, что галочка выключена, что позволит самолетам лететь в хаотичном порядке, создавая иллюзию бегства
Переместим этот «action» на строку выше чем «unitAttackTarget». В результате этого бомбардировщики, достигнув территории завода, получат приказ на эвакуацию, а так же приказ на атаку. Так как приказ на атаку имеет приоритет, то они сначала начнут атаковать цель, а когда боеприпасы закончатся, начнут паническое бегство.
Определение окончания бомбардировки
Самое время включить проверку на то, не достигнут ли немецкие бомбардировщики своей цели и не разрушат ли завод. Однако проверять успешность бомбардировки мы будем не в ее процессе, а после завершения. Как же определить завершена ли бомбардировка или еще нет? Для этого давайте создадим триггер с именем «check_for_bombing_end», и выключим ему галочку «Enabled». Теперь добавим ему условие проверки «condition», выбрав из списка «unitWhenStatus» с параметрами:
- в поле «object» выбираем «enemy_bombers»
- в поле «object_type» выбираем «noBombs»
- в поле «check_objects» выбираем «all»
Мы только что создали проверку, которая выполнится если у всех немецких бомбардировщиков закончатся бомбы.
Так как бомбам необходимо время, чтобы долететь до земли, давайте изменим периодичность этой проверки с 1 секунды на 120 секунд. Для этого выделите в триггере в дереве «Events» событие «periodicEvent», и измените ему параметр «time» с «1» на «120».
Добавим вызов этого триггера из триггера «check_for_bombers_near_factory» с помощью «triggerEnable».
Проверка успешности бомбардировки
Время окончания бомбардировки нами определено, теперь надо узнать ее результаты. Для этого создайте два новых триггера с именами: «check_for_mission_failed» и «check_for_mission_failed». Обоим триггерам снимите «Enabled». Перейдите в триггер «check_for_bombing_end» и, с помощью «action» «triggerEnable» вызовите оба только что созданных триггера. Таким образом как только время бомбардировки подойдет к концу, мы выполним обе проверки.
Перейдем в триггер «check_for_mission_failed» и добавим в него «condition», выбрав из списка «unitWhenCountMatches» с параметрами:
- в поле «object» выберем «bomb_targets»
- в поле «object_type» выберем «isAlive»
- в поле «func» выберем «less»
- в поле «value» укажем 8
Эта условие проверит все структуры в скваде «bomb_targets», и если их количество окажется меньше 8, выполнит дальнейший «action». Давайте добавим «action», который заблокирует выполнение триггера «check_for_mission_failed» , так как он нам больше не нужен — мы уже определили, что бомбардировка была успешной и завод разрушен. Добавьте «tirggerDisable», указав ему в качестве «target» «check_for_mission_failed».
Перейдем в триггер «check_for_mission_failed» и добавим в него «condition», выбрав из списка «unitWhenCountMatches» с параметрами:
- в поле «object» выберем «bomb_targets»
- в поле «object_type» выберем «isAlive»
- в поле «func» выберем «noLess»
- в поле «value» укажем 8
Эта условие проверит все структуры в скваде «bomb_targets», и если их количество окажется не меньше 8, выполнит дальнейший «action». Давайте добавим «action», который заблокирует выполнение триггера «check_for_mission_failed» , так как он нам больше не нужен — мы уже определили, что бомбардировка была не успешной и завод выстоял. Добавьте «tirggerDisable», указав ему в качестве «target» «check_for_mission_failed». Вернемся к триггеру «check_for_mission_failed» и добавим новый «action», который пометит основное задание игрока — защиту завода проваленным. Выберите из списка «moSetObjectiveStatus», указав в качестве «target» задание «bombers_engaged», а в качестве «status» выбрав «3», что соответствует провалу миссии. Теперь добавим «action» «wait» на 3 секунды, и закончим список, добавив «missionFailed». В результате мы получаем, что если на момент окончания бомбардировки у завода остается меньше 8 зданий, то миссия по защите завода считается проваленной, а через 3 секунды после этого происходит и сам провал миссии. Теперь пора закончить логику триггера «check_for_mission_failed». Добавим в него «moSetObjectiveStatus», указав в качестве «target» задание «bombers_engaged», а в качестве «status» выбрав «2», что соответствует успеху миссии. Теперь добавим «action» «wait» на 3 секунды, и закончим список, добавив «missionCompleted». В результате мы получаем, что если на момент окончания бомбардировки у завода остается не меньше 8 зданий, то миссия по защите завода считается успешной, а через 3 секунды после этого происходит завершение миссии.
Выдача задачи на защиту бомбардировщиков истребителям противника
Если вы уже пробовали играть в создаваемую миссию, то должны были заметить, что истребители прикрытия ведут себя совершенно индифферентно, не реагируя на самолеты игрока. Пора это исправить. Давайте создадим новый триггер «check_for_player_near_bombers», и снимем ему галочку «Enabled». Добавим этому триггеру новый «condition», выбрав из списка «unitDistanceBetween» и настроим его:
- в поле «object» выбираем «player»
- в поле «target» выбираем «enemy_bombers»
- в поле «value» выставляем 3000 метров
- в поле «math» выбираем «2D»
Теперь добавим «action», который заставит самолеты прикрытия атаковать самолеты игрока. Добавьте «unitAttackTarget» с параметрами:
- в поле «object» выберите «enemy_fighters»
- в поле «target» выберите «player»
- включите галочку поля «fireRandom»
- включите галочку поля «playerAttracted»
- в поле «playerAttractedCount» укажите «2»
- в поле «playerAttractedEffRate» укажите «0.7»
Таким образом, когда игрок подойдет к бомбардировщикам ближе чем на 3000 метров, вражеские истребители атакуют его самолеты, выбрав себе случайные цели из их числа. Но при этом как минимум 2 самолета прикрытия будут всегда атаковать самолет игрока, и их точность, при стрельбе по игроку составит 70%. Добавим вызов этого триггера из триггера «check_for_reach_point», используя уже имеющийся там «triggerEnable».