ObjectName 1 distance ObjectName 2



Учебник по созданию скриптов

Sanek <Sanek-Solo@yandex.ru>

Наша Армия [CCCP]

Flashpoint on Xaos

Год


Учебник по созданию скриптов

Для начала скажу, что, приступая к изучению встроенного в ОФП языка скриптов, Вы уже должны прекрасно уметь работать во встроенном редакторе ОФП. Вы должны знать, как создавать и называть объекты, что такое триггер и маркер и зачем они нужны и т.д.…

 

Что же такое скрипт? Скрипт – внешний файл, написанный на встроенном в игру языке программирования, таком же, как и Turbo Pascal или Basic. В этом файле находится нечто напоминающее план действий для игры - последовательность команд и операторов. С помощью этого планы Вы “говорите” игровому движку, что ему надо сделать. В целом скрипт – файл, содержащий некую информацию для игры.

 

Зачем же нужны скрипты, если можно использовать триггеры, вейпоинты и другие встроенные в сам редактор ОФП средства? Во-первых, скрипты выглядят намного красивее, чем нагромождение триггеров и вейпоинтов. Во-вторых, скрипты – универсальны, то есть, один раз написав скрипт, Вы можете использовать его в разных миссиях. В-третьих, скрипты меньше загружают процессор. И, в-четвертых, скрипты позволяют сделать гораздо больше, чем те же триггеры.

 

Ну, предположим мы написали очень интересный скрипт, но как теперь его использовать в игре? Как я уже говорил скрипт – это всего лишь файл с расширением “sqs”. Например, myscript.sqs. Что бы использовать скрипт в игре нужно его скопировать в каталог с вашей миссией. Обычно это каталог “ Operation Flashpoint \ Users \{ваше имя в игре}\{название вашей миссии}”. Например “C:\Program Files\Codemasters\Operation Flashpoint\Users\Sanek\MyMission.Intro”.

 

MyMission.Intro

 

Название миссии

Остров

Eden Malden Kolgujev   Desert Island   Nogova

Название каталога с миссией

Inprison Inprison.Eden Inprison.Abel Inprison.Cain Inprison.Intro Inprison.noe
Ambush Ambush.Eden Ambush.Abel Ambush.Cain Ambush.Intro Ambush.noe
Test test.Eden test.Abel test.Cain test.Intro Test.noe

 

Итак, скрипт переписан в каталог с миссией и его осталось только лишь вызвать из игры. Но как? А вот так:

[arg1,arg2,arg3…argN] exec “ScriptName.sqs”

Arg1,arg2,arg3 и argN – аргументы передаваемые в скрипт. Аргументы, скажем так, это те объекты, числа, переменные и т.п. с которыми мы будем работать в скрипте (конечно помимо этих переменных в скрипте будут использоваться и другие). Аргументы передаются в скрипт из игры. То есть если в игре создана какая-нибудь переменная или объект, то они могут быть переданы в скрипт, для этого их нужно лишь  указать в списке аргументов. Exec – ключевое слово, а “ScriptName.sqs” – название вашего скрипта. Скрипты можно вызывать из полей, On Activation, On Deactivation, Script(поле в вейпоинте). Приступим к рассмотрению нашего первого скрипта!

Hello . sqs


;этот скрипт выводит на экран сообщение “Hello!”

;вывод на экран сообщения

TitleText [“Hello!”, ”plain down”]

;выход

Exit

;Запуск скрипта: [] exec "Hello.sqs"

 


Вот и наш первый скрипт. Рассмотрим его повнимательнее. Для начала запомните символ “;” – этот символ, поставленный в начале строки позволяет делать комментарии – то есть текст, который не будет считываться игрой. Комментарии помогут Вам самим не запутаться при написании скрипта и облегчат другим понимание вашего скрипта. Но все же основная роль этого символа – разделение команд:

Unit1 dofire Unit2; Unit2 dofire Unit1

Хотя чаще всего каждую новую команду пишут с новой строчки и тогда “;” не ставится.

 В следующей строке мы видим команду “TitleText”. Эта команда позволяет выводить на экран во время игры различные сообщения. Она имеет следующий синтаксис:

TitleText [“Необходимый текст в кавычках”,”Позиция текста на экране”, скорость]

Существуют две известные мне позиции: “PLAIN” – в центре экрана или “PLAIN DOWN” – внизу экрана. Скорость – скорость появления текста. Чем больше число – тем дольше текст будет появляться на экране. Если скорость не указана она будет установлена по-умолчанию.

Далее идет ключевое слово “Exit”. Это ключевое слово завершает выполнение скрипта. Причем это ключевое слово не обязательно должно стоять в конце скрипта, оно может быть и в середине скрипта.

       Теперь посмотрим на работу скрипта в самой игре. Для чего сначала создадим в редакторе миссию и поставим всего лишь один юнит. Затем можно сохранять миссию. Пускай она называется Test а остров, на котором мы ее делали – Desert Island (следовательно, каталог с миссией будет называться Test.Intro ).  Далее ОФП (Alt+Tab) и найдем каталог с миссией и в этом каталоге создадим файл (можно Блокнотом или встроенным в файловую оболочку редактором – как правило, с помощью нажатия Shift+F4) с именем “Hello.sqs”. Наберем в этом файле текст вышеописанного скрипта (я настоятельно Вам рекомендую самим набирать текст, а не копировать его через буфер обмена – это поможет Вам лучше его понять и запомнить команды) и сохраним его в каталоге с вашей миссией. Теперь снова вернемся к ОФП. В поле Initalization поставленного юнита пропишем следующую строку:

[] exec “ Hello . sqs ”

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

Наконец сохраните миссию и нажмите кнопку Preview и….. Вы сами все видели!

 

Теперь, когда Вы уже убедились в существовании и работоспособности скриптов приступим к более подробному их изучению.

 

Сначала я хочу немного рассказать о том, с чем Вам придется работать, создавая скрипты. В первую очередь это, конечно же, переменные. Переменная – это ячейка памяти, имеющая имя и в которой хранится какая-то информация. Переменные создаются тогда, когда Вы их прописываете в скрипте. Значениями переменных можно легко оперировать. Переменные бывают глобальные и локальные. Локальные переменные – это те переменные, которые видны только в пределах этого скрипта. То есть параллельно может выполняться скрипт с переменной имеющей точно такое же имя и любое значение (то есть это две переменные с одинаковым именем – у них могут быть разные значения). Локальную переменную можно узнать по символу подчеркивания “_” стоящему перед именем переменной. Символ подчеркивания пишется слитно с именем переменной. Например, _testvar . При каждом запуске скрипта локальные переменные обновляются! Глобальная переменная – переменная видимая во всей игре. С такой переменной можно работать как из любого скрипта, так и из любого поля (типа Initialization или Condition) в самой игре. Перед именем глобальной переменной подчеркивание не ставится. Имя глобальной переменной должно быть уникальным во всей игре. Пример использования переменных:


….

;часть скрипта пропущена

;глобальной переменной a присваивается значение 5

a = 5

;глобальной переменной b присваивается значение 4

b = 4

;локальной переменной _ b присваивается значение суммы значения ;переменной a и 2. ;_ b и b совершенно разные переменные! Теперь _ b ;равно 7, а b равно 4(значение не ; изменилось).

_b = a + 2

;значение глобальной переменной b увеличивается на 1

b = b + 1

;думаю все и так понятно. * - знак умножения, / - знак деления.

_c = (a*b)/c

;после такой записи локальной переменной _ Soldier 1 присваивается ;значение глобальной переменной Sold 1(если Sold 1 - переменная) ;или же переменная  _ Soldier 1 становится как бы ссылкой на ОБЪЕКТ ; Sold 1. То есть если Sold 1 – солдат в игре (его имя Sold 1) то совершая ;какие-либо действия с _ Soldier 1(перемещая или убивая его) в игре ;все эти действия будут происходить с солдатом Sold 1.

_Soldier1 = Sold1

;пример для предыдущего комментария. Этой командой мы убиваем солдата Sold 1 хотя команда относится к _ Soldier 1(ведь _ Soldier 1 = Sold 1 ).

_Soldier1 setdammage 1

exit

 


Значением переменной может быть число, логическая переменная True(истина) или False(ложь), ссылка на объект, строка или массив. Строка – текст, заключенный в кавычки. Строки можно складывать:

 

Hint “Vasia hochet domoi!”

Hint (“Vasia” + “ ” + “hochet” + “ ” + “domoi” + “!”)

Name = “Vasia”

Znak = “!”

Hint (Name + “ ” + “hochet” + “ ” + “domoi” + Znak)

 

Hint – ключевое слово которое выводит на экран подсказку. Имеет следующий синтаксис:

hint { строка(текст в кавычках) или переменная со значением строки }

Все три приведенные в примере команды приведут к одному и тому же примеру: на экране появится подсказка с надписью “Vasia hochet domoi!”

 

Массив – набор однотипных или разнотипных элементов. В игре он обозначается как перечисление через запятую элементов массива заключенное в квадратные скобки. Массивы бывают одномерными и многомерными.  Одномерный массив имеет несколько элементов одного типа (например, только числа, или только строки) или разных типов (одновременно и числа, и строки).

 

_ array 1 = [“ Ivan ”,” Sergei ”,” Alexander ”] – определение(создание) одномерного массива с одинаковым типом переменных.

_ array 2 = [“ Ivan ”, true ,1] -  определение одномерного массива с различными типами переменных.

 

 

 Вы можете также создавать многомерные массивы. Они могут быть составлены из элементов различных типов. Чтобы создать многомерный массив, необходимо вместо одного или нескольких элементов уже созданного массива записать новый массив.

 

_array3 = [["Ivan","Sergei",1],”Alexander”,true,10] - определение многомерного массива.

 

Для выбора определенного элемента из массива используется команда select . Она имеет следующий синтаксис:

MassivName select n

Где n – порядковый номер элемента массива. ЗАПОМНИТЕ: Нумерация элементов в массиве начинается с 0!

 

_ elem 1 = _ array 1 select 0 – выбор ПЕРВОГО элемента из массива _ array 1 и сохранение его в переменную _ elem 1.

_ elem 2 = _ array 1 select 1 – выбор второго элемента из массива _ array 1 и сохранение его в переменную _ elem 2.

 

Посмотрим на выше описанный массив _array3 и выберем второй элемент из массива первого элемента (сложно звучит, нужным элементом будет строка “Sergei”).

 

_ elem 3 = (_ array 1 select 0) select 1

 

Для того чтобы узнать количество элементов в массиве используют команду count.

Count MassivName

Пример:

NumberOfElems = count _ array 1 – получение количества элементов в массиве _ array 1 и сохранение значения в переменную NumberOfElems .

 

Также можно складывать массивы и находить их разность.

 

Нахождение суммы массивов:

_array1 = ["One", "Two"]

_array2 = ["Three","Four"]

_summaArray = _array1 + _array2

Теперь массив summaArray будет содержать элементы "One", "Two","Three","Four".

 

Нахождение разности массивов:

_array1 = ["One", "Two","Three"]

_array2 = ["One"]

RaznostArray = _array1 - _array2

Массив RaznostArray будет содержать элементы "Two","Three".

 

Для того чтобы убрать один элемент из массива нужно просто его вычесть из этого массива:

 

Убираем элемент “Sergei” из массива _array1

_array1 = [“Ivan”,”Sergei”,”Alexander”,”Vovan”]

_array1 = _array1 – (_array1 select 1)

Теперь массив _array1 содержит элементы “Ivan”,”Alexander”,”Vovan”.

 

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

 

10 in SomeArray – проверяет наличие числа 10 в массиве SomeArray

MyUnit in MyTank - проверяет наличие солдата MyUnit в технике MyTank

 

Иногда Вам нужно будет, чтобы все юниты из массива сделали одно и то же действие. Для подобных случаев существует ключевое слово foreach. Это ключевое слово имеет такой синтаксис:

 

“_ x {какое-то действие или команда}” foreach MassivName

 

Где _x – специальная переменная, которая последовательно принимает значение каждого из элементов массива MassivName. Пример:

"_ x dowatch ap " foreach Unitsgroup 1 – команда заставляет всех юнитов из массива Unitsgroup 1 выполнить команду dowatch ap (команда Unit 1 dowatch ap заставляет следить Unit 1 за ap – более подробно об этой и других командах Вы узнаете из списка команд на русском или на английском (более полная версия))

 

Для наглядности покажу, что примерно делает компьютер, выполняя это команду:

 

_x = Unitsgroup1 select 0

_x dowatch ap

_x = Unitsgroup1 select 1

_x dowatch ap

_x = Unitsgroup1 select 2

_x dowatch ap

…… и так далее

 

Однако это довольно “капризная” команда и у меня она срабатывала не всегда, поэтому я вместо этой команды использую другой способ “перебора” всех значений массива, о котором Вы узнаете из скрипта “Exitfromhome.sqs”.

 

Довольно часто Вам при работе с массивами понадобится команда случайного выбора. Это команда random. Она имеет следующий синтаксис:

Random n

Это команда будет генерировать случайное число от 1 до n. Чтобы она использовала и число 0, необходимо из условия генерации вычитать 0.5 (по какой-то причине вычет 1 приводит к ошибке деления на ноль! - это одна из странностей игры):

 

Выбор случайного элемента из массива mylist и сохранение его в переменную nextelement (с учетом 0-го элемента!):

nextelement = (random (count mylist)) - 0.5

 

Также стоит отметить знаки сравнения и присваивания.

= - знак ПРИСВАИВАНИЯ. Например, a = b, теперь переменной a присвоено значение b. Не путайте этот знак со знаком сравнения.

== - знак СРАВНЕНИЯ. Var1 == Var2. Эта запись возвращает значение True(истина) если Var1 равно Var2 и значение False(ложь) если Var1 не равно Var2. Например, если b = 1 и c = 1 то выражение a = (b == c) приведет к тому, что a станет равным True.

 

!= - знак ОТРИЦАНИЯ ЗНАЧЕНИЯ. Var1 != Var2. Эта запись возвращает значение True(истина) если Var1 не равно Var2 и значение False(ложь) если Var1 равно Var2. Например, если b = 1 и c = 1 то выражение a = (b == c) приведет к тому, что a станет равным False.

 

> - ПРОВЕРКА ЗНАЧЕНИЙ, КАКОЕ БОЛЬШЕ. Var1 > Var2. Эта запись возвращает значение True(истина) если Var1 больше чем Var2 и значение False(ложь) если Var1 меньше чем Var2. Например, если b = 2 и c = 1 то выражение a = (b > c) приведет к тому, что a станет равным True.

 

Действие знаков >=, <, <= можно понять по аналогии.

 

 

Давайте вернемся к скрипту “Hello.sqs”. В этот скрипт не передавалось никаких аргументов (помните, мы запускали его с пустыми квадратными скобками) и, следовательно, мы не изменяли состояние каких-либо объектов в игре – мы просто выводили на экран заранее написанное в скрипте сообщение. Но подумайте сами, для того чтобы изменить выводимое сообщение надо изменять сам скрипт. То есть скрипт не универсален. Для того чтобы сделать скрипт более универсальным, нужно передавать в него аргументы. Как мы уж знаем, чтобы передать в скрипт аргументы их нужно перечислить в квадратных скобках при вызове скрипта. Но как же использовать в скрипте переданные аргументы. Для этого используется специальная локальная переменная _ this. Локальная переменная "_this" зарезервирована для ссылки на список аргументов, переданных в скрипт. Это может быть как один аргумент (если, например, скрипт вызывался так unit exec “Script.sqs” – однако такой вызов применяется очень редко, как правило, даже одиночный аргумент заключают в квадратные скобки), так и массив. Пример:

 

[arg1,arg2,arg3] exec “Script.sqs” – так вызывался скрипт

_ argmassiv 1 = _ this – получение всего массива аргументов. Теперь переменная _ argmassiv приняла значение(стала равной) массива [ arg 1, arg 2, arg 3].

_ argument 1 = _ this select 0 – получение первого аргумента и сохранение его значения в переменную _ argument 1

_ argument 2 = _ this select 1 - – получение второго аргумента и сохранение его значения в переменную _ argument 2

_ argument 3 = _ this select 2 - – получение третьего аргумента и сохранение его значения в переменную _ argument 3

Теперь _argument1 равно arg1

_argument2 равно arg2

_argument3 равно arg3

 

Изменим наш скрипт так, чтобы в него передавалась строка, которая будет выведена на экран и позиция самого текста. Наш скрипт будет выглядеть так:

 

“Hello2.sqs”

 

;получение аргументов (строки передаются обязательно в кавычках)

_string = _this select 0

_position = _this select 1

;вывод текста на экран

TitleText [_string, _position]

;выход

Exit

;Запуск скрипта: [“Текст сообщения”, “Позиция текста на экране”] exec "Hello2.sqs"

 


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

[“Текст сообщения”, “Позиция текста на экране”] exec “Hello2.sqs”

Например:

[“Hello World!!!”,”Plain Down”] exec “Hello2.sqs”

 

В предыдущем скрипте мы передавали в качестве аргументов строки (текст в кавычках) потому что команда titletext требует данные именно такого типа. То есть если бы Вы написали команду так titletext [5,”Plain Down”] или так titletext [peremen,”Plain Down”] (где значение переменной peremen не строка) то игра выдала бы Вам ошибку. Ключевое слово hint тоже требует именно строку. А что если Вам нужно сделать например таймер? Вот таймер-то и будет объектом следующего скрипта.

Ключевое слово format, позволяет конвертировать любые типы данных в строку. Синтаксис:

Format [“{текст %1 текст %2 текст % n }”, ARG 1, ARG 2, ARGn ]

Где %1,%2…%n – ссылки на аргументы, которые идут через запятую после закрытия кавычек. То есть вместо %1 в отформатированной строке будет значение переменной (или число, если ARG1 - число) ARG1, а вместо %2 соответственно ARG3. В кавычках нельзя использовать запятые.

Можно также вставлять знаки перевода строки и разбивать текст на несколько строк. Для этого используется символ \n. Пример:

 

Groupid = Alfa

Dist = 1000

Hint format[“Hey %1 were are you? \n %2 meters from you!”, groupid, dist]

Тогда отформатированная строка будет выглядеть так:

“Hey Alfa were are you?

1000 meters from you !”

Ключевое слово format используют не только с hint :

TitleText [format [“Hey %1 were are you? \n %2 meters from you!”, groupid, dist ],”PLAIN”]

 

Теперь приступим к скрипту:

" Timer . sqs "

 


; получение аргумента

_timeleft = _this select 0

;метка “loop”

#loop

;уменьшение значения переменной _timeleft на единицу

_timeleft = _timeleft – 1

;вывод подсказки

hint format["Time left %1 seconds",_timeleft]

; пауза в 1 секунду

~1

;проверка условия и при правильности условия переход на метку “loop”

? (_timeleft > 0) : goto "loop"

;присвоение переменной timeendfromscript значения True

timeendfromscript = True

;выход

exit

 

;Запуск скрипта: [количество_секунд] exec "timer.sqs"


Ну что же – поехали! Первая строчка Вам уже знакома – это получение аргументов. В качестве аргумента должно быть число – время, которое будет отсчитывать таймер(или оставшееся время). А вот вторая строчка – это уже что-то новое. “#loop” – метка. Метка необходима для быстрого перехода к определенному месту в скрипте. Она ставится в любом месте скрипта как отдельная строка. Любая метка должно начинаться с символа #. Затем (слитно или раздельно с решеткой) пишется имя метки. Для перехода на метку используется команда goto. Синтаксис команды:

Goto “ LabelName ”

Где LabelName – имя метки без решетки! После этой команды начинается выполняться следующая строка после метки, на которую указывает goto. То есть если метка идет в скрипте выше чем команда goto указывающая на эту метку, то получается как бы замкнутый круг – цикл. Вот общий пример цикла в ОФП:

 

# Label

~ 1 ( Время для паузы )

{какие то команды}

goto “ Label ”

 

Пауза обязательно должна присутствовать в цикле. Иначе компьютер, как правило, зависает. В зависимости от мощности компьютера и сложности действий в скрипте величина паузы колеблется от 0.0001 до бесконечности.

В цикле у нас выполняются всего две команды – hint и простое уменьшение значения переменной _timeleft на единицу. А вот потом в теле цикла идет такая строчка: ?(_timeleft > 0) : goto "loop".

Это условие. Вопросительный знак – символ постановки условия в ОПФ. После “?” идет само условие, именно оно и будет проверяться. Как правило, условие пишут в круглых скобках (хотя можно и без них) : это помогает при чтение, да и просто выглядит красивее. После условия идет двоеточие и после него те действие, которые будут выполняться при верности условия (условие возвращает значение True). Если условие неверно (возвращает False) то просто начинается выполнение следующей строчки скрипта. Вот общий пример условия в ОФП:

?(условие – одно или несколько): {действия, выполняемые в случае верности условия}

 

Условий может быть несколько. Для того чтобы их комбинировать используются логические операторы AND(или &&)  - И,OR(или II) - ИЛИ и NOT(или !) - ОТРИЦАНИЕ. Например:

 

?(( a >1) AND ( b >1)): c = a + b – значение True будет возвращено, если оба условия верны.

?(( a >1) OR ( b >1)): c = a + b - значение True будет возвращено, если хотя бы одно из условий будет верно.

?( NOT ( a >1) AND NOT ( b >1)): c = a + b – значение True будет возвращено, если оба условия будут не верны.

 

Если после двоеточия должно быть несколько команд или действий, то они отделяются друг от друга точкой с запятой (;). Например:

 

?(NOT(a>1) AND NOT(b>1)): c = a + b; b = b +1

 

Существует также другой способ постановки условия:

@(одно или несколько условий)

Дойдя до такого условия, выполнения скрипта приостанавливается. Но как только условие будет верным (вернет значение True) выполнение скрипта продолжится со следующей строчки после условия. Этот вид условия используется намного реже, чем первый, но иногда он заметно упрощает скрипт.

И все же вернемся к нашему скрипту. В условии у стоит “_timeleft > 0” – то есть если оставшееся время будет меньше или равно 0, то условие возвратит False и выполнится следующая после условия строчку. Эта строчка exit – выход из скрипта. Если же условие возвращает True, то выполняется действие после двоеточия. Это действие – переход(goto “Loop”) на метку “Loop”.Если бы в цикле не было условия с возможностью выхода из цикла, то он (цикл) стал бы бесконечным (а в нашем скрипте вдобавок таймер перешел бы за ноль и начал считать отрицательное время) и постоянно грузил бы процессор компьютера(и в свою очередь начались бы “тормоза” в игре ). Поэтому старайтесь не делать бесконечных циклов (хотя иногда это просто необходимо).

Вроде бы все, но как теперь “связать” этот скрипт с игрой. Например, чтобы при окончании отсчета таймера срабатывал какой-то триггер (в поле OnActivation триггера можно написать необходимые действия или просто сделать триггер, при активизации которого заканчивается игра – тип триггера END или LOSE). Многие скрипты должны иметь такую связку. В скрипте практически все переменные локальные и, следовательно, с ними нельзя работать через редактор в игре. Именно для связки скрипта с встроенным в ОФП редактором используют несколько глобальных переменных, которые в свою очередь проверяются в редакторе через триггеры. В нашем скрипте это переменная “timeendfromscript”. Я специально использую длинные и как бы говорящие о своей роли (timeendfromscript – “конец времени из скрипта”) переменные, для того чтобы не создать две переменные с одним именем. Также можно создавать обратную связь. То есть наоборот в скрипте проверяется переменная (например так ?(endtimefromgame == true):goto “SomeLabel”) которая изменяется через триггеры(вейпоинты и т.д.) в игре. Попробуйте сами изменить скрипт “Timer.sqs” так чтобы при срабатывании триггера отсчет времени прекращался.

Чтобы проверить работу скрипта “Timer.sqs” необходимо создать миссию, сохранить ее под каким-нибудь именем, создать файл “Timer.sqs” и набрать в нем код скрипта, а затем переписать этот файл в каталог с миссией. Теперь в редакторе(в этой миссии) создаем юнита и называем его “aP”. Затем в поле Initialization этого юнита нужно прописать [15] exec “Timer.sqs”. Создаем триггер, в поле Condition которого пишем timeendfromscript == true(или просто timeendfromscript). В поле OnActivation пишем “aP setdammage 1”. Этот триггер и будет отслеживать конец выполнения скрипта и при активации (как только закончится скрипт) убивать игрока. Смотрим!

 

Я писал: “…в поле Condition … пишем timeendfromscript == true(или просто timeendfromscript)”. Действительно если в поле триггера Condition написать просто имя переменной, то игра будет проверять эту переменную на значение True.

Еще я упоминал команду setdammage . Эта команда устанавливает юниту или другому объекту уровень повреждений. Синтаксис команды:

UnitName setdammage n

 

Где UnitName – имя юнита, n – уровень повреждений от 0 до 1, причем 0 – полностью здоров, а 1 – максимальный уровень повреждений. Для проверки уровня повреждений используют команду getdammage.

Getdammage UnitName

Где UnitName – имя юнита. Эта команда возвращает уровень повреждений. Например:

 

aP setdammage 0.5 – установка юниту aP уровня повреждений 0.5

Povregdenie = getdammage aP – получение значения повреждений юнита aP и сохранения значения в переменную Povregdenie .

Теперь значение переменной Povregdenie равно 0.5

 

Приступим к рассмотрению следующего скрипта! Вот собственно и он:

 

“ Salut . sqs”


;получение аргумента(солдат)

_Unit = _this select 0

;прекратить выполнение скрипта до тех пор, пока дистанция между ;игроком и юнитом _unit не станет меньше 5 метров

@(_unit distance player < 5)

;устанавливает юниту _unit режим поведения SAFE(все спокойно, оружие за спину)

_unit setbehaviour "SAFE"

;заставляет юнит _unit следить за игроком

_unit doWatch player

;пауза в 5 секунд

~5

; Заставляет юнит _unit проиграть анимацию "effectstandsalute"

_unit playmove "effectstandsalute"

; заставляет юнит _unit не за кем не следить(следить за отсутствием объекта)

_unit dowatch objnull

;выход

exit

 

Сначала рассмотрим новые для нас команды, а потом уже поймем, что же делает этот скрипт. Первые две строчки нам уже хорошо известны это получение аргумента (для правильной работы этого скрипта аргументом должен быть юнит-солдат) и установка условия. В условии у нас присутствует новая для нас команда – это distance. Нетрудно догадаться, что же делает эта команда, но все же… Синтаксис:

ObjectName 1 distance ObjectName 2

 

Эта команда возвращает значение расстояния между двумя юнитами или объектами. Следовательно, условие в скрипте поставлено, так что скрипт приостанавливает свое выполнения до тех пор, пока дистанция между юнитом _Unit и юнитом player не будет меньше 5 метров. Однако Вы наверно заметили что юнит player не получается как аргумент а значит либо в редакторе должен быть юнит с именем player либо.… Да это не простое имя юнита. Ключевое слово player заменяет имя игрока (то есть того юнита, за которого играет человек). Вы можете выполнять любые команды с ключевым словом player вместо имени юнита, и все ваши действия будут отражаться на игроке. Например:

 

Player setdammage 1

 

Такая строчка убьет игрока. А в нашем условии проверяется дистанция между игроком и юнитом _Unit. В следующей строчке мы опять встречаем новую команду – setbehaviour .

UnitName setbehaviour “{тип поведения}”

 

Эта команда устанавливает для юнита Unit определенный тип поведения. Доступные типы поведения: SAFE - все спокойно, можно идти не спеша, оружие за спину, AWARE - будь на чеку, передвигайся ползком (но не заставляет искать укрытие), COMBAT - к бою, враг наступает, передвигаться ползком или бегом, CARELESS - не обращать внимания ни на что, даже если рядом приземлиться граната, STEALTH - укрыться и передвигаться ползком.

 

Зачем нужно “успокаивать” юнита я объясню чуть позже. Следующая команда, требующая объяснения:

 


Дата добавления: 2020-11-15; просмотров: 76; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!