|
0. Wstęp Jako dźwięk w OFP rozumiem: kwestie wypowiadane przez różne osoby podczas misji i cutscenek, muzykę, dźwięki otoczenia oraz wszelkie inne odgłosy nie-ludzkiego pochodzenia. Ogólnie rzecz biorąc dźwięki w OFP można by podzielić na dwie grupy - te które są już w grze i należy je tylko wywołać oraz takie które są dodawane do gry i opisywane w pliku description.ext. Dźwięk można wywołać na trzy sposoby: za pomocą efektów wyzwalacza albo punktu trasy, za pomocą komend języka skryptowego OFP umieszczonych w polu Przy aktywacji (wyzwalacza albo punktu trasy) albo polu Inicjacja albo w skrypcie sqs oraz umieszczając obiekty Strona: Pusty, Klasa Sounds Umieszczanie obiektów z generujących dźwięk (oczywiście są obiektami tylko w sensie mechaniki gry. Nie istnieją w sposób fizyczny i są niewidoczne) nie nastręcza żadnych trudności. Niestety nie ma zbyt wielkiego wyboru tego typu dźwięków. Ze zrozumiałych względów są to wyłącznie dźwięki otoczenia. 2. Efekty wyzwalaczy i punktów trasy Wywoływanie dźwięków dostępnych w grze za pomocą efektów wyzwalacza albo punktu trasy jest również dosyć proste. W przypadku wyzwalacza musi on być oczywiście aktywowany, a w przypadku punktu trasy jednostka/grupa musi do niego dotrzeć. W obu przypadkach dźwięk jaki ma wystąpić określa się w oknie Efekty. Ponieważ interesuje nas tylko dźwięk istotne będzie jedynie pięć pól w tym oknie. Są to pola ujęte "obwódką" Dźwięki (czyli Anonimowy, Głos, Otoczenie, Wyzwalacz) oraz pole Ścieżka (Muzyka). Każde z tych pól pozwala wybrać dźwięk danego rodzaju, który ma wystąpić z chwilą aktywacji wyzwalacza/dotarcia do punktu trasy. Charakterystyka pól jest następująca: Anonimowy - Dźwięki anonimowe dochodzą "znikąd" tzn. są słyszane zawsze tak samo dobrze bez względu na to jak daleko od wyzwalacza generującego dźwięk gracz się znajduje. Głos - Dźwięki typu głos są najlepiej słyszalne w centrum wyzwalacza który je generuje. Wraz z odległością są coraz trudniejsze do usłyszenia, a więc daje to wrażenie, że dźwięk ma źródło. Otoczenie - Dźwięk typu otoczenie jest słyszalny wszędzie tak samo dobrze i trwa bez końca chyba, że zostanie zastąpiony innym dźwiękiem tego typu. Oznacza to że w danej chwili występować może tylko jeden dźwięk typu Otoczenie. Ogólnie rzecz biorąc nie ma potrzeby używania tego typu dźwięków, gdyż są one generowane automatycznie w zależności od tego na jakim typie terenu przebywa gracz (mogą mieć zastosowanie jeśli chcemy zastąpić odtwarzane domyślenie dźwięki otoczenia). Wyjątkiem są "Odgłosy walki 1". Wyzwalacz - Dźwięki tego typu są podobne do dźwięków otoczenia, ale tak jak dźwięki typu głos stają się słabiej słyszalne w miarę jak oddalamy się od wyzwalacza, który je generuje. Podobnie jak dźwięki typu otoczenie są generowane w nieskończoność, ale występować w danej chwili może dowolna ich ilość. Ścieżka - jak łatwo się domyślić efektem aktywacji wyzwalacza jest rozpoczęcie odtwarzania wybranego w tym polu utworu muzycznego. Dany utwór jest odtwarzany do końca albo do momentu w którym rozpocznie się odtwarzanie innego utworu. Szczególną rolę pełni tu "cisza", która pozwala na zakończenie odtwarzania utworu przed jego końcem. 3. Komendy wywołujące odtworzenie dźwięku Trzecia metoda wywołania dźwięku to komendy umieszczone w polu Przy aktywacji(wyzwalacza albo punktu trasy) albo polu Inicjacja albo w skrypcie sqs. Komendy te są następujące: unit Say speechName PlaySound soundName time FadeSound volume PlayMusic musicName time FadeMusic volume unit VehicleRadio
radioName unit GroupRadio
radioName unit SideRadio
radioName unit GlobalRadio
radioName Niestety nie jest ich za wiele. Łatwo można się o tym przekonać przeglądając
pola w oknie Efekty. Możliwe do użycia w komendach kwestie podaję poniżej. Po
lewej jest nazwa jaką należy użyć np. PLAYER say
"ENG6", a po prawej tekst jaki jest wypowiadany. Jeżeli jakiś tekst się
powtarza to znaczy że kwestie te wypowiadane są głosem o różnym
brzmieniu. W grze znajdują się też wszystkie utwory muzyczne, a ich nazwy podaję poniżej
(do użycia w komendzie playMusic np. playMusic "TRACK3"). 5. Umieszczanie własnych dźwięków w grze Aby umieścić w grze jakieś dialogi, dźwięki i muzykę musimy je najpierw nagrać (albo skądś zdobyć), następnie skonwertować do odpowiedniego formatu i opisać w pliku description.ext który dołączamy do misji albo kampanii. Poza tym w przypadku dialogów często konieczne jest stworzenie plików lip które powodują, że mówiąca postać porusza ustami (oczywiście nie ma sensu tego robić jeśli nie widzimy rozmówcy). Na koniec warto jeszcze stworzyć plik stringtable.csv, który odpowiada za napisy towarzyszące dialogom (pozwala to również na stworzenie kilku wersji językowych misji lub kampanii). Aby dźwięk został odtworzony w grze musi być w formacie ogg (wav też jest dopuszczalny, ale ze względu na brak kompresji zajmuje to zdecydowanie za dużo miejsca). Do wykonania powyższego zadania może posłużyć program OggDrop (dostępny na stronie), który konwertuje pliki z formatu wav na ogg. Pliki te muszą dodatkowo spełniać pewne warunki tj. muszą być 16 bit i 44100 kilohertz. Ponadto muszą być Mono (dotyczy to mowy i dźwięków, tło muzyczne może być Stereo). Należy skorzystać z jakiegoś programu do obróbki dźwięku by zmienić ich format jeżeli jest inny niż podany. Użycie OggDrop'a jest dosyć proste. Wystarczy uruchomić go klikając na ikonę - w efekcie pojawi się małe okienko z rybką. Następnie przeciągamy plik .wav na okienko z rybką (Napis "Drop files here" nie jest tam bez powodu). Czas w jaki zajmie konwersja zależy od rozmiaru pliku, a jej postęp jest zobrazowany poprzez granatowy pasek pod rybką (która zresztą obraca się w czasie trwania konwersji). Ostatecznie w katalogu w którym jest Oggdrop pojawi się plik o nazwie takiej jak konwertowany .wav tyle, że z rozszerzeniem .ogg. Plik ten umieszczamy w specjalnym folderze o nazwie Sound, który tworzymy w folderze naszej misji (czyli zwykle C:\ Program Files\ Codemasters\ OperationFlashpoint\ Users\ twój_nick\ missions\ Moja_misja\ Sound). Poza tym klikając prawym klawiszem myszy na okno oggdrop'a możemy zmienić bitrate z wartości 80 na inną - im większa wartość tym dźwięk będzie lepszej jakości, ale też będzie więcej ważył. Pliku źródłowego wav nie należy jeszcze kasować gdyż zaraz będzie potrzebny do stworzenia pliku lip (o ile zachodzi potrzeba jego utworzenia). Teraz kolej na stworzenie plików .lip, które odpowiadają za ruch warg osób
podczas wypowiedzi. Potrzebny jest program Wav2Lip (również dostępny na
stronie). Wbrew pozorom programu nie trzeba uruchamiać - wystarczy przeciągnąć
plik wav na ikonę WaveToLip. W folderze w którym mamy plik wav pojawi się plik
.lip o tej samej nazwie, który powinniśmy umieścić w tym samym katalogu co plik
ogg (czyli Sound). 5.3 Klasa CfgSounds w description.ext Kolejny krok i zwykle sprawiający najwięcej kłopotów to opisanie dźwięków w pliku description.ext, który znajdzie się w folderze z misją. Można go stworzyć na przykład za pomocą Notatnika (czyli Notepad'a). Załóżmy, że mamy cztery pliki tekst1.ogg, tekst2.ogg, tekst3.ogg i tekst4.ogg (już w folderze Sound w folderze naszej misji), które tworzą krótki dialog pomiędzy dwiema osobami oraz dźwięk tłuczonej butelki w pliku glass.ogg. Aby je opisać wpisujemy następujący tekst w Notatniku: class CfgSounds A teraz czas na wyjaśnienia. Klasa CfgSounds
odpowiada za dźwięki, które będą odtwarzane za pomocą komend playSound i Say (a więc nie
dotyczy to muzyki i komunikatów radiowych). Na początku wpisujemy nazwy
wszystkich klas (aczkolwiek nie jest to konieczne). Potem każdy plik musi zostać
opisany poprzez pojedynczą klasę np. Nazwa klasy jest także nazwą używaną w komendach czyli np. soldier2 Say "ivan1" sprawi, że żołnierz o nazwie soldier2 wypowie kwestię zawartą w pliku tekst1.ogg. name Nazwa Ivan 1 będzie wśród nazw dźwięków w oknie Efekty wyzwalacza bądź punktu trasy (jako Anonimowy i Głos). sound Oczywiście musimy też podać nazwę pliku czyli tekst1.ogg. Kolejne dwa parametry oznaczają względną głośność odgrywanego dźwięku tzn. czy dźwięk ma być odtworzony głośniej/ciszej i o ile - db+0 oznacza że zostanie odegrany bez żadnych zmian, db+50 że zostanie odegrany głośniej (wartość należy dobrać metodą prób i błędów), a db- 70, że zostanie odegrany ciszej. Oszczędza wykonywania kolejnej konwersji gdyby okazało się że nagrany dźwięk jest zbyt głośny/ za cichy. Ostatni parametr określa wysokość dźwięku (tzw. Pitch - chodzi tu głównie o wysokość głosu. Jak to "działa" można się przekonać w naszych osobistych ustawieniach gracza zmieniając wysokość wybranego głosu). Wartość 1.0 oznacza dźwięk odtworzony bez zmian, wartości poniżej zera (np. 0.9) to dźwięki niższe niż w rzeczywistości, a większe od jedności (np. 1.1) to dźwięki wyższe. Czasem przydaje się to gdy chcemy zmodyfikować brzmienie nagranej kwestii. titles Jeżeli konieczne jest obecność napisów (czyli tylko w przypadku dialogu - dźwięk tłuczonego szkła tego raczej nie potrzebuje) to musimy umieścić nazwę linijki zawierającej ten tekst i znajdującej się w pliku stringtable.csv (na przykład taką nazwą jest $STRM_IVAN1 - w pliku stringtable.csv umieścimy ten identyfikator, ale bez znaku dolara na początku). Wartość 0 która jest obecna w przykładzie oznacza, że napis pojawi się bez żadnego opóźnienia w chwili odtworzenia wypowiadanej kwestii i będzie widoczny przez 10 sekund albo do chwili gdy pojawi się kolejny napis (co zwykle następuje szybciej). Czasem jednak potrzebne jest pewne opóźnienie. Na przykład jeśli wypowiedź trwa 15 sekund i są w niej dwie wyraźne pauzy (np. aktor się zastanawia co dalej powiedzieć - nie zawsze można podzielić wypowiedź na trzy osobne pliki) to potrzebne jest wyświetlenie trzech napisów w krótkich odstępach czasu. W takiej sytuacji opis wyglądał będzie tak: class dlugaGadka Oznacza to, że najpierw pojawi się tekst o z linijki oznaczonej $STRM_GAD1, po 6 sekundach zastąpi go tekst z linijki $STRM_GAD2, którego z kolei po 5 sekundach (w 11 sekundzie odtwarzania pliku przemowa.ogg) zastąpi tekst z linijki $STRM_GAD3. Podkreślam, że nie trzeba koniecznie tworzyć pliku stringtable.csv - wystarczy zamiast identyfikatora wpisać tekst w cudzysłowie np. zamiast $STRM_GAD1 możemy wpisać "Melduję się na rozkaz towarzyszu pułkowniku!". Oznacza to jednak, że tekst ten będzie wyświetlany w każdej wersji językowej OFP. 5.4 Klasa CfgRadio w description.ext Opis komunikatów radiowych czyli tych dźwięków, które wywołują komendy vehicleRadio, groupRadio, SideRadio i globalRadio jest nieco inny (choć bardzo podobny co jest źródłem wielu pomyłek). Przede wszystkim znajduje się w klasie CfgRadio, a wygląda następująco. Załóżmy, że mamy trzy pliki: komunikat1.ogg, komunikat2.ogg i komunikat3.ogg (już w folderze Sounds). Ich opis w description.ext jest następujący: class CfgRadio Różnica dotyczy jedynie title (zamiast titles[]) - jak widać brak nawiasów klamrowych i nie podaje się opóźnienia (jedna kwestia może być opisana tylko jedną linijką tekstu). Reszta jest identyczna jak w klasie CfgSounds. Komunikaty radiowe odtwarzane są z dodatkowym szumem (charakterystycznym "szumem w eterze"). W misji komunikaty odtworzyłoby się na przykład za pomocą komendy [WEST,"HQ"] sideRadio "Radkom2". 5.5 Klasa CfgMusic w description.ext Osobna klasa CfgMusic służy do opisu ścieżek dźwiękowych, które mają zostać odtworzone w misji. Muzykę umieszczamy w folderze Music (a nie Sounds) utworzonym w folderze z misją, a odtwarzamy za pomocą komendy playMusic (np. playMusic myTrack1) lub za pomocą okna Efekty wyzwalaczy i punktów trasy wybierając w polu "Ścieżka" odpowiednią nazwę (w poniższym przykładzie The Cranberries- Zombies. Przykładowy opis pliku music01.ogg wygląda następująco: class CfgMusic Nic zaskakującego - zamiast sounds[] jest tracks[] i nie ma opisu napisów towarzyszących dźwiękowi. Poza tym przypomina to opis dźwięków w klasach CfgSounds i CfgRadio. 5.6 Tworzenie pliku stringtable.csv Ostatnim krokiem może być wykonanie pliku stringtable.csv (jak już wspominałem nie jest to konieczne) zawierającego napisy towarzyszące wypowiadanym kwestiom (choć nie tylko to, ale tego nie będę omawiał w tym poradniku). Dzięki jego użyciu możemy stworzyć misję, w której napisy będą
wyświetlane w różnych językach, w zależności od wersji językowej gry. Jeżeli
misja zostanie rozegrana na OFP w wersji językowej do której tłumaczenia nie ma
w stringtable.csv, to zostaną wyświetlone tłumaczenia angielskie (o ile
oczywiście je umieściliśmy). Pierwszy jest identyfikator kwestii (tyle że bez znaku "$"), a po przecinku
następują kolejne wersje językowe danej kwestii (również oddzielone
przecinkami). Jeśli tekst jest długi i wychodzi poza ekran można umieścić w nim
znak "\n", który nie jest wyświetlany, a jest informację dla engine'u o
konieczności przejścia do następnej linijki (czyli tekst zostanie "złamany"). Na
końcu można umieścić komentarz, który informuje kto wypowiada daną kwestię (nie
jest to konieczne, ale może ułatwić później orientację). 5.6.1 Klasa CfgEnvSounds w description.ext Oprócz dźwięków, dialogów, komunikatów radiowych i muzyki, można umieścić w misji jeszcze dwa rodzaje dźwięków. Są to dźwięki otoczenia, które występują w dwóch rodzajach: jako dźwięki nie mające źródła i wszędzie słyszane tak samo dobrze np. szum deszczu i dźwięki mające źródło np. szczekanie psa. Oba te typu dźwięków są dostępne w ramach efektów wyzwalacza jako Dźwięki/Otoczenie i Dźwięki/Wyzwalacz, ale istnieje także możliwość stworzenia własnych. W tym celu należy dysponować plikami ogg i utworzyć odpowiednie klasy w pliku description.ext. Dźwięki otoczenia należy umieścić w folderze Sounds (tym w folderze z misją) i wskazane jest by była to nieco dłuższa sekwencja która dodatkowo daje się łatwo zapętlić. Opis w description.ext jest następujący: class CfgEnvSounds Opis jest również podobny do wcześniejszych klas. W sounds[] umieszczamy nazwy klas, a w name nazwę która będzie na liście Dźwięk/Otoczenie w oknie efekty wyzwalacza. Parametry dźwięku w sound[] i soundNight[] są takie same jak we wcześniejszych opisach, a te dwa opisy są obecne gdyż dźwięki otoczenia na danym obszarze mogę być różne w dzień i w nocy (na przykład inne dźwięki usłyszymy w lesie w dzień niż w nocy. Z kolei szum morza będzie taki sam bez względu na porę dnia). 5.6.2 Klasa CfgSFX w description.ext W przypadku dźwięków "wyzwalaczy" sytuacja jest nieco inna. Przede wszystkim nie tworzy je jeden dłuższy zapętlony plik ogg, ale kilka podobnych plików, które są odtwarzane ciągle w losowej kolejności np. szczekanie psa to kilka plików ogg z różnie brzmiącymi szczeknięciami. Pliki te również umieszczamy w folderze Sounds, a ich opis w description.ext jest następujący: class CfgSFX horse2[]={"rzenie2.ogg", db+0,1, 0.20, 0,0,0}; horse3[]={"rzenie3.ogg", db+0,1, 0.20, 0,0,0}; horse4[]={"parskniecie.ogg", db+0,1, 0.30, 0,0,0}; empty[]= {, , , , 1 , 5, 20}; }; }; Podobnie jak w poprzednich klasach w sounds[] występuje spis klas opisujących dźwięki, tyle że tym razem sounds[] znajduje się również w samej klasie, która opisuje kilka dźwięków. Opis każdego z nich jest podobny tzn. kolejno podawana jest nazwa pliku, głośność względem ustawionej w grze i wysokość dźwięku. Kolejne cztery parametry to prawdopodobieństwo wystąpienia i oraz opóźnienie względem spełnienia warunku wystąpienia wyrażone za pomocą sekund (Minimalne, Dominujące, Maksymalne). Na końcu musi wystąpić definicja dźwięku empty. Mechanizm losowania polega na tym, że kolejno (czyli w tym przykładzie horse1, potem hores2 itd..) sprawdzane jest czy dany dźwięk wystąpi (szansa wystąpienia jest równa podanemu prawdopodobieństwu, a zatem lepiej dawać niewielkie, bo inaczej dźwieki z końca listy będą pojawiały się bardzo rzadko). Jeśli któryś z dźwięków z listy wystąpi to sprawdzanie zaczyna się od początku, a jeśli nie wystąpi żaden to odgrywany jest dźwięk empty (czyli brak dźwięku). Opóźnienia powodują powiększenie odstępów w których testowane jest wystąpienie dźwięków z listy, w przypadku empty są to jedyne parametry które podajemy i wyznaczają one długość trwania ciszy. W name oczywiście podajemy nazwę pod jaką ten dźwięk znajdzie się na liście w polu Dźwięki/wyzwalacz w oknie efekty wyzwalacza. Napisał: ALDEROUS |
|