Terminu "parser" użyłem celowo, wydaje mi się że do tej "zamiany" dochodzi właśnie na tym etapie (choć mogę się mylić).
Ciekawe jest jednak zachowanie funkcji Npc_IsDead(...) o ile Avallach mówi prawdę.
Dlaczego miałbym kłamać że jest tak, a nie inaczej? Naprawdę sprawdziłem to kilka razy i za każdym razem działa. Twoja funkcja już niestety nie, przy reparsowaniu wywalany jest błąd:
Error-Message: U:PAR: Func does not return an instance
w linijce:
xard1 = NONE_100_Xardas;
Próbujesz przypisać wartość liczbową do zmiennej c_npc. Parser przy przypisywaniu wartości oczekuje albo wartości tego samego typu, albo funkcji która ją zwróci.
Kolejny błąd po zakomentowaniu tej części funkcji to
Error-Message: U:PAR: Wrong type : CX
Po wykomentowaniu i tego warunku, kolejnym błędem jest
Error-Message: U:PAR: Wrong type : vx
O ile dobrze rozumiem, oba te błędy potwierdzają że do "podmiany" wpisanej instancji (która reprezentuje indeks) na obiekt dochodzi już na etapie parsera, a nie przy wykonywaniu kodu.
Po wykomentowaniu i tego, zostaje ostatnia część kodu, która już działa:
Spoiler
func void test() {
var string b;
b = "Test:";
var c_npc xard0;
xard0 = Hlp_GetNpc(NONE_100_Xardas);
if(!Npc_IsDead(xard0)) {
b=concatstrings(b, "Good");
};
print(b);
if(!Npc_IsDead(NONE_100_Xardas)) {
b=concatstrings(b, "Inst");
};
print(b);
Kiedy Xardas jest żywy, funkcja wypisuje dwa napisy jeden pod drugim: "Test:GoodInst" i "Test:Good" (bo dałeś w różnych miejscach dwa printy, nie wiem czy celowo). Kiedy jest martwy, już tylko podwójne "Test:".
To nie jest co prawda jednoznaczny dowód mojej prawdomówności ale zawsze jakiś
Jak widzisz funkcja działa bez zarzutu
Twoje dwa poprzednie eksperymenty nie wypaliły, bo przypisywałeś ten indeks do zwykłej zmiennej. Parser potrafi "zgadywać" tylko kiedy dostaje bezpośrednio odpowiednią nazwę.