[TUTORIAL] Stalker CoP - dodawanie zadań

[TUTORIAL] Stalker CoP - dodawanie zadań

Postprzez StalkerCell w 26 Paź 2013, 16:08

Stalker Zew Prypeci – dodawanie zadań z wykorzystaniem własnego skryptu
Jak 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,
*info_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

Za ten post StalkerCell otrzymał następujące punkty reputacji:
Positive Junx, Pangia.
Awatar użytkownika
StalkerCell
Weteran

Posty: 575
Dołączenie: 17 Lut 2013, 17:06
Ostatnio był: 06 Kwi 2021, 01:46
Miejscowość: Paniewo
Frakcja: Samotnicy
Ulubiona broń: Akm 74/2
Kozaki: 57

Reklamy Google

Re: [TUTORIAL] Stalker CoP - dodawanie zadań

Postprzez Pangia w 26 Paź 2013, 17:10

Jeszcze przydałby się osobny tutek co do dialogów - jak dodawałem bronie Żwawemu, to najwięcej problemów miałem właśnie z dialogami. Ostatecznie udało mi się je zrobić (wzorowałem się na tym, co już było w grze), tylko w sumie nie wiem do końca, co czemu odpowiada. Np. po co jest <has_info>, <dont_has_info>, <give_info> itp.
Proszę państwa, sto pięćdziesiąt kilometrów na godzinę w ciągu kilku sekund, wspaniały wynik. Gdyby w ten sposób można było wypie*dolić z polskiej polityki tych wszystkich śmieci z Okrągłego Stołu, Leszka Millera, byłoby… cudownie i każdemu bym ku*wa kupił po takim Ferrari, byleby w piz*u pojechali tym PROSTO do swojego ukochanego… Izraela. SYJONIŚCI Europy, jedźcie do siebie! Pozdrawiam, Zbigniew Stonoga. Nie jestem antysemitą!
Awatar użytkownika
Pangia
Monolit

Posty: 4280
Dołączenie: 27 Maj 2012, 10:49
Ostatnio był: 28 Lis 2017, 19:49
Miejscowość: Kukle Karakańskie
Ulubiona broń: TOZ34
Kozaki: 854

Re: [TUTORIAL] Stalker CoP - dodawanie zadań

Postprzez StalkerCell w 26 Paź 2013, 17:20

To są infoportion. Przykład - jeżeli w pierwszym zdaniu masz <dont_has_info> w pierwszym zdaniu, a w ostatnim <give_info> to znaczy, że dialog już się nie pojawi, jak raz go przeczytałeś.
Awatar użytkownika
StalkerCell
Weteran

Posty: 575
Dołączenie: 17 Lut 2013, 17:06
Ostatnio był: 06 Kwi 2021, 01:46
Miejscowość: Paniewo
Frakcja: Samotnicy
Ulubiona broń: Akm 74/2
Kozaki: 57

Re: [TUTORIAL] Stalker CoP - dodawanie zadań

Postprzez Pangia w 26 Paź 2013, 17:22

Czyli dialogi u Żwawego mają mieć tylko <dont_has_info>?
Proszę państwa, sto pięćdziesiąt kilometrów na godzinę w ciągu kilku sekund, wspaniały wynik. Gdyby w ten sposób można było wypie*dolić z polskiej polityki tych wszystkich śmieci z Okrągłego Stołu, Leszka Millera, byłoby… cudownie i każdemu bym ku*wa kupił po takim Ferrari, byleby w piz*u pojechali tym PROSTO do swojego ukochanego… Izraela. SYJONIŚCI Europy, jedźcie do siebie! Pozdrawiam, Zbigniew Stonoga. Nie jestem antysemitą!
Awatar użytkownika
Pangia
Monolit

Posty: 4280
Dołączenie: 27 Maj 2012, 10:49
Ostatnio był: 28 Lis 2017, 19:49
Miejscowość: Kukle Karakańskie
Ulubiona broń: TOZ34
Kozaki: 854

Re: [TUTORIAL] Stalker CoP - dodawanie zadań

Postprzez StalkerCell w 26 Paź 2013, 17:37

Kod: Zaznacz wszystko
<dialog id="nazwa_dialogu">
   [b]<dont_has_info>dał_broń_give</dont_has_info>[/b]
                <phrase_list>
                    <phrase id="0">
                        <text>daj_broń_0</text>
                        <next>1</next>
                    </phrase>
                    <phrase id="1">
                        <text>daj_broń_1</text>
                        <next>3</next>
                    </phrase>
                    <phrase id="2">
                        <text>daj_bron_2</text>
                        [b]<give_info>dał_broń_give</give_info>[/b]
                        [b]<action>skrypt.give_broń</action>[/b]
                    </phrase>
                </phrase_list>
            </dialog>


Jeżeli będzie <dont_has_info>dał_broń_give</dont_has_info> i <give_info>dał_broń_give</give_info> to dialog już się nie pojawi, bo złamiemy pewien warunek. Jeżeli będzie <action>skrypt.give_broń</action> to da nam broń (trzeba wpisać jej nazwę systemową).
Awatar użytkownika
StalkerCell
Weteran

Posty: 575
Dołączenie: 17 Lut 2013, 17:06
Ostatnio był: 06 Kwi 2021, 01:46
Miejscowość: Paniewo
Frakcja: Samotnicy
Ulubiona broń: Akm 74/2
Kozaki: 57

Re: [TUTORIAL] Stalker CoP - dodawanie zadań

Postprzez Pangia w 26 Paź 2013, 20:37

Dobra, i tak dalej niewiele z tego rozumiem (to z <action> chyba kapuję - piszemy skrypt, w którym NPC daje nam broń i później to z <action> się do niego odnosi), ale z tamtym dalej nic. No, trudno, jakby co, to będę się wzorował na tym, co już zrobiłem.
A w ogóle to jest o tym tutek? Kurde, może też bym zrobił. :P
Proszę państwa, sto pięćdziesiąt kilometrów na godzinę w ciągu kilku sekund, wspaniały wynik. Gdyby w ten sposób można było wypie*dolić z polskiej polityki tych wszystkich śmieci z Okrągłego Stołu, Leszka Millera, byłoby… cudownie i każdemu bym ku*wa kupił po takim Ferrari, byleby w piz*u pojechali tym PROSTO do swojego ukochanego… Izraela. SYJONIŚCI Europy, jedźcie do siebie! Pozdrawiam, Zbigniew Stonoga. Nie jestem antysemitą!
Awatar użytkownika
Pangia
Monolit

Posty: 4280
Dołączenie: 27 Maj 2012, 10:49
Ostatnio był: 28 Lis 2017, 19:49
Miejscowość: Kukle Karakańskie
Ulubiona broń: TOZ34
Kozaki: 854

Re: [TUTORIAL] Stalker CoP - dodawanie zadań

Postprzez StalkerCell w 26 Paź 2013, 20:50

Tutek z AMK

Tutek ze STALKER Team

Ja z nich się nauczyłem. W tutku ze STALKER Team są opisane wszystkie funkcje.
Awatar użytkownika
StalkerCell
Weteran

Posty: 575
Dołączenie: 17 Lut 2013, 17:06
Ostatnio był: 06 Kwi 2021, 01:46
Miejscowość: Paniewo
Frakcja: Samotnicy
Ulubiona broń: Akm 74/2
Kozaki: 57


Powróć do Tutoriale

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość