Zmienne C_NPC self, other i hero są ustawiane poprzez silnik gry.
Hero to zawsze gracz, nieważne czy grasz jako Lord Hagen, Xardas, jakiś obywatel, czy bezimienny.
Self jest ustawiany poprzez silnik w niektórych funkcjach gry. Self zawsze odpowiada za cel, to znaczy, jeśli jest dialog, self to będzie osoba, z którą rozmawiasz, jeśli jest to walka, to self jest przeciwnikiem.
Other jest troszkę bardziej skomplikowany, bo jest to osoba zaczepiająca, jeśli chodzi o dialog. W walce jest to osoba, która zaczęła bójkę.
W dialogach other jest przypisany do osoby, która wybiera kwestie dialogowe. W tym przypadku, other w dialogach to zawsze (albo i przeważnie) hero, czyli gracz.
PrintDebugNpc zapisuje pozycję w funkcji w zSpy, żeby lepiej było znaleźć przyczynę błędu.
Przykład: PrintDebugNpc (PD_ZS_DETAIL, "...false!") dodane w linijce pierwszej funkcji będzie pokazywało w zSpy napis "...false!" przez co będziesz wiedział, że rozpoczęła się funkcja.
Można tego także użyć, żeby sprawdzać, czy dane warunki się spełniają w funkcjach, albo żeby po prostu sprawdzać, gdzie się popełniło błąd.
Przykład:
PrintDebugNpc (PD_ZS_DETAIL, "Sprawdzam czy npc ma przedmioty");
if (npc_hsaitems(hero, itmi_gold, 150)
{...};
na czerwono zaznaczyłem błąd. Teraz włączam grę, wywali mi błąd i nie wiem gdzie jest. Włączam zSpy i sprawdzam, gdzie jest błąd. Pojawił się zaraz po informacji "Sprawdzam czy npc ma przedmioty", czyli wiem, gdzie popełniłem błąd i jestem w stanie go bez problemu naprawić.
Externals.d jest zbiorem "wszystkich" nazw funkcji (tak naprawdę nie ma tam wszystkich).
Funkcje są tam dla pomocy, gra nie czyta tego pliku. Jest tam zapisane nazwa funkcji, oraz potrzebne do niej zmienne oraz co zwraca.
FUNC INT Hlp_IsValidItem (VAR C_ITEM item) { return 0; };
// Prüfe ob Item-Instanz gültig und initialisiert ist True/False
Nazwa funkcji. W sumie to niepotrzebnie piszę.
Wymagana zmienna, czyli tutaj wpisujemy instance przedmiotu, albo zmienną C_ITEM przedmiotu.
Funkcja zawsze zwraca 0, ale jeśli funkcja dostanie ID (instance / zmienną) broni, która jest dostępna w grze, zwróci 1
Jak to działa w praktyce?
func int nazwa (var int zmienna)
{
if (zmienna == 1)
{
return 1;
};
return 0;
};
Jeśli zmienna będzie wynosiła 1, funkcja zwróci wartość 1 i zakończy się. Jeśli zaś zmienna nie będzie wynosiła 1, funkcja zwróci 0.
return zawsze kończy funkcję, czyli jeśli dasz w jakieś funkcji zaraz po pierwszej { return; to funkcja się wcale nie rozpocznie.
return też wygląda nie zawsze tak samo. W "func int" czyli funkcjach numerycznych (? nie wiem jak to nazwać) zwraca numer, jakikolwiek, może też być -38745983745 (return -38745983745;). W "func string" czyli funkcjach z napisami (tej raczej nie znajdziesz w oryginalnym Gothic) zwraca napis, czyli np. "Placki lubią być jedzone" (return "Placki lubią być jedzone";). W "func void" czyli funkcjach, które nie są używane w warunkach, nic nie zwracają i return wygląda: return;
Funkcji takich jest więcej, ale w zasadzie starczy Ci tylko int i void, bo innych się raczej nie używa.
W razie pytań pisz.