EffectVar: got any, but expected &?

Ich habe versucht, eine Funktion GrabEffects zu schreiben, die analog zu GrabObjectInfo die einer Suchmaske entsprechenden Effekte eines Objektes klaut und sie einem anderen Objekt gibt.
Nachdem der neue Effekt erstellt wird, will ich noch die EffectVars übertragen.

Allerdings schmeißt die Zeile
EffectVar(iVarIndex, pTo, iNewEffect) = EffectVar(iVarIndex, pFrom, iOldEffect);
einen Fehler, wenn ich versuche, mehr als eine EffectVar zu übertragen.
Operator "=": left side: got "any", but expected "&"!

Ich verstehe nicht, warum das nicht funktioniert. Meine erste Vermutung war, dass EffectVars im Effekt initialisiert werden müssen, aber das ist nicht der Fall.
Die Übertragung von EffectVars ist so ziemlich der Hauptzweck dieser Funktion, also ist der Verzicht auf dieses Feature keine Lösung.

(Ja, der Effekt existiert.)

EffectVar gibt nur dann keine Referenz zurück, wenn der Effekt nicht existiert oder dein iVarIndex negativ ist.

Dann müsste man das ja mit IsRef(var) filtern können, oder? (Ich hab die funktion noch nie wirklich benutzt)

Ich glaube, die Referenz geht verloren, wenn du das Ergebnis von EffectVar in einer Variable speicherst (zumindest sieht man ja häufig das Muster, dass die Effektvariablen zuerst schön in benannte Variablen gepackt werden und am Ende wieder zurück). Von daher überprüft man wohl besser einfach davor, ob der Effekt existiert. Da der hier aber frisch erzeugt wird, liegt das Problem wohl eher woanders.

Naja, eigentlich meinte ich damit IsRef(EffectVar(…)). Ich hatte es lediglich in etwas kürzerer Form geschrieben und gehofft, dass es nicht falsch verstanden wird. :stuck_out_tongue:

Aber dann muss man ja auch zwei mal EffectVar aufrufen und gewinnt nichts gegenüber einem GetEffect davor.

> (Ja, der Effekt existiert.)


Erzeugst du einfach eine Kopie mit AddEffect? Denn das wuerde ja auch den Start-Callback des Effektes aufrufen und sich ggf. gleich wieder entfernen oder sonstige komische Dinge tun.

Ja - ein anderer Weg ist mir nicht bewusst - aber ich habe es bisher nur mit einem eigenen Effekt ausprobiert, der sowas eigentlich nicht tut.
Die aktuelle Laufzeit und sowas kann es natürlich auch nicht kopieren, also taugt es nur für bestimmte Effekte.

Meine Tests widersprechen dem. IsRef gibt auch bei vorher nicht benutzten EffectVars false zurück!

Der Error kam allerdings daher, dass ich zu weit iteriert habe und die Prozedur dann doch auf einen nicht existenten Effekt ausgeführt werden sollte. Jetzt funktioniert alles, wie es soll.

Jetzt habe ich noch eine weitere Frage.
Laut Doku werden die Effect Vars ja in einer Liste gespeichert.

>Es sind theoretisch beliebig viele Variablen möglich; da aber die Liste beim Abfragen von Variablen außerhalb des erzeugten Bereiches neu erstellt werden muss, sollten hier nicht größere Werte als nötig genommen werden.


Kann es "Lücken" in der Liste der existierenden EffectVars geben? Das heißt, wenn ich Effect Var 20 definiere, werden dann 0-19 automatisch mit zur Referenz?
Wenn nein, könnte ich die Schleife ja bis zur ersten Non-reference durchlaufen lassen und damit sicherstellen, dass ich alle Effect Vars kopiere.

Die Liste kann keine Lücken haben (vom Speicherlayout her). Soweit ich das sehe, wird die Liste aber auch schon bei einem lesenden Zugriff über das letzte Element hinaus vergrößert. Daher denke ich nicht, dass du uninitialisierte Werte (für die IsRef ja scheinbar false zurückgibt, obwohl es durchaus schreibbare Referenzen sind) am Listenende von solchen zwischendrin unterscheiden kannst.

Du bekommst aber vermutlich eine zuverlässigere Antwort, wenn du das ausprobierst, ein Blick in den Sourcecode verrät da nicht alle Feinheiten.