Stalker Zew Prypeci – dodawanie zadań z wykorzystaniem własnego skryptuJak wiadomo Stalker Cień Czarnobyla ma inną strukturę plików niż Zew Prypeci. Właśnie przez to nie mogłem dodać questów (sugerowałem się tutorialami pod Cień). Szukałem i znalazłem w sieci post użytkownika z AMK Team – XMK. Przestudiowałem najważniejsze pliki i dodałem nowy quest. Z chęci pomocy przerobiłem jego tutorial i tym sposobem mamy poradnik na stalker.pl. Dodam, że nie jest to tutorial do dodawania zadań zaawansowanych skryptowo – jest to zupełnie ogólny poradnik. Więc zaczynajmy.
Po pierwsze podam pliki, które będziemy przerabiać lub pisać od nowa:
*
dialogs_zaton (gamedata>configs>gameplay) szkielet drzewka dialogowego,
*i
nfo_zaton (gamedata>configs>gameplay) infoportion dla lokacji w której robimy zadanie (tu Zaton),
*
character_desc_zaton (gamedata>configs>gameplay) plik, w którym dodamy dialog do postaci,
*
st_dialogs_zaton (gamedata>configs>text>pol) teksty dialogu,
*
st_quest_zaton (gamedata>configs>text>pol) opis zadania,
*
tm_zaton (gamedata>configs>misc) plik, w którym musimy dodać sekcję zadania,
*
nowy skrypt (gamedata>scripts) skrypt, który sami napiszemy w celu zdefiniowania akcji dialogu,
Polecam edytować pliki tekstowe za pomocą
Notepad++, ponieważ otwarte pliki mamy w przyborniku (lub jak kto woli - zakładce).
Nasze zadanie polegać będzie na przyniesieniu kiełbasy Sowie.
1. Otwieramy plik st_dialogs_zaton by napisać tekst dialogu. Najlepiej od tego zacząć, gdyż będzie prościej w późniejszej części. Piszemy na przykład to (
Sowa,
Major):
M:Mogę w czymś pomóc?
S:Tak. Przynieś mi kiełbasę. Jestem bardzo głodny, a nie chce mi się iść do Brodacza... Wynagrodzę cię.
M:Zgoda.
Będzie to dialog, w którym dostaniemy informację o zadaniu. Jednak musimy napisać frazę taką, by gra rozpoznała dialog. Przykładowa forma tego dialogu będzie taka:
- Kod: Zaznacz wszystko
<string id="kolbasa_dialog_0">
<text> Mogę w czymś pomóc? </text>
</string>
<string id="kolbasa_dialog_1">
<text>Tak. Przynieś mi kiełbasę. Jestem bardzo głodny, a nie chce mi się iść do Brodacza... Wynagrodzę cię.</text>
</string>
<string id="kolbasa_dialog_2">
<text>Zgoda.</text>
</string>
Mamy dialog rozpoczynający. Teraz musimy napisać zakańczający. Jego przykładowa, poprawna forma:
- Kod: Zaznacz wszystko
<string id="kolbasa_end_0">
<text> Mam kiełbasę </text>
</string>
<string id="kolbasa_end_1">
<text>Dzięki ci bardzo! Nie wiesz nawet jak mi pomogłeś. Trzymaj nagrodę.</text>
</string>
<string id="kolbasa_end_2">
<text>Również dzięki.</text>
</string>
Tutaj uwagę zwróćcie na <string id="...">. W części początkującej dialog zadania było to <string id="kolbasa_dialog_0"> a w części kończącej dialog zadania - <string id="kolbasa_end_0">. Dlaczego jest to takie ważne? Ano dlatego, że kolbasa_dialog i kolbasa_end to inne dialogi. Lepiej będzie jak omówimy poszczególne części dialogu:
*<string id="kolbasa_dialog_0">, <string id="kolbasa_end_0"> - "link" do dialogu w pliku dialogs_zaton,
*1, 2, 3 - numery dialogu (muszą być, by dobrze zdefiniować drzewko dialogu),
*<text></text> - miejsce do wpisania tekstu,
*</string> - zakończenie sekcji,
2. Przechodzimy do pliku dialogs_zaton. Dodajemy - najlepiej na końcu - tą oto frazę:
- Kod: Zaznacz wszystko
<dialog id="kolbasa_dialog">
<phrase_list>
<phrase id="0">
<text>kolbasa_dialog_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>kolbasa_dialog_1</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>kolbasa_dialog_2</text>
</phrase>
</phrase_list>
</dialog>
Jest to część dialogu początkującego zadanie. Na razie to tylko dialog, później po dopisaniu funkcji będzie to dialog właściwy pod zrobienie zadania. Skupmy się na części kończącej dialog:
- Kod: Zaznacz wszystko
<dialog id="kolbasa_end">
<phrase_list>
<phrase id="0">
<text>kolbasa_end_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>kolbasa_end_1</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>kolbasa_end_2</text>
</phrase>
</phrase_list>
</dialog>
Opiszę funkcję poszczególnych fraz:
*<dialog id="kolbasa_dialog">, <dialog id="kolbasa_end"> - "link" do pliku character_desc_zaton, sekcja dialogu,
*</dialog> - zakończenie sekcji dialogu,
*<phrase_list> - lista dialogu ( dla początkującego i kończącego zadanie osobna),
*</phrase_list> - koniec listy dialogu,
*<phrase id="..."> - "link" frazy,
*</phrase> - zakończenie linku frazy,
*<text></text> - "link" do dialogu w pliku st_dialogs_zaton,
*<next></next> - następna fraza,
*1, 2, 3 - "linki" fraz,
3. Przechodzimy do pliku character_desc_zaton i znajdujemy sekcję Sowy (początek pliku). Szukamy sekcji supplies i pod nią dopisujemy:
- Kod: Zaznacz wszystko
<actor_dialog>kolbasa_dialog</actor_dialog>
<actor_dialog>kolbasa_end</actor_dialog>
Możemy zobaczyć, czy sam dialog działa. Wchodzimy do gry i klikamy "F" przy Sowie. Wywala? Przeczyjajcie loga. Nie pamiętam, jakie logi były, ale możemy zastosować manewr przyklejając:
- Kod: Zaznacz wszystko
<actor_dialog>kolbasa_dialog</actor_dialog>
<actor_dialog>kolbasa_end</actor_dialog>
pod:
- Kod: Zaznacz wszystko
<start_dialog>zat_b30_owl_stalker_trader_start_dialog</start_dialog>
Jeżeli nadal wywala pokombinuj z przeklejaniem, lub podaj loga na stalker.pl w temacie tutoriala.
Hmm, widzimy <actor_dialog> i <start_dialog>. Co one mogą oznaczać? <actor_dialog> oznacza, że dialog rozpoczyna gracz, zaś<start_dialog> oznacza, że rozpoczyna NPC. Osądzić można to na podstawie wpisu w st_dialogs_zaton:
- Kod: Zaznacz wszystko
<string id="kolbasa_dialog_0">
<text> Mogę w czymś pomóc? </text>
</string>
Jest to pierwsze zdanie w tym dialogu. Tak samo jest z kolbasa_end_0.
4. Czas na dopisywanie funkcji i napisanie skryptu. Wchodzimy w plik dialogs_zaton. Szukamy sekcji napisanego dialogu.
- Kod: Zaznacz wszystko
<dialog id="kolbasa_dialog">
<dont_has_info>quest_kolbasa_done</ dont_has_info>
<dont_has_info>quest_kolbasa_give</ dont_has_info>
<phrase_list>
<phrase id="0">
<text>kolbasa_dialog_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>kolbasa_dialog_1</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>kolbasa_dialog_2</text>
<give_info>quest_kolbasa_give</ give_info>
<action>nowy_skrypt.give_kolbasa_quest</ action>
<action>dialogs.break_dialog</action>
</phrase>
</phrase_list>
</dialog>
gdzie:
*<dont_has_info>quest_kolbasa_done</ dont_has_info> - to jeden z warunków pojawienia się dialogu,
*<dont_has_info>quest_kolbasa_give</ dont_has_info> - drugi warunek pojawienia się dialogu w menu,
*<give_info>quest_kolbasa_give</ give_info> - wpis kontrolujący infoprtion,
*<action>nowy_skrypt.give_kolbasa_quest</ action> - wpis w nowo utworzonym skrypcie oznaczający iż dostaliśmy zadanie,
*<action>dialogs.break_dialog</action> - wpis ten ucina dialog tak, by nie zapętlał się (powtarzał),
- Kod: Zaznacz wszystko
Teraz część, w której kończymy zadanie:
<dialog id="kolbasa_end">
<dont_has_info>quest_kolbasa_done</ dont_has_info>
<has_info>quest_kolbasa_give</ has_info>
<precondition>nowy_skrypt.actor_has_kolbasa</precondition>
<phrase_list>
<phrase id="0">
<text>kolbasa_end_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<has_info>quest_has_kolbasa</ has_info>
<text>kolbasa_end_1</text>
<action>nowy_skrypt.transfer_kolbasa_to_owl</ action>
<next>2</next>
</phrase>
<phrase id="2">
<text>kolbasa_end_2</text>
<give_info>quest_kolbasa_done</ give_info>
</phrase>
</phrase_list>
</dialog>
gdzie:
*<precondition>nowy_skrypt.actor_has_kolbasa</precondition> -warunek pojawienia się dialogu,
*<has_info>quest_has_kolbasa</ has_info> - wpis kontrolujący infoportion,
*<action>nowy_skrypt.transfer_kolbasa_to_owl</ action> - funkcja dająca przedmiot Sowie,
*<give_info>quest_kolbasa_done</ give_info> - wpis kontrolujący infoportion,
Mamy dialog z funkcjami, teraz pora na napisanie skryptu. Przechodzimy do folderu "scripts" i tworzymy skrypt o dowolnej nazwie. Pamiętajmy, że skrypt musi mieć taką samą nazwę jak funkcje w drzewku dialogowym!!! Jest to cholernie ważne. W pliku utworzonego skryptu wpisujemy to:
- Kod: Zaznacz wszystko
function give_kolbasa_quest()
task_manager.get_task_manager():give_task("give_kolbasa_quest")
end
function actor_has_kolbasa()
if db.actor:object("kolbasa") then
return true
end
return false
end
function transfer_kolbasa_to_owl(first_speaker, second_speaker)
dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "kolbasa")
dialogs.relocate_money_to_actor(first_speaker, second_speaker, 5000)
end
Funkcje skryptu:
*function give_kolbasa_quest - jak sama nazwa mówi otrzymaliśmy quest,
*actor_has_kolbasa - funkcja, która wie, czy mamy kiełbasę czy nie (albo zaktualizowano zadania, alebo szukamy dalej),
* function transfer_kolbasa_to_owl(first_speaker, second_speaker)
dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "kolbasa")
- funkcja dzięki której możemy ukończyć zadanie,
*dialogs.relocate_money_to_actor - funkcja dająca nagrodę (dialogs.relocate_money_to_actor(first_speaker, second_speaker, 5000) ta funkcja daje 5000 Rubli, a ta:
dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "bandage", 6)
daje sześć sztuk bandaży.
5. Wchodzimy do pliku info_zaton. Wpisujemy tam (najlepiej na samym dole) te frazy:
- Kod: Zaznacz wszystko
<info_portion id="quest_kolbasa_give"></ info_portion>
<info_portion id="quest_has_kolbasa"></ info_portion>
<info_portion id="quest_kolbasa_done"></ info_portion>
Pliki te odnoszą się do zapisu w pliku dialogs_zaton.
6. Wchodzimy do pliku tm_zaton. Wpisujemy poniższą frazę:
- Kod: Zaznacz wszystko
[quest_kolbasa_give]
icon = ui_inGame2_Put_v_pripyat
prior = 2
storyline = false
title = {= actor_has_item (kolbasa)} kolbasa_owl_prinesti_name, kolbasa_owl_naiti_name
descr = kolbasa_owl_descr
target = {= actor_has_item (kolbasa)} zat_b30_owl_stalker_trader
condlist_0 = {+ quest_kolbasa_done} complete
Funkcje fraz:
*icon = ui_inGame2_Put_v_pripyat - ikonka zadania, można wybrać inną,
*prior = 2 - zdanie przed zdaniem, w którym wzięliśmy zadanie, ja to usuwałem i zadanie działało,
*storyline = false - jeżeli jest to zadanie fabularne wpisujemy "true", jeżeli nie - "false",
*title = {= actor_has_item (kolbasa)} kolbasa_owl_prinesti_name, kolbasa_owl_naiti_name - nazwy zadania (prinesti = przynieś, naiti = znajdź) w pliku st_quest_zaton,
*descr = kolbasa_owl_descr - opis zadania w pliku st_quest_zaton,
*target = {= actor_has_item (kolbasa)} zat_b30_owl_stalker_trader - cel i klient, do którego ma trafić,
*condlist_0 = {+ quest_kolbasa_done} complete - fraza ta powoduje zaliczenie zadania
Mam nadzieję, że przyda się komuś ten tutek.
All Rights Reserved