Itharu Team

Forum grupy modderskiej Itharu Team.

  • Nie jesteś zalogowany.

Ogłoszenie

PATRONITE

#1 2018-05-02 20:09:04

Kruk
Administracja Itharu Team
Zarejestrowany: 2016-12-09
Posty: 982

[G1,G2] Opcje wyboru

Na prośbę oto pojawia się skromny poradnik jak w gothicu tworzyć opcje wyboru w dialogu. Jako przykład posłużę się swoim starym skryptem.

Jeszcze mała uwaga. Osobiście nie polecam nazywania swoich dialogów jak tutaj: "DIA_Lester_4", bo samo 4 nic nie mówi osobie z zewnątrz i łatwo się później pogubić, ale ten skrypt akurat się zachował na moim komputerze i mam absolutną pewność, że działa.

Początek - nic niezwykłego. Po prostu definiujemy kolejny dialog o nazwie DIA_Lester_4, dla postaci OP_5011_Lester. Permanent ustawione na TRUE oznacza, że dialog będzie można wielokrotnie powtarzać.

Kod:

INSTANCE DIA_Lester_4   (C_INFO)
{
    npc         = OP_5011_Lester;
    nr          = 99;
    condition   = DIA_Lester_4_Condition;
    information = DIA_Lester_4_Info;
    permanent   = TRUE;
    description = "Chcesz trochę ziela?";
};

Dodatkowo dodałem warunek, aby dialog można było odpalić jedynie w momencie, w którym rzeczywiście posiadamy łodygi do zapalenia. W innym wypadku nie będzie można proponować ich Lesterowi.

Kod:

FUNC INT DIA_Lester_4_Condition()
{    
    if (Npc_HasItems(other,itmi_joint)>0){
        return TRUE;    
    };
};

Dalej mamy jakąś prostą wymianą zdań, a po niej zaczyna się najważniejsza część.

Info_ClearChoices     (DIA_Lester_4); - czyści nam wszystkie opcje, które mieliśmy do tej pory. Jeśli z tego nie skorzystamy, może się zdarzyć, że opcje zostaną wyświetlone poprawnie, ale najpewniej oprócz nich będziemy mogli dodatkowo wybrać inny dialog, a tego chcemy uniknąć.

Info_AddChoice        (DIA_Lester_4, "Nic nie dawaj.", DIA_Ziele_Back); - ta linijka odpowiada za dodanie do dialogu DIA_Lester_4 opcji "Nic nie dawaj", która wywołuje funkcję DIA_Ziele_Back. Analogicznie w kolejnych funkcjach pierwszy argument wskazuje na dialog, w którym dodane mają być te opcje, czyli w każdej linijce będzie to samo, drugi argument jest, nazwijmy to, etykieta, która pokazuje się graczowi w dialogu, zaś trzecim argumentem jest nazwa funkcji, która ma zostać wywołana.

if (Npc_HasItems(other,itmi_joint)>=5){Info_AddChoice        (DIA_Lester_4, "Oddaj 5 skrętów.", DIA_Ziele_3);}; - jak widać można również uzależnić dodawanie kolejnych opcji od konkretnych warunków. W tym wypadku gra najpierw sprawdzi czy mamy co najmniej 5 skrętów. Jeśli tak, wówczas dodana zostanie utworzona dodatkowa opcja z oddaniem mu 5 skrętów. W innym wypadku nic się nie stanie.

Nadmienię jeszcze, że opcje dialogowe pojawiają się od góry, niczym stos(LIFO). Zatem jeśli dodasz jakąś opcję jako pierwszą, to w grze wyświetlona będzie jako ostatnia. z tego powodu najpierw dodałem opcję powrotu, później kolejno oddanie wszystkich skrętów, 5, 2 i jednego. W grze będą te opcje pojawiać się w odwrotnej kolejności, zatem 1, 2, 5, wszystkie, nic.


Kod:

FUNC VOID DIA_Lester_4_Info()
{
    AI_Output (other, self,"DIA_Lester_4_10_01");//Chcesz trochę ziela?
    AI_Output ( self,other,"DIA_Lester_4_10_02");//Jeszcze się pytasz?
    
    Info_ClearChoices     (DIA_Lester_4);
    Info_AddChoice        (DIA_Lester_4, "Nic nie dawaj.", DIA_Ziele_Back);
    Info_AddChoice        (DIA_Lester_4, "Oddaj wszystkie skręty.", DIA_Ziele_4);
    if (Npc_HasItems(other,itmi_joint)>=5){Info_AddChoice        (DIA_Lester_4, "Oddaj 5 skrętów.", DIA_Ziele_3);};
    if (Npc_HasItems(other,itmi_joint)>=2){Info_AddChoice        (DIA_Lester_4, "Oddaj 2 skręty.", DIA_Ziele_2);};
    Info_AddChoice        (DIA_Lester_4, "Oddaj 1 skręt.", DIA_Ziele_1);
};

Co prawda dalsze funkcje są wywoływane przez kolejne opcje dialogowe, to jednak ich działanie jest na tyle proste, że powstrzymam się od omawiania ich.

Kod:

FUNC VOID DIA_Ziele_Give(var int ziolo)
{
    B_GiveInvItems     (hero,self, itmi_joint,ziolo);
    B_GivePlayerXP (ziolo*10);
    Info_ClearChoices     (DIA_Lester_4);
};
FUNC VOID DIA_Ziele_1()
{
    DIA_Ziele_Give(1);
};
FUNC VOID DIA_Ziele_2()
{
    DIA_Ziele_Give(2);
};
FUNC VOID DIA_Ziele_3()
{
    DIA_Ziele_Give(5);
};
FUNC VOID DIA_Ziele_4()
{
    var int ziolo;
    ziolo = Npc_HasItems(hero,itmi_joint);
    DIA_Ziele_Give(ziolo);
};

Na uwagę zasługuje jednak jeszcze funkcja powrotu. Koniecznie musi się w niej znaleźć Info_ClearChoices, aby nasze opcje dialogowe poznikały z okienka. Inaczej będzie można wybierać je tak samo jak dialogi, a tego lepiej uniknąć.

Kod:

FUNC VOID DIA_Ziele_Back()
{
    Info_ClearChoices     (DIA_Lester_4);
};

No ale ale, te opcje dialogowe to tylko raz można wybrać, a ja to chcę, żeby wybór można było sobie powtarzać, a nie wracać do tego przez dialog ;c

W takim wypadku należy zaraz pod DIA_Lester_4_Info zdefiniować sobie dodatkową funkcję np. o nazwie  DIA_Ziele_Reset. Powinna ona działać dokładnie w taki sposób, w jaki definiowaliśmy nasze opcje dialogowe na samym początku, czyli Info_ClearChoices, a następnie wszystkie interesujące nas Info_AddChoices. Następnie należy zadbać o to, żeby owy Reset wywoływany był na końcu każdej opcji dialogowej. W powyższym przykładzie wystarczy więc dodać jedną linijkę do funkcji DIA_Ziele_Give, ale jeśli takowej funkcji nie macie, bo każda opcja dialogowa robi zupełnie coś innego, zatem należy po prostu umieścić Reset na koniec każdej z opcji, oprócz tej odpowiadającej za powrót.


while (!success) try{...}

https://media.discordapp.net/attachments/359470928389865483/410858992965910538/Leiwark_ITH_TEAM_Kruk.png

Offline

 

Stopka forum

Powered by PunBB
Host by: Hosting
© Copyright 2002–2005 Rickard Andersson



Założ : stronę za darmo