Dźwięki

0. Wstęp
1. Obiekty generujące dźwięk
2. Efekty wyzwalaczy i punktów trasy
3. Komendy wywołujące odtworzenie dźwięku
4. Dźwięki dostępne w grze
5. Umieszczanie własnych dźwięków w grze
5.1 Użycie oggDrop'a
5.2 Użycie Wav2Lip
5.3 Klasa CfgSounds w description.ext
5.4 Klasa CfgRadio w description.ext
5.5 Klasa CfgMusic w description.ext
5.6 Tworzenie pliku stringtable.csv
5.6.1 Klasa CfgEnvSounds w description.ext
5.6.2 Klasa CfgSFX w description.ext

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

1. Obiekty generujące dźwięk

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

Typy zmiennych:
unit: obiekt
speechName: łańcuch znaków

Typ Zwracanej wartości:
nie zwraca

Opis: Komenda ta powoduje że obiekt o nazwie unit odegra dźwięk speechName. Jeżeli dźwięk nie występuje w grze to musi być zdefiniowany w pliku description.ext. Jeżeli obiekt jest człowiekiem, a dźwięk ma odpowiadający mu plik lip, wykona ruch warg (lipsync effect) odpowiadający wydaniu z siebie tego dźwięku.

Przykład:
soldierOne say "ENG11"

PlaySound soundName

Typy zmiennych:
soundName: łańcuch znaków

Typ Zwracanej wartości:
nie zwraca

Opis: Komenda Powoduje odegranie dźwięku (wszędzie słyszalnego tak samo dobrze - nie ma źródła). Jeżeli dźwięk nie występuje w grze to musi być zdefiniowany w pliku description.ext.

Przykład:
playSound "RUS7"

time FadeSound volume

Typy zmiennych:
time: liczba
volume: liczba

Typ Zwracanej wartości:
nie zwraca

Opis:
Płynnie zmienia głośność odtwarzania wszystkich dźwięków w grze. Czas w jakim zajdzie zmiana (w sekundach) określa zmienna time (0 oznacza, że zmiana zajdzie natychmiast), a docelową głośność określa zmienna volume. Domyślnie głośność ustawiona jest na poziomie 0.5, a może przyjmować wartości od 0 do 1, gdzie 0 oznacza że dźwięki w ogóle nie są słyszalne.

Przykład:
0 fadeSound 0

PlayMusic musicName

Typy zmiennych:
musicName: łańcuch znaków

Typ Zwracanej wartości:
nie zwraca

Opis:
Powoduje odegranie ścieżki dźwiękowej. Jeżeli ścieżka dźwiękowa nie występuje w grze to musi być zdefiniowana w pliku description.ext.

Przykład:
playMusic "track01"

time FadeMusic volume

Typy zmiennych:
time: liczba
volume: liczba

Typ Zwracanej wartości:
nie zwraca

Opis:
Płynnie zmienia głośność odtwarzanej muzyki. Czas w jakim zajdzie zmiana (w sekundach) określa zmienna time (0 oznacza, że zmiana zajdzie natychmiast), a docelową głośność określa zmienna volume. Domyślnie głośność ustawiona jest na poziomie 0.5, a może przyjmować wartości od 0 do 1, gdzie 0 oznacza, że muzyka w ogóle nie jest słyszalna.

Przykład:
5 fadeMusic 0

unit VehicleRadio radioName

Typy zmiennych:
unit: obiekt
radioName: łańcuch znaków

Typ Zwracanej wartości:
nie zwraca

Opis:
Wysyła komunikat radiowy (automatycznie dodawany jest szum w tle), który będzie słyszalny tylko dla osób znajdujących się w pojeździe w którym przebywa jednostka unit która go nadaje (słychać będzie komunikat, a na dole pojawi się "fioletowy tekst"). Komunikat musi być zdefiniowany w pliku description.ext.

Przykład:
driver vehicle PLAYER VehicleRadio "warning01"

unit GroupRadio radioName

Typy zmiennych:
unit: obiekt
radioName: łańcuch znaków

Typ Zwracanej wartości:
nie zwraca

Opis:
Wysyła komunikat radiowy (automatycznie dodawany jest szum w tle), który będzie słyszalny tylko w obrębie grupy do której należy jednostka unit która go nadaje (słychać będzie komunikat, a na dole pojawi się "zielony tekst"). Komunikat musi być zdefiniowany w pliku description.ext.

Przykład:
leader group PLAYER GroupRadio "message02"

unit SideRadio radioName

Typy zmiennych:
unit: obiekt
radioName: łańcuch znaków

Typ Zwracanej wartości:
nie zwraca

Opis:
Wysyła komunikat radiowy (automatycznie dodawany jest szum w tle), który będzie słyszalny tylko przez jednostki tej samej strony do której należy jednostka unit która go nadaje (słychać będzie komunikat, a na dole pojawi się "niebieski tekst"). Komunikat musi być zdefiniowany w pliku description.ext.

Przykład:
[WEST,"HQ"] SideRadio "komunikat02"

unit GlobalRadio radioName

Typy zmiennych:
unit: obiekt
radioName: łańcuch znaków

Typ Zwracanej wartości:
nie zwraca

Opis:
Wysyła komunikat radiowy (automatycznie dodawany jest szum w tle), który będzie słyszalny przez wszystkie jednostki każdej ze stron (słychać będzie komunikat, a na dole pojawi się "biały tekst"). Komunikat musi być zdefiniowany w pliku description.ext.

Przykład:
Guba globalRadio "Surrender"

4. Dźwięki dostępne w grze

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.

ENG1 Bastards!
ENG2 Bastards!
ENG3 Bastards!
ENG4 Commie!
ENG5 Commie!
ENG6 Cover me!
ENG7 Cover me!
ENG8 Die!
ENG9 Die!
ENG10 Die!
ENG11 Don't shoot we're unarmed!
ENG12 Enemy spotted, open fire!
ENG13 Everyone out!
ENG14 Everyone out!
ENG15 Forward!
ENG16 Get out of here!
ENG17 Get out of here!
ENG18 Get to your positions!
ENG19 Get to your positions!
ENG20 Go, go, go!
ENG21 Go, go, go!
ENG22 Help!
ENG23 Help!
ENG24 Hey, what are you doing there?
ENG25 Hey, what are you doing there?
ENG26 Hey, what are you doing there?
ENG27 Let them have it!
ENG28 Let them have it!
ENG29 Look out!
ENG30 Look out!
ENG31 Look out!
ENG32 Medic, I am hit!
ENG33 Medic, I am hit!
ENG34 Medic, I am hit!
ENG35 Sector clear, take it easy
ENG36 Sector clear, take it easy
ENG37 Stay sharp, they're all around us
ENG38 We surrender!
ENG39 We're under attack. Return fire!
ENG40 Who's there?
ENG41 Who's there?
RUS1 American devils
RUS2 Run away, all, run away!
RUS3 Devil's dogs!
RUS4 Damn!
RUS5 Damn!
RUS6 Hey you. What are you doing there?
RUS7 I surrender!
RUS8 Mamo...
RUS9 Don't shoot. We're unarmed
RUS10 Fire!
RUS11 Cease fire
RUS12 Get out!
RUS13 Help!
RUS14 Freeze!
RUS15 Alarm!
RUS16 Vodka!
RUS17 Vodka?
RUS18 Forward!
RUS19 Sector clear
RUS20 Die, bastard!

W grze znajdują się też wszystkie utwory muzyczne, a ich nazwy podaję poniżej (do użycia w komendzie playMusic np. playMusic "TRACK3").

7THDECIDE 7th - Decide
7THIAMGONAFLY 7th - I am Gonna Fly
7THLIFELESS 7th - Lifeless
7THOVERDOSE 7th - Overdose
7THDARKEN 7th - Darken
7THMYLIFE 7th - My Life
RTRACK1a Resistance Track 1a
RTRACK1b Resistance Track 1b
RTRACK2 Resistance Track 2
RTRACK3 Resistance Track 3
RTRACK4 Resistance Track 4
RTRACK5 Resistance Track 5
RTRACK6 Resistance Track 6
RTRACK7 Resistance Track 7
RTRACK8 Resistance Track 8
RTRACK9 Resistance Track 9
RTRACK10 Resistance Track 10
TRACK1 Ścieżka 1 - Main Theme
TRACK2 Ścieżka 2 - Walk
TRACK3 Ścieżka 3 - Slow Blades
TRACK4 Ścieżka 4 - The Fallen
TRACK5 Ścieżka 5 - Secret
TRACK6 Ścieżka 6 - Dark Side
TRACK7 Ścieżka 7 - Heroes
TRACK8 Ścieżka 8 - Ocean
TRACK9 Ścieżka 9 - Decisions
TRACK10 Ścieżka 10 - March Hell
TRACK11 Ścieżka 11 - Hunt
TRACK12 Ścieżka 12 - Casualties Of War
TRACK13 Ścieżka 13 - Suppression
TRACK14 Ścieżka 14 - Soviet Theme
TRACK15 Ścieżka 15 - Armor
TRACK16 Ścieżka 16 - Amen
FROST Muzyka organowa

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.

