Skocz do zawartości

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


Rekomendowane odpowiedzi

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ą.
 
bce57c261630504.jpg
 
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:

 

post-3466-0-03221700-1371972451_thumb.pn

 

  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 </supplies> , 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 <action>tutorial.spawn_kanister</action> - 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 </dialog> 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: <article>opis_zadania_testowego</article> - 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:

 

1.jpg2.jpg1ce2f9261645843 ).jpg
e8777e261645848.jpgf15952261645850.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

tym temacie, 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

  • Dodatnia 7
Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 miesiące temu...

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

Odnośnik do komentarza
Udostępnij na innych stronach

@The Emperor - już nie potrzeba :smile: 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:

Odnośnik do komentarza
Udostępnij na innych stronach

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

  • Dodatnia 1
Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 tygodnie później...

@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 :sad:(lecz nie pokazuje znacznika, i opisów zadania, pisze za to np. DESC_DONT_EXIST). Pomógłbyś?

Odnośnik do komentarza
Udostępnij na innych stronach

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, 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
Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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
    <text>explosive_dialog_0</text>
  • 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:
    <text>Mam wrażenie, ze coś cię gryzie?</text>
    - pkt. 6 poradnika

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 oraz link2. 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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 lata później...

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ć?

Odnośnik do komentarza
Udostępnij na innych stronach

  • 6 miesięcy temu...

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"?

Odnośnik do komentarza
Udostępnij na innych stronach

@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 😕 

  • Dodatnia 1
Odnośnik do komentarza
Udostępnij na innych stronach

@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"

Odnośnik do komentarza
Udostępnij na innych stronach

@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ę :063:
'Pogooglam' potem ten konkretny przypadek, ale na pierwszy rzut oka to widzę, że na wschodnich stronach ludzie każą się cofać/zaczynać od nowa.

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

@tomlopag ostatnio w tematach OP 2.2 widziałem parę rozmów o zaliczaniu różnych zadań np:

Czy też 

Może ci to za wiele nie pomoże ale chociaż zobaczysz jak wygląda schemat zadań i warunki jakie trzeba spełniać żeby je zaliczać, pewnie jakby człowiek bardziej poszukał to by jeszcze coś znalazł.

Odnośnik do komentarza
Udostępnij na innych stronach

@tom3kbDzięki za próbę pomocy ale pomimo zmiany w plikach dialogu z Kuzniecowem nic nie pomogło. Wszystkie zadania zmieniłem na w wykonane w gamedata a zadanie w PDA dalej wisi jako nie wykonane. Może jeszcze któregoś dnia coś poszukam a jak nie to nic mi nie pozostanie jak zaczynanie od nowa:-(

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Korzystając z tej strony, zgadzasz się na nasze Warunki użytkowania.