Инструкция по использованию редактора/Бомбардировка
В данной миссии игроку предстоит, в составе крыла бомбардировщиков HE-111 уничтожить английский порт. Игрок начнет игру уже в воздухе, на подлете к порту.
Содержание
Расстановка самолетов игрока
Выбрав инструмент «Create Unit», и убедившись, что в поле справа от него выбрана «armada» мы ставим значок самолета неподалеку от крупного порта, находящегося на локации. Выделив его, мы изменяем ему имя на «player», выставляем высоту в 1.000 метров , назначаем в качестве самолета «he111-h2», и выбираем ему оружие по умолчанию. Так же необходимо изменить значение «army» на 1, довести количество самолетов «count» до 30 и, нажатием на кнопку «+NumInWing» ввести значение «2» что позволит нам создать 15 летных пар.
Выбор игрока
Открыв окно свойств миссии, мы распахиваем закладку «player_teamA» и полю «wing» назначаем «player».
Создание миссии
Открыв окно свойств миссии, находим поле, отвечающее за триггера и добавляем в него новый триггер «start_mission» с одним единственным «event»: «initMission». Далее, открыв закладку «mission» дадим название миссии: «sample03_britain», выберем карту, на которой будет происходить миссия «britain», укажем что это миссия одиночного типа «singlemission», западная кампания «western», погоду выставим в «Night» и видимость в «hazy».
Настройка погоды
В окне свойств миссии, в закладке «stars» выставим 15 сентября 1940 года, 22 часа вечера. Можно сохраниться и запустить миссию, чтобы полюбоваться полученным результатом.
Выбор курса полета
После запуска миссии, скорее всего вы обнаружите, что летите в неправильном направлении. Чтобы изменить это достаточно выделить самолет игрока в редакторе и, нажав «E», перейти в режим вращения объекта. Вращая самолет добейтесь того, чтобы при запуске миссии ваш самолет летел в нужную сторону. Направление вам подскажет небольшая красная линия под самолетом, которая вращается при его повороте.
Создание союзников
Если вы запускали игру, то видели, что являетесь флагманом эскадрильи бомбардировщиков. Это, конечно, здорово, но при этом заметно теряет в зрелищности. Поэтому давайте добавим еще одну эскадрилью бомбардировщиков рядом с нами так, чтобы она оказалась между самолетом игрока и портом. Для этого выделите самолет игрока, перейдите в режим перемещения объекта, нажав «W», и переместите самолет в новое место, с зажатой клавишей «Shift». После того, как вы прекратите перемещать объект вы увидите диалог, с предложением ввести имя для клонированного самолета. Введите «ally_bombers». Таким образом вы создали клон эскадрильи игрока с теми же параметрами, но другим названием.
Теперь давайте добавим самолеты сопровождения: истребителей. Для этого опять скопируйте самолет игрока и назовите копию «ally_fighters». Выделите получившийся самолет и поднимите его на высоту 3.000 метров, чтобы истребители оказались выше бомбардировщиков. Так же измените класс самолетов на «bf-109f-4», вооружение на стандартное, а количество самолетов уменьшите до 8.
Остался последний штрих. Объединить всю эту армаду самолетов в одну логическую единицу, чтобы было удобнее работать в дальнейшем. С помощью кнопки «Create Unit», предварительно убедившись, что в поле справа выбрано «squad», создайте объект рядом с самолетом игрока, и назовите его «player_squad». В закладке «Properties» сквада укажите все три созданных самолета: «player», «ally_bombers» и «ally_fighters».
Направление союзников к порту
Если запустить миссию сейчас, то обнаружится что самолеты союзников игрока летят абсолютно прямо, постепенно снижая высоту. Чтобы направить их в порт, с помощью кнопки «Create Point Zone» создадим в порту зону, назвав ее «enemy_port», и подняв ее на высоту 1.000 метров.
Теперь перейдем в триггер «start_mission» и добавим в него «action» «unitMoveTo». В качестве «object» укажем «player_squad», в качестве «target» - только что созданную зону, укажем «speed» равным 370, и поставим галочку «shouldKeepFormation», чтобы самолеты летели строем.
Создание самолетов противника
Теперь давайте создадим две эскадрильи с английскими самолетами. С помощью кнопки «Create Unit» создайте две армады над поверхностью земли неподалеку от порта, укажите обоим армадам вторую армию, и измените названия на «english_fighters01» и «english_fighters02». В качестве самолета для первой армады выберите «hurricane_mk1» а для второй «spitfire_mk1». Оружие обоим армадам поставьте в значение «по умолчанию». Количество самолетов в первой армаде укажите равным 15, и количество самолетов в крыле равным 3. Количество самолетов второй армады укажите равным 4, и количество самолетов в крыле равным 2.
Теперь создайте новый «squad» и назовите его «english_fighters», включив в него обе армады.
Настало время заставить английские самолеты напасть на немецкие. Для этого в триггере «start_mission» добавим новый «action» «unitAttacktarget» с параметрами:
- в «object» укажем «english_fighters»
- в «target» укажем «player_squad»
- поставим галочку «firerandom»
- в поле «playerAttracted» выставим галочку, чтобы самолеты противника обязательно атаковали игрока, а поле «playerAttractedCount» выставим в 3, чтобы игрока одновременно атаковало не меньше 3 истребителей.
Если сейчас запустить миссию, то истребители противника будут постоянно убивать игрока. Чтобы этого не было, и чтобы их точность зависела от успехов игрока добавим новую команду: «unitSetProperties» с параметрами:
- распахните раздел «plane» и укажите в качестве «target» вражеские истребители «english_fighters»
- распахните раздел «targetDeviation», находящийся выше и в качестве «trigger» выберите «mashine gun»
- поле «default_value» выставьте в 1.5, чтобы по умолчанию истребители, стреляющие по противникам мазали в пределах 1.5 корпуса самолета
- параметр «limits» выставьте в «0.5» - «2.5»
Теперь можно сохраниться и проверить что же у нас получилось.
Создание первой точки полетного маршрута и выдача задания
Для того, чтобы игроку было очевидно куда лететь и что вообще необходимо сделать в миссии, добавим первую точку маршрута. Для этого в триггере «start_mission» добавим новый «action» в «missionMarkAsWaypoint» со значениями:
- в «target» добавим «enemy_port»
- оставим включенными галочки «visible» и «primary»
Теперь после запуска миссии над вражеским портом появится метка, показывающая куда лететь.
Добавим задание, которое будет выдаваться игроку в начале миссии. Для этого добавим «Mission Object» типа «abstractMissionObjective» с именем «reachEnemyPort». В папке, в которой лежит файл миссии создадим новый файл с именем, таким же, как и имя файла миссии, но расширением «csv», добавив в него строку: «"reachEnemyPort";"Follow to the checkpoint";"Проследуйте к отмеченной зоне"». После этого сохраним файл в кодировке «UTF-8».
Реакция самолетов прикрытия на появление английских истребителей
Пора подумать над тем, что когда английские истребители нападают на союзные бомбардировщики, истребители прикрытия реагировали на них, и пытались бы уничтожить. Для этого необходимо создать новый триггер «check_for_enemy_fighters» с «condition» «unitDistanceBetween» с параметрами:
- в «object» выберем «english_fighters»
- в «target» выберем «player_squad»
- в «value» выставим «2500»
А так же добавим новый «action» «unitAttackTarget» в котором укажем:
- в «object» выберем «ally_fighters»
- в «target» выберем «english_fighter01» и «english_fighter02»
- так же включим галочку «fireRandom»
Достижение первой точки полета
Для того, чтобы завершить первое задание, связанное с полетом до вражеского порта, и выдать игроку новое задание, связанное непосредственно с бомбежкой, создадим новый триггер «check_for_reaching_first_point», с «condition» «unitDistanceBetween» и параметрами:
- в «object» выберем «player_squad»
- в «target» выберем «enemy_port»
- в «value» выставим «4500»
И тут же добавим новый «action» «moSetObjectiveStatus» с «target» «reachEnemyPort» и «status» равным «2».
Расстановка английских кораблей
Пришло время добавить в миссию объекты бомбардировки: английские корабли, стоящие в порту. Для этого с помощью кнопку «Create Unit», убедившись, что в поле справа выбрано «ships». Расставляем в порту несколько кораблей. Потом, с помощью той-же кнопки создаем новый «squad», изменяем его имя на «english_ships», и добавляем в него все, только что созданные нами, корабли. Теперь выделяем каждый корабль и меняем его «class» на любой понравившийся из списка, начинающийся на «hms» (английские корабли). Убедитесь, что все корабли относятся к армии с индексом «2».
Выдача нового задания
После выполнения первого задания, игроку необходимо дать новое. Для этого в файл текстового описания миссии с расширением «csv» добавим строку: «"destroyEnemyShips";"Destroy enemy ships";"Уничтожьте корабли противника"». Добавим новый «Mission Object», выбрав, как всегда «abstractMissionObjective», назовем его «destroyEnemyShips» и снимем галочку «enabled» Теперь в триггере «check_for_reaching_first_point» добавим два новых «action». Первый: «wait» на 3 секунды, а второй: «moAddMissionObjective», в качестве «traget» указав ему «destroyEnemyShips».
Заодно необходимо убрать метку на точку полета, раз уж мы ее достигли. Это делается добавлением «action» «missionMarkAsWaypoint», где в качестве «target» указывается «enemy_port» и снимается галочка «visible».
Добавление английских кораблей в качестве целей
Когда игрок достигает порта, неплохо было бы указать корабля, стоящие в порту, в качестве целей, а заодно вывести учет их количества в левый нижний угол экрана.
Для этого в триггере «check_for_reaching_first_point» добавим два новых «action». Первый: «setUnitIndication», которому в качестве «target» необходимо указать «english_ships». А перед тем, как добавить второй «action», необходимо создать еще один триггер: «update_indicator», которому необходимо снять галочку «enabled» и поставить галочку «enableAfterComplete». В качестве «action» для этого триггера необходимо указать «missionSetTargetIndication», где в качестве «target» указать «english_ships». Добавим второй «action» в триггер «check_for_reaching_first_point». Им станет «triggerEnable», которому в качестве «traget» необходимо указать «update_indicator».
Расстановка зенитных орудий
Маловероятно, что крупный порт остался бы без прикрытия зенитных орудий. С помощью кнопки «Create Unit», предварительно убедившись, что в поле справа выбрано «air_defence», поставьте несколько зенитных орудий в непосредственной близости от порта. Выделите все из них, и выберите в качестве «class» орудие «uk_12mm_m2». Убедитесь, что все зенитные орудия относятся к армии с индексом «2».
Бомбежка союзными самолетами порта
Так как не все союзные самолеты находятся под управлением игрока было бы неплохо заставить их бомбить порт, а не просто летать над ним. Для этого в триггер «check_for_reaching_first_point» добавим новый «action»: «unitAttackTarget» с параметрами:
- в «object» добавим «ally_bombers» и «player»
- в «target» добавим «english_ships»
Для того, чтобы корабли противника чаще мазали добавим еще одну команду: «unitSetProperties», где в качестве «target» укажем сквад «english_ships», а так же все зенитные орудия, а «effShootingrate» выставим в «0.6» Теперь, если сохраниться и запустить миссию, мы получим практически ее финальный вариант, в котором события развиваются согласно задуманным планам, а все, что нам остается доделать — это отслеживание провала или выполнения задания по бомбежке, и организация пункта эвакуации.
Время бомбежки
На саму бомбежку отведем 3 минуты. Если за 3 минуты игрок и союзные самолеты не успевают разбомбить корабли противника миссия будет считаться проваленной. Для того, чтобы корректно отсчитывать время бомбардировки, необходимо завести новую переменную «bombardingTime». Для этого необходимо нажать кнопку «Add» в секции «Variables», расположенной ниже списка триггеров миссии, указать необходимое имя и выбрать тип переменной «Integer».
Для того, чтобы работать с этой переменной нам придется создать новый триггер: «bombarding_time_increase», выключить ему галочку «ebable» и включить ему «enableAfterComplete». В триггер «check_for_reaching_first_point», в уже существующий «action» «triggerEnable» добавим вызов только что созданного триггера, перейдем в него и добавим ему «action» «varModify» с параметрами:
- в «var» выберем переменную «bombardingTime»
- в «operator» укажем «add»
Переменную мы изменяем, неплохо было бы так же проверять ее на некоторое значение, и, если оно уже достигнуто, запрещать дальнейшее увеличение переменной и отправление бомбардировщиков к точке эвакуации.
Для этого создадим новый триггер с именем «check_for_bombarding_time» и выключим галочку «enabled». В качестве «conditions» необходимо указать «varCompareInt» с параметрами:
- в «var_value» укажем имя переменной «bombardingTime»
- в «value» выставим значение «180»
- в «comparasion_func» выберем «more»
Добавим в этот триггер новый «action»: в «triggerDisable» в котором в качестве «target» укажем «bombarding_time_increase». Теперь в триггер «check_for_reaching_first_point» в «action» в «triggerEnable» добавим «check_for_bombarding_time», чтобы вызвать триггер проверки переменной.
Создание точки эвакуации
С помощью кнопку «Create Point Zone» создайте новую зону, на высоте 1.000 метров в море, и назовите ее «evacuate_point». В триггере «check_for_reaching_first_point» добавьте новый «action» «unitMoveTo» с параметрами:
- в «object» добавьте «ally_bombers» и «player»
- в «target» укажите «evacuate_point»
И передвиньте его выше «unitAttackTarget». Это сработает следующим образом: самолеты получают приказ эвакуироваться, и сразу после него приказ атаковать. Приказ атаки имеет наивысший приоритет, поэтому они начнут атаковать корабли. Однако, когда боезапас самолетов подойдет к концу, они развернутся и начнут полет к точке эвакуации.
Проверка удачной бомбежки
Пора создать триггер, который будет отслеживать уничтожение всех кораблей в порту. Для этого создаем новый триггер с названием «is_bombarding_was_succesful» и снимаем с него галочку «Enabled». В триггере «check_for_reaching_first_point» в уже существующий «triggerEnabled» добавляем вызов «is_bombarding_was_succesful». Так как этот триггер может сработать ДО того момента, как кончилось время бомбежки, необходимо запретить дальнейшее выполнение триггера, отвечающего за отсчет времени бомбежки, и вызвать все последующие триггеры. И при этом необходимо учитывать то, что условие может быть выполнено уже после окончания времени бомбежки, когда остальные самолеты повернули к точке эвакуации, а игрок продолжал уничтожать цели. В качестве условия проверки для данного триггера необходимо выбрать «unitWhenCountMatches» с параметрами:
- в «object» выбрать «english_ships»
- в «object_type» выбрать «isAlive»
- в «func» выбрать «less»
- в «value» выставить значение «4»
Итак, проверка на то, что почти все корабли уничтожены произошла.
Однако что если самолеты под управлением АИ не смогли уничтожить достаточное количество кораблей противника, а игрок, как не старался, не смог уничтожить их больше 4, что хоть и является значимым числом, но для успеха миссии пока не достаточно?
Давайте добавим еще одно условие проверки «unitWhenCountMatches» с параметрами:
- в «object» выбрать «english_ships»
- в «object_type» выбрать «isKilledByPlayer»
- в «func» выбрать «more»
- в «value» выставить значение «3»
Так как у нас есть два условия проверки нам необходимо выбрать как именно будет происходить проверка. Необходимо ли чтобы для успешной проверки были выполнены оба условия, или подойдет только одно из них и не важно какое? Обратимся к полю «conditionsType», расположенному под именем триггера. Сейчас значением этого поля является «ALL», что означает, что для успешной проверки необходимо выполнение всех условий. Давайте изменим его на «ANY», что позволит проверке быть успешной в случае если хотя бы одно из условий будет пройдено.
Теперь необходимо как-то развести проверку для случая когда переменная уже достигла порогового значения, и для случая, когда еще не достигла. Для этого создаем два новых триггера: «is_boarding_var_maxed» и «is_boarding_time_in_progress». С обоих снимаем галочку «enabled». В качестве «conditions» в триггере «is_boarding_var_maxed» необходимо указать «varCompareInt» с параметрами:
- в «var_value» укажем имя переменной «bombardingTime»
- в «value» выставим значение «180»
- в «comparasion_func» выберем «more»
Добавим в этот триггер новый «action»: «triggerDisable» в котором в качестве «target» укажем «bombarding_time_increase». В триггере «is_bombarding_was_succesful» с помощью «triggerEnabled» вызываем оба, только что созданных триггера. В триггере «is_boarding_var_maxed» создаем «action» «triggerDisable» и указываем ему в качестве «target» «is_boarding_time_in_progress», а в триггере «is_boarding_time_in_progress» создаем «action» с «triggerDisable» и указываем ему в качестве «target» «is_boarding_var_maxed». Таким образом при выполнении каждый триггер закроет вторую проверку, чтобы она не висела в памяти и не мешала. Так же запретим увеличение значения переменной, добавив в триггер «is_bombarding_was_succesful» новый «action» «triggerDisable» со значением «bombarding_time_increase» и «check_for_bombarding_time».
Теперь, в триггере «is_boarding_time_in_progress» сымитируем то, что переменная, отвечающая за длительность бомбардировки достигла своего порогового значения. Для этого добавим новый «action» «varSetInt» со значением «target» в виде имени переменной «bombardingTime», и выставив «value» в значение «181». Таким образом, следующая-же проверка на то закончилось-ли время бомбардировки будет успешной, и союзные бомбардировщики повернут к точке эвакуации. В качестве «conditions» необходимо указать «varCompareInt» с параметрами:
- в «var_value» укажем имя переменной «bombardingTime»
- в «value» выставим значение «180»
- в «comparasion_func» выберем «less»
Добавим в этот триггер новый «action»: в «triggerDisable» в котором в качестве «target» укажем «bombarding_time_increase» и «update_indicator».
Тем не менее нам все еще необходимо создать новый триггер с именем «bombarding_was_fully_succesful», выключив галочку «Enabled», в котором мы пометим заданием выполненным, и с помощью «triggerEnable» вызовем его из двух последних триггеров. В этом триггере добавим «action» «moSetObjectiveStatus», в качестве «target» указав «destroyEnemyShips», и в качестве «status» указав «2».
В триггере «check_for_bombarding_time» добавим новый «action» «triggerEnable» в качестве «target» указываем «is_bombarding_was_succesful».
Проверка неудачной бомбежки
Добавим новый триггер с именем «is_bombarding_was_failed», в котором мы проверим выполнена ли цель бомбардировки, и так же снимем с него галочку «Enabled». С помощью «triggerEnable» вызовем его из триггера «check_for_bombarding_time».
Так как все задания в игре у нас давались строго последовательно и их получения нельзя было избежать, то проверка на успешность бомбардировки очень простая: просто добавляем «condition» в триггер «is_bombarding_was_failed», выбрав из списка «misObjStatus», где в качестве «target» указываем «destroyEnemyShips», а в качестве «status» выбираем «inProgress». Если проверка будет успешной, это будет означать, что часть английских кораблей выжила, и миссия провалена.
Так же запретим увеличение значения переменной, добавив в триггер «is_bombarding_was_succesful» новый «action» «triggerDisable» со значением «bombarding_time_increase» и «check_for_bombarding_time». Дальше добавляем новый «action»: «moSetObjectiveStatus», в качестве «target» выбрав «destriyEnemyShips», а в качестве «status» выбрав «3». Добавляем «action» «wait» на 3 секунды, и добавляем «action» «missionFailed».
Отображение времени выполнения задания
Так как игроку дается некоторое время на выполнение задания, было бы неплохо его отображать. Для этого, в триггер «update_indicator» добавим команду «missionSetTimerIndicator», указав ему в качестве «target» нашу переменную «bombardingTime».
Выдача нового задания
Добавим в наш «csv» файл новую строку: «"evacuateToPoint";"Follow to the checkpoint for evacuate";"Проследуйте к отмеченной зоне для эвакуации"», а так же добавим новый «Mission Object» с именем «"evacuateToPoint";"Follow to the checkpoint for evacuate";"Проследуйте к отмеченной зоне для эвакуации"», обязательно выключив ему галочку «Enabled».
В триггер «bombarding_was_fully_succesful» добавляем «wait» на 3 секунды, чтобы дать паузу между завершением одного задания и выдачей нового, добавляем новый «action» «moAddMissionObjective», указав ему в качестве «target» «evacuateToPoint». Добавим новый «action» «missionMarkAsWaypoint», в качестве «target» указав «evacuate_point», и оставив галочки «visible» и «primary» включенными.
Проверка успешной эвакуации
Создадим новый триггер «is_evacuate_sucessfull», выключив ему галочку «Enabled». С помощью «triggerEnable» вызовем его из триггера «bombarding_was_fully_succesful». В самом триггере добавим новый «condition» «playerDistanceBetween», указав в качестве «target» «evacuate_point», и дистанцию в 1500 метров.
В триггер добавим новый «action» «moSetObjectiveStatus» с «target» «evacuateToPoint» и «status» равный «2». Так же добавим «wait» на 3 секунды и «missionCompleted».
Сохраняемся и проверяем завершенную миссию.