Przykład intro w skryptach sqs

Przykład ten ma wypełnić lukę jaka powstała w wyniku napisania przeze mnie poradnika pt. "Jak tworzyć przerywniki filmowe za pomocą skryptów zewnętrznych" - jest on nieco za trudny dla osób nie zorientowanych w temacie skryptów, a poza tym dołączone przykłady nie są omówione "krok po kroku". Starałem się unikać jakichś bardzo wymyślnych trików w związku z czym filmik nie jest wyjątkowo efektowny, ale dzięki temu skrypt jest w miarę prosty - możliwe, że kolejne tego typu przykłady, które mam zamiar zrobić i opisać, będą bardziej widowiskowe (i w związku z tym trudniejsze). Mam nadzieję, że ten przykład pomoże w tworzeniu filmików za pomocą skryptów chociaż zdaję sobie sprawę, że bardziej przydatny byłby poradnik o tworzeniu skryptów jako takich. Opinie na jego temat i wszelkie sugestie związane z uzupełnieniem bądź poprawieniem jego treści są mile widziane.

Ten poradnik jest nieoficjalny (tzn. nie został wydany ani przez BIS ani przez Codemasters). Ponadto jego autor nie gwarantuje, że ustrzegł się błędów, a w związku z tym używasz informacji w nim zawartych na własne ryzyko.

Na początku muszę zaznaczyć, że nie miałem wszystkiego zaplanowanego zanim zacząłem tworzyć to intro. Fabuła i sposób jej zaprezentowania powstawały w trakcie jego tworzenia. Niejednokrotnie okazywało się, że muszę coś poprawić albo że któreś ujęcie trzeba wyciąć. Zatem nie ulegajcie złudzeniu, że wszystko dobyło się bezboleśnie - po prostu opisuję efekt końcowy.

Przy tworzeniu przerywników filmowych niewątpliwie pierwszą kwestią do ustalenia jest to co mają przedstawiać, czyli trzeba mieć jakiś pomysł na nie. Zwykle nie jest to specjalnie trudne jeśli przerywniki są fragmentami misji, ale jeśli stanowią intro do misji lub są swego rodzaju samodzielną misją sprawa się komplikuje. Ostrzegam jednak przed wymyślaniem ujęć w zupełnym "oderwaniu" od możliwości edytora - ich realizacja może pochłonąć zbyt wiele czasu i dać mizerne efekty (nie ma co się porywać z motyką na słońce). Oczywiście nie jest konieczne dokładne ustalenie przebiegu przerywnika (co więcej jest to wręcz niemożliwe), a z mojego doświadczenia wynika, że najwięcej pomysłów przychodzi już w trakcie tworzenia.

W tym przypadku przerywnik jest całkowicie samodzielną misją, co daje mi pełną swobodę w kwestii fabuły. Filmik przedstawiał będzie zasadzkę partyzantów na sowiecki oddział przemieszczający się z jednej miejscowości do drugiej. Zasadzka będzie miała miejsce na skraju lasu, czyli będę potrzebował jakiejś drogi biegnącej koło lasu. Po krótkim namyśle zdecydowałem, że konwój wyruszy z bazy wojskowej koło miejscowości Levie (tej w której James wysadzał czołgi), a zasadzka będzie miała miejsce na drodze do miejscowości Laruns. Filmik będzie składał się z następujących "części":
1. Załadunek oddziału i wyjazd konwoju z bazy.
2. Droga konwoju z bazy do skrzyżowania (mniej więcej połowa drogi do zasadzki).
3. Zajęcie pozycji przez oddział partyzancki (nastąpi przeskok do miejsca zasadzki) i przebieg samej zasadzki.

Pierwsza część składa się z trzech ujęć. Najpierw ogólne ujęcie pokazujące oddział i pojazdy (plus parę drobiazgów w tle, które wstawimy na końcu). Ponieważ załadunek nieco się przedłuży dodam ujęciu trochę dynamiki przemieszczając kamerę stopniowo na inną pozycję. Dzięki czemu oglądający zobaczy więcej detali bazy. Gdy wszyscy żołnierze zajmą miejsca w pojazdach dam chwilę konwojowi na ruszenie i zmienimy położenie kamery tak by filmowała bramę obozu spoza niego (czyli wyjazd oddziału).

By uzyskać ten efekt potrzebuję grupy pojazdów (zdecydowałem, że będzie to UAZ - Ecar1 i Ural - ETruck1) oraz grupy żołnierzy (SovietOne - wpisane w nazwie dowódcy grupy), która wsiądzie do Ural'a. Pojazdy muszą mieć szyk kolumny i punkt zerowy trasy, w miejscu gdzie są na początku, z wpisanym warunkiem Count Crew ETruck1 == (Count Units Group SovietOne) + 1. Dzięki temu warunkowi konwój ruszy dopiero, gdy wszyscy żołnierze zajmą miejsca w Ural'u (+1 oznacza kierowcę, który nie należy do grupy SovietOne). W zerowym punkcie trasy konwoju ustawiam szyk kolumny, a Ural'owi ustawiam "nic" w polu Specjalny, tak by pozostał nieruchomy, gdy film się rozpocznie (jeżeli pozostawimy "w szyku" to na samym początku będzie starał się zająć odpowiednią pozycję). Drugi punkt trasy konwoju (którego dowódcą de facto jest Ecar1) ustawiam w miejscowości Laruns - dzięki czemu po załadunku konwój ruszy do miejsca przeznaczenia korzystając z dróg, jako że tworzą go pojazdy kołowe (to że nigdy tam nie dotrze to inna sprawa). Grupie SovietOne daję punkt trasy typu WSIADAJ na Ural'u, a drugi punkt (czyli tak naprawdę punkt nr1) typu SZUKAJ I ZNISZCZ w miejscu zasadzki (wysiadanie rozwiążę w inny sposób). W zerowym punkcie grupy SovietOne ustawiam zachowanie "Bezpiecznie", a w pierwszym zachowanie "Bojowo" i postawa "Strzelać, można atakować" (dzięki czemu żołnierze będą wyglądać na zrelaksowanych wsiadając, ale w chwili przymusowego postoju będą już gotowi do walki). Poza tym ustawiam każdemu żołnierzowi grupy w polu Specjalny wartość "nic" (nie będą trzymać szyku dopóki się nie ruszą) i rozmieszczam ich tak, by stanowili zwartą grupę i bez problemu mieścili się w kadrze.

Czas zająć się kamerą. By kontrolować jej ruch wstawiam trzy wyzwalacze (choć tak naprawdę nie będą one służyć jako wyzwalacze lecz jako "punkty odniesienia"). Wyzwalacze będą miały nazwy f0, f0a, f1 (to samo wpisuję w polu Nazwa i w polu Tekst - choć wystarczy tylko w tym pierwszym), poza tym nie trzeba wpisywać lub zmieniać czegokolwiek (można ewentualnie ustawić odpowiednie rozmiary). Wyzwalacze te, są po to by można było łatwo umieszczać kamerę w odpowiednich miejscach na mapie (mogą również wyznaczać punkt, który kamera ma obserwować). W skrypcie będzie polecenie nakazujące kamerze zająć pozycję, w której znajduje się wyzwalacz o danej nazwie. W związku z tym jeżeli postanowimy zmienić położenie kamery w danym ujęciu, wystarczy przesunąć wyzwalacz (zamiast zmieniać współrzędne w skrypcie), co jest bardzo wygodnym rozwiązaniem. Położenie wyzwalaczy pokazane jest na zdjęciu.

Czas zacząć tworzyć skrypt. Jeżeli wiesz jak utworzyć skrypt to możesz pominąć następny akapit i zająć się od razu jego treścią.

Skrypt jest po prostu plikiem tekstowym i możemy go napisać np. w notatniku (tzn. Notepad'dzie). W tym celu uruchamiamy notatnik, a następnie wybieramy Plik -> Zapisz. W polu Nazwa pliku wpisujemy np. Intro.sqs, po czym w polu Zapisz jako typ ustawiamy Wszystkie pliki(*.*) i zapisujemy w folderze z misją. Jeżeli nigdy nie oglądaliście skryptu w notatniku to będzie on miał domyślną ikonę windows - wystarczy na niego dwukrotnie kliknąć i w oknie Otwórz z wybrać notatnik jako aplikację (uprzednio zaznaczywszy opcję Do otwierania tego pliku zawsze używaj tego programu), którą użyjemy do otwarcia skryptu. Na razie nie robi on nic, bo nic nie zawiera, ale możemy zacząć wypełniać go treścią.

Fragment odpowiedzialny za pierwszą część przerywnika będzie wyglądał następująco:

;Intro.sqs

TitleCut["Baza Armii Czerwonej niedaleko miasteczka Levie ","BLACK IN",5]
_cam = "CAMERA" CamCreate [0,0,0]
_cam CameraEffect ["INTERNAL","BACK"]

_cam CamSetTarget ETruck1
_ox = GetPos f0 Select 0
_oy = GetPos f0 Select 1
_cam CamSetPos [_ox,_oy,5]
_cam CamCommit 0
~5

_ox = GetPos f0a Select 0
_oy = GetPos f0a Select 1
_cam CamSetPos [_ox,_oy,2]
_cam CamCommit 10

@(Count Crew ETruck1 == (Count Units Group SovietOne) + 1)
@(ETruck1 Distance f1<40)

_ox = GetPos f1 Select 0
_oy = GetPos f1 Select 1
_cam CamSetPos [_ox,_oy,2]
_cam CamCommit 0

@(ETruck1 Distance f1>40)

8 FadeMusic 0
~5
TitleCut ["", "BLACK OUT",3]
~3
_cam CameraEffect ["TERMINATE","BACK"]
CamDestroy _cam
koniec=true
Exit

Linijki wyróżnione kursywą są odpowiedzialne za zakończenie przerywnika, więc w każdej fazie tworzenia skryptu będziemy mogli obejrzeć efekty naszej pracy, po czym skrypt elegancko zakończy działanie. Następne fragmenty skryptu będziemy umieszczali przed tymi linijkami.

Przejdźmy więc do objaśniania co powodują te wszystkie komendy. Linijka ;Intro.sqs jest po prostu komentarzem ignorowanym podczas wykonywania skryptu. TitleCut["Baza Armii Czerwonej niedaleko miasteczka Levie","BLACK IN",5] spowoduje, że ekran stopniowo (w czasie 5 sekund) przejdzie z czerni do "normalnego" obrazu z jednoczesnym wyświetleniem napisu "Baza Armii Czerwonej niedaleko miasteczka Levie". _cam = "CAMERA" CamCreate [0,0,0] stworzy w punkcie o współrzędnych 0,0,0 (nie ma znaczenie gdzie to jest, bo zaraz zmieni położenie) kamerę o nazwie _cam (tak naprawdę to jest to zmienna lokalna _cam, z którą kamera jest skojarzona, ale nie komplikujmy). Jak łatwo się domyśleć kamerę można tworzyć więcej niż jedną, ale nie ma takiej potrzeby. _cam CameraEffect ["INTERNAL","BACK"] powoduje uruchomienie kamery. Te trzy linijki to stały element każdego skryptu filmowego.

Kolejne sześć linijek odpowiada za pierwsze ujęcie. Polecenie _cam CamSetTarget ETruck1 nakazuje kamerze obserwować obiekt o nazwie ETruck1 czyli Ural'a. Następne trzy linijki będą powtarzać się dość często. _ox = GetPos f0 Select 0 i _oy = GetPos f0 Select 1 przypisują zmiennym _ox i _oy odpowiednie współrzędne położenia wyzwalacza f0. Z kolei polecenie _cam CamSetPos [_ox,_oy,5] umieszcza kamerę w punkcie w którym znajduje się wyzwalacz tyle, że na wysokości 5 metrów. Następnie dosyć istotna komenda _cam CamCommit 0, które spowoduje, że wszystkie polecenia wydane kamerze zostaną wykonane natychmiast (czyli w czasie 0 sekund). Kolejnym krokiem jest danie pięciosekundowego opóźnienia w wykonaniu skryptu dzięki czemu ekran będzie miał czas się całkowicie rozjaśnić.

Gdy ekran będzie się stopniowo rozjaśniał żołnierze grupy SovietOne ruszą do Ural'a. Oczywiście nie wsiądą w pięć sekund, a zatem czas ruszyć kamerę. Uzyskamy to dzięki następnym czterem linijkom. Wyglądają podobnie do poprzednio napisanych. Różnica polega na przypisaniu zmiennym (tym samym - czyli właściwie nadpisaniu) współrzędnych wyzwalacza f0a, oraz innej wysokości na jakiej znajdzie się kamera. Poza tym, w tym przypadku kamera nie zmieni położenia natychmiast, ale w czasie 10 sekund (tzn. będzie przemieszczać się z poprzednich współrzędnych, na nowe, stopniowo obniżając wysokość o 3 metry). Ponieważ wciąż ma być skierowana na Ural'a, nie trzeba po raz drugi wyznaczać jej celu poleceniem CamSetTarget.

Kolejne dwie linijki są warunkami jakie muszą być spełnione, aby skrypt był dalej wykonywany tzn. jego wykonywanie zostanie wstrzymane do czasu ich spełnienia. @(Count Crew ETruck1 == (Count Units Group SovietOne) + 1) jest tym samym warunkiem jaki wpisaliśmy w zerowym punkcie trasy konwoju i działa dokładnie tak samo, czyli wstrzymuje wykonanie skryptu na tej linijce, dopóki wszyscy żołnierze nie wsiądą do Ural'a. W rzeczywistości potrzebują oni więcej niż 15 sekund na wykonanie tego zadania, a zatem po zmianie pozycji, kamera przez kilka sekund pozostanie w bezruchu. Drugi warunek czyli @(ETruck1 Distance f1<40) wstrzymuje wykonanie z skryptu do momentu, gdy Ural znajdzie się w odległości 40 metrów od wyzwalacza f1 (dla ułatwienia ustawiłem taki rozmiar tego wyzwalacza, że widać na screen'ie gdzie musi znaleźć się Ural) - w praktyce oznacza to, że Ural musi ruszyć z miejsca i przejechać kilkanaście metrów (czyli nim nastąpią dalsze zmiany w położeniu kamery, przez kilka sekund będziemy obserwować z tyłu odjeżdżającego Ural'a). Właściwie wystarczyłby tylko drugi z tych warunków, lecz obecność obydwu ułatwia późniejszą ewentualną modyfikację skryptu. Na przykład przesunięcie wyzwalacza f1 bliżej Ural'a (tj. bliżej niż 40 metrów) nie spowoduje błędu w jego funkcjonowaniu.

Działanie kolejnych czterech linijek nie trzeba chyba tłumaczyć. Kamera zajmie (w mgnieniu oka) zadaną pozycję przy bramie (tj. tam gdzie jest wyzwalacz f1). Ponadto kamera będzie cały czas "podążać wzrokiem" za Ural'em, który wyjeżdżając z bazy minie wyzwalacz f1, tak że na końcu tego ujęcia kamera będzie zwrócona w inną stronę niż była na jego początku. Działanie skryptu zostanie wstrzymane do chwili gdy Ural oddali się od wyzwalacza f1 na odległość 40 metrów (oddalając się od bazy).

By móc zobaczyć efekt dotychczasowej pracy należy dodać w edytorze parę elementów. Jakie to elementy wyjaśnię przy okazji omawiania fragmentu kończącego przerywnik (czyli tego na niebiesko). Linijka 8 FadeMusic 0 spowoduje wyciszenie muzyki w czasie 8 sekund (muzykę zaraz dodamy za pomocą wyzwalacza). Z kolei TitleCut ["", "BLACK OUT",3] spowoduje przejście do czerni w czasie 3 sekund (czyli gdy ekran będzie już czarny muzyki nie będzie już słychać, bo w sumie opóźnienia wynoszą 8 sekund). Dlaczego umieszczone jest to 5 sekundowe opóźnienie wyjaśni się na koniec. Komenda _cam CameraEffect ["TERMINATE","BACK"] kończy pracę kamery, a CamDestroy _cam powoduje jej usunięcie (tak, że nie zajmuje już pamięci). Rola przypisania koniec=true jest taka, że zmienna globalna koniec aktywuje wyzwalacz kończący intro (czyli w cutScence nie było by to konieczne). I wreszcie Exit kończy wykonywanie skryptu.
Muszę więc dodać dwa wyzwalacze - jeden z warunkiem aktywacji np. 0==0 i z jakąś ścieżką dźwiękową (ja wybrałem ścieżkę nr11 - "Hunt") i drugi z warunkiem aktywacji koniec typu "koniec cz.1". Ponadto muszę wpisać w Inicjacji dowolnej jednostce (np. tej, którą my jesteśmy) komendę [] Exec "Intro.sqs", która uruchomi skrypt.

Po umieszczeniu (w wstępie, a nie w misji) wszystkich dotychczas wymienionych elementów (tj. pojazdów wyzwalaczy i grup) oraz umieszczeniu skryptu (o nazwie Intro.sqs) w folderze z misją, mogę obejrzeć efekt swojej pracy za pomocą podglądu i sprawdzić czy wszystko działa tak jak sobie zaplanowałem.

Druga część naszego filmiku to droga konwoju do skrzyżowania w Levie (a właściwie do rogatek miasta). Żeby nie było nudno po drodze konwój minie BMP-1 zmierzający do bazy. Jest to trochę ryzykowny krok, bo z mijaniem się pojazdów w OFP bywa różnie - czasami, zamiast po prostu się minąć, zaczynają jakieś dziwne "ewolucje". Najlepiej tak zgrać ten manewr w czasie, żeby mijanie nastąpiło na prostym i płaskim odcinku drogi z dala od skrzyżowań. Jeżeli są problemy to pomóc może przesuniecie w czasie momentu mijania o kilka sekund (poprzez zmianę położenia pojazdów) - po prostu może to być kwestia konkretnego miejsca na drodze. BMP-1 otrzymuje punkt trasy typu RUSZAJ umieszczony w bazie i z szybkością "Ograniczona" oraz zachowaniem "Bezpiecznie" rusza tam w momencie rozpoczęcia misji. Kamera będzie podążała "lecąc" za konwojem mniej więcej z jego prędkością. W tym celu muszę umieścić na mapie trzy kolejne wyzwalacze (f1a, f1b, f2) służące do przemieszczania kamery. Rozmieszczenie przedstawiam na rysunku.

Fragment skryptu odpowiadający za tą część filmiku jest następujący (wstawiam go przed fragmentem wyróżnionym kursywą):

_ox = GetPos f1a Select 0
_oy = GetPos f1a Select 1
_cam CamSetPos [_ox,_oy,6]
_cam CamCommit 7
@CamCommitted _cam

_ox = GetPos f1b Select 0
_oy = GetPos f1b Select 1
_cam CamSetPos [_ox,_oy,6]
_cam CamCommit 8
@CamCommitted _cam

_ox = GetPos f2 Select 0
_oy = GetPos f2 Select 1
_cam CamSetPos [_ox,_oy,3]
_cam CamCommit 5

@(ETruck1 Distance f2<35)
@(ETruck1 Distance f2>35)

Wygląda znajomo? Jak widać mamy trzy zmiany położenia kamery. Wędruje ona kolejno od jednego wyzwalacza do następnego w zadanym czasie (który dobrałem metodą prób) zmieniając również wysokość na jakiej się znajduje. Warto zauważyć, że na pokonanie odcinka pomiędzy f1a, a f1b kamera ma aż 8 sekund (mimo, że nie jest on najdłuższy) - wynika to z tego, że na tym odcinku nastąpi mijanie, co spowolni ruch konwoju, za czym musi iść też spowolnienie ruchu kamery. Tak naprawdę ustawiamy prędkość z jaką kamera się porusza, podając punkt początkowy i końcowy oraz czas w jakim ma ona przewędrować z jednego do drugiego. Na koniec znajome zatrzymania warunkowe związane z odległością Ural'a od wyzwalacza. Trochę dziwić może, że są obok siebie, ale zastanówcie się przez chwilę, co było by gdyby był tylko jeden? Jeżeli byłby tylko pierwszy to koniec nastąpiłby przed dotarciem do wyzwalacza (w odległości 35 metrów od niego), po czym jeszcze przez 8 sekund (tak naprawdę to niecałe) obserwowalibyśmy Ural'a - niby może być, ale po dodaniu kolejnego fragmentu skryptu nie będziemy mieli tych 8 sekund, a ja chcę zobaczyć Ural'a wjeżdżającego do Levie. Gdyby był tylko drugi warunek było by jeszcze gorzej, bo koniec nastąpiłby 8 sekund po dotarciu kamery do wyzwalacza f1b (czyli ekran zacząłby się ściemnieć w chwili dotarcia kamery do f2). Obiekt w który wycelowana jest kamera to wciąż Ural (czyli Etruck1).

Wszystko (BMP, wyzwalacze) zostało dodane do misji i skrypt został uzupełniony o kolejny fragment, więc mogę obejrzeć po raz kolejny filmik - tym razem dłuższy o ponad 20 sekund.

Czas na część trzecią filmiku, czyli na przygotowanie zasadzki przez partyzantów. Właściwie bardziej przypomina to przypadkowe spotkanie niż zasadzkę, ale nie znam sposobu na zorganizowanie jej w OFP tak by wyglądała przekonywująco (zawsze mi łażą gdzie nie trzeba zamiast siedzieć w ukryciu).

Zostawiliśmy ostatnio kamerę w okolicach Levie. Wykona ona teraz skok do lasu w okolicach Laruns (natychmiastowa zmiana położenia), który zamaskuję ściemnieniem , a następnie rozjaśnieniem ekranu (wszystko potrwa 2 sekundy). W tym momencie rozpocznie się ścieżka nr6 - "Dark Side" (jedna z moich ulubionych). Kamera będzie podążać "wzrokiem" za dowódcą partyzantów gdy ich oddział będzie zmierzał na skraj lasu. Gdy dowódca opuści obszar wyzwalacza (f3) kamera zmieni położenie (f4) i pokaże skraj lasu "z zewnątrz", a po chwili obróci się w kierunku nadjeżdżającego konwoju (wyceluje w UAZ'a). Gdy konwój wejdzie w obręb wyzwalacza (zasadzka) na drodze wybuchnie granat, a partyzanci otworzą ogień. Gdy tylko ciężarówka się zatrzyma i żołnierze zaczną z niej wyskakiwać, kamera przemieści się na pozycję obok niej i wyceluje w dowódcę partyzantów. Po piętnastu sekundach walki kamera przeskoczy do nowego miejsca (f5) i ponownie wyceluje w Ural'a. Pozostanie tak skierowana do momentu zakończenia walki i w zależności od jej wyniku da albo zbliżenie ciężarówki (i poległych sowietów), albo zbliżenie martwego dowódcy partyzantów (i ewentualnie jego martwych towarzyszy leżących niedaleko). To ostatnie ujęcie potrwa 5 sekund (stąd to opóźnienie na końcu) po czym ekran przejdzie do czerni i film się skończy (w tym czasie muzyka będzie stopniowo wyciszana). Tak jest w teorii - praktyka wykaże, że filmik może się skończyć wcześniej, bo np. jakiś celnie rzucony granat zabije wszystkich sowietów na samym początku zasadzki.

Zaczynam od rozmieszczenia oddziału partyzantów w lesie (siedmiu ludzi). Ich dowódca ma nazwę ResOne (więc taka jest też nazwa grupy) i w polu Inicjacja ma wpisane this RemoveWeapon "Binocular" (korzystając z lornetki wywoływał opóźnienia w ruchu oddziału, więc mu ją zabrałem). Zerowy punkt trasy wstawiam na dowódcy grupy i ustawiamy szyk na "kolumna nieregularna" (choć może być inny). W polu warunek tego punktu trasy wpisuję ResRuch (to nazwa zmiennej, która musi mieć wartość true aby ResOne ruszył z miejsca). Pierwszy punkt trasy ResOne umieszczam na skraju lasu. Jest to punkt trasy typu UTRZYMAJ, pole "postawa" ma wartość "Wstrzymaj ogień", w polu przy aktywacji wpisuję ResOne SetBehaviour "COMBAT".
Teraz czas na umieszczenie wyzwalaczy kontrolujących ruch kamery (f3, f4, f5) i sterujących przebiegiem akcji. Rozmieszczenie takie jak na rysunku, a opis poniżej (jeżeli o czymś nie ma mowy to zostaje domyślne):
Wyzwalacz f3: połączony "linią grupy" z ResOne (wciskajcie SHIFT), oś a = 20, oś b=40, Aktywacja "Pojazd" i "Nieobecny", w polu przy aktywacji ma wpisane f4start = true.
Wyzwalacze f4 i f5: nic specjalnego - tak jak poprzednie, czyli tylko pola nazwa i tekst.
Wyzwalacz zasadzka: (bez nazwy - tylko tekst), oś a = 100, oś b = 50 (Prostokąt), Aktywacja "Wschód" i "Obecny", w polu przy aktywacji ma wpisane Group ResOne SetCombatMode "YELLOW"; ambush=true. Zmienna ambush sygnalizuje, że konwój wpadł w zasadzkę (będzie potrzebna do zdetonowania granatu i do zrobienia ostatniego ujęcia).
Wyzwalacz wysiadać: (bez nazwy - tylko tekst), w polu warunek ma wpisane (GetDammage Ecar1>0) OR (GetDammage ETruck1>0) OR (NOT Alive Driver Ecar1) OR (NOT Alive Driver ETruck1) (czyli wyzwalacz aktywuje się jeśli któryś z pojazdów zostanie trafiony lub któryś z kierowców zginie), a w polu "Przy aktywacji" ma wpisane "UnAssignVehicle _x" Foreach Units Group SovietOne - co spowoduje, że grupa SovietOne opuści Ural'a i ruszy do punkty trasy nr1 (czyli zaatakuje partyzantów).
Wyzwalacz granat: (nazwa i tekst), w polu "Warunek" ma wpisane ambush, a w polu "Przy aktywacji" ma wpisane xyz = "GRENADE" CamCreate GetPos granat - to taka mała niespodzianka w postaci wybuchu granatu na drodze, który uszkodzi UAZ'a i da mi gwarancję, że konwój zatrzyma się mniej więcej tam gdzie chcę (jest to granat "znikąd", ale o tym wie tylko twórca filmiku).
Wyzwalacz noRes: (bez nazwy - tylko tekst), oś a = 150, oś b = 150, Aktywacja "Partyzanci" i "Nieobecny" oraz "Cyklicznie", w polu "Przy aktywacji" ma wpisane victory = true; failure = true.
Wyzwalacz noEast: (bez nazwy - tylko tekst), oś a = 150, oś b = 150, Aktywacja "Wschód" i "Nieobecny" oraz "Cyklicznie", w polu "Warunek" ma wpisane this AND ambush (gdyby było tylko this to wyzwalacz aktywowałby się na samym początku filmiku), a w polu "Przy aktywacji" wpisujemy victory = true.

Dwa ostatnie wyzwalacze są związane z zakończeniem filmiku. Tak naprawdę nie wiem jak się on skończy choć zwykle wygrywają partyzanci. To jeden z przyjemniejszych aspektów robienia filmików - za każdym razem gdy się je ogląda nie są dokładnie takie same. Jest to też główna trudność związana z ich tworzeniem, gdyż musimy zmusić "aktorów", by fabuła filmiku była taka jak sobie zaplanowaliśmy np. gdyby to było intro do misji, w której zadaniem jest znalezienie i likwidacja grupy partyzantów, to dobrze by było, żeby nie została zlikwidowana już w intro (czyli trzeba je zrobić tak by partyzanci zawsze wygrywali). Pozostawienie małego elementu losowego jest jednak bardzo "miłym dla oka" zabiegiem (zwłaszcza jeśli trzeba oglądać ten filmik n-razy podczas testowania). Zresztą losowość może polegać na pokazywaniu za każdym razem tych samych zdarzeń za pomocą ujęć za każdym razem innych (ale to już jest "wyższa szkoła jazdy"). Jak już wspominałem wyzwalacze te mogą spowodować, że filmik potrwa krócej, gdyż dzięki nim trwa on dopóki obie strony są obecne (ale i tak ujęcia z zasadzką zawsze potrwają przynajmniej 15 sekund).

Kwestia elementów na mapie już za nami (w przykładzie widać, że dodałem parę drobiazgów by nadać bazie wygląd "zamieszkanej", ale to nie jest istotne i każdy może to zrobić samemu - czas na ostatni fragment skryptu).

ResRuch = true

TitleCut ["", "BLACK OUT",1]
~1
_cam CamSetTarget ResOne
_ox = GetPos f3 Select 0
_oy = GetPos f3 Select 1
_cam CamSetPos [_ox,_oy,3]
_cam CamCommit 0
TitleCut ["", "BLACK IN",1]

@f4start

_ox = GetPos f4 Select 0
_oy = GetPos f4 Select 1
_cam CamSetPos [_ox,_oy,10]
_cam CamSetFOV 0.4
_cam CamCommit 0
~5
_cam CamSetTarget Ecar1
_cam CamCommit 5

@(Speed ETruck1==0)

_cam CamSetTarget ResOne
_ox = GetPos ETruck1 Select 0
_oy = GetPos Etruck1 Select 1
_cam CamSetPos [_ox-20,_oy-20,10]
_cam CamSetFOV 0.7
_cam CamCommit 5
~15

_cam CamSetTarget ETruck1
_ox = GetPos f5 Select 0
_oy = GetPos f5 Select 1
_cam CamSetPos [_ox,_oy,5]
_cam CamCommit 0

@victory

_ox = 0
_oy = 15
_oz = 3
?(failure):_cam CamSetTarget ResOne
?(failure):_ox = -30
?(failure):_oy = 0
?(failure):_oz = 20

_cam CamSetRelPos[_ox,_oy,_oz]
_cam CamCommit 0

Jest to trochę nowych rzeczy. Na początek przypisanie ResRuch = true - jak już wspominałem nadanie zmiennej ResRuch wartości true spowoduje, że oddział ResOne ruszy z miejsca (czyli od początku filmu, do tego miejsca, będzie "grzecznie" czekał, aż będzie mógł odegrać swoją rolę). Komenda TitleCut ["", "BLACK OUT",1] jest już znana - spowoduje przejście ekranu do czerni w czasie 1 sekundy (opóźnienie jest podane zaraz potem). Gdy ekran jest już czarny kamera przeskakuje do lasu (f3) i bierze na cel ResOne (wszystkie polecenia już znamy). Gdy to wykona ekran wraca z czerni w czasie jednej sekundy (ponieważ zmiana położenia kamery następuje "w mgnieniu oka", widzimy tylko, że obraz znikł i pojawił się już w innym miejscu). Jak zapewne pamiętacie zmienna f4start znajdowała się w wyzwalaczu f3 w polu "Przy aktywacji" (przyjmowała wartość true, gdy jednostki ResOne nie było w obszarze wyzwalacza). W związku z tym skrypt zatrzyma się dopóki wyzwalacz f3 pozostaje "nieaktywny" (jako jedyny z "punktów odniesienia" dla kamery pełni także rolę wyzwalacza). Oznacza to, że kamera będzie w ustalonym wcześniej punkcie i będzie podążała wzrokiem za ResOne, dopóki będzie w obrębie wyzwalacza (a na początku misji jest). Gdy wyzwalacz się uaktywni (czyli zmienna f4start przyjmie wartość true) kamera przeskoczy do nowego punktu (f4) i...dalej będzie obserwować co robi ResOne. Wszystkie komendy są znane z wyjątkiem _cam CamSetFOV 0.4, która powoduje "zbliżenie" (zoom). Podanie wartości mniejszej od 1 powoduje "zbliżenie", a większej od 1 "oddalenie" (unzoom), przy czym zmiany zachodzą w czasie określonym komendą CamCommit (a zatem zmiany nie nastąpią jeżeli nie potwierdzimy ich tym poleceniem).

Jak widać po pięciu sekundach kamera traci zainteresowanie jednostką ResOne i obraca się (stopniowo, w czasie 5 sekund) w kierunku nadjeżdżającego od strony Levie UAZ'a (Ecar1). Choć miedzy komendą _cam CamCommit 5, a zatrzymaniem warunkowym @(Speed ETruck1==0) nie ma nic to w rzeczywistości upłynie kilkanaście sekund (dosyć sporo - w skrypcie ilość tekstu wcale nie odpowiada temu jak wiele się dzieje na ekranie). Wspomniane zatrzymanie warunkowe powoduje wstrzymanie wykonywania skryptu (a więc wprowadzania jakichkolwiek zmian względem kamery) do momentu w którym Ural się nie zatrzyma (czyli jego prędkość będzie wynosiła 0). Gdy to się stanie kamera przemieści się (w czasie 5 sekund) w okolice Ural'a - tym razem punktem odniesienia dla kamery nie jest wyzwalacz, ale Etruck1 czyli Ural (po prostu musi to być obiekt, a wyzwalacze są używane tylko dlatego, że są niewidoczne). Warto zwrócić uwagę na fakt, że kamera nie przemieszcza się "dokładnie tam" gdzie jest Ural tylko względem niego (dokładnie 20 metrów na południe i 20 metrów na zachód - chodzi o to, żeby widać było Ural'a i wysiadających z niego żołnierzy). Jednocześnie następuje "oddalenie" (unzoom) i kamera zaczyna obserwować jednostkę ResOne (chodzi o to, by była skierowana mniej więcej tam gdzie są partyzanci). Po piętnastu sekundach (podczas których trwa walka) kamera ponownie "kieruje wzrok" na Ural'a - tym razem przeskakując do pozycji wyznaczonej przez wyzwalacz f5 (to ujęcie od strony partyzantów). Pozostaje ustawiona w taki sposób do chwili gdy wyzwalacz noRes albo noEast się aktywuje i przypisze zmiennej victory wartość true (czyli któraś ze stron przegra tj. zostanie wyeliminowana lub ucieknie).

Teraz czas na mały trik. W zależności od tego, który wyzwalacz się aktywował - noRes czy noEast zmienna failure ma wartość true (gdy wygrał "Wschód") lub jej nie ma (gdy wygrał "Ruch oporu" - pamiętacie co było wpisane w wyzwalaczu noRes?) Po zatrzymaniu warunkowym zmienne _ox, _oy, _oz przyjmują odpowiednio wartości 0, 15 i 3. Kamera jest skierowana w stronę Ural'a. Jeżeli wygrał Ruch oporu (nastąpiła aktywacja wyzwalacza noEast to kolejne cztery linijki są ignorowane (te rozpoczynające się pytajnikiem). Jeżeli wygrał Wschód to skrypt wykonuje polecenia znajdujące się po dwukropku (w tych czterech linijkach) czyli nadpisuje zmienne (zastępuje 0, 15, 3 wartościami -30, 0, 20) i zmienia obiekt, w który kamera ma być skierowana (na ResOne). To wszystko po to, żeby następne ujęcie było różne w zależności od tego kto wygra. Gdybym założył, że wygrają partyzanci (i pokazywał na koniec Ural'a oraz ciała poległych czerwonoarmistów wokół niego) uzyskałbym dosyć dziwny efekt, kiedy ktoś obejrzałby filmik i akurat w tym przypadku zwyciężyliby sowieci. Kolejne polecenie czyli _cam CamSetRelPos[_ox,_oy,_oz] umieszcza kamer względem celu, w który jest skierowana - "względem" należy rozumieć tak, że kamera znajdzie się we współrzędnych celu plus podany wektor np. jeżeli zwyciężą partyzanci to kamera będzie wycelowana w Ural'a, a wektor będzie miał elementy [0, 15, 3], czyli kamera znajdzie się 3 metry nad ziemią i 15 metrów na północ od Ural'a. Teraz chyba jest jasne, że jeżeli w wyniku aktywacji wyzwalacza noRes (zmienna failure będzię miała wartość true) wartości zmiennych tworzących wektor ulegną nadpisaniu i zmieni się cel kamery to ujęcie będzie inne tzn. kamera pokaże martwego dowódcę grupy ResOne będąc 30 metrów na zachód od niego i na wysokości 20 metrów (dosyć daleko więc jest szansa, że w zasięgu wzroku będą też leżeli inni polegli). Bez względu na to jakie są wartości wektora i co jest celem zmiana zostanie wykonana w ułamku sekundy.

Co nastąpi potem już wiemy, bo fragment wyróżniony na niebiesko już był omawiany, ale przypomnę, że ujęcie (któreś z tych dwóch które nastąpi) będzie trwało 5 sekund (w tym czasie muzyka zacznie cichnąć) po czym ekran zacznie się ściemniać, by po 3 sekundach być całkowicie czarny. Co kończy filmik i ten poradnik.

Jeżeli macie jakieś wątpliwości, to zawsze możecie obejrzeć jak misja została zrobiona w edytorze, a poza tym pisać pytania na Forum OFP Center PL w dziale "Edytor".

Napisał: ALDEROUS



Wejdź na forum Wejdź na stronę Armed Assault Center PL