Kolejny tutek o stalku. Tym razem dialogi.
Pliki, których będziemy używać:
\config\gameplay\character_desc_escape.xml
\config\gameplay\dialogs_escape.xml
\config\gameplay\info_l01escape.xml
Mówiąc szczerze, miałem duże wątpliwości, czy pisanie tego tutka ma jakikolwiek sens, gdyż to jest po prostu nieopisywalnie proste. No, ale dobra, zaczynamy. Będziemy pisali dialog dla Sidorowicza - bo on zaraz po starcie jest najbliżej, najłatwiej testować.
Otwieramy character_desc_escape.xml. W zasadzie te okna z notatnikiem nie będzie sensu zamykać, w obu ciągle będzie się coś zmieniać. Ten escape_trader, którego widzimy od początku skryptu, to właśnie sidorowicz. Widzimy tu dużo wersów typu <actor_dialog>(pierdoły)</actor_dialog>. Tu jest zapisane, które dialogi wyświetlają się u danego NPCa. Dodajmy linię:
<actor_dialog>escape_trader_losowo</actor_dialog>
Ja dodałem ją gdzieś w środku tych actor_dialog, ale myślę, że można to dodać gdziekolwiek, a i tak zadziała. Dobra, teraz otwieramy plik dialogs_escape.xml. Zaraz po
<?xml version="1.0" encoding="windows-1251" ?>
<game_dialogs>
Wstawiamy:
<dialog id="escape_trader_losowo" priority="90">
<phrase_list>
<phrase id="0">
<text>Witaj LOSOWE.</text>
<next>1</next>
<next>2</next>
<next>3</next>
</phrase>
<phrase id="1">
<text>Siema.</text>
</phrase>
<phrase id="2">
<text>Cześć.</text>
</phrase>
<phrase id="3">
<text>Witam.</text>
</phrase>
</phrase_list>
</dialog>
Teraz opis, co do czego.
dialog id - "Nazwa" dialogu, której używamy do wstawienia go w plik character_desc_escape.xml;
priority - Priorytet. Tutaj oznacza pozycję na liście w wyborze dialogu. Wybieramy dużą liczbę, jak to przykładowe 90, bo wybranie innej może nam zepsuć dialog, "zasłaniając" jakąś inną kwestię o tym samym priorytecie;
phrase_id - ID frazy. Dzięki temu, że takie coś istnieje, możemy pisać jeden dialog na kilka sposobów;
text - Logiczne;
next - Jaka fraza jest następna. Wpisując to w odpowiedni sposób, uzyskamy inne wyniki, ale o tym dalej.
Włączamy grę. Powinno - dzięki temu, że kilka "next" było w jednej frazie - wyświetlać nam losowo odpowiedzi 1,2, lub 3, poklikajcie kilka razy, a zauważycie. Uwaga - najpierw trzeba wziąć od Sidorowicza misję, dopiero potem dialogi są możliwe do wybrania.
No, to dalej. Losowo już było, teraz będzie dialog, w którym osoby wypowiadają się więcej, niż jeden raz.
<dialog id="escape_trader_konkretnie" priority="91">
<phrase_list>
<phrase id="0">
<text>Witaj KONKRETNE.</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>Siema.</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>Cześć.</text>
<next>3</next>
</phrase>
<phrase id="3">
<text>Witam.</text>
</phrase>
</phrase_list>
</dialog>
Co się zmieniło? Przestawiłem NEXT tak, aby każdy był odnośnikiem do następnej frazy. Dzięki temu dialog działa tak, że na początku Sidorowicz mówi Siema, potem bohater Cześć, potem sidorowicz znowu, ale tym razem Witam. Oczywiście zmieniłem również priorytet, żeby dwa dialogi się nie gryzły, i zmieniłem ID - jeśli chcecie zobaczyć to w grze, musicie dopisać do character_desc_escape.xml:
<actor_dialog>escape_trader_konkretnie</actor_dialog>
Łatwe, proste, zrozumiałe. Dobra, następny przykład:
<dialog id="escape_trader_wyborem" priority="92">
<phrase_list>
<phrase id="0">
<text>Witaj Z WYBOREM.</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>Siema.</text>
<next>2</next>
<next>3</next>
</phrase>
<phrase id="2">
<text>Cześć.</text>
</phrase>
<phrase id="3">
<text>Witam.</text>
</phrase>
</phrase_list>
</dialog>
Tutaj mamy dwa NEXT w frazie dalszej, niż 0 - więc będę miał wybór pomiędzy odpowiedzią 2 albo 3. Jak zwykle zmiana ID - dokleić do character_desc_escape nową linijkę! - i zmiana priorytetu.
Parę ciekawostek:
Informacje. Stalker ma całkiem ciekawie rozwiązane sprawdzanie, czy gracz dowiedział się o danej rzeczy, czy nie. Robią za to chyba tylko te trzy rzeczy:
<has_info> - sprawdza, czy gracz posiada daną informację;
<dont_has_info> - sprawdza, czy gracz jeszcze nie posiada informacji;
<give_info> - dodaje informację dla gracza.
Takie informacje dodajemy przez "info_portion id" w pliku info_l01escape.xml. Jak? Przykładowo, mam informację "wiedzapowszechna. Więc dodaję gdzieś pomiędzy innymi podobnymi liniami:
<info_portion id="wiedzapowszechna"></info_portion>
I gotowe! Można już tego używać w swoich dialogach. Dla przykładu:
W info_l01escape.xml dodajemy pod
<info_portion id="tutorial_alarm_played"></info_portion>
swoją linijkę - na przykład
<info_portion id="wiedzapowszechna"></info_portion>
Teraz w dialogu KONKRETNIE, na samym początku frazy pierwszej, doklejamy <give_info>. Powinno wyjść to tak:
<dialog id="escape_trader_konkretnie" priority="91">
<phrase_list>
<phrase id="0">
<text>Witaj KONKRETNE.</text>
<next>1</next>
</phrase>
<phrase id="1">
<give_info>wiedzapowszechna</give_info>
<text>Siema.</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>Cześć.</text>
<next>3</next>
</phrase>
<phrase id="3">
<text>Witam.</text>
</phrase>
</phrase_list>
</dialog>
Teraz w dialogu LOSOWE doklejamy przed <phrase_list> swoje <has_info> - powinno wyjść:
<dialog id="escape_trader_losowo" priority="90">
<has_info>wiedzapowszechna</has_info>
<phrase_list>
<phrase id="0">
<text>Witaj LOSOWE.</text>
<next>1</next>
<next>2</next>
<next>3</next>
</phrase>
<phrase id="1">
<text>Siema.</text>
</phrase>
<phrase id="2">
<text>Cześć.</text>
</phrase>
<phrase id="3">
<text>Witam.</text>
</phrase>
</phrase_list>
</dialog>
I gotowe! Po rozmowie KONKRETNIE pojawi się opcja dialogowa LOSOWE.
Dalsza ciekawostka - jak dodać nóż i broń graczowi.
<action>escape_dialog.give_weapon_to_actor</action>
<action>escape_dialog.give_knife_to_actor</action>
To chyba nie wymaga opisu? Wklejamy w któryś z testowych dialogów i sprawdzamy efekt.
A może jednak wymaga. Znalazłem w Internecie, co można wsadzić w te <action>:
http://fr.pastebin.ca/445944
Jest to plik scripts/escape_dialog.script. Opiszę tutaj, jak go edytować:
Przykładowo, mamy funkcję Trader. Po jej END, dopisujemy:
function measkrypt(first_speaker, second_speaker)
dialogs.relocate_item_section(first_speaker, "medkit", "in")
dialogs.relocate_item_section(first_speaker, "bandage", "in")
end
W gruncie rzeczy nie rozumiem, co znacza first_speaker, ale dobra.
medkit, bandage - to itemy. Można tam wsadzić sobie rakietnicę, granatnik, czy pistolecik z poprzedniego tutka.
function measkrypt - to nazwa skryptu. Nazwałem go tak, Wy nazywajcie go jak chcecie.
"in" - to stwierdza, że item jest dla nas, a nie od nas. Przeciwieństwo to oczywiście OUT.
Teraz w swoim dialogs_escape, przykładowo w frazie 0 dialogu losowe, po TEXT dodajemy:
<action>escape_dialog.measkrypt</action>
escape_dialog jest konieczne, żeby pokazać, który to plik. measkrypt to nazwa naszego skryptu. Sprawdzamy w grze i cieszymy się
Co jeszcze można tam dopisać, oprócz dialogs.relocate_item_section? Ano, kasę. Piszemy to tak:
dialogs.relocate_money(npc, 500, "in")
Bądź out, żeby zapłacić - jak kto woli.
SCREENY:http://i47.tinypic.com/2ilfnms.jpghttp://i47.tinypic.com/2zecjl1.jpghttp://i50.tinypic.com/r9jtpx.jpgPS: Z tego, co tu jest, da się już zrobić prosty quest, w którym idziesz od dawcy questa, wyciągasz informację od innego npca, mówisz ją dawcy i otrzymujesz nagrodę. Zrobiłem sobie taki, ale nie chce mi się go rozpisywać. Tu jest za to mój gamedata, gdzie wszystko ładnie widać:
http://www.speedyshare.com/files/20549988/gamedata.rarLub:
http://hotfile.com/dl/25710284/011aba5/gamedata.rar.htmlAha, w kwestii tej gry nie mam nic przeciwko zapychaniu mi PW pytaniami, o ile umiem, postaram się odpowiedzieć