Postanowiłem napisać ten tutorial(albo raczej taki mini-artykuł),który wyjaśni wszystkie problemy,które pojawiają się po stworzeniu dialogu i zadania.A więc krótki wstęp:
Easy dialog maker 3.1 to program stworzony przez Bucika bardzo ułatwiający tworzenie dialogów,a co za tym idzie również zadań.Każdy,kto ma problemy ze zrozumieniem tutoriali na temat tworzenia dialogów i zadań powinien zapoznać się z tym programem.
A więc na początek musimy ściągnąć ten program(jest w 3 wersjach językowych,w tym polskiej).Program jest na forum w dziale download->programy.Można go wypakować gdzie się chce.Zrobię kilka screenów,bo nie chce mi się wszystkiego przepisywać.
A więc 1 co widzimy po uruchomieniu programu:

Panel główny-tutaj jedynie co zmieniamy to:
opcja kradzieży u npc'a,
[description]nazwę opcji dialogowej,czyli np.w menu wyboru opcji dialogowej będzie "1.Kim jesteś?"
kod postaci,
do której części gothica tworzymy dialog
[important]to,czy npc ma sam do nas zagadać(opcja true),sami mamy zagadać(opcja false),[pernament]czy daną opcję dialogową możemy wybierać cały czas lub tylko jeden(opcja false=jeden raz,true=aż do śmierci^^)
[Trade]czyli czy możemy handlować z tą postacią(ja tego nie preferuję,no ale każdy zrobi co chce)
No to teraz drugie okienko-warunki.Tutaj akurat po najechaniu nad daną opcję wszystko jest ładnie opisane,więc wrócę do tego okna przy tłumaczeniu,jak zrobić własne zadanie"

Teraz 3 zakładka(i ostatnia,którą omawiam,a gdyby ktoś chciał zaktualizować o zakładkę 4,czyli choices to niech pisze w tym temacie)-rozmowa.I tu zaczynają się jaja:P

