<<<Назад <<< <<<Меню>>> >>> Далее>>>

Создание CTF миссии

Вступление

В силу определенной специфики данной миссии мы начнем ее создание с файла description.ext, который должен располагаться в директории с миссией. В первую очередь, создадим папку и файл миссии, сохранив в редакторе пустую карту. После чего, переключившись в Windows, создадим в любом текстовом редакторе файл description.ext и сохраним его в ту же папку с миссией. Ниже вы можете найти полный текст данного файла с описанием его частей.

respawn=3
respawndelay=30

onLoadMission="Capture the Flag Tutorial"

titleParam1 = "Time:";
valuesParam1[] = {10000, 300, 600, 900, 1200, 1500, 1800, 2700, 3600, 7200};
defValueParam1 = 1800;
textsParam1[] = {"Unlimited", "5 min", "10 min", "15 min", "20 min", "25 min", "30 min", "45 min", "1 hour", "2 hours"};

titleParam2 = "Score to win:";
valuesParam2[] = {10000, 5, 7, 10, 15, 20, 25, 30};
defValueParam2 = 5;
textsParam2[] = {"Unlimited", 5, 7, 10, 15, 20, 25, 30};


class CfgSounds
{
  sounds[] = { WScore, EScore, WCapture, ECapture };
  class WScore
  {
    name = "WScore";
    sound[] = {"WScore.ogg", 1, 1.0};
    titles[] = { };
  };
  class EScore
  {
    name = "EScore";
    sound[] = {"EScore.ogg", 1, 1.0};
    titles[] = { };
  };
  class WCapture
  {
    name = "WCapture";
    sound[] = {"WCapture.ogg", 10, 1.0};
    titles[] = { };
  };
}
class ECapture
{
  name = "ECapture";
  sound[] = {"ECapture.ogg", 10, 1.0};
  titles[] = { };
};

В первых двух строчках настраивается характеристики респауна в миссии:
respawn=3
respawndelay=30

Тип респауна 3 обозначает, что игроки будут "рождаться" в предопределенной зоне, а значение respawndelay задает задержку между моментом "смерти" и моментом "рождения" игроков в 30 секунд.

В третьей строке файла указывается текст, который будет отображаться на экране в момент загрузки миссии.
onLoadMission="Capture the Flag Tutorial"

Затем идут "опции хоста", такие как лимиты на время игры и на максимальное количество очков.
titleParam1 = "Time:";
valuesParam1[] = {10000, 300, 600, 900, 1200, 1500, 1800, 2700, 3600, 7200};
defValueParam1 = 1800;
textsParam1[] = {"Unlimited", "5 min", "10 min", "15 min", "20 min", "25 min", "30 min", "45 min", "1 hour", "2 hours"};

titleParam2 = "Score to win:";
valuesParam2[] = {10000, 5, 7, 10, 15, 20, 25, 30};
defValueParam2 = 5;
textsParam2[] = {"Unlimited", 5, 7, 10, 15, 20, 25, 30};

