Dialogi 67840 22

O temacie

Autor

Zaczęty 20.01.2008 roku

Wyświetleń 67840

Odpowiedzi 22

Kazzmir
  • Gość

Kazzmir
Gość

Dialogi
2008-01-20, 21:54(Ostatnia zmiana: 2009-07-06, 14:42)
Cytat: dekster17 link=topic=101.msg73250#msg73250 date=Nov 4 2007, 19:43\'
To nie będzie tutek jak napisać od podstaw dialog, ale raczej wyjaśnienie, ale można go używać jako tutka jak zrobić dialog.

Będę wyjaśniał wszystko na podstawie dialogu kolesia o imieniu Gorr. Niektóre wypowiedzi mogą być dość dziwne, ale to tylko przykład.

Cały dialog wygląda tak:

// ************************************************************
// EXIT
// ************************************************************

INSTANCE DIA_GORR_EXIT(C_INFO)
{
npc = Kdf_9002_Gorr;
nr = 999;
condition = DIA_GORR_EXIT_Condition;
information = DIA_GORR_EXIT_Info;
permanent = 1;
description = DIALOG_ENDE;
};  

FUNC INT DIA_GORR_EXIT_Condition()
{
return 1;
};

FUNC VOID DIA_GORR_EXIT_Info()
{
AI_StopProcessInfos (self);
};

// ************************************************************
// Hallo
// ************************************************************

INSTANCE DIA_GORR_Hello (C_INFO)
{
npc = Kdf_9002_Gorr;
nr = 1;
condition = DIA_GORR_Hello_Condition;
information = DIA_GORR_Hello_Info;
permanent = 0;
description = "Witaj. Kim jesteś?";
};  

FUNC INT DIA_GORR_Hello_Condition()
{
return 1;
};

FUNC VOID DIA_GORR_Hello_Info()
{
AI_Output (other, self,"DIA_GORR_Hello_15_00"); //Witaj. Kim jesteś?
AI_Output (self, other,"DIA_GORR_Hello_13_01"); //Mam na imię Gorr. Jestem strażnikiem tego obozu.
AI_Output (other, self,"DIA_GORR_Hello_15_02"); //A cóż to za obóz?
AI_Output (self, other,"DIA_GORR_Hello_13_03"); //To obóz Magów Czarnego Ognia.
};

// ************************************************************
// What
// ************************************************************

INSTANCE DIA_GORR_What (C_INFO)
{
npc = Kdf_9002_Gorr;
nr = 2;
condition = DIA_GORR_What_Condition;
information = DIA_GORR_What_Info;
permanent = 1;
description = "Mogę wejść do obozu?";
};  

FUNC INT DIA_GORR_What_Condition()
{
if (Npc_KnowsInfo (hero,DIA_GORR_Hello))
{
return 1;
};
};

FUNC VOID DIA_GORR_What_Info()
{
AI_Output (other, self,"DIA_GORR_What_15_00"); //Mogę wejść do obozu?
AI_Output (self, other,"DIA_GORR_What_13_01"); //Oczywiście.
};

// ************************************************************
// PERM
// ************************************************************

INSTANCE DIA_GORR_PERM (C_INFO)
{
npc = Kdf_9002_Gorr;
nr = 3;
condition = DIA_GORR_PERM_Condition;
information = DIA_GORR_PERM_Info;
permanent = 0;
description = "Jak się tutaj znaleźliście?";
};  

FUNC INT DIA_GORR_PERM_Condition()
{
if (Npc_KnowsInfo (hero,DIA_GORR_Hello))
{
return 1;
};
};

FUNC VOID DIA_GORR_PERM_Info()
{
AI_Output (other, self,"DIA_GORR_PERM_15_00"); //Jak się tutaj znaleźliście?
AI_Output (self, other,"DIA_GORR_PERM_13_01"); //Zostaliśmy niesłusznie oskarżeni o zdradę ojczyzny. Oskarżono nas o współpracę z Beliarem.
AI_Output (self, other,"DIA_GORR_PERM_13_02"); //Kiedyś byliśmy potężnymi Magami Ognia i wierzyliśmy w Innosa. Teraz jednak na prawdę sprzymierzyliśmy się z Beliarem.
AI_Output (self, other,"DIA_GORR_PERM_13_03"); //Posiadamy moc ognia, ale również moc ciemności. Beliar pomoże się nam zemścić!
};

Teraz wyjaśnienia:

// ************************************************************
// EXIT
// ************************************************************

Jest to tytuł wypowiedzi (chyba) (nie ten, co jest pokazany w wyborze opcji dialogowych podczas rozmowy).

INSTANCE DIA_GORR_EXIT(C_INFO)
To jest instancja (ang. instance) tej opcji dialogowej. Każde instance powinno nazywać się DIA_nazwa NPC_o czym jest dialog (np. EXIT).

