NIS an IE Tutorial


Contents (Содержание)

Introduction (Введение)

В этом руководстве мы добавим несколько NIS & IE скриптов к миссии над которой мы работаем. Эти скрипты помогут нам рассказать нашу историю. Мы уже определили эти функции, просто они есчё не наполнены содержимым. Цель данной части руководства научить тебя работать с ними, чтобы ты понял как они работают и как ты можешь использовать их. Перед тем как мы раскажем тебе о Скар шаблоне .nis файла, мы хоти чтобы ты понял как надо писать эти скрипты. прежде всего ты должен усвоить, что NIS/IE скрипты основаны на линейной концепции. т.е. каждое следущие действие происходит после предыдущего. Всё это управляется посредством контрольной таблицы которая называется CTRL. Хотя эти детали и неважны, просто держи в голове, что NIS/IE скриптование слегка отличается от простого скриптования миссий.

NISes and IEs


Non Interactive Sequences

Non Interactive Sequences (Непрерываемые последовательности. В простонародье говоря, видеоролики сделаные на "движке" игры. Далее мы будем называть их просто НИР (непрерываемые игровые ролики)

Ну а для начала немного предосторожностей. Учти, НИР напрямую используют внутренние команды игры и движка для рассказа истории, т.е. внутренние команды движка используюются на полную катушку, влкючае те, что ты используеш при игре. Многие из этих команд недетерминированы, поэтому создавай свою карту ты можешь столкнуться со случаями, когда игра идёт немного подругому, чем в прошлый раз. Это конечно приводит к головным болям от попыток заставить всё-таки систему сделать именно то и именно так, как хочешь ты. Вообще-то, создание НИР-лв - это как запускание своей руки внутрь игрового движка. Ты можешь хотеть видеть некоторые вещи по одному, а они будут происходить совершенно по другому. Это происходит из-за того, что в игре вовсю используется элемент случайности, который влияет на все события, статы юнитов и пр., а поэтому каждый отдельный игровой процесс будет по своему уникален и совсем не похожь на другие. Так-что, готовся принести в жертву свои амбиции и желания.


Ну а теперь можно и начать. Сами последовательности используют, как уже упоминалось, систему создания СКАР скриптов. Но, что-бы сохранить файл со СКАР скриптами чистым от вкраплений другого рода, файлы с НИС-ами создаются с .nis расширением. Как и в файле шаблона СКАР, первая вещь, которую мы объявляем, - таблица Событий:

EVENTS = {}

Которая создаёт ТАБЛИЦУ СОБЫТИЙ, в которой хранятся НИР и УС.

Обычно УС создаётся так:

EVENTS.<nameOfNis> = function ()
{
  --  содержание находится здесь.
}

Например, открытие выглядит так :


EVENTS.NIS_Opening = function()
{

-- Будет наполнено дальше в этом руководстве.
}


Прежде чем мы начнем неплохо бы выключить туман войны, что-бы увидеть хоть что-то. А потому, первое что мы сделаем - это вызовем функцию FOW_RevealAll(). Было бы также неплохо показать название миссии перед началом игры. это делается с помощью функции Util_MissionTitle(<missionName>). Также, перед этим неплохо-бы войти в "letterbox format"(киноматографический режим 16:9) и погасить экран. Это делается с помощью Скар скрипта перед началом игры.


Следующие функции ты уже видел в прошлом руководстве, где они делали экран чёрным:

EventCue_Enable(false)
Fade_Start( 0, false )
W40k_Letterbox( true, 0 )
Util_StartNIS( EVENTS.NIS_Opening )


EventCue_Enable(false) просто выключает реплики всех ИИ и озвучку связаную с событиями (событие это нападение на юниты, потеря стратегической точки и т.п.). Вторая функция мгновенно делает экран черным . Следующая команда включает "letterbox mode", ну а последняя передаёт бразды правления нам.

Когда все предидущие команды выполнены, добавляем команду FOW_Reveal для того что-бы показать нас. Заодно мы отключаем вызов FOW_ReavealAll, как и "letterbox" возле окончания функции. Теперь твой NIS_Opening скрипт будет будет похож на нижеследующее:

EVENTS.NIS_Opening = function()

FOW_RevealAll()

-- LOCATION 1 - ADDED LATER

CTRL.Event_Delay( 4 )
Util_MissionTitle("Moo")
CTRL.WAIT()

Fade_Start(1, true)

FOW_Reset()
CTRL.Event_Delay( 1 )
CTRL.WAIT()

-- LOCATION 2 - ADDED LATER

-- end 
CTRL.W40k_Letterbox( false, 2 )-- Goodbye letterbox
CTRL.WAIT()

end


"Эй! Стоп!" - скажешь ты, - "А что это за CTRL хрень?". В общем, CTRL позволяет тебе проигрывать набор событий в твоей последовательности. Каждый раз, когда ты вызовеш CTRL и CTRL.WAIT(), игра будет ожидать, пока твоя последовательность окончится, прежде чем снова взять управление над всем в свои руки. Для пробы мы сделаем такую последовательность:

print("Yo")
CTRL.Event_Delay(3)
print("This will show up right after Yo, it will not wait for 3 seconds")
CTRL.Event_Delay(2)
CTRL.WAIT() -- execution will now delay for 5 seconds (waiting for controllers)
print("Yo, 5 seconds later")

Ну а теперь что собственно наш скрипт натворит:
1. Мы убираем "туман войны".
2. "Придерживаем" игру на 4 секунды, что-бы показать название нашей миссии.
3. После 4-х секундной задержки мы начинаем "включать" экран.
4. Одновременно с этим мы возобновляем "тумай войны" в своих правах, ждём секунду и всё заканчивается. Это начало большинства НИР-ов. Теперь пришло время наполнить среднюю часть скрипта.

Теперь, когда у нас есть последовательности начала и конца НИР-а, мы настроим "полёт камеры" над полем боя, что-бы показать игроку с каким противником ему предстоит столкнуться (врагов мы уже расставили в предыдущем туториале). Мы можем просто пролететь над ними. Это может быть любой тип поведения камеры при полёте, какой пожелаеш. Но наилучше работает "полёт задом-на-перёд" (т.е. Когда камера движется "назад", открывая перед этим ландшафт, войска и прочее), плюс ты сможешь комбинировать этот режим камеры с pov-коммандами для достижения эффекта описываемого в последней миссии этого туториала.


Что-ж, давай проложим путь для нашей камеры.

Это может быть сделано в МЕ. Выбери иконку похожую на “n” и создай путь типа “Camera”. Установи на экране точки пути. Заодно прийдётся назвать некоторые из них. Для этого, выбери точку 0 и перетяни её в зону настроек (Похоже, имеется ввиду Drag&Drop методика), где сразу появится расширеный список настроек для неё (что-бы ты смог сделать такую простенькую фишку, разработчики угробили не один час что-бы настроить всё и вся для нормальной работы такой возможности. Теперь назови этот первый кадр “start”, соттветсвенно выбери последнюю точку и назови её “end”. Тебе прейдётся проделать эту процедуру со всеми путями которые ты создашь в этом руководстве, ведь им надо как-то указать рабочий путь (т.е. от точки “start” до точки “end”).

После завершения установки пути, давай пропишем его в нашеи НИР файле, в разделе под названием "LOCATION 1" :

CPath_Start( "canim_test1", "start", "end" )
CPath_CutToPoint("canim_test1", "start");

You would of course rename canim_test1 to whatever animation named you used.


Как ты уже понял, мисии для одного игрока состоят в основном из стартовых НИР-ов, внутриигровых НИР-ов и УС-ов и НИР-ов которые завершают нашу мисиию. В качетве подопытного кролика мы возмём миссию над которой работали всё время до этого (не забудь сохранить её в каком-то тихом и сухом уголке, а то мало ли что натворим ;) и привнесём в неё наши новые знания и умения. Что собственно мо сделаем? Значит так, камера стартует в точке камеры заданной по умолчанию игры где игрок начинает мисиию. Если мы делаем стартовый НИР, то наверняка мы "стартуем" в какой-то определённой точке на карте и вовремя своего полёта покажет игроку поле битвы или какие-то войска. НО! Так-как СКАР скрипты в действительности не поддерживают мгновенное перемещение камеры в определённую точку, мы исползуем маленькую хитрость для достижения требуемого эффекта. Вначале мы включаем путь для нашей камеры (перед тем как "включть" экран), после чего переносим камеру в стартовую точку нашего пути (теперь наша камера смотрит на стартовую точку нашего пути) после чего ты просто запускаешь "выполнение" своего пути для камеры.

Теперь в "LOCATION 2" мы добавим следующие команды:


CTRL.CPath_CutToPath("canim_test1", "start", "end", true)
CTRL.WAIT()
CTRL.CPath_Blendout();

Первая команда включает путь и проигрывает его от начала до конца, вторая команда ожидает окончания "работы" камеры, а третья её просто выключает.

Ну а теперь запусти свою мисиию. У тебя теперь есть красивенький летающий стартовый НИР.


Пока все смотрится неплохо, но вскорости мы есчё займёмся этим НИР-ом ;).


Вначале мы добавим немного речи, как довесок к пути полёта камеры. А путь наш будет пролегать в наблюдении за ФарСиром, пока она движется к своим войскам, заодно разговаривая при этом. Учти, что есть 2 способа слежения за какой-либо целью, оба мы расмотрим в нашем руководстве. Первый даст тебе громадье возможностей по контролю, но сложнее в установке и настройке, второй попроще в установке, но позволяет контролировать поменьше первого способа.


Что-ж, давай освоим первый способ который включает в себя два пути, один для "цели", второй - для камеры. Сначала сделаем путь для цели, например таким:



Это путь пок которума наша ФарСир движется водиночку. Теперь давай установим второй путь для камеры, которая будет следовать за ФарСир. Наилучшим способом будет установить количество точек пути для камеры одинаковым с количеством точек пути для ФарСир и двигать камеру с одинаковой скоростью с ФарСир и использовать pov команды.


Сделав это мы получим нечто похожее на это:



Где активный (жёлтый) путь камеры повторяет путь ФарСир (голубой путь). Немного поднастроив ты можешь заставить камеру показывать наилучший ракурс откуда тебе захочется. Теперь возникает вопрос, как это сделать работающим в СКАР файле? Очень просто.

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

CTRL.CPath_CutToPath("canim_followFarseer", "start", "end", true)

SPath_Start("manim_farseer", "start", "end", SGroup_FromName("sg_Farseer"))

CTRL.WAIT()
CPath_Blendout()
SPath_Finish("manim_farseer")

Всё описаное выше нам уже знакомо, кроме Spath. Spath практически идиентичен Cpath, но ты можешь иметь на карте несколько Spath которые могут быть запущены, плюс, Cpath может иметь только одну камеру "привязаную" к нему, в то время как Spath может иметь несколько привязаных объектов. Вот почему нужен последний аргумент, он указывает на индентификатор нужной "вещи"/групы, которые будут двигаться вдоль пути в данный промежуток времени. это даёт возможность снова и снова использовать один и тот-же путь для нескольких "вещей".


Имей ввиду, если игрок нажмёт княпавку ESC во время проигрывания НИР-а, то мир вернётся в то состояние, в котором он находился в данный момент. это подразумевает, что если "вещь" не закончила путь, по которому она двигалась, или не достигла целевой точки своего движения, она ("вещь") там не мгновенно не появится. Для решения этой проблемы можно сделать проверку нахождения "вещи" в нужном месте, и если её там нет - направить её туда, или можно просто убрать "вещь" из мира и заново создать её там, где она должна быть. Но это нелёгкий путь или решение проблемы с нужным местонахождением "вещей" после окончания работы НИР-а, поэтому ты всегда должен иметь это ввиду.

IE (Intel Events - "умные" события, дальше будем сокращать как УС)


УС-ы в многом похожи на НИР-ы, главное отличие - они должны быть определены в таблицах событий, но ими намного проще выделить нужный маркер, сфокусироваться на нужном юните или месте на карте и проиграть какой-либо разговор. Давай создадим УС, который покажет нам маркер mk_relicPt после того как игрок с помощью ФарСир убьёт всех врагов. Наш УС будет иметь примерно такой вид:


EVENTS.IE_CaptureRelic = function()
Util_SetIE( true )


FOW_RevealMarker( "mk_relicPt", -1 ) 
Camera_FocusOnTargetMarker("mk_relicPt", 2)
CTRL.Actor_PlaySpeech( ACT.Gabriel, 242110 )
CTRL.WAIT()

CTRL.Actor_PlaySpeech( ACT.Gabriel, 242112 )
CTRL.WAIT()


CTRL.Actor_PlaySpeech( ACT.Gabriel, 242114 )
CTRL.WAIT()

Util_SetIE( false )
CTRL.WAIT()

end

Функция Util_setIE передает управление звуком УС-у, а всё остально я думаю и так понятно. Мы показываем маркер, фокусируем камеру на него и проигрываем немного речи, после чего отдаём управление звуком другим (не УС-ким) событиям

More on Paths (Немного больше о путях.)


Просматривая документация по СКАР, ты наверное заметил, что есть ещё один тип пути - Epath. Это практически тот-же Spath, только используется для установки пути объектов. Он может быть использован для показа полёта орбитального транпорта Космопехов с последующим сбросом чего-нить на карту, или для симуляции крушения транспорта в ближайших деревьях.


Ну последние предостережение. Пути и НИР-ы весьма сложны, поэтому проффесионально освоить их с первого раза не получится, нужна практика, практика и еще раз практика, чтобы с их помощью показать то, что мы хотим покать так, как мы хотим показать.


Conclusions


На этом наше начальное руководство закончено. В дальнейших руководствах мы не будем больше создавать миссии или карты, а сконцентрируемся на дебагинге СКАР приложений и украшательстве наших карт..


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

Конец

Сайт управляется системой uCoz