Последняя часть файла описывает собственные звуковые файлы, используемые в миссии. После того как вы добавите описание ваших звуков в description.txt, они появятся в окне Effects в поле Sounds при создании вами триггера или вэйпоинта.
class CfgSounds
{
  {
    sounds[] = { WScore, EScore, WCapture, ECapture
  };
  class WScore
  {
    name = "WScore";
    sound[] = {"WScore.ogg", 1, 1.0};
    titles[] = { };
  };
  class EScore
  {
    name = "EScore";
    sound[] = {"EScore.ogg", 1, 1.0};
    titles[] = { };
  };
  class WCapture
  {
    name = "WCapture";
    sound[] = {"WCapture.ogg", 10, 1.0};
    titles[] = { };
  };
  class ECapture
  {
    name = "ECapture";
    sound[] = {"ECapture.ogg", 10, 1.0};
    titles[] = { };
  };
};


После того как вы набрали весь необходимый текст файла description.txt, сохраните его и закройте ваш текстовый редактор.
Теперь в директории с миссией создайте поддиректорию "Sound" и поместите в нее 4 звуковых файла (WScore.ogg; EScore.ogg; WCapture.ogg; ECapture.ogg). Они прилагаются к данному руководству (см. окончание).

Размещение необходимых объектов

Для создания CTF миссии нам понадобятся следующие вещи:

Флаги:

Начнем с установки двух флагов. На данном этапе создания миссии нам пока нет дела до установки различных объектов и триггеров, по этому вы можете просто установить флаги в том месте карты где открыл ее редактор. Нажмите F1 и установите юнит "Player" со свойствами по умолчанию. Затем установите рядом с плеером юнит флаг (Side: Empty, Class: Objects, Unit: Flag) со следующими свойствами:

Name: FlagW
Initialization (Init): this setflagtexture "usa_vlajka.pac"; this setflagside west
И второй флаг со свойствами:
Name: FlagE
Init: this setflagtexture "rus_vlajka.pac"; this setflagside east
Если вы не добавите в поле Init указанный выше скрипт, то флаг будет выглядеть просто как флагшток.

Инициализирующий триггер

Данный триггер используется для установки всех переменных миссии в их первоначальное значение. Вот его параметры:
Axis a: 0
Axis b: 0
Text: Init
Condition: true
On Activation: WScore=0; EScore=0; ownerW=objnull; ownerE=objnull; WFlagTaken=false; EFlagTaken=false; TimeEnd=0

Система накопления очков

Нам необходимо создать систему триггеров, которая будет автоматически добавлять 1 очко команде, захватившей флаг, и несколько очков (указанных в дебрифинге) к личному рейтингу каждого игрока этой команды. Ниже приведены все триггеры и их свойства, которые нам нужно будет установить в миссии (установим их на карте пока рядом с флагами):

Trigger 1:
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: FlagscoreW
Condition: (ownerE in list FlagSwitchW) and not WflagTaken
On Activation: Flagcarrier=ownerE; ownerE=objNull; FlagE setFlagOwner objNull; WScore = WScore + 1; titletext[format ["One point for NATO\nScore : NATO %1 - Soviet %2", WScore, EScore],"Plain down"]; EFlagTaken=false; "_x addScore 5" forEach units group Flagcarrier
Effects: Sounds: Anonymous: WScore

Trigger 2:
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: FlagscoreE
Condition: (ownerW in list FlagSwitchE) and not EflagTaken
On Activation: Flagcarrier=ownerW; ownerW=objNull; FlagW setFlagOwner objNull; EScore = EScore + 1; titletext[format ["One point for Soviet\nScore : NATO %1 - Soviet %2", WScore, EScore], "Plain down"]; WFlagTaken=false; "_x addScore 5" forEach units group Flagcarrier
Effects: Sounds: Anonymous: EScore

Trigger 3:
Axis a: 0
Axis b: 0
Activation: Radio Alpha
Set to Repeatedly
Text: Score
Condition: this
On Activation: titletext[format ["Score : NATO %1 - Soviet %2", WScore, EScore], "Plain down"]

Статус флагов

Поскольку флаг - это основной объект в CTF миссии, нам необходимо создать систему, которая будет проверять текущее состояние флагов обоих сторон в любой момент времени. Флаг может находится на флагштоке на основной базе, его может нести игрок, он может быть брошен в результате гибели игрока который его нес. Для того, чтобы создать такую систему нам потребуется 3 пары триггеров. Вот список триггеров и их свойств:

Trigger 4 (устанавливается в месте расположения флага НАТО):
Axis a: 10
Axis b: 10
Activation: West
Set to Repeatedly
Text: West Flag Switch
Name: FlagSwitchW
Condition: this

Trigger 5 (устанавливается в месте расположения флага СССР):
Axis a: 10
Axis b: 10
Activation: East
Set to Repeatedly
Text: East Flag Switch
Name: FlagSwitchE
Condition: this

Trigger 6 :
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: Returned NATO
Condition: (isnull flagowner flagW) and WflagTaken
On Activation: WFlagTaken = false; titletext["The NATO flag was returned","Plain down"]

Trigger 7:
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: Returned Soviet
Condition: (isnull flagowner flagE) and EflagTaken
On Activation: EFlagTaken = false; titletext["The Soviet flag was returned","Plain down"]

Trigger 8:
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: NATO flag taken
Condition: (not isnull flagowner FlagW) and flagowner FlagW != ownerW
On Activation: ownerW = flagowner FlagW; titletext[format ["%1 has the NATO flag", name ownerW], "Plain down"]; WFlagTaken=true

Trigger 9:
Axis a: 0
Axis b: 0
Set to Repeatedly
Text: Soviet flag taken
Condition: (not isnull flagowner FlagE) and flagowner FlagE != ownerE
On Activation: ownerE = flagowner FlagE; titletext[format ["%1 has the Soviet flag", name ownerE], "Plain down"]; EFlagTaken=true

Триггеры окончания игры

Данные триггеры используются для того, что бы дать возможность хосту закончить игру при превышении каких-либо пределов. Например, оговоренного лимита времени или количества набранных очков. Триггеры проверяют, когда будет превышен лимит времени или по очкам и завершают игру.

Trigger 10:
Axis a: 0
Axis b: 0
Text: Time1
Condition: (Param1<10000) and (Param1>=120) and ((Param1-time)<=120)
On Activation: hint "2 minutes left"

Trigger 11:
Axis a: 0
Axis b: 0
Text: Time2
Condition: (Param1<10000) and (Param1>=300) and ((Param1-time)<=300)
On Activation: hint "5 minutes left"

Trigger 12:
Axis a: 0
Axis b: 0
Text: Time3
Condition: (Param1<10000) and (Param1>=600) and ((Param1-time)<=600)
On Activation: hint "10 minutes left"

Trigger 13:
Axis a: 0
Axis b: 0
Text: Time4
Condition: (Param1<10000) and (Param1>=1200) and ((Param1-time)<=1200)
On Activation: hint "20 minutes left"

Trigger 14:
Axis a: 0
Axis b: 0
Text: Time5
Condition: (Param1<10000) and (Param1>=1800) and ((Param1-time)<=1800)
On Activation: hint "30 minutes left"

Trigger 15:
Axis a: 0
Axis b: 0
Text: Time6
Condition: (Param1<10000) and (Param1>=3600) and ((Param1-time)<=3600)
On Activation: hint "1 hour left"

Trigger 16:
Axis a: 0
Axis b: 0
Type: End#1
Text: Ending after Outro.sqs
Condition: TrueEnd
On Activation: ForceEnd

Trigger 17:
Axis a: 0
Axis b: 0
Text: Ending when time is up or score is maximum
Condition: (param1<10000 and ((time >= param1) or (TimeEnd >= param1))) or (param2<10000 and ((WScore>=param2) or (EScore>=param2)))
On Activation: TimeEnd=time; publicVariable "TimeEnd"; titletext[format ["Mission over\nFinal score : NATO %1 - Soviet %2", WScore, EScore], "Plain"]; player exec "Outro.sqs"

Респаун

Поскольку в файле descrption.txt мы указали. что игроки будут "рождаться" в предопределенной зоне, то нам необходимо создать данные зоны для обеих команд. Это делается установкой двух маркеров на карте со следующими свойствами:

Marker 1:
Name: Respawn_west
Set to Ellipse
Color: Green
Fill: Grid Diagonal
Axis a: 20
Axis b: 20
Marker 2:
Name: Respawn_east
Set to Ellipse
Color: Red
Fill: Grid Diagonal
Axis a: 20
Axis b: 20

Игроки будут оживать в участках карты, помеченных маркерами каждой стороны.

Установка юнитов, вэйпоинтов и объектов

Для того чтобы полностью создать работающую миссию, вам необходимо добавить в нее сколько-нибудь юнитов и вэйпоинтов. В мультиплеерной игре мы часто находим несколько игровых слотов, которые заполняются AI игроками. По этому нам необходимо заставить такие юниты не только сражаться между собой, но и собирать флаги. Используйте следующий список юнитов/объектов с их свойствами. Также переустановите все триггеры и оба флага.
# Side Class Control Unit Rank Skill Init Azimut Name
НАТО:
1 West Men Player Officer Colonel 75% GroupW = group this 90 CommanderWest
2 West Men Playable Machine gunner Corporal 50% GroupW = group this 90 West2
3 West Men Playable Grenadier Corporal 50% GroupW = group this 90 West3
4 West Men Playable Black Op Private 50% GroupW = group this 90 West4
5 West Men Playable Soldier Private 50% GroupW = group this 90 West5
6 West Men Playable LAW soldier Lieutenant 50% GroupW = group this 90 West6
7 West Men Playable Sniper Corporal 50% GroupW = group this 90 West7
СССР:
8 East Men Playable Officer Colonel 75% GroupE = group this 0 CommanderEast
9 East Men Playable Machine gunner Corporal 50% GroupE = group this 0 East2
10 East Men Playable Grenadier Corporal 50% GroupE = group this 0 East3
11 East Men Playable Sniper Corporal 50% GroupE = group this 0 East4
12 East Men Playable Soldier Private 50% GroupE = group this 0 East5
13 East Men Playable RPG soldier Lieutenant 50% GroupE = group this 0 East6
14 East Men Playable Spetz Natz Private 75% GroupE = group this 0 East7

Техника:
# Side Class Unit Unlocked
15 Empty Car Jeep Unlocked
16 Empty Car 5t Truck Unlocked
17 Empty Car UAZ Unlocked
18 Empty Car Ural Unlocked

Техника:
# Side Class Unit
19 Empty Ammo Ammo Crates (West)
20 Empty Ammo Ammo Crates (West)
21 Empty Ammo Ammo Crates (West)
22 Empty Ammo Ammo Crates (West)
23 Empty Ammo Ammo Crates (Eest)
24 Empty Ammo Ammo Crates (Eest)
25 Empty Ammo Ammo Crates (Eest)
26 Empty Ammo Ammo Crates (Eest)

Вэйпоинты:

Свойства объектов, которые мы не устанавливаем явно, устанавливаются в значение по умолчанию или в значение "без изменений" (NO CHANGE).

WP1W / WP1E:
WP type: Move
Combat mode: Open fire, Engage at will

WP2W:
WP type: Move
Description: Get flag
Condition: (local this) and this != player and (this distance FlagE < 6)
On Activation: this action ["TAKE FLAG", FlagE]
Set to Show in Cadet mode

WP2E:
WP type: Move
Description: Get flag
Condition: (local this) and this != player and (this distance FlagW < 6)
On Activation: this action ["TAKE FLAG", FlagW]
Set to Show in Cadet mode

WP3W / WP3E:
WP type: Move

WP4W / WP4E:
WP type: Cycle

Написание briefing и overview

Брифинги, которые вы видите в игре - это обычные HTML файлы как, например, интернет страницы. Шаблоны доступны в разделе Утилиты. Откройте шаблон брифинга в броузере если вы не знакомы с языком HTML. Очень важно оставить как есть части файла, которые отображаются не красным цветом и редактировать только те, которые отображаются красным. Откройте текстовый редактор и загрузите в него шаблон для брифинга. Сравните два экрана (броузер и редактор), что бы видеть какую часть текста можно редактировать, а какую нет. После того как вы добавите собственный текст брифинга, сохраните этот файл с именем briefing.html в директории миссии.

Следующий шаг- это подготовка файла overview, который описывает миссию в игре в экране выбора миссии. Просто повторите те же действия, что и с briefing.html, сохранив при этом overview в файле overview.html в директории с миссией.

Дополнительные пояснения:
<a href="marker:FlagWest">NATO flag</a>: вы можете вставить свое имя маркера (одного из миссии) в место слова "FlagWest". "NATO flag" это ссылка, которая будет отображаться в окне брифинга. Она будет ссылаться на ваш маркер на карте.

Добавление небольшого вступления и концовки

Уже сейчас миссия вполне играбельна и готова к экспорту, однако добавим к ней кое-что дополнительное: вступительную и заканчивающую последовательности. Мы хотим, что бы миссия начиналась с постепенного появления из затемнения и заканчивалась плавным приближением к флагу НАТО, пока отображается счет игры. Это можно сделать используя внешние скрипт-файлы. Для некоторых из вас это будут первые шаги в написании собственных скриптов для OFP миссий, однако мы не будем сейчас останавливаться на серьезном их описании, а сделаем это в будущих руководствах по написанию скриптов для OFP.

Для создания заставки мы сделаем текстовый файл init.sqs в директории с миссией, в котором напишем следующую строку: titleCut ["”,"BLACK IN", 3] Это заставит миссию начаться с темного экрана, постепенно просветляющегося в течение 3 секунд. Между первыми двумя символами кавычек мы могли бы добавить строку текста, которая отображалась бы на экране в момент выполнения этой сцены. Однако сейчас мы не будем этого делать. Мы можем не беспокоиться о выполнении данного скрипта, поскольку скрипт с именем init.sqs, если таковой имеется, выполняется всегда при старте миссии.

Концовка будет чуть сложнее поскольку нам понадобиться "создать" камеру, котрую сфокусируем на флаге НАТО. Ниже приведен полный текст, который мы для этого использовали:

enableRadio false

_camera = "camera" camCreate [1300.443237,5970.769540,10]
_camera cameraEffect ["internal","back"]
_camera camSetTarget FlagW
_camera camSetFOV 0.700
_camera camCommit 0
@camCommitted _camera

~5

TrueEnd=true

~2

player cameraEffect ["terminate","back"]
camDestroy _camera

Теперь осталось только сохранить миссию и экспортировать для сетевой игры. Вот что (161 кб) должно было у вас получиться.

<<<Назад <<< <<<Меню>>> >>> Далее>>>