<<<Назад <<< | <<<Меню>>> | >>> Далее>>> |
В силу определенной специфики данной миссии мы начнем ее создание с файла 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
Trigger 5 (устанавливается в месте расположения флага СССР):
Axis b: 10
Activation: West
Set to Repeatedly
Text: West Flag Switch
Name: FlagSwitchW
Condition: this
Axis a: 10
Trigger 6 :
Axis b: 10
Activation: East
Set to Repeatedly
Text: East Flag Switch
Name: FlagSwitchE
Condition: this
Axis a: 0
Trigger 7:
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"]
Axis a: 0
Trigger 8:
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"]
Axis a: 0
Trigger 9:
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
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
Trigger 11:
Axis b: 0
Text: Time1
Condition: (Param1<10000) and (Param1>=120) and ((Param1-time)<=120)
On Activation: hint "2 minutes left"
Axis a: 0
Trigger 12:
Axis b: 0
Text: Time2
Condition: (Param1<10000) and (Param1>=300) and ((Param1-time)<=300)
On Activation: hint "5 minutes left"
Axis a: 0
Trigger 13:
Axis b: 0
Text: Time3
Condition: (Param1<10000) and (Param1>=600) and ((Param1-time)<=600)
On Activation: hint "10 minutes left"
Axis a: 0
Trigger 14:
Axis b: 0
Text: Time4
Condition: (Param1<10000) and (Param1>=1200) and ((Param1-time)<=1200)
On Activation: hint "20 minutes left"
Axis a: 0
Trigger 15:
Axis b: 0
Text: Time5
Condition: (Param1<10000) and (Param1>=1800) and ((Param1-time)<=1800)
On Activation: hint "30 minutes left"
Axis a: 0
Trigger 16:
Axis b: 0
Text: Time6
Condition: (Param1<10000) and (Param1>=3600) and ((Param1-time)<=3600)
On Activation: hint "1 hour left"
Axis a: 0
Trigger 17:
Axis b: 0
Type: End#1
Text: Ending after Outro.sqs
Condition: TrueEnd
On Activation: ForceEnd
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
Marker 2:
Set to Ellipse
Color: Green
Fill: Grid Diagonal
Axis a: 20
Axis b: 20
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
Брифинги, которые вы видите в игре - это обычные 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 кб) должно было у вас получиться.
<<<Назад <<< | <<<Меню>>> | >>> Далее>>> |