5.1 Użycie oggDrop'a

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).

5.2 Użycie Wav2Lip

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).
Uwaga! Pamiętajcie, że plik musi być w formacie 16 bit, 44100 kilohertz, Mono żeby Wav2Lip zadziałał. Poza tym jeśli w tle są słyszalne jakieś zakłócenia, bądź kwestia jest wypowiadana niewyraźnie efekt będzie raczej komiczny.

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
{
sounds[] = {ivan1, vasyl1, ivan2, vasyl2, glass};

class ivan1
{
name = "Ivan 1";
sound[] = {"tekst1.ogg", db+50, 1.0};
titles[] = {0, $STRM_IVAN1};
};
class ivan2
{
name = "Ivan 2";
sound[] = {"tekst2.ogg", db+50, 1.0};
titles[] = {0, $STRM_IVAN1};
};
class vasyl1
{
name = "Vasyl 1";
sound[] = {"tekst3.ogg", db+50, 1.0};
titles[] = {0, $STRM_VASYL1};
};
class vasyl2
{
name = "Vasyl 2";
sound[] = {"tekst4.ogg", db+50, 1.0};
titles[] = {0, $STRM_VASYL2};
};
class glass
{
name = "Breaking glass";
sound[] = {"glass.ogg", db+100, 1.0};
titles[] = {};
};
};

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.

class ivan1
{
name = "Ivan 1";
sound[] = {"tekst1.ogg", db+50, 1.0};
titles[] = {0, $STRM_IVAN1};
};

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
{
name = "Gaduła 1";
sound[] = {"przemowa.ogg", db+50, 1.2};
titles[] = {0, $STRM_GAD1,
6, $STRM_GAD2,
11, $STRM_GAD3};
};

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
{
sounds[] = {Radkom1,Radkom2,Radkom3};

class Radkom1
{ name = "Naprzód";
sound[] = {"komunikat1.ogg", db+0, 1.0};
title = $STRM_RAD01;
};
class Radkom2
{
name = "Wykonane";
sound[] = {"komunikat2.ogg", db+0, 1.0};
title = $STRM_RAD02;
};
class Radkom3
{
name = "Odwrót";
sound[] = {"komunikat3.ogg", db+0, 1.0};
title = $STRM_RAD03;
};
};

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
{
tracks[]={myTrack1};

class myTrack1
{
name = "The Cranberries-Zombies";
sound[] = {\Music\music01.ogg,db+100, 1.0};
};
};

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).
Ze względu na irytujący zwyczaj modyfikowania typów plików przez Excel'a proponuję stworzyć ten plik w notatniku (najlepiej byłoby zmienić przypisanie rozszerzenia .csv z Excel'owskiego na Notepad'a). Piszemy, więc w notatniku na przykład coś takiego (nawiązując do przykładu z komunikatami radiowymi):

LANGUAGE,English,Polish,Comment
STRM_RAD1, "All units foreward!","Wszystkie jednostki Naprzód!",PapaBear
STRM_RAD2, "Objective captured! All hostile units neutralised!","Cel uchwycony! Wszystkie wrogie jednostki zneutralizowane!",alphaTeam
STRM_RAD3, "To all units! Disengage imediatelly!","Do wszystkich jednostek! Wycofać się natychmiast!",PapaBear

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ę).
Tylko STR jest konieczne - ciąg dalszy identyfikatora może być różny np. STR_kom2 ,STRCAMP_sound23).
Na koniec zapisujemy plik jako "stringtable.csv" - dzięki cudzysłowom nie zostanie zapisany jako plik tekstowy.

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
{
sounds[] = {jungle};

class jungle
{
name = "jungle ambient";
sound[]={"jungle.Day.ogg",db-55,1};
soundNight[]={"jungleNight.ogg",db-55,1};
};
};

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
{

sounds[]={horse};

class horse
{
sounds[]={horse1, horse2, horse3, horse4};
name = $STR_HORSE;

horse1[]={"rzenie1.ogg", db+0,1, 0.20, 0,0,0};
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



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