[Tutorial] Tworzenie zadań z wykorzystaniem własnego skryptu

SoC Tutorial

Tytułem wstępu:

Niech obszerność poradnika nie zniechęca Cię - do tworzenia questu!. Aby kompleksowo opisać poszczególne etapy tworzenia zadań, nie wystarczy kilka punktów, toteż zachęcam do lektury. Poradnik umożliwia stworzenie nowego questu zarówno w Shoc jak i w Solijance, na podstawie której został napisany.
Zanim zaczniemy pracę z tworzeniem zadań, będzie nam potrzebny program/skrypt umożliwiający pokazanie game_vertex_id oraz level_vertex_id, niezbędnych dla spawnu obiektu.
Pobieramy to narzędzie modderskie:

http://sdk.stalker-game.com/en/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip

Po wypakowaniu - zawartość folderu: save_pos_patrol - wrzucamy do naszego gamedata.
Sposób użytkowania:

  • [*]wychodzimy do menu gry i wciskamy klawisz

Z - który aktywuje menu z opcją nadania nazwy dla 1 punktu. [*]lub naciskamy klawisz X - aktywujący menu, umożliwiające wpisania nazwy dla wielu punktów, co jest przydatne zwłaszcza dla tworzenia smart terrain’a.

Dane o punkcie zapisują się w logu z dużą dokładnością. Jest to wygodne o tyle, iż nie musimy spisywać z monitora długiego ciągu liczb. Wystarczy iż skopiujemy wartości, które nas interesują.

Tak przedstawia się menu powyżej omówionego narzędzia.

________________________________

Część |. - znajdź przedmiot.

Aby ułatwić sobie realizację poszczególnych punktów niniejszego opracowania, potrzebną ilość plików oraz ich wzajemne powiązanie - warto zapoznać się ze screenem:

  1. [*]Potrzebny będzie plik skryptu, który zawiera funkcję spawnu przedmiotu. (będziemy definiować funkcję). Tworzymy plik

tutorial.script i umieszczamy w katalogu gamedata/scripts. Jeśli ktoś wcześniej nie miał do czynienia z plikami, wystarczy, iż zmieni rozszerzenie z .txt na .script - nadając nazwę plikowi.
W pliku na potrzeby zadania utworzymy 3 funkcje, jednakże aby unaocznić, jakie powiązania posiadają pliki, będziemy stopniowo dodawać funkcje.
W nowo utworzonym pliku o nazwie j/w. umieszczamy funkcję:

-- Tutorialowy skrypt.function spawn_kanister()alife():create("explosive_mobiltank",vector():set(-244.069,-19.549,-128.138),12825,8)end	

Funkcja służy zespawnowaniu obiektu, w naszym przykładzie będzie to kanister z benzyną czyli explosive_mobiltank [katalog weapons]
Współrzędne w funkcji - kolejno: (poniższego wpisu nie dodawaj do skryptu)

X: -244.069Y: -19.549Z: -128.138level_vertex_id: 12825game_vertex_id: 8

[*]Potrzebny będzie plik dialogu, zawierający wpis aktywujący funkcję - character_desc_escape.xml [gamedataconfiggameplay] do którego musimy dodać nowy dialog, w naszym przykładzie Wilk będzie zlecał zadanie na przyniesienie kanistra do zasilenia generatora - stąd w/w plik. Jeśli zależy nam na innej postaci, wpis dotyczący dialogu dodajemy do pliku .xml - właściwego dla tejże postaci. [*]Znajdujemy sekcję odpowiedzialną za konfigurację Wilka, tj. esc_wolf. Interesują nas dialogi, przechodzimy do wpisu poniżej frazy , znajdziemy tam następujące wpisy:

<start_dialog>escape_lager_volk_talk</start_dialog>	<start_dialog>dm_hello_dialog</start_dialog>	<actor_dialog>dm_cool_info_dialog</actor_dialog>	<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>	<actor_dialog>tm_wolf_dialog</actor_dialog>	<actor_dialog>tm_wolf_reward</actor_dialog></specific_character>	

Dodajemy do powyższego nowy dialog, czyli poniższy wiersz:

<actor_dialog>explosive_dialog</actor_dialog>

Dialog rozpoczyna - I część zadania, w której przedmiot będzie spawnowany poprzez skrypt oraz do PDA zostanie dodany stosowny wpis w zakładce “zadania aktywne”.

[*]

Konstruujemy drzewo dialogowe zawierające “explosive_dialog”, stosowny wpis dodajemy w pliku dialogs_escape.xml [gamedataconfiggameplay]

<dialog id="explosive_dialog">  <dont_has_info>kanister_done</dont_has_info>  <dont_has_info>kanister_start</dont_has_info>	    <phrase_list>		    <phrase id="0">			    <text>explosive_dialog_0</text>	    <next>1</next>		    </phrase>		    <phrase id="1">			    <text>explosive_dialog_1</text>			    <action>tutorial.spawn_kanister</action>	    <next>2</next>		    </phrase>		    <phrase id="2">			    <text>explosive_dialog_2</text>                <give_info>kanister_start</give_info>			    <action>dialogs.break_dialog</action>                <action>tutorial.gasoline_have</action>		    </phrase>	    </phrase_list>    </dialog>

gdzie:

<dont_has_info>kanister_done</dont_has_info>

to jeden z warunków - pojawienia się dialogu. Warunek jest spełniony, gdy informacja “kanister_done”, która oznacza - wypełnienie zadania z kanistrem - nie zostanie dodana do PDA.

<dont_has_info>kanister_start</dont_has_info>

drugi warunek pojawienia się dialogu w menu, oznacza iż nie mając wpisu “kanister_start” - mamy widoczny (dostępny) dialog. Zasada podobna j/w. - brak określonych infoportion - generuje dialog. Czemu ma to służyć, hmm? - otóż patrząc na drzewo dialogowe z pkt.4 mamy wpis:

<give_info>kanister_start</give_info>

drzewo dodaje informację “kanister_start” do PDA - jeśli doprowadzimy dialog do końca, wówczas złamiemy warunek :

<dont_has_info>kanister_start</dont_has_info>

czyli będziemy mieli infoportion - i bardzo dobrze - bowiem dialog już się nie powtórzy - tylko zniknie, poprzez złamanie jednego z warunków. Chcąc pozbyć się z menu dialogowego - danej rozmowy, która już jest nieaktualna a dotyczy np. wykonanego zadania - musimy doprowadzić do takiego układu infoportion, aby warunki nie zostały powtórzone (warunki jednorazowe), czyli dodajemy poprzez <give_info> odpowiedni wpis, który stoi w sprzeczności z <dont_has_info> - czyli brakiem informacji zdefiniowanej w początkowym ustawieniu drzewa dialogowego.
Jeśli przykładowo pominę :

<dont_has_info>kanister_start</dont_has_info>

to warunek 1 zawsze będzie spełniony - ponieważ jest nim brak wpisu, a zatem dialog
będzie widoczny po zakończeniu zadania, stwarzając możliwość jego zdublowania. Bardzo ważny jest sposób w jaki skrypt jest aktywowany, przyjrzyjmy się wpisowi tutorial.spawn_kanister - wpis jest podzielony na 2 części, rozdziela kropka. Specjalnie wyróżniłem podział, również w pkt. 1 poradnika.

Część 1 - tutorial - to nazwa pliku z rozszerzeniem .script, który zawiera funkcję wywoływaną. (pkt 1. poradnika) - nowo utworzony plik skryptu (nie wpisujemy rozszerzenia pliku skryptu)
część 2 - spawn_kanister - ponieważ plik może zawierać wiele funkcji, ten wpis konkretyzuje żądane działanie, czyli spawn obiektu explosive_mobiltank. W tym przykładzie spawn następuje przy explosive_dialog_1, możemy oczywiście stworzyć bardziej rozbudowany dialog i wpis dodać w innej sekcji drzewa.

<give_info>kanister_start</give_info>

informacja dodana do PDA, infoportion omówiony dalej.

<action>dialogs.break_dialog</action>

w/w wpis ucina dialog, który byłby zapętlany - odwołanie do dialogs.script, funkcja: break_dialog

<action>tutorial.gasoline_have</action>

□****aktywuje funkcję, którą musimy utworzyć w pliku z pkt.1
Omówione w pkt.5 - gasoline_have.

<dialog id="explosive_dialog">

identyfikator dialogu, dodany w pliku character_desc_escape.xml, w naszym przykładzie, zgodnie z pkt 3.

explosive_dialog_0/explosive_dialog_1/explosive_dialog_2 - to odniesienia do tekstu zawartego w katalogu: [gamedataconfigtextpol] - pliku: stable_dialogs_escape.xml.

Uwaga: tworząc drzewo dialogowe należy zachować szyk tagów je tworzących, jeśli chcemy wkomponować wpisy pomiędzy istniejące już sekcje. Dodajemy wpisy pomiędzy kończącej, a <dialog id=" - następnej sekcji. - patrz pierwotne konfiguracje rzeczonego pliku.

[*]

Zgodnie z uwagą dotyczącą kolejnej funkcji tj. tutorial.gasoline_have
Do pliku tutorial.script, dodajemy pod poprzednią funkcją z pkt.1 - wpis, który powoduje informowanie gracza o zaliczeniu części zadania, gdy questowy item znajdzie się w ekwipunku.

-- dla infoportion_havefunction gasoline_have(task, objective)if db.actor ~= nil thenreturn db.actor:object("explosive_mobiltank") ~= nilendreturn falseend

[*]

Do pliku stable_dialogs_escape.xml [gamedataconfigtextpol], musimy dodać odniesienia: explosive_dialog_0, explosive_dialog_1, explosive_dialog_2 , które zdefiniowaliśmy poprzednio w 4 pkt. poradnika - tworząc “szkielet dialogowy”, ten rodzaj plików odpowiada za czytany tekst.

<string id="explosive_dialog_0">	    <text>Mam wrażenie, ze coś cię gryzie?</text></string><string id="explosive_dialog_1">	    <text>Skoro emocje mam wypisane na twarzy...jest sprawa, trzeba znaleźć kanister z benzyną do zasilenia agregatu w wiosce, moi ludzie są osłabieni po walce z bandytami, ale Ty wyglądasz na pełnego sił i potrzebującego pieniędzy, więc jak będzie, hmm?</text></string><string id="explosive_dialog_2">	    <text>W porządku, zdobędę ten kanister!</text></string>

____________________________________

Część ||. - przynieś przedmiot.

[*]

Tworzymy infoportion - jest to wpis bądź zbiór wpisów, które pozwalają na umiejscowienie zadania w konkretnym momencie fabuły jak również warunkujące pojawienie się zadania i jego usunięcie z menu dialogu postaci. Ponieważ omawiamy przykład dotyczy zadania na Kordonie, potrzebny plik to: info_l01escape.xml [gamedataconfiggameplay] dodajemy infoportions do w/w, czyli wpis poniższy kopiujemy.

<!-- Tutorial_test --><info_portion id="kanister_start"><task>zadanie_testowe</task></info_portion>    <info_portion id="kanister_have"></info_portion><info_portion id="kanister_done"></info_portion><!-- Tutorial_test -->

<!– sekcje które są w ten sposób oznaczone, nie są wykorzystywane, można ich używać do komentowania, oznaczania zadań etc.

info_portion id

odnosi się do wpisu (pkt. 4 poradnika -patrz: szkielet dialogowy). <give_info>kanister_start</give_info>, ta sekcja jest dodana w pliku dialogs_escape.xml. Pozostałe wpisy kanister_have oraz kanister_done stanowią istotny element poniższych wpisów (pkt.8), dlatego omówię w następnym punkcie poradnika - w kontekście przykładu.

Gdzie:

kanister_start” - wpis służący warunkowaniu pojawienia się zadania.

kanister_have” - wpis służący warunkowaniu pojawienia się zadania w odniesieniu do posiadania przedmiotu w ekwipunku, zgodnie ze zdefiniowaną funkcją - pkt.5

kanister_done” - wpis służący warunkowaniu pojawienia się zadania w odniesieniu do jego zakończenia, będziemy definiować ostatnią funkcję (pkt.11) warunkującą zakończenie misji. W/w sekcje są ściśle związane z plikiem poniższym.

[*]

Do pliku tasks_escape.xml [gamedataconfiggameplay] dodajemy wpis:

<!--Test dot. wpisów w PDA-->        <game_task id="zadanie_testowe">    <title>Znaleźć kanister z benzyną</title>    <objective>        <text>Trzeba poszukać benzyny dla agregatu w wiosce</text>        <icon>ui_iconsTotal_find_item</icon>        <infoportion_complete>kanister_done</infoportion_complete>	    <article>opis_zadania_testowego</article>    </objective>    <objective>        <text>Trzeba poszukać benzyny dla agregatu w wiosce</text>        <icon height="50" width="50" x="100" y="50">uiui_icons_task</icon>        <function_complete>tutorial.gasoline_have</function_complete>        <infoportion_set_complete>kanister_have</infoportion_set_complete>    </objective>    <objective>        <text>Dostarcz kanister Wilkowi</text>        <map_location_type hint="volk">blue_location</map_location_type>        <object_story_id>Escape_novice_lager_volk</object_story_id>        <infoportion_complete>kanister_done</infoportion_complete>    </objective>    </game_task><!--Test-->

W/w sekcja jest kluczowa dla infoportions, ponieważ wiąże określony warunek (wpisy -pkt.7 poradnika) z funkcjami, które definiowaliśmy w pkt. 1 poradnika.

Gdzie:

game_task id - dotyczy infoportion “kanister_start” - patrz pkt.7

title - to oczywiście tytuł zadania w PDA.

text - opis zadania w PDA.

icon - ikona wyświetlana w PDA np. inną mamy dla zadania zabić stalkera, inną dla znaleźć artefakt etc. Ikony znajdziemy w ui_iconstotal.dds [gamedatatexturesui]

□ infoportion_complete - wiążące wpis “kanister_done” z funkcją wykonania questu.

□ article - jest to opis szczegółowy, który pojawia się po rozwinięciu zadania w PDA.

□ icon height=“50” width=“50” x=“100” y="50 - definiuje położenie ikony z pliku ui_iconstotal.dds - o wartość odsunięcia 100 px w osi X oraz 50 w osi Y a także wysokość/szerokość ikony na 50 px.

□ function_complete - odniesienie do tutorial.script i funkcji gasoline_have, którą dodaliśmy w pkt. 5 poradnika.

□ infoportion_set_complete - wiąże infoportion kanister_have, z sprawdzeniem posiadania przedmiotu zadania - w ekwipunku i info. zwrotnego do PDA (pkt.7 połączony z pkt.1 poprzez funkcję gasoline_have.

□ map_location_type - znacznik dla postaci (mapa - PDA), dla której wykonujemy zadanie.

□ object_story_id - jest to odniesienie do pliku game_story_ids.ltx, w którym jest zapisany zleceniodawca - w naszym przykładzie - Wilk:

006    = "Escape_novice_lager_volk"

Jeśli chcemy dodać właściwy wpis, musimy odszukać ją w pliku w/w. [*]

Ponownie do pliku dialogu dialogs_escape.xml [gamedataconfiggameplay] dodajemy wpis, który będzie odpowiedzialny za 2 etap zadania, czyli rozmowa odnośnie dostarczenia przedmiotu. Do pliku dodajemy:

<dialog id = "zadanie_z_kanistrem_complete">	    <has_info>kanister_have</has_info>	    <dont_has_info>kanister_done</dont_has_info>	    <phrase_list>   		 <phrase id = "0">       		 <text>esc_kanister_complete_0</text>       		 <next>1</next>   		 </phrase>   		 <phrase id = "1">       		 <text>esc_kanister_complete_1</text>       		 <give_info>kanister_done</give_info>                <action>tutorial.gasoline_done</action>       		 <next>2</next>   		 </phrase>   		 <phrase id = "2">       		 <text>esc_kanister_complete_2</text>       		 <action>dialogs.break_dialog</action>			    </phrase>	    </phrase_list>    </dialog>

Gdzie:

□ has_info - dialog pojawi się, gdy mamy informację “kanister_have” - czyli zgodnie ze skryptem, w którym zdefiniowaliśmy funkcję oraz wiążącymi wpisami z pkt. 8 poradnika.

[*]

Musimy również dodać do pliku character_desc_escape.xml - tak samo jak w pkt.3 poradnika /sekcja dialogów Wilka/.

<actor_dialog>zadanie_z_kanistrem_complete</actor_dialog>

[*]Uzupełniamy plik tutorial.script o ostatnią funkcję, która występuje w drzewie skryptowo-dialogowym - pkt 9 poradnika - przy esc_kanister_complete_1. (poniżej funkcji już dodanych w pliku).

--- dla infoportion_donefunction gasoline_done(first_speaker, second_speaker)dialogs.relocate_item_section(first_speaker, "explosive_mobiltank", "out")dialogs.relocate_item_section(second_speaker, "wpn_spas12", "in")end   

Powyższa funkcja odpowiada za zakończenie zadania, oddanie przedmiotu i otrzymanie nagrody.

Rozważmy wpisy tworzące funkcję:
Poprzez dialog (dialogs) następuje przeniesienie przedmiotu (relocate_item_section) pomiędzy rozmówcami (first_speaker, second_speaker). Jeśli mamy wpis “out” - to oddajemy przedmiot, przy którym stoi wpis, natomiast “in” to przedmiot otrzymywany - w naszym przykładzie jest to Spas12.

[*]

Oraz uzupełniamy plik stable_dialogs_escape.xml [gamedataconfigtextpol] - jak w pkt.6

<string id="esc_kanister_complete_0">        <text>Znalazłem kanister!</text>    </string>    <string id="esc_kanister_complete_1">        <text>Dobra robota Naznaczony.</text>    </string>    <string id="esc_kanister_complete_2">        <text>Wisisz mi kolejkę stary.</text></string>

[*]

Do pliku storyline_info_escape.xml [gamedataconfiggameplay]
dodajemy (opis zgodnie z wierszem: opis_zadania_testowego - patrz pkt.8) wpis:

<article id="opis_zadania_testowego" name="new_task" article_type="task" group="new_task/0">	    <text>opis_zadania1</text></article>

[*]Powyższy plik prowadzi do spolszczenia kwestii dialogowej tj. stable_storyline_info_escape.xml [gamedataconfigtextpol] w którym dodajemy wpis:

<string id="opis_zadania1">    <text>Muszę wywiązać się z ważnego dla Wilka - zadania dostarczenia benzyny do agregatu w wiosce, tylko tak mogę udowodnić swoją wartość jako nowicjusz.</text></string>

[*]W moim przykładzie wykorzystałem kanister, toteż w pliku weapons.ltx [gamedataconfigweapons] odnajdujemy nasz przedmiot z pliku tutorial.script czyli explosive_mobiltank i zmieniamy sekcję z:

can_take            = false

na:

can_take            = true

Zmiana wpisu umożliwi zabranie przedmiotu do ekwipunku, co przedtem nie było możliwe.

Pozostaje jeszcze kwestia drugorzędna - zrobienia ikony dla kanistra, jednak to już temat innego tutoriala. Screeny prezentujące nowe zadanie:

.thumb.jpg.43be02f0834ee5274da4fe18f0d6d93e.jpg).jpg.a1c42ea6058a9dcd32e8934f836d03c2.jpg)

Jeśli ktokolwiek będzie miał - przeczytawszy powyższe wskazówki - wątpliwości dotyczące tworzenia zadań - w załączeniu pliki w formie sfinalizowanej - instalacja poprzez skopiowanie gamedata.

new_quest_tutorial.7z

Uwagi dla administracji**:** - dotyczące podobnego tematu.

Spoiler

Ponieważ podobny tutorial już został napisany, w

Tworzenie kwestu [Mod Wiki], pragnę nadmienić iż niniejsze opracowanie nie służy dublowaniu wątków. Merytoryczna część poradnika dotycząca szczegółów tworzenia własnych funkcji (skrypty) oraz zagadnień ukazujących sposób połączeń plików - dla ich poprawnego funkcjonowania - jak również przedstawiających sposób zbierania informacji o punktach terenowych - jest znacznie bardziej rozbudowana, niż ta podana w linku a odnosząca się do podobnego tematu. Chciałbym zwrócić uwagę na pewien fakt, otóż poradnik - nadmieniony w linku - nie jest kompletny, na jego podstawie nie da się zbudować nowego questu, ponieważ brakuje kilku istotnych tagów - wpisy ujęte w code. Warto sprawdzić to co mówię, porównując zawartość z artykułem, w oparciu o który - powstał.

Poradnik opracowany na podstawie plików Solijanki:

Prawa autorskie na podstawie regulaminu, pkt.1.6. - The Emperor, wyłączność: StalkerTeam.

_________________________

Autor: The Emperor dla StalkerTeam

7 polubień

Hej, The Emperor, pokusiłbyś się o napisanie tutoriala pod CoP? Może być tak jak ten, z wykorzystaniem własnego skryptu

@StalkerCell

Gdybym miał więcej czasu z chęcią napisałbym taki poradnik, mówiąc szczerze - jeszcze 2 poradniki pod Shoc czekają na napisanie, ale trudno mi “wykrzesać” nawet kilka godzin - nie tylko na napisanie, lecz również przetestowanie sposobu modyfikacji. Aktualnie wzoruję się na Solijance, jeśli chodzi o CoP - musiałbym rozłożyć dany mod na części, ponieważ to jedyny sposób by nauczyć się modować (zadania pod CoP są inaczej skonstruowane). Dam Ci radę którą ja stosuję tworząc poradnik - stosuj metodę inżynierii wstecznej jeśli potrzebujesz wiedzy już teraz, natomiast - jeśli znajdę czas, wówczas z pewnością poradnik pojawi się w dziale tutoriali.

@The Emperor - już nie potrzeba Na podstawie twojego posta i posta XMK z AMK Forum napisałem tutorial pod CoP. Wszystko działa jak należy ale muszę jeszcze ulepszyć (zespawnować przedmiot przez skrypt, a teraz mi się nie chce). Mimo to dzięki za obszerne tutoriale. Zastanawia mnie jedno - ile czasu na nie poświęciłeś :woot:

@StalkerCell.

By napisać porządny tutorial potrzeba ok. 10 do 30 godz. - włączając w to testy i przeróbki, nie chciałbym aby ktoś tracił czas na tworzenie modyfikacji, która nie będzie działać. Dobrze mieć duży mod i znać strukturę plików, ogólnie wiedzę zbieram od 2 lat - ponieważ tworzę a raczej tworzyłem (brak czasu) dużego moda. Najwięcej pracy zabiera tworzenie obozów. Bazę na 30 osób tworzy się ok. tygodnia włączając testy w cyklu dzień-noc, ostrzał obozu, ataki mutantów czy stalkerów - dopiero wówczas można powiedzieć, że dodało się obozowisko. Wszystko zależy od sumienności - jeśli szanujesz graczy napiszesz porządny poradnik, który będzie twoją wizytówką. Powodzenia w modowaniu.

1 polubienie

@The Emperor - wyciąłem wszystkie zadania i infoportiony z plików gry (chodzi mi o Stalker CoP), by zrobić nową fabułę. Może będziesz wiedział, dlatego pytam. Jak zrobić (albo lepiej - co), by nie dawało mi żadnego komunikatu, albo dawało jeden? Bo według mojego toku myślenia nie powinno dawać zadania, gdy wyciąłem wpisy infoportion, tm_zaton, tm_jupiter i tm_pripyat, a nadal daje (lecz nie pokazuje znacznika, i opisów zadania, pisze za to np. DESC_DONT_EXIST). Pomógłbyś?

Gdzie może być zawarta fabuła, hmm?

Podstawą wszelkich zadań są opcje dialogowe oferujące określone questy. Wycinając fabułę - usunąłbym dialogi odpowiedzialne za zadania, wspomniane przez Ciebie - infoportion’y oraz przeszukałbym plik all.spawn, ponieważ tam znajdują się odpowiedzialne za pojawienie się zadań aktywatory - przykładem są strefy aktywacji zadań, gdy dochodzimy do Ogończy na wzgórzu lub nawet patrząc na Shoc - strefa aktywująca licznik, gdy dochodzimy do CEA-1 i zadanie “uciec przed emisją”. Są to strefy reprezentowane przez obiekty typu:

*```
section_name = space_restrictor


o określonej logice narzucającej aktywację questu. Musiałbyś przeszukać all.spawn'a pod kątem infoportions odnoszących się do fabuły. Usunąłbym lub zakomentował pliki .**xml** w których zawarte są questy, ale nie podam Ci dokładnie jakie to muszą być pliki, ponieważ nie moduję CoP (nie mam nawet plików na dysku). Jest tutaj krótkie info o usuwaniu fabuły - **[link](http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D1%80%D0%B5%D0%B7%D0%B0%D1%82%D1%8C_%D1%81%D1%8E%D0%B6%D0%B5%D1%82#.D0.97.D0.9F)**, ale traktowałbym to jako ewentualne uzupełnienie. Linię fabularną prawdopodobnie rozpoczyna wpis w pliku **bind\_stalker.script** (trzeba sprawdzić jego zawartość pod kątem powiązania z pierwszym questem). Jeśli znajdę przydatne informacje - dam znać. W tej chwili bardziej precyzyjnie nie jestem w stanie Ci powiedzieć.

W skrócie usuwasz korelacje pomiędzy plikami:

* **all.spawn**
* **.xml -** zawierającymi infoportions
* **.xml** odpowiedzialnymi za dialogi
* **bind\_stalker.script**

@The Emperor - wczoraj pobrałem moda SZA Freeplay, uzyskałem odpowiedź na mój problem. Zadań nie ma - wystarczyło skopiować pliki gamedata/configs/scripts. No dobra, skopiowałem te pliki i dodałem nowy quest storyline - wszystko, tak jak do zadań siędodaje. Zadanie działa (aktywacja i wpis w PDA), ale opisy i tytuł są “dziwne”, bowiem pisze takie coś:

DESC_DONR_EXIST - dla opisu,

TEXT_DONT_EXIST - dla nazwy,

Być może dzieje się dlatego, że wyciąłem wszystko z wszystkich tm_lokacja i info_lokacja. Dialogi również powywalałem.

Na pierwszy rzut oka brakuje odniesienia do tekstu…

TEXT_DONT_EXIST (tekst główny) oraz DESC_DONT_EXIST (opis zadania) - to informacje które pojawiają się gdy nie istnieje powiązanie tekstu np. spolszczenia z drzewem dialogowym na którym osadzone są odniesienia do tegoż tekstu. Weźmy przykład z poradnika, otóż w pkt. 4 mamy plik:

  • dialogs_escape.xml [gamedataconfiggameplay] a wnim wpis*```
    explosive_dialog_0
  • explosive_dialog_0 - jest swoistym identyfikatorem tekstu spolszczenia występującym dla tego przykładu w pliku: stable_dialogs_escape.xml [gamedataconfigtextpol], gdzie mamy właściwy tekst:*```
    Mam wrażenie, ze coś cię gryzie?
    
    

Nie znam struktury plików CoP’a, dlatego trudno mi wskazać dokładne położenie tego tekstu - bazując jedynie na tutorialu pod Shoc. Szukałbym w/w fraz w plikach .xml, ja standardowo otwieram jednocześnie do 200 plików (Notepad ++), Ctrl + F i szukam położenia frazy w takiej sytuacji. Jesteś pewien, że wszystko dobrze połączyłeś?

Edit:

pobrałem patch 1.6.02, mam kilka plików po wypakowaniu dla wstępnej oceny problemu.

przykład na podst. pliku tm_zaton.ltx [lokalizacja: gamedataconfigsmisc]

*```
[zat_b100_heli_2_crash]icon = ui_inGame2_Skat_2prior = 104storyline = truetitle = zat_b100_heli_2_crash_namedescr = zat_b100_heli_2_crash_texttarget = zat_b100_heli_2condlist_0 = {+zat_b100_heli_2_searched} complete, {+pri_b305_actor_wondered_done} complete


w powyższym zadaniu zwróć uwagę na parametry: **title**, który odpowiada za tytuł zadania, a znajduje się w pliku **st\_quests\_zaton.xml**, wpis:

*```
<string id="zat_b100_heli_2_crash_name">        <text>Ogończa 2: zbadaj miejsce katastrofy</text>    </string>
```*

oraz parametr "**descr**" odpowiadający za opis zadania zawarty również w pliku **st\_quests\_zaton.xml** czyli wpis:

*```
<string id="zat_b100_heli_2_crash_text">        <text>Zbadaj miejsce katastrofy Ogończy 2.</text>    </string>
```*W twoim przypadku prawdopodobnie brakuje w/w powiązań - piszę prawdopodobnie ponieważ nie widziałem konstrukcji twoich zadań.  
Inny przykład do usunięte przez Ciebie infoportion.*```
[zat_b101_heli_5_crash]icon = ui_inGame2_Skat_5prior = 101storyline = truetitle = {+zat_b101_both_heli_info} zat_b101_heli_5_crash_name_03, {+zat_b101_one_heli_info -jup_b8_heli_4_searching} zat_b101_heli_5_crash_name_02, zat_b101_heli_5_crash_namedescr = {+zat_b101_both_heli_info} zat_b101_heli_5_crash_text_03, {+zat_b101_one_heli_info -jup_b8_heli_4_searching} zat_b101_heli_5_crash_text_02, zat_b101_heli_5_crash_texttarget = {+zat_b101_both_heli_info} nil, {+zat_b101_one_heli_info -jup_b8_heli_4_searching} nil, zat_b101_heli_5condlist_0 = {+pri_b305_actor_wondered_done} complete
```*

w/w znajduje się w pliku tm\_zaton.ltx  
widzimy przykładowy odnośnik do infoportion tj.

*```
{+pri_b305_actor_wondered_done}
```*

nie wiem jaki komunikat może pojawić się w sytuacji gdy zadanie zostało niewłaściwie skonfigurowane.

Przejrzyj uzupełniająco te poradniki pod CoP: **[link](http://www.moddb.com/tutorials/making-a-primitivesimple-quest)** oraz **[link2](http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%B2%D0%B5%D1%81%D1%82%D0%B0)**. Ponieważ nie mam wszystkich plików CoP'a a jedynie te z patcha - pomóc mogę połowicznie. Myślę, że usunięcie plików **tm...\*.ltx** nie było najlepszym pomysłem. Więcej czasu zajęłoby usuwanie poszczególnych sekcji - efekt byłby jednak lepszy. Jeśli tworzyłeś już zadania i były właściwie skonstruowane - odpowiedzi musisz szukać w usuniętych plikach.

No to tak:

1.Powycinałem tekst z tm_lokacja.

2.Powycinałem tekst z info_lokacja.

Przy starcie gry były właśnie te TEXT_DONT_EXIST i DESC_DONT_EXIST. To nie były opisy, gdyż dodając nowe zadanie i nadając mu opisy i nazwę było tak samo. Teraz znalazłem inny sposób:

1.Pobrałem moda SZA Freeplay (http://stalkerteam.pl/topic/6095-sza-freeplay-mod/).

2.Wyciąłem z niego plik all.spawn i configs/scripts do swojego moda. Zadania nie aktywują się.

3.Do pliku all.spawn (uprzednio dekompilując) dodałem space_restrictor z takimi samymi wartościami position, co actora.

4.Zgodnie z dodaną ścieżką w pliku alife_zaton dodałem logica, a w nim dwa zadania storyline:

*```
[logic]active = sr_idle@give_task[sr_idle@give_task]on_info = {+quest_storyline_give}on_info2 = {+quest_storyline2_give}


Nie wiem, czy jest dobrze, ponieważ logiców nigdy nie ruszałem. Jeżeli jest jakiś błąd, to popraw.

5.Dodałem zadania do pliku tm\_zaton z tymi samymi nazwami, co przy **on\_info** i **on\_info2**. Jednakże nie działa.

Jeżeli chcesz i możesz, prosiłbym o pomoc w napisaniu tego logica.

Powiedz czy wpisy: quest_storyline_give oraz quest_storyline2_give zostały dodane do pliku zawierającego infoportion’y - czyli dla zatonu: info_zaton.xml? (chyba że umieściłeś je w innym pliku?). Plik powinien zawierać zbiór zdefiniowanych dla realizacji fabuły/questów i ich aktywacji wpisy warunkujące. Jeśli tworzysz nowy infoportion definiując quest - zadbaj o dodanie go do bazy infoportion’ów gry.

Tak, infoporiony dodane. Cóż, będę musiał inaczej rozwiązać mój problem.

Mogę zajrzeć do konstrukcji zadań w CoP, ale muszę mieć pliki. Jeśli masz wypakowane pliki .db z Zewu - wyślij mi spakowane foldery: scripts, configs oraz plik alife (all.spawn) z Zatonu. Pliki mają być z oryginalnego CoP w wersji 1.6.02 - bez żadnych dodatków czy innych modów.

Mam problem. Wzorując się na przykładzie próbowałem stworzyć własne zadanie, które polega na przyniesieniu Sidorowiczowi winchestera, w którego uzbroiłem jednego z bandytów w fabryce w kordonie, edytując plik character_desc_escape. Niestety wywala mnie do pulpitu z logiem

FATAL ERROR

[error]Expression : start_node && path
[error]Function : CXml::NavigateToNode
[error]File : E:\stalker\sources\trunk\xrXMLParser\xrXMLParser.cpp
[error]Line : 97
[error]Description : NavigateToNode failed in XML file
[error]Arguments : gameplay\dialogs_escape.xml

stack trace:

Tak oto wyglądają dialogi, które dodałem w pliku dialogs_escape

<dialog id="poszukiwanie\_strzelby\_start">  
<dont\_has\_info>strzelba\_start</dont\_has\_info>  
    <phrase\_list>  
        <phrase id="1">  
            <text>poszukiwanie\_strzelby\_1</text>  
            <next>2</next>  
        </phrase>  
        <phrase id="2">  
            <text>poszukiwanie\_strzelby\_2</text>  
            <next>3</next>  
        </phrase>  
        <phrase id="3">  
            <text>poszukiwanie\_strzelby\_3</text>  
            <give\_info>strzelba\_start</give\_info>  
            <action>dialogs.break\_dialog</action>  
        </phrase>  
    </phrase\_list>  
</dialog>  
<dialog id="poszukiwanie\_strzelby\_complete">  
    <has\_info>strzelba\_have</has\_info>  
    <dont\_has\_info>strzelba\_done</dont\_has\_info>  
    <phrase\_list>  
        <phrase id="1">  
            <text>poszukiwanie\_strzelby\_complete\_1</text>  
            <next>2</next>  
        </phrase>  
        <phrase id="2">  
            <text>poszukiwanie\_strzelby\_complete\_2</text>  
            <give\_info>strzelba\_done</give\_info>  
            <action>Moje\_zadania\_kordon.strzelba\_done</action>  
            <action>dialogs.break\_dialog</action>  
        </phrase>  
    </phrase\_list>  
</dialog>

A tutaj plik script

– dla infoportion_have
function strzelba_have(task, objective)
if db.actor ~= nil then
return db.actor:object(“wpn_wincheaster1300”) ~= nil
end
return false
end

— dla infoportion_done
function strzelba_done(first_speaker, second_speaker)
dialogs.relocate_item_section(first_speaker, “wpn_wincheaster1300”, “out”)
dialogs.relocate_item_section(second_speaker, “wpn_spas12”, “in”)
dialogs.relocate_item_section(second_speaker, “wpn_beretta”, “in”)
dialogs.relocate_item_section(second_speaker, “ammo_9x19_fmj”, “in”)
end

Do czego służy plik game_story_ids.ltx, który jest w gamedacie z zadaniem do pobrania? Co tam trzeba zedytować?

Log sugeruje, że masz zapętlone odwołania. Podziel to co zrobiłeś na mniejsze kawałki i sprawdzaj kiedy wywali grę, będziesz wiedział w którym miejscu szukać problemu.

1 polubienie

Witam!

Mam pytanie odnośnie edytowania zadań, czy jest możliwe zamknięcie aktywnego zadania(zmienienie w plikach na wykonanie)?

Mam problem z zadaniem na wódkę dla Kuzniecowa, po powrocie z Agropromu na Kordon kropnełem go bo do mnie strzelał, wódkę mam ale zadanie nie jest zaliczone bo mu jej nie oddałem. Zadanie olałem i doszedłem do Wschodniej Prypeci i okazuje się że zaliczam error(nie otwiera mi się przejście na Jupiter) ze względu na nie wiszące zadanie dla Kuzniecowa. Czy gdzieś w plikach można zmienić to zadanie na ''done"?

@tomlopag Serwus.
Nie wiem, czy grzebanie przy takich rzeczach nie jest trochę ryzykowne, zwłaszcza w modach i nie lepiej cofnąć się w zapisach.

Specjalistką żadną też nie jestem, kojarzę tylko, że przy Anomaly często używali takiego wpisu w trybie debugowania:
task_manager.get_task_manager():set_task_completed(“znacznik zadania”)
Jednak nie mam pojęcia czy to zadziała gdzie indziej :confused:

1 polubienie

@MetaSiema!

Jak nie sprawdzę to się nie dowiem;-) Cofać mi się nie chce bo jestem już parę ładnych zadań od Kuzniecowa(a to praktycznie trzeba zaczynać grę od nowa)

A kojarzysz ścieżkę do konkretnego task_menager? Może wykażę się laicyzmem ale co znaczy “używać wpisu w trybie debugowania”

@tomlopag Wnioskuję po Twoich postach, że tu chodzi konkretnie o NS. Nie znam kompletnie tego moda, więc ciężko będzie pomóc, bo nie wiem nawet na ile ma pozmienianą strukturę plików i na ile ta struktura jest delikatna, w końcu to kolos, więc strach kombinować. Nie wiem też, czy w NS w ogóle jest tryb debugowania, takie mody jak CoC i Anomaly to miały raczej specjalne zmiany w silniku, no i jak to wygląda z anticheatem. Może dałoby się to obejść z jakimś modem umożliwiającym cziterkę :thinking:
‘Pogooglam’ potem ten konkretny przypadek, ale na pierwszy rzut oka to widzę, że na wschodnich stronach ludzie każą się cofać/zaczynać od nowa.

Dzięki za odpowiedź, próbuję coś wykombinować aby się nie wracać tak daleko. NS faktycznie jest wielkim modem i jest gdzie szukać, biorąc na zdrowy chłopski rozum musi gdzieś być plik w którym gra zapisuje wykonane zadania, nie wykonane i w toku. Jeśli by się udało nawet przez małe oszustwo pchnąć dalej grę byłoby super.

Ja niestety nie poszukam nic na wschodnich stronach bo ze znajomością rus nie jest u mnie najlepiej pomimo że do szkoły podstawowej chodziłem gdy ten język był obowiązkowy:-)