Dobra no to przechodzimy teraz do konkretów.
F1 służy do przełączania rozmówcy.Możemy wpisać dużo dialogów,ale tak na próbę polecam od 4-6 dialogów podczas 1 opcji dialogowej.
Klikając na "Dodaj czynność do dialogu"dochodzimy do najlepszej funkcji programu,czyli do tworzenia zadań.
Spróbuję w skrócie objaśnić co i jak,a na końcu wkleję swój skrypt(w pełni działający!).
A więc 1 zakładka to "Daj przedmiot".Tutaj jest opcja dawania przedmiotu npc'owi bądź otrzymania od npc'a.Klikając w "..." możemy wybrać jaki przedmiot mamy otrzymać/przekazać oraz jego ilość.Za każdym razem,jeśli chcemy dodać przedmiot to musimy dać "..."i opcję "Dodaj"
Druga zakładka to opcje zadania-tutaj zaczynają się schody,ponieważ po stworzeniu zadania i tak musimy sami przerobić plik.A więc aby zacząć zadanie wybieramy pozycję "Rozpocznij".
W nazwie zadania wpisujemy obojętnie jaką nazwę(bez polskich znaków i odstępów!)czyli np.możemy wpisać Diego_Miecz.Obok jest opcja premia doświadczenia-tutaj polecam odznaczyć tę opcję(przynajmniej przy pierwszym dialogu)bo inaczej za samą rozmowę dostajemy podaną ilość doświadczenia.
Treść wpisu do dziennika-tutaj już możemy użyć polskich znaków,odpowiada za wpis,który się pokazuje po naciśnięciu na nazwę zadania oraz to,co tam jest napisane.
Teraz przejdę do niższej "opcji"czyli "Wpis do LOG_Constants".Tutaj mamy do wyboru między innymi:
Wyświetlana nazwa zadania-czyli jaka będzie pokazana w grze(można używać polskich znaków).Po wpisaniu nazwy generujemy wpis i ręcznie(!)kopiujemy go do LOG_Constants_Mattes.Później klikamy na "Dodaj"i dzięki temu mamy rozpoczęte zadanie.Od razu napiszę co musimy skasować,bo w sytuacji,kiedy to mamy,wyskakuje w cholerę błędów.A więc po stworzeniu zadania mamy takie coś:
var int MIS_Diego_Miecz;
MIS_Diego_Miecz = LOG_RUNNING;
Log_CreateTopic (TOPIC_Diego_Miecz, LOG_MISSION);
Log_SetTopicStatus (TOPIC_Diego_Miecz, LOG_RUNNING);
B_LogEntry (TOPIC_Diego_Miecz,"Kapłanka Verssi zleciła mi zadanie znalezienia 10 starych monet.");
Usuwamy "var int MIS_Diego_Miecz oraz MIS_Diego_Miecz= LOG_RUNNING).Po usunięciu tego nie będzie błędów związanych z tworzeniem zadań.
Teraz tworzymy następny dialog,w którym damy zakończenie zadania.Czyli wchodzimy w warunki i:
Wybieramy pozycję "Jeśli z kimś rozmawialiśmy"i tam powinniśmy wpisać opcję dialogową,która zapoczątkowała zadanie(czyli np.Jeśli zadanie zapoczątkowało się w DIA_Diego_HELLO1 to w wolne miejsce wpisujemy DIA_Diego_HELLO1).Jeśli mieliśmy przynieść jakiś przedmiot npc'owi to wybieramy następnie opcję "Jeśli mamy przedmiot"i wybieramy other(czyli bohater musi mieć go w ekwipunku),później wybieramy instancję przedmiotu klikając w "..."bądź wpisując własną(np.ja mam zbroję z gothica 1 i ustawiłem sobie kod na przyzwanie pancerza Ore_Armor_M)a następnie wpisujemy,ile przedmiotów musimy mieć,by zakończyć zadanie.Po wybraniu wszystkiego dajemy dodaj i przechodzimy do panelu głównego,a następnie dajemy dodaj opcję dialogową i zapisujemy skrypt.
I teraz najważniejsze-program "rozwala"skrypty więc musimy sami co nieco pozmieniać(szczególne podziękowania dla Jendrzejsa,ponieważ to on mnie o tym uświadomił).
Teraz wkleję dwa skrypty dialogu-jeden nie powodujący błędów i jeden powodujący błędy.
Najpierw zacznę od tego z błędami:
//========================================
//-----------------> OPCJA *KONIEC*
//========================================
INSTANCE DIA_Ash_EXIT(C_INFO)
{
npc = VLK_1009_Ash;
nr = 999;
condition = DIA_Ash_EXIT_Condition;
information = DIA_Ash_EXIT_Info;
permanent = TRUE;
description = "KONIEC";
};
FUNC INT DIA_Ash_EXIT_Condition()
{
return TRUE;
};
FUNC VOID DIA_Ash_EXIT_Info()
{
AI_StopProcessInfos (self);
};
//========================================
//-----------------> HELLO1
//========================================
INSTANCE DIA_Ash_HELLO1 (C_INFO)
{
npc = VLK_1009_Ash;
nr = 1;
condition = DIA_Ash_HELLO1_Condition;
information = DIA_Ash_HELLO1_Info;
permanent = FALSE;
description = "Kim jesteś?";
};
FUNC INT DIA_Ash_HELLO1_Condition()
{
return TRUE;
};
FUNC VOID DIA_Ash_HELLO1_Info()
{
AI_Output (other, self ,"DIA_Ash_HELLO1_15_01"); //Kim jesteś?
AI_Output (self, other ,"DIA_Ash_HELLO1_03_02"); //Człowiekiem.
AI_Output (other, self ,"DIA_Ash_HELLO1_15_03"); //A co robisz?
AI_Output (self, other ,"DIA_Ash_HELLO1_03_04"); //Pierdzę.
};
//========================================
//-----------------> HELLO2
//========================================
INSTANCE DIA_Ash_HELLO2 (C_INFO)
{
npc = VLK_1009_Ash;
nr = 2;
condition = DIA_Ash_HELLO2_Condition;
information = DIA_Ash_HELLO2_Info;
permanent = FALSE;
description = "Masz dla mnie jakieś zadanie?";
};
FUNC INT DIA_Ash_HELLO2_Condition()
{
return TRUE;
};
FUNC VOID DIA_Ash_HELLO2_Info()
{
AI_Output (other, self ,"DIA_Ash_HELLO2_15_01"); //Masz dla mnie jakieś zadanie?
AI_Output (self, other ,"DIA_Ash_HELLO2_03_02"); //No pewnie.Przynieś mi piwo.
AI_Output (other, self ,"DIA_Ash_HELLO2_15_03"); //Ok postaram się.
AI_Output (self, other ,"DIA_Ash_HELLO2_03_04"); //Tylko się pośpiesz!
var int MIS_Piwo_Asha;
MIS_Piwo_Asha = LOG_RUNNING;
Log_CreateTopic (TOPIC_Piwo_Asha, LOG_MISSION);
Log_SetTopicStatus (TOPIC_Piwo_Asha, LOG_RUNNING);
B_LogEntry (TOPIC_Piwo_Asha,"Mam przynieść piwo.");
};
//========================================
//-----------------> HELLO3
//========================================
INSTANCE DIA_Ash_HELLO3 (C_INFO)
{
npc = VLK_1009_Ash;
nr = 3;
condition = DIA_Ash_HELLO3_Condition;
information = DIA_Ash_HELLO3_Info;
permanent = FALSE;
description = "Mam piwo.";
};
FUNC INT DIA_Ash_HELLO3_Condition()
{
if (Npc_KnowsInfo (other, DIA_Ash_HELLO2))
&& (Npc_HasItems (other, ItFo_Beer) >=1)
{
return TRUE;
};
};
FUNC VOID DIA_Ash_HELLO3_Info()
{
AI_Output (other, self ,"DIA_Ash_HELLO3_15_01"); //Mam piwo.
AI_Output (self, other ,"DIA_Ash_HELLO3_15_02"); //To dawaj.
AI_Output (other, self ,"DIA_Ash_HELLO3_15_03"); //Trzymaj.
AI_Output (self, other ,"DIA_Ash_HELLO3_03_04"); //Jednak na coś się przydałeś.
B_GiveInvItems (other, self, ItFo_Beer, 1);
CreateInvItems (self, ItMi_Gold, 50);
B_GiveInvItems (self, other, ItMi_Gold, 50);
B_LogEntry (TOPIC_Piwo_Asha,"Przyniosłem piwo Ashowi.");
Log_SetTopicStatus (TOPIC_Piwo_Asha, LOG_SUCCESS);
MIS_Piwo_Asha = LOG_SUCCESS;
B_GivePlayerXP (500);
AI_StopProcessInfos (self);
};
// *Script was make in Easy Dialog Maker (EDM)
Po wklejeniu poprawnego napiszę,co powodowało błędy.
Czyli teraz poprawny:
//========================================
//-----------------> OPCJA *KONIEC*
//========================================
INSTANCE DIA_Ash_EXIT(C_INFO)
{
npc = VLK_1009_Ash;
nr = 999;
condition = DIA_Ash_EXIT_Condition;
information = DIA_Ash_EXIT_Info;
permanent = TRUE;
description = "KONIEC";
};
FUNC INT DIA_Ash_EXIT_Condition()
{
return TRUE;
};
FUNC VOID DIA_Ash_EXIT_Info()
{
AI_StopProcessInfos (self);
};
//========================================
//-----------------> HELLO1
//========================================
INSTANCE DIA_Ash_HELLO1 (C_INFO)
{
npc = VLK_1009_Ash;
nr = 1;
condition = DIA_Ash_HELLO1_Condition;
information = DIA_Ash_HELLO1_Info;
permanent = FALSE;
description = "Kim jesteś?";
};
FUNC INT DIA_Ash_HELLO1_Condition()
{
return TRUE;
};
FUNC VOID DIA_Ash_HELLO1_Info()
{
AI_Output (other, self ,"DIA_Ash_HELLO1_15_01"); //Kim jesteś?
AI_Output (self, other ,"DIA_Ash_HELLO1_03_02"); //Człowiekiem.
AI_Output (other, self ,"DIA_Ash_HELLO1_15_03"); //A co robisz?
AI_Output (self, other ,"DIA_Ash_HELLO1_03_04"); //Pierdzę.
};
//========================================
//-----------------> HELLO2
//========================================
INSTANCE DIA_Ash_HELLO2 (C_INFO)
{
npc = VLK_1009_Ash;
nr = 2;
condition = DIA_Ash_HELLO2_Condition;
information = DIA_Ash_HELLO2_Info;
permanent = FALSE;
description = "Masz dla mnie jakieś zadanie?";
};
FUNC INT DIA_Ash_HELLO2_Condition()
{
return TRUE;
};
FUNC VOID DIA_Ash_HELLO2_Info()
{
AI_Output (other, self ,"DIA_Ash_HELLO2_15_01"); //Masz dla mnie jakieś zadanie?
AI_Output (self, other ,"DIA_Ash_HELLO2_03_02"); //No pewnie.Przynieś mi piwo.
AI_Output (other, self ,"DIA_Ash_HELLO2_15_03"); //Ok postaram się.
AI_Output (self, other ,"DIA_Ash_HELLO2_03_04"); //Tylko się pośpiesz!
Log_CreateTopic (TOPIC_Piwo_Asha, LOG_MISSION);
Log_SetTopicStatus (TOPIC_Piwo_Asha, LOG_RUNNING);
B_LogEntry (TOPIC_Piwo_Asha,"Mam przynieść Ashowi piwo");
};
//========================================
//-----------------> HELLO3
//========================================
INSTANCE DIA_Ash_HELLO3 (C_INFO)
{
npc = VLK_1009_Ash;
nr = 3;
condition = DIA_Ash_HELLO3_Condition;
information = DIA_Ash_HELLO3_Info;
permanent = FALSE;
description = "Mam piwo.";
};
FUNC INT DIA_Ash_HELLO3_Condition()
{
if (Npc_KnowsInfo (other, DIA_Ash_HELLO2))
&& (Npc_HasItems (other, ItFo_Beer) >=1)
{
return TRUE;
};
};
FUNC VOID DIA_Ash_HELLO3_Info()
{
AI_Output (other, self ,"DIA_Ash_HELLO3_15_01"); //Mam piwo.
AI_Output (self, other ,"DIA_Ash_HELLO3_03_02"); //To dawaj.
AI_Output (other, self ,"DIA_Ash_HELLO3_15_03"); //Trzymaj.
AI_Output (self, other ,"DIA_Ash_HELLO3_03_04"); //Jednak na coś się przydałeś.
AI_Output (self, other ,"DIA_Ash_HELLO3_03_05"); //Masz w nagrodę 50 sztuk złota.
B_LogEntry (TOPIC_Piwo_Asha,"Przyniosłem piwo Ashowi");
Log_SetTopicStatus (TOPIC_Piwo_Asha, LOG_SUCCESS);
B_GivePlayerXP (500);
B_GiveInvItems (other, self, ItFo_Beer, 1);
CreateInvItems (self, ItMi_Gold, 50);
B_GiveInvItems (self, other, ItMi_Gold, 50);
};
No więc co było problemem w tym pierwszym skrypcie?Pozwólcie,że wymienię:
W HELLO2 problemem były dwie linijki czyli:
var int MIS_Piwo_Asha;
MIS_Piwo_Asha = LOG_RUNNING;
Tego nie powinno być.
W HELLO3 natomiast problemy sprawiały 2 linijki:
MIS_Piwo_Asha = LOG_SUCCESS;
Oraz na samym końcu // *Script was make in Easy Dialog Maker (EDM)-te linijki uniemożliwiały stworzenie/dodanie dialogów i zadań w grze.Czyli po stworzeniu dialogów,a więc i zadań kasujemy z pliku następujące linijki:
// *Script was make in Easy Dialog Maker (EDM)
MIS_Piwo_Asha = LOG_SUCCESS;
var int MIS_Piwo_Asha;
MIS_Piwo_Asha = LOG_RUNNING;
Po tym pozostaje skopiować np.na pulpit plik dialogu jakiejś innej osoby(np.harada),skopiować(oczywiście przy otwartym notatniku,zakładając,że go używamy do edycji skryptów itp.)oraz wkleić swój poprawny dialog,a następnie zmienić nazwę np.z DIA_VLK_412_Harad na DIA_VLK_1009_Ash.Teraz podam mój sposób na to,by dialogi wraz z zadaniem były w grze:
Uruchamiamy spacera i dajemy World->Reparse Script i wybieramy plik gothic.src.Jak skończy naprawianie skryptów,to wyłączamy spacera i uruchamiamy go ponownie.Później kasujemy pliki ou.bin i ou.scsl z folderu cutscene i w oknie spacera wybieramy update i czekamy aż skończy aktualizację,po czym dajemy save.Taka mała uwaga(być może u mnie tylko są z tym problemy,ale tak na przyszłość).Mi się zdarza przy aktualizacji zawiesić spacer całkowicie i nic nie można zrobić jak tylko w menadżerze zadań wybrać "Zakończ proces".Więc ja mam na to taki sposób:
Uruchamiam spacera i wybieram repars script(plik gothic.src),a po naprawie wyłączam go i włączam ponownie.Następnie daję update,a jak mi się zatnie to daję "Zakończ proces"i znowu po uruchomieniu spacera daje opcję reparse script i update(i tak dopóki się nie zaktualizuje bez zawieszania).Po wszystkim w programie Gothic VDFS tworzymy paczkę z modem(dodajemy do niej pliki gothic.dat i ou.bin).Po wszystkim uruchamiamy grę z opcją reparse script(oczywiście wybieramy z gothic startera własny mod)i...szukamy npc'a bądź przyzywamy go kodem i się cieszymy z naszych własnych dialogów i zadań:)
Do moderatorów/adminów-jeśli był podobny temat to przepraszam,ale pomyślałem,że napiszę tutorial do tego programu(i od razu jak stworzyć moda^^),ponieważ to jest łatwiejszy sposób na stworzenie dialogów(jedynie wymaga niewielkiej poprawy po stworzeniu skryptu w programie).I jeszcze jedna prośba do was o wielcy moderzy/admini-nie zamykajcie tego tematu,bo jak ktoś będzie miał problemy,to niech tutaj pisze(w tym temacie).
Kopiowanie dozwolone,wpiszcie tylko mnie jako autora/współautora.