npc = Kdf_9002_Gorr;
Zamiast Kdf_9002_Gorr należy wpisać instancja Twojego NPC’a (znak ; musi zostać!)

nr = 999;
Numer opcji dialogowej (każda opcja musi mieć inny numer).

condition = DIA_GORR_EXIT_Condition;
Powinno być InstancjaOpcji_Condition.

information = DIA_GORR_EXIT_Info;
Powinno być tak: InstancjaOpcji_Info.

permanent = 1;
To określa, czy po porozmawianiu o tym można jeszcze raz o tym porozmawiać. Jeżeli jest ustawione na 1, to będzie można o tym gadać do woli, ale jeżeli będzie wpisane 0, to będzie można tylko raz o tym porozmawiać.

description = DIALOG_ENDE;
Opis opcji. To, co tu wpiszesz będzie się pokazywało przy wyborze opcji dialogowych (wyjątkiem jest KONIEC, który zależy od wersji językowej).

FUNC INT DIA_GORR_EXIT_Condition()
{
return 1;
};

Tutaj można określić czy po wybraniu tej opcji dialogowej wraca się do wyboru, czy kończy rozmowę lub co jest wymagane, aby o tym porozmawiać, itp.

FUNC VOID DIA_GORR_EXIT_Info()
{
AI_StopProcessInfos (self);
};

Tutaj można określić, co ma się dziać po wybraniu tej opcji dialogowej.

To by było tyle opcji dialogowej KONIEC. Przejdźmy teraz do opcji, która wywołuje rozmowę.

// ************************************************************
// Hallo
// ************************************************************

Nazwa dialogu.

INSTANCE DIA_GORR_Hello (C_INFO)
Instancja dialogu.

{
npc = Kdf_9002_Gorr;
nr = 1;
condition = DIA_GORR_Hello_Condition;
information = DIA_GORR_Hello_Info;
permanent = 0;
description = "Witaj. Kim jesteś?";
};
                   

Tutaj nie będę wszystkiego od początku tłumaczył. Powiem tylko, że w description należy wpisać to, co ma się pojawić w tym dolnym okienku, gdzie się wybiera opcje dialogowe.

FUNC VOID DIA_GORR_Hello_Info()
{
AI_Output (other, self,"DIA_GORR_Hello_15_00"); //Witaj. Kim jesteś?
AI_Output (self, other,"DIA_GORR_Hello_13_01"); //Mam na imię Gorr. Jestem strażnikiem tego obozu.
AI_Output (other, self,"DIA_GORR_Hello_15_02"); //A cóż to za obóz?
AI_Output (self, other,"DIA_GORR_Hello_13_03"); //To obóz Magów Czarnego Ognia.
};

To jest to, co oni będą mówić. To, co ktoś ma mówić należy wpisać po //. Każda wypowiedź musi się zaczynać AI_Output (other, self,"DIA_GORR_Hello_15_00");. „Other, self,” oznacza, że mówi to bohater, a „self, other,” oznacza, że mówi to NPC. „DIA_GORR_Hello” – tutaj wpisujesz instancję opcji dialogowej. „_15” – jeżeli mówi bohater gry, to wpisz „_15”, ale jeżeli mówi NPC, to wpisz „_13”. „_00”, „_01”, „_02”, „_03” – to jest kolejność wypowiedzi. Najlepiej wpisywać 00, 01, 02, 03 itp.

Sorki za wszelkie błędy, ale to mój pierwszy tutek. Wszelkie pytania do mnie kierować na PW. Nie ma tu szczegółowych wyjaśnień, ale może niedługo będą. Szczerze mówiąc, to nie ma tu sporo rzeczy...

[size=20]NIE zabraniam kopiowania całości, lub części tutoriala.[/size]

PS: Dla ludzi, którzy mają problemy z pisaniem dialogów od podstaw polecam kopiować dialogi od innych NPC’ów, a następnie przerabiać je.
 

Kazzmir
  • Gość

Kazzmir
Gość

Dialogi
#1 2008-01-20, 22:16(Ostatnia zmiana: 2009-07-06, 15:46)
Cytat: Zysk link=topic=101.msg361#msg361 date=Jul 31 2006, 17:11\'
Zapoznaj się najpierw z opisem skryptów.
Dialogi znajdują się w katalogu content\story\missions. Pliki z dialogami (oddzielny dla każdego NPC#msgote author=Zysk link=topic=101.msg361#msg361 date=Jul 31 2006, 17:11\']Zapoznaj się najpierw z opisem skryptów.
Dialogi znajdują się w katalogu content\story\missions. Pliki z dialogami (oddzielny dla każdego NPCa nazywa się zwykle DIA_kod_postaci_imię.d
Najpierw należy stworzyć element dialogu:
Gothic Script
instance ?(C_info)
{
  npc=?;
  nr=?;//Opcjonalnie
  condition=?;
  information=?;
  important=?;
  permanent=?;
  description="?"//Opcjonalnie
}
W pierwszej linii wpisujemy kod dialogu (zazwyczaj jego nazwę rozpoczyna się kodem postaci).
npc to rozmówca, a nr to numer na liście dialogów.
condition to nazwa funkcji wykonywanej, aby sprawdzić, czy na dany temat można porozmawiać (zazwyczaj nazywa się ją kod_dialogu_cond). Funkcja ta zwraca int - 1 gdy da się porozmawiać, 0 gdy się nie da. Funkcja nie powinna posiadać parametrów.
information to nazwa funkcji wykonywanej podczas wykonania dialogu (nazywana kod_dialogu_info). Funkcja ta nic nie zwraca, ani nie posiada parametrów.
! Pamiętaj aby nie wpisywać tutaj nawiasów wywołania funkcji !
important ustawiamy na 1, gdy postać sama nam o tym powie, inaczej 0
permanent ustawiamy na 1, gdy na dany temat da się rozmawiać więcej niż raz, inaczej 0.
description to opcja na liście tematów (nie trzeba ustawiać gdy important=1).
 

Aidan

Aidan

Użytkownicy
posty50
Propsy1
ProfesjaSkrypter
  • Użytkownicy
jesli stworze zadanie to co zrobic zeby dawalo ono expa?
 

Arkadiusz1998

Arkadiusz1998

Labirynt
posty71
Propsy1
ProfesjaNierób
  • Labirynt
jesli stworze zadanie to co zrobic zeby dawalo ono expa?

Żeby dawało expa pod jakąś opcją dialogową dopisz:
  B_GivePlayerXP (iloscexpa);
 

Vamper

Vamper

Użytkownicy
posty62
Propsy2
Profesjabrak
  • Użytkownicy

Vamper

Dialogi
#4 2017-07-26, 12:29(Ostatnia zmiana: 2017-07-26, 12:34)
Jaką funkcję ustawić aby po zakończeniu dialogu postać z którą rozmawialiśmy umiera?
Bo jak wstawiam B_KillNpc (self); nie ważne w jakiej kolejności to postać umiera podczas dialogu a nie po jego zakończeniu.
 

SanTiago

SanTiago

Użytkownicy
posty212
Propsy47
ProfesjaLvl designer
  • Użytkownicy
Wydaje mi się, że najlepiej w takiej sytuacji stworzyć kolejny dialog z tą komendą, który będzie się aktywował zaraz po automatycznym zakończeniu poprzedniego.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Są dwie opcje:

1. Ustawiasz tick tock/framefunctions, który po małym opóźnieniu po dialogu zabije npc.
2. Dodajesz do rutyny (tego npca) warunek, że jeśli dialog jest skończony (zmienna) i npc się zgadza, zabija go.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1152
ProfesjaProgramista
  • Złote Wrota
3. Użyjesz AI_functions z LeGo
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Draquer

Draquer

Użytkownicy
Problematyk :F
posty360
Propsy23
ProfesjaNierób
  • Użytkownicy
  • Problematyk :F

Draquer

Dialogi
#8 2019-04-18, 14:45(Ostatnia zmiana: 2019-04-18, 14:56)
A co zrobić kiedy dialog po prostu się nie wyświetla u danego NPC ?
Pomimo napisania pliku dialogu jedynie z EXIT i HALLO, po zagadaniu do NPC wyświetla się tylko opcja "ENDE", nie ma opcji HALLO.
//Gothic1
 
Spoiler
#include<iostream>
using namespace std;

int main()
{
      cout << "Hello theModders" <<endl;
      return 0;
}

Wowoz

Wowoz

Użytkownicy
Wowoźny
posty3699
Propsy4862
NagrodyVV
Profesjabrak
  • Użytkownicy
  • Wowoźny
@Kazzmir ratuj kolege :F
 

Fabio

Fabio

The Modders
posty3467
Propsy2150
ProfesjaSkrypter
  • The Modders
A co zrobić kiedy dialog po prostu się nie wyświetla u danego NPC ?
Pomimo napisania pliku dialogu jedynie z EXIT i HALLO, po zagadaniu do NPC wyświetla się tylko opcja "ENDE", nie ma opcji HALLO.
//Gothic1

Skompilować skrypty.

Draquer

Draquer

Użytkownicy
Problematyk :F
posty360
Propsy23
ProfesjaNierób
  • Użytkownicy
  • Problematyk :F
Skompilowałem i GothicStarterem i Spacerem, dopiero po zrobieniu paczki się pojawiają, zawsze coś :F
 
Spoiler
#include<iostream>
using namespace std;

int main()
{
      cout << "Hello theModders" <<endl;
      return 0;
}

Splash

Splash

Moderator
posty4207
Propsy3409
ProfesjaNierób
  • Moderator
Możesz też po prostu skompilować skrypty i zaktualizować dialogi Redefixem:
https://themodders.org/index.php?topic=16628.0
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy

Ebhodini

Dialogi
#13 2019-11-21, 16:05(Ostatnia zmiana: 2019-11-21, 16:29)
Problem podobny więc piszę tutaj. A co jeśli teoretycznie wszystko działa tylko kwestie wypowiadane są jakby natychmiast tzn. są pokazane opcje dialogowe do wyboru przez gracza, ale ani nie zadaje on pytań ani NPC nie odpowiada, a dialog się wykonuje, np. znika gdy mógł być użyty tylko raz.

PS. Już działa, musiałem skompilować Spacerem i śmiga normalnie. ;)
 

Splash

Splash

Moderator
posty4207
Propsy3409
ProfesjaNierób
  • Moderator
PS. Już działa, musiałem skompilować Spacerem i śmiga normalnie. ;)
Redefix robi to o wiele szybciej. W dodatku Spacer lubi się wysypać i czasem nie odpalają się dialogi mimo ustawionego atrybutu important.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Skoro jest odzew to pociągnę temat. Stworzyłem sobie postać gladiatora Ulgora z Gothic der Comic. Chciałem mu wstawić dialog na podstawie tego z Draxem i przyniesieniem piwa. Jednak spacer wysypuje mi się na funkcji if
// ************************************************************
// EXIT
// ************************************************************

INSTANCE DIA_Ulgor_EXIT(C_INFO)
{
npc = GRD_886_Ulgor;
nr = 999;
condition = DIA_Ulgor_EXIT_Condition;
information = DIA_Ulgor_EXIT_Info;
permanent = 1;
description = DIALOG_ENDE;
};    

FUNC INT DIA_Ulgor_EXIT_Condition()
{
return 1;
};

FUNC VOID DIA_Ulgor_EXIT_Info()
{
AI_StopProcessInfos (self);
};

// ************************************************************
// Powitanie?
// ************************************************************

INSTANCE DIA_Ulgor_Hello (C_INFO)
{
npc = GRD_886_Ulgor;
nr = 1;
condition = DIA_Ulgor_Hello_Condition;
information = DIA_Ulgor_Hello_Info;
permanent = 0;
description = "Witaj. Kim jesteś?";
};    

FUNC INT DIA_Ulgor_Hello_Condition()
{
return 1;
};

FUNC VOID DIA_Ulgor_Hello_Info()
{
AI_Output (other, self,"DIA_Ulgor_Hello_15_00"); //Witaj. Kim jesteś?
AI_Output (self, other,"DIA_Ulgor_Hello_13_01"); //Mam na imię Ulgor. Jestem gladiatorem, walczę na arenie.
};

// ************************************************************
// What
// ************************************************************

INSTANCE DIA_Ulgor_What (C_INFO)
{
npc = GRD_886_Ulgor;
nr = 2;
condition = DIA_Ulgor_What_Condition;
information = DIA_Ulgor_What_Info;
permanent = 1;
description = "Mogę z Tobą walczyć?";
};    

FUNC INT DIA_Ulgor_What_Condition()
{
if (Npc_KnowsInfo(hero, DIA_Ulgor_Hello))
{
return 1;
};
};

FUNC VOID DIA_Ulgor_What_Info()
{
AI_Output (other, self,"DIA_Ulgor_What_15_00"); //Mogę z Tobą walczyć na arenie?
AI_Output (self, other,"DIA_Ulgor_What_13_01"); //Oczywiście, ale nie w tej chwili...
AI_Output (self, other,"DIA_Ulgor_What_13_02"); //Jestem ranny po ostatniej walce i potrzebuję paru dni przerwy.
};

// ************************************************************
// PRZESZŁOŚĆ
// ************************************************************

INSTANCE DIA_Ulgor_PRZE (C_INFO)
{
npc = GRD_886_Ulgor;
nr = 3;
condition = DIA_Ulgor_PRZE_Condition;
information = DIA_Ulgor_PRZE_Info;
permanent = 0;
description = "Jak się tutaj znalazłeś?";
};    

FUNC INT DIA_Ulgor_PRZE_Condition()
{
if (Npc_KnowsInfo (hero,DIA_Ulgor_Hello))
{
return 1;
};
};

FUNC VOID DIA_Ulgor_PRZE_Info()
{
AI_Output (other, self,"DIA_Ulgor_PRZE_15_00"); //Jak się tutaj znalzłeś?
AI_Output (self, other,"DIA_Ulgor_PRZE_13_01"); //Jesteś tu nowy i ledwo się znamy, nie mam powodu żeby Ci się zwierzać.
};
//*********************************************************
// Zadanie z piwem
//*********************************************************
var int Ulgor_piwosz;

INSTANCE DIA_Ulgor_PIWO (C_INFO)
{
npc = GRD_886_Ulgor;
nr = 4;
condition = DIA_Ulgor_PIWO_Condition;
information = DIA_Ulgor_PIWO_Info;
permanent = 1;
description = "Poczęstuj Ulgora piwem";
};

FUNC int  DIA_Ulgor_PIWO_Condition()
{
if ( Npc_KnowsInfo(hero,DIA_Ulgor_Hello) && (Ulgor_piwosz==FALSE) )
{
return 1;
};
};

FUNC VOID DIA_Ulgor_PIWO_Info()
{
if (Npc_HasItems(other,itfobeer)>0)
{
B_GiveInvItems (other, self, itfobeer,1);
AI_Output (other, self,"DIA_Ulgor_PIWO_15_00"); //Proszę, łyknij sobie. Przemyciłem jedno gdy mnie tu zrzucano, prosto z Khorinis.
if ( C_BodystateContains(self, BS_SIT) )
{
AI_StandUp (self);
AI_TurnToNpc (self, hero);
};
AI_UseItem (self, ItFobeer);
AI_Output (self, other,"DIA_Ulgor_PIWO_13_01"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_02"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_03"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_04"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_05"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_06"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_07"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_08"); //tekst
Ulgor_piwosz==TRUE;
};
else if(Npc_HasItems(other,itfobooze)>0)
{
B_GiveInvItems (other, self, itfobooze,1);
AI_Output (other, self,"DIA_Ulgor_PIWO_15_00"); //Proszę, łyknij sobie.
if ( C_BodystateContains(self, BS_SIT) )
{
AI_StandUp (self);
AI_TurnToNpc (self, hero);
};
AI_UseItem (self, ItFobooze);
AI_Output (self, other,"DIA_Ulgor_PIWO_13_01"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_02"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_03"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_04"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_05"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_06"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_07"); //tekst
AI_Output (self, other,"DIA_Ulgor_PIWO_13_08"); //tekst
Ulgor_piwosz==TRUE;
};
else
{
AI_Output (other, self,"DIA_Ulgor_PIWO_15_00"); //Nie mam przy sobie piwa.
AI_Output (self, other,"DIA_Ulgor_PIWO_13_01"); //tekst
};
};

Jak powinna wyglądać składnia if jeśli mam, w tym przypadku trzy warunki ale tylko dwa zawierają jakieś wyrażenie warunkowe, a to osatnie wykona się gdy poprzednie dwa nie zostaną spełnione?
Spróbowałem jedynie z dwoma warunkami z if i potem else ale też wyskoczył błąd to użyłem dwa razy if, co prawda funkcja wykonała się dwa razy ale chociaż spacer przyjął ;) Ale wtedy w samym dialogu od razu wyswietliła się opcja z przekazaniem piwa jakby ignorując
FUNC int  DIA_Ulgor_PIWO_Condition()
{
if ( Npc_KnowsInfo(hero,DIA_Ulgor_Hello) && (Ulgor_piwosz==FALSE) )
{
return 1;
};
};
 

Splash

Splash

Moderator
posty4207
Propsy3409
ProfesjaNierób
  • Moderator
Ulgor_piwosz==TRUE;
};
else
{
AI_Output (other, self,"DIA_Ulgor_PIWO_15_00"); //Nie mam przy sobie piwa.
Kiedy jest else, nie może być średnik przed klamrą
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Ok, dzięki! :D
 

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Chciałem rozwinąć zadanie "Test zaufania" o krótki quest. To znaczy, zamiast szybkiego oddania listy Ian zleca nam pracę jako kopacz i wysyła do Grimesa. Przy okazji Tego zadania można pomóc Grimesowi w pracy i zapłacić Ianowi za kopacza wymaganych 100 bryłek. No i teraz problemy ;)
1. Przy dialogu z Ianem odgrywa się dialog oryginalny ale tekst jest ten stworzony przeze mni, ale lista się nie pojawia i aktywuje się dodane moje zadanie, czyli połowiczny sukces.
2. Grimes nie ma w swoim dialogu nic o tym zadaniu i to mnie dziwi najbardziej, w tym ifie FUNC int VLK_586_Grimes_ZADANIE_Condition()
{
if (STT_301_IAN_KOPACZ == LOG_RUNNING) && (Npc_KnowsInfo (hero,VLK_586_Grimes_STORY) )
{
return 1;
};
};

Testując usunąłem 1. warunek i zadziałało, ale wiadomo od razu bez rozmowy z Ianem czyli niepoprawnie. Czy tam powinno być jakieś inne odwołnie, jakaś inna składnia?
3. Nie da się oddać rudy Ianowi bez znaczenia czy samych 100 czy 200, niema żadnej interakcji, więc i nie da się otrzymać listy.
 
KOD IANA:

/*------------------------------------------------------------------------
LISTE ABHOLEN
------------------------------------------------------------------------*/

instance  STT_301_IAN_KOPACZ (C_INFO)
{
npc = STT_301_IAN;
condition = STT_301_IAN_KOPACZ_Condition;
information = STT_301_IAN_KOPACZ_Info;
important = 0;
permanent = 0;
description = "Przysyła mnie Diego. Mam odebrać listę.";
};

FUNC int  STT_301_IAN_KOPACZ_Condition()
{
if (Diego_BringList == LOG_RUNNING)
&& (Npc_KnowsInfo (hero,Info_Diego_IanPassword))
{
return TRUE;
};
};

FUNC void  STT_301_IAN_KOPACZ_Info()
{
AI_Output (other, self,"STT_301_IAN_GETLIST_Info_15_01"); //Przysyła mnie Diego. Mam odebrać listę.
AI_Output (self, other,"STT_301_IAN_GETLIST_Info_13_02"); //Nie tak szybko! Najpierw musisz odpracować swoje jako kopacz.
AI_Output (self, other,"STT_301_IAN_GETLIST_Info_13_03"); //Każdy nowy musi przynieść mi jakiś procent miesięcznego urobku. Dla Ciebie będzie to...
AI_Output (self, other,"STT_301_IAN_GETLIST_Info_13_04"); //100 bryłek rudy.
AI_Output (self, other,"STT_301_IAN_GETLIST_Info_13_05"); //Idź do Grimesa. To jeden z najlepszych kopaczy, on pokaże Ci z czym to się je.
AI_Output (self, other,"STT_301_IAN_GETLIST_Info_13_06"); //Ah byłbym zapomniał, możesz od razu przypomnieć temu staremu prykowi, że zalega ze swoją częścią urobku.
AI_Output (self, other,"STT_301_IAN_GETLIST_Info_13_07"); //Spadaj już! I jeśli chcesz cokolwiek tu osiągnąć postaraj się, żeby to zadanie nie zabrało Ci całego życia.
Log_CreateTopic (CH1_Kopacz, LOG_MISSION);
B_LogEntry ( CH1_Kopacz,"Ian powiedział mi, że nie odda mi listy dopóki nie spłacę 100 bryłek rudy pracując jako kopacz w kopalni. Mam zgłosić się do Grimesa, który ma mi pomóc. Podobno sam ma jakiś dług u szefa... ");
Log_SetTopicStatus (CH1_Kopacz, LOG_RUNNING);
}; 

//*********************************************************
// KOPACZ SUKCES
//*********************************************************

instance  STT_301_IAN_KOPACZS (C_INFO)
{
npc = STT_301_IAN;
condition = STT_301_IAN_KOPACZS_Condition;
information = STT_301_IAN_KOPACZS_Info;
important = 0;
permanent = 0;
description = "Mam rudę o którą mnie prosiłeś.";
};

FUNC int  STT_301_IAN_KOPACZS_Condition()
{
if (STT_301_IAN_KOPACZ == LOG_RUNNING)
&& (Npc_HasItems(other,itminugget)>=100)
{
return 1;
};
};

FUNC void STT_301_IAN_KOPACZS_Info()
{
B_GiveInvItems (other, self, itminugget,100);
AI_Output (other, self,"STT_301_IAN_KOPACZS_Info_15_01"); //Mam rudę o którą mnie prosiłeś.
AI_Output (self, other,"STT_301_IAN_KOPACZS_Info_13_02"); //Pokaż! No, no postarałeś się. Na ten miesiąc wystarczy.
B_LogEntry ( CH1_Kopacz,"Ian pochwalił mine za szybkie wykonanie zadania.");
Log_SetTopicStatus (CH1_Kopacz, LOG_SUCCESS);
B_GiveXP(250/*DOPISAĆ DODAWANIE EXPA*/);
//**************************************************
// KONIEC ZADANIA Z RUDĄ
//**************************************************
};

//*********************************************************
// KOPACZ DODATEK DLA GRIMESA
//*********************************************************

instance  STT_301_IAN_DLAGRIMESA (C_INFO)
{
npc = STT_301_IAN;
condition = STT_301_IAN_DLAGRIMESA_Condition;
information = STT_301_IAN_DLAGRIMESA_Info;
important = 0;
permanent = 0;
description = "Chciałbym zapłacić również część Grimesa.";
};

FUNC int  STT_301_IAN_DLAGRIMESA_Condition()
{
if ((VLK_586_Grimes_POMOC == LOG_RUNNING)&& (Npc_HasItems(other,itminugget)>=100))
{
return 1;
};
};

FUNC void STT_301_IAN_DLAGRIMESA_Info()
{
B_GiveInvItems (other, self, itminugget,100);
AI_Output (other, self,"STT_301_IAN_DLAGRIMESA_Info_15_01"); //Chciałbym zapłacić również część Grimesa.
AI_Output (self, other,"STT_301_IAN_DLAGRIMESA_Info_13_02"); //Na prawdę chcesz płacić za kogoś 100 BRYŁEK RUDY?!
AI_Output (other, self,"STT_301_IAN_DLAGRIMESA_Info_15_03"); //Tak, to jak będzie bierzesz czy mam to wydać na ryżówkę i kawałek szynki?
AI_Output (self, other,"STT_301_IAN_DLAGRIMESA_Info_13_04"); //Żaden grosz nie śmierdzi. W tym miesiącu już odpuszczę staruszkowi.
};

//**********************************************************
// ODEBRANIE LISTY
//**********************************************************
instance  STT_301_IAN_GETLIST (C_INFO)
{
npc = STT_301_IAN;
condition = STT_301_IAN_GETLIST_Condition;
information = STT_301_IAN_GETLIST_Info;
important = 0;
permanent = 0;
description = "Odbierz listę.";
};

FUNC int  STT_301_IAN_GETLIST_Condition()
{
if (Diego_BringList == LOG_RUNNING)
&& (Npc_KnowsInfo (hero,Info_Diego_IanPassword))
&& (STT_301_IAN_KOPACZS == LOG_SUCCESS) /*ZMIENILEM NA LOG_SUCCES Z WCZESNIEJSZEGO TRUE*/
{
return TRUE;
};

};
FUNC void  STT_301_IAN_GETLIST_Info()
{
AI_Output (other, self,"STT_301_IAN_GETLIST_Info_15_01"); //Zrobiłem wszystko co chciałeś, czy teraz mogę otrzymać listę?
AI_Output (self, other,"STT_301_IAN_GETLIST_Info_13_08"); //W porządku. Oto i ona. Powiedz im, żeby się pospieszyli z dostawami.
B_LogEntry  (CH1_BringList,"Ian wręczył mi listę zamówień.");
B_GiveInvItems (self,hero,TheList,1);
}; 

KOD GRIMESA
//****************************************
// ZADANIE GRIMESA
//****************************************

instance VLK_586_Grimes_ZADANIE (C_INFO)
{
npc = VLK_586_Grimes;
condition = VLK_586_Grimes_ZADANIE_Condition;
information = VLK_586_Grimes_ZADANIE_Info;
important = 0;
permanent = 0;
description = "Przysyła mnie Ian...";
};

FUNC int VLK_586_Grimes_ZADANIE_Condition()
{
if (STT_301_IAN_KOPACZ == LOG_RUNNING) && (Npc_KnowsInfo (hero,VLK_586_Grimes_STORY) )
{
return 1;
};
};

FUNC int VLK_586_Grimes_ZADANIE_Info()
{
AI_Output (other, self,"VLK_586_Grimes_ZADANIE_Info_15_01"); //Przysyła mnie Ian. Podobno możesz mi pomóc.
AI_Output (self, other,"VLK_586_Grimes_ZADANIE_Info_13_02"); //Tak chłopcze, mogę pokazać Ci jak należy poprawnie machać kilofem.
//*****************************************************
// DODAĆ TUTAJ MOŻLIWOŚĆ NAUKI KOPANIA RUDY
//*****************************************************
Log_CreateTopic (GE_OreMining, LOG_NOTE);
B_LogEntry (GE_OreMining, "Grimes, kopacz ze Starej Kopalni, może nauczyć mnie jak wydobywać rudę.");
};

//********************************************
// POMOC Z RUDĄ
//********************************************

instance VLK_586_Grimes_POMOC (C_INFO)
{
npc = VLK_586_Grimes;
condition = VLK_586_Grimes_POMOC_Condition;
information = VLK_586_Grimes_POMOC_Info;
important = 0;
permanent = 0;
description = "Słyszałem, że zalegasz ze swoją działką rudy...";
};

FUNC int VLK_586_Grimes_POMOC_Condition()
{
/*if ( Npc_KnowsInfo (hero,VLK_586_Grimes_STORY))*/
if ( VLK_586_Grimes_ZADANIE == LOG_RUNNING)
{
return 1;
};
};

FUNC int VLK_586_Grimes_POMOC_Info()
{
AI_Output (other, self,"VLK_586_Grimes_POMOC_Info_15_01");//Słyszałem, że zalegasz ze swoją działką rudy.
AI_Output (self, other,"VLK_586_Grimes_POMOC_Info_13_02");//Dobrze słyszałeś.
AI_Output (self, other,"VLK_586_Grimes_POMOC_Info_13_03");//Jestem już stary i chociaż umysł dalej sprawny, ciało nieraz odmawia mi posłuszeństwa.
Log_CreateTopic (CH1_POMOC, LOG_MISSION);
B_LogEntry (CH1_POMOC,"Grimes nie wytrzymuję trudów cięzkiej pracy w kopalnii. Może będę w stanie mu pomóc... ");
Log_SetTopicStatus (CH1_POMOC, LOG_RUNNING);
};
//*************************************************
// SUKCES POMOCY
//*************************************************

instance VLK_586_Grimes_POMOCS (C_INFO)
{
npc = VLK_586_Grimes;
condition = VLK_586_Grimes_POMOCS_Condition;
information = VLK_586_Grimes_POMOCS_Info;
important = 0;
permanent = 0;
description = "Oddałem twoją część.";
};

FUNC int VLK_586_Grimes_POMOCS_Condition()
{
if ( Npc_KnowsInfo (hero,VLK_586_Grimes_STORY))
&& ( VLK_586_Grimes_POMOC == LOG_RUNNING)
{
return 1;
};
};

FUNC int VLK_586_Grimes_POMOCS_Info()
{
AI_Output (other, self,"VLK_586_Grimes_POMOCS_Info_15_01");//Oddałem Ianowi twoją część rudy.
AI_Output (self, other,"VLK_586_Grimes_POMOCS_Info_13_02");//Dziękuję Ci chłopcze!
AI_Output (self, other,"VLK_586_Grimes_POMOCS_Info_13_03");//W końcu będę mógł chwilę odpocząć.
AI_Output (other, self,"VLK_586_Grimes_POMOCS_Info_15_04");//Cieszę się, że mogłem pomóc.
AI_Output (self, other,"VLK_586_Grimes_POMOCS_Info_13_05");//Nie wiem jak Ci dziękować. Proszę przyjmij chociaż te ZŁOTE PANTALONY.
B_LogEntry ( CH1_POMOC,"Grimes wyglądał na szczęśliwego! W dodatku otzwymałem od niego te dziwne łąchy.");
Log_SetTopicStatus (CH1_POMOC, LOG_SUCCESS);
};

Log_Constants.d:

const string GE_OreMining = "Wydobycie rudy";
const string CH1_Kopacz = "Praca, praca";
const string CH1_POMOC = "Pomoc dla Grimesa";

Jakieś rady, uwagi, przemyślenia? :D
 

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Już sobie z tym poradziłem, wystarczyło w funkcjach if() połączyć niektóre, podobne warunki np:
FUNC int VLK_586_Grimes_ZADANIE_Condition()
{
if ( Npc_KnowsInfo (hero,VLK_586_Grimes_STORY) && Npc_KnowsInfo(hero, IAN_KOPACZ))
{
return 1;
};
};
 

Ingvrath

Ingvrath

Użytkownicy
posty10
Propsy2
Profesjabrak
  • Użytkownicy
Nie chcę tworzyć nowego tematu, więc zapytam w tym najbardziej ogólnym. Przepraszam za odgrzebanie dwuletniego trupa.

Podczas tworzenia dialogów, chciałem użyć kilku opcji dubbingowych z Gothic 1 w Gothic 2 NK. Niestety kwestie z G2 od innych postaci, u mojego nowo utworzonego NPC działają bez zarzutów, ale z Gothic 1 w ogóle się nie odtwarzają, a kwestia dialogowa jest przez NPC w ogóle pomijana.
Zaznaczam że przeniosłem plik .wav ze speech do speech i użyłem wywołania dubbingu w pliku dialogowym NPC.

Ciekawe jest, że jeśli zmienię nazwę zaimportowanego pliku z Gothic 1 na jakąkolwiek z Gothic 2 NK to wtedy plik ten działa i dubbing się odtwarza. Stąd moja teoria, że musi istnieć jeszcze jakiś jeden plik, w którym muszę dodać nazwy tych plików, aby gra je czytała. Tak jak jest to w przypadku dodania nowego NPC do pliku Gothic.src i Startup.d.

Czy ktoś ma podpowiedź jak sprawić by te dialogi działały? Będę bardzo wdzięczny za pomoc.
 

bogu9821

bogu9821

Użytkownicy
posty406
Propsy185
ProfesjaProgramista
  • Użytkownicy
Sparsuj dialogi spacerem lub redefixem, poszukaj o tym na forum.
 
while(false) Do();

Ingvrath

Ingvrath

Użytkownicy
posty10
Propsy2
Profesjabrak
  • Użytkownicy
Niestety ani spacer ani redefix w tej sytuacji nie pomógł, a szkoda bo narobiłem sobie już dużych nadziei. Czy ktoś ma jeszcze jakiś pomysł gdzie może tkwić problem? Jest to dziwne, bo nie są to dialogi tworzone przeze mnie, a zwyczajnie skopiowane dialogi z G1, lub przycięte fragmenty dialogów z G2.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry