Вход в систему
Информация по игре "Operation Flashpoint: Red Hammer"
Название: Operation Flashpoint: Red Hammer PC
Версия игры:
Жанр: Action
Мультиплеер: Интернет, локальная сеть
Разработчик: Bohemia Interactive
Издатель: Codemasters
Дата выхода: декабрь 2001
Сайты игры:
http://www.flashpoint1985.com
http://www.flashpoint1985.com
Объем: Один CD
Минимум: CPU 450 MHz, 128 Mb, 32 Mb Video
Рекомендуем: CPU 1 GHz, 256 Mb, 64 Mb Video
Последние статьи
Самые комментируемые статьи
Военный конструктор. Редактор Operation Flashpoint: 1985 Cold War Crisis. Часть пятая: СкриптыАвтор: Антон Логинов
Полный текст
Где взять: Встроен в игру Возможности: 40% игровых; после данной статьи: 85% игровых Сложность освоения: В зависимости от вашего желания. От очень легкого до экстремально сложного Уважаемые читатели, вышла локализованная версия Operation Flashpoint, изданная на территории России компанией "Бука". Поэтому мы — как и обещали — продолжаем публикацию цикла статей "Военный конструктор: Редактор Operation Flashpoint: 1985 Cold War Crisis". На нашем компакте в разделе "ИнфоБлок" находятся все четыре статьи цикла, опубликованные в 9, 10, 11 и 12-ом номерах "Мании" за 2001 год. В ваших руках — уникальное руководство по созданию собственных миссий и кампаний, аналогов которому на русском языке не существует. Алексей Кравчун, редактор "Игромании" Приветствую всех, кто не сошел с дистанции из-за кажущейся сложности редактирования и продолжает создавать свои собственные миссии. Да, казалось бы, столько всего уже сказано-пересказано о Flashpoint, а говорить еще есть о чем. И даже много. Начинаем рассказ о продвинутом редактировании в Operation Flashpoint, и тема у нас сегодня — скрипты. Вернее, первая часть разговора о них, ибо для начала неплохо бы добиться "въезжания" в тему, а затем уже говорить о крутых наворотах.Введение Итак, зачем нужны скрипты? Скрипты созданы, во-первых, для более гибкого управления ходом миссии, а во-вторых, для создания режиссуры (как роликов, так и непосредственно игры). Это своеобразные команды движку игры, которые выполняются друг за другом. Отчасти вы создаете скрипты, используя строку инициализации юнита в редакторе, а также с помощью триггеров и вейпойнтов, но все это маленькие скрипты. Внешние .sqs-скрипты предоставляют гораздо больше возможностей, и использовать их гораздо удобнее, несмотря на кажущуюся сложность. Все скрипты пишутся, как вы уже догадались, вне редактора. Вас, наверное, уже достали постоянные употребления этого "вне", но что поделать, если у редактора возможностей только на 40% игровых. Файл скрипта имеет расширение .sqs, должен располагаться в директории исходников миссии (X:\OperationFlashpoint\Users\имяпользователя\имякарты) и активизируется командой: имя объекта/условие/значения (можно несколько, но тогда перечислять их нужно [в квадратных скобках]) exec "имяскрипта.sqs". Например, [ig1,ig2,ig3] exec "go.sqs". Основы Для начала попробуем создать простейший скрипт, который выведет на экран сообщение "Igromania — rulezzz forever!". Зачем, если можно сделать это в редакторе? А просто так, чтобы вы получили хотя бы начальное представление. Да и потом, в сложных скриптах пригодится. Итак, открываем Notepad, создаем файл rulez.sqs и в нем пишем: ;Скрипт вывода на
TitleText ["Igromania — rulezzz forever!", "plain down"] ; Теперь строка выхода. Каждый скрипт должен оканчиваться строкой exit. exit Вот и все! Сложно было? Вот и я говорю, что нет. "Plain Down" — тип вывода текста. Подробнее смотрите в командах (предыдущие номера "Мании"), а также в эффектах в редакторе. Команду titletext не обязательно писать как "TitleText" — движку игры все равно, с каким регистром вы напишете команду. Но учтите, что тайтлтекст выводит только буквы, но не цифровые значения. Надеюсь, все понимают, что 1 или 2 тоже могут быть буквенным значением — нужно просто писать в кавычках? Теперь идите в редактор (не забудьте положить .sqs в директорию миссии) и в своей миссии создайте игрока; в строке инициализации напишите this exec "rulez.sqs" или, как вариант, [] exec "rulez.sqs". Теперь давайте сделаем немного по-другому. Напишем скрипт, который позволит нам выводить текст, но набранный уже в редакторе в качестве аргумента (в [] скобках): ; Скрипт вывода на экран набранного в редакторе сообщения для игрока. ; Строка ожидания ввода. _this select 0 означает ожидание ввода первого значения ; в [квадратных скобках]. Можно также сделать _this select 1 — такая команда будет ; принимать показания второго аргумента в скобках. То есть, например, [arg1,arg2] — ; arg1 это _this select 0, а arg2 — _this select 1. _soobshenie = _this select 0 ; Распечатка введенного в редакторе сообщения. TitleText [_soobshenie,"plain down"] exit Теперь вредакторе (например, встроке инициализации игрока) пишем ["Igromania — rulezzz forever!"] exec "soobshenie.sqs". Все. Теперь вы можете просто писать где угодно сообщение и командой exec "soobshenie.sqs" выводить его на экран. Преимущества такого подхода в том, что вы можете, однажды написав все параметры текста, просто менять сам текст, что сэкономит ваше время. Ведь с триггерами и вейпойнтами все нужно вводить каждый раз. Скрипты и объекты Разобравшись с
; Пример обращения объекта к скрипту. ; Ожидание ввода объекта (как и с текстом). _obyekt = _this select 0 ; Результат действия скрипта — применение анимации от генерала Лебедя: "упал- ; отжался". _obyekt SwitchMove "FXStandDip" exit Имя объекта вводится в [квадратных скобках]. Например, [igroman] exec "obyekt.sqs". Вообще, будьте осторожны при написании скриптов — неправильно поставленная кавычка придет к невыполнению скрипта. Теперь усложним задачу. Напишем скрипт взрыва машины в тот момент, когда в нее садится солдат. Здесь мы применим прием зацикливания (loop). ; Скрипт "завел-взорвался". ; Юнит, который пойдет заводить машину. _psih = _this select 0 ; Машина, которая заведется и взорвется. _bibibka = _this select 1 ; Начинаем цикл. #Update ; Идет проверка — юнит в машине или нет. ? (_psih in _bibibka) : goto "Big-bada-bum" ; Ждем две секунды (особо кровожадные могут сразу). ~2 goto "Update" ; Юнит в машине, и тогда... #Big-bada-bum ; ...машина взрывается. _bibibka setdammage 1 exit Теперь в редакторе в строке инициализации нужной машины пишем [this, this] exec "boom.sqs". Как только в нее кто-нибудь залезет — состоится взрыв. Естественно, вместо this можно указать специфического юнита. Продвинутые скрипты Плавно подходим к более сложным скриптам. Теперь коснемся темы переклички нескольких скриптов. Попробуем составить цепь из нескольких скриптов. Для начала создадим скрип счетчика, который, отсчитав определенное время до нуля, активизирует следующий скрипт: ; Скрипт таймера.
; Вводим ожидаемые значения: _timeleft = _this select 0 _text = _this select 1 _location = _this select 2 _script = _this select 3 ; Цикл #Update ; Wait 1 second ~1 ; Делаем отсчет в обратную сторону. _timeleft = _timeleft — 1 ; Проверяем — время на нуле или нет. Обратите
; иначе таймер остановится на единице. Если да, то переходим к "Done". ? (_timeleft == -1) : goto "Done" ; Все это время будем показывать таймер. Команда format задает формат текста. TitleText [format [_text + " %1", _timeleft], _location] goto "Update" #Done ; Как только будет 0, выполнится _скрипт. [] exec _script exit Теперь в редакторе пишем все в соответствии с порядком скрипта: [11, "Time Left:", "plain", "blow.sqs"] exec "countdown.sqs". Первый параметр (аргумент) обозначает время на счетчике. Обратите внимание на значение 11, а не 10. Если поставить 10, то отсчет начнется с 9. Второй параметр — текст. Третий — его размещение. И, наконец, четвертый — скрипт, который начнет выполняться после наступления на таймере нуля. Как видите, все довольно просто. Теперь напишем скрипт, который пройдет по всей цепи и соберет параметры, чтобы передать их другому скрипту: ; Ожидаемые значения скрипта и собирателя. _script = _this select 0 _vektor = _this select 1 ~2 TitleText ["Look!", "Plain Down"] ~2 ; Сосчитаем число элементов в цепи. _elements = count _vektor ; Теперь распечатаем число аргументов, которое мы собрали. TitleText [Format["You passed: %1 arguments.", _elements],"Plain Down"] ~3 ; Собрав аргументы, даем добро на
_vektor exec _script exit Например, сделаем вышеуказанное с нашей цепью: ["countdown.sqs",[10,"Time Left:", "plain", "blow.sqs"]] exec "chain.sqs". Скрипт сосчитает 4 аргумента. Честно говоря, довольно сложно понять, что мы с вами сейчас сделали, но попробуйте, и все разложится по полочкам. Теперь соберем оба примера цепей на основе вышеописанного счетчика: _timeleft = _this select 0 _caption = _this select 1 _location = _this select 2 _script = _this select 3 _vektor = _this select 4 #Update ; Пауза в одну секунду ~1 _timeleft = _timeleft — 1 ? _timeleft == -1 : goto "Done" titletext [format [_caption + " %1",_timeleft], _location] goto "Update" #Done ; Выполняем скрипт с аргументами. _vektor exec _script exit В редакторе пишем [10,"Time Left To Blow:", "plain", "blow.sqs",[]] exec "countdown2.sqs". Уверен, что сейчас вам ничегошеньки не понятно, так что садитесь за редактор. Работа с камерой Вот мы и подобрались к самому интересному — созданию скриптовых роликов. Грамотное составление скриптовых роликов может многократно повысить интерес к вашей миссии, тогда как их отсутствие вообще грозит потерей заинтересованности масс. Для начала создадим простейший скрипт с камерой, нацеленной на солдата: ; Прием вводных значений. Первый — объект, на который будет нацелена камера. ; Последующие значения — расположение камеры в координатной сетке относительно объекта. _Object = _this select 0 _camx = getpos _Object select 0 _camy = getpos _Object select 1 _camz = getpos _Object select 2 ; Создадим камеру и поместим ее в 5 метрах от объекта и в одном метре над землей. _cam = "camera" CamCreate [_camx,_camy+5,_camz+1] ; Направим камеру на объект. _cam CamSetTarget _Object ; Выберем эффект для камеры. _cam CameraEffect ["Internal","Back"] ; Закрепим изменения. _cam CamCommit 0 ; Сделаем затухание камеры через 10 секунд. ~10 _cam CameraEffect ["Terminate","Back"] ; В конце работы с камерой нужно ее уничтожить. Непонятно зачем — после этого ; камера все равно остается "живой". CamDestroy _cam exit Подробнее о командах камерам смотрите в предыдущих номерах, а я, в свою очередь, напомню, что вместо _cam = "camera" можно написать _cam = "Seagull" — камера предстанет в виде чайки. Также напомню команду GetPos, которая представляет собой направляющий вектор камеры. CamCommit назначает время, за которое камера сделает изменения. Например, вы сделали камеру, а затем ее
Усложним скрипт, добавив вид наблюдения из бинокля и зуминг. ; Здесь у нас будет два солдата. Один — оператор, а второй — актер. _CameraMan = _this select 0 _Actor = _this select 1 ; Снимем координаты оператора и автоматически передадим их камере. _CameraPos = getpos _CameraMan _cmx = _CameraPos select 0 _cmy = _CameraPos select 1 _cmz = _CameraPos select 2 ; Создадим камеру на месте полученных от оператора координат. _cam = "camera" CamCreate [_cmx,_cmy,_cmz+2] ; Направим камеру на юнит. _cam CamSetTarget _Actor _cam CameraEffect ["Internal","Back"] ; Закрепляем настройки. _cam CamCommit 0 @CamCommitted _cam ; Для пущего эффекта добавим вид бинокля и сделаем зум. CutRSC ["Binocular","Plain Down",100] _Zoom = 0.7 ; Блок "приближения". #ZoomIn ; Zoom in _zoom = _zoom — 0.01 ; Зададим зону обзора. _cam CamSetFov _zoom ; Закрепим изменения и через мгновение начнем процесс удаления от точки. _cam CamCommit 0 ~0.01 ? _zoom < 0.1 : goto "ZoomOutWait" goto "ZoomIn" #ZoomOutWait ; Упал-отжался. _Actor PlayMove "FXStandDip" ~8
#ZoomOut ; Zoom out _zoom = _zoom + 0.01 _cam CamSetFov _zoom _cam CamCommit 0 ~0.01 ? _zoom > 0.7 : goto "Done" goto "ZoomOut" #Done ~2 ; Теперь отдадим управление игроку обратно и уберем вид из бинокля. CutRSC ["Default","Plain Down",100] _cam CameraEffect ["Terminate","Back"] CamDestroy _cam exit В редакторе, соответственно, пишите [имя оператора, актера] exec "secondcam.sqs". Понравилось? Другого сложно было ожидать. CutRSC — отрезает ресурсы. Не совсем понятно, зачем эта команда, но она должна быть. Команды _zoom +/— 0.01 написаны для смягчения эффекта зума. Еще больше усложним задачу — добавим мимику, описанную в предыдущем номере: ; Опять делаем актера и оператора, получаем и вносим координаты. _CameraObj = _this select 0 _Actor = _this select 1 _CamPos = GetPos _CameraObj _cx = _CamPos select 0 _cy = _CamPos select 1 _cz = _CamPos select 2 ; Делаем телевизионный (линиями) вид. CutObj ["TvSet","Plain Down",100] ; Создаем камеру. _Camera = "Camera" CamCreate [_cx,_cy,_cz+1.25] _Camera CamSetTarget _Actor _Camera CameraEffect ["Internal","Back"] _Camera CamCommit 0 @CamCommitted_Camera ; Теперь сделаем так, чтобы актер заговорил и изменял свою мимику. Все считывается ; движком игры построчно. Для правдоподобности делаем задержки во времени. _Actor PlayMove "StandStraight" _Actor SetMimic "Happy" _Actor Say "RUS2" ~2 _Actor Say "RUS7" _Actor SetMimic "Angry" ~3 _Actor Say "RUS12" ~2
_Actor Say "RUS9" ~2 _Actor SetMimic "Ironic" _Actor Say "RUS14" ~5 _Actor SetMimic "Angry" _Actor Say "RUS20" ~3 ; Убираем камеру. CutRSC ["Default","Plain Down",100] _Camera CameraEffect ["Terminate","Back"] CamDestroy _Camera exit В редакторе, как и раньше, пишем [оператора, актера] exec "cam3.sqs". Только учтите, что в качестве оператора солдат уже не пойдет (будет заслонять обзор) — используйте какой-нибудь пустой объект, можно Game Logic. Кстати, обязательно посмотрите пример на компакте — несмотря на то, что я ставил say "от балды", получилось довольно прикольно. *** Вот и все на сегодня. Я постарался подготовить большую основу для вашей фантазии в нелегком деле написания скриптов. В следующем номере ждите продолжения разговора о них. Забегая вперед, скажу, что там речь пойдет о часто употребляемых, но очень сложных для самостоятельного изобретения скриптов. Например, выброска группы десанта, удар артиллерии и т.д. Все описанные сегодня в качестве примеров скрипты лежат на компакте, вместе с учебной миссией, наглядно демонстрирующей некоторые из них. Удачи, и до следующего номера!
Статей: 3 Все статьи по игре |