[Modding] SpellCast() löst keine Script-Reaktion aus

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.199
Ich möchte in einer meiner Mods ein kleines Ritual einfügen, bei dem der Spieler mehrere Zauber nacheinander wirken muss.

Problem: Die gewirkten Zauber lösen das Script nicht aus.

Folgender Code des ersten Zaubers:
Code:
IF
    OR(6)
        SpellCast([ANYONE],WIZARD_PROTECTION_FROM_EVIL)  // SPWI113.SPL (Schutz vor Bösem)
        SpellCast([ANYONE],CLERIC_PROTECT_FROM_EVIL)  // SPPR107.SPL (Schutz vor Bösem)
        SpellCast([ANYONE],CLERIC_PROTECTION_FROM_EVIL_10_FOOT)  // SPPR408.SPL (Schutz vor Bösem, 3 m Radius)
        SpellCastRES("SPIN121",[ANYONE])  // Schutz vor Bösem
        SpellCastRES("SPCL213",[ANYONE])  // Schutz vor Bösem
        SpellCastRES("SPCL233",[ANYONE])  // Schutz vor Bösem, 3 m Radius
    Global("Protect_evil","ACDT22",0)
THEN
    RESPONSE #100
        SetGlobal("Protect_evil","ACDT22",1)
        CreateVisualEffect("ICMAGICH",[557.533])
END

...führt zu keinem Ergebnis. Egal, ob ich es aus dem Area-Script oder aus einer Kreatur heraus laufen lasse. Auch, wenn ich das [ANYONE] durch [PC] oder Player1 etc. ersetze, tut sich... nichts. Ich habe auch schon andere Zauber versucht, immer das gleiche Spiel. Woran könnte das liegen? Gibt es nur bestimmte Zauber, die durch SpellCast() erkannt werden können?
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Der Trigger funktioniert nur, wenn das Ereignis in der letzten Skriptrunde aufgetreten ist.
In meinen Notizen steht auch, dass der Trigger an alle Akteure "in der Nähe" vom Auslöser + Baldur AI geschickt wird. (Also vermutlich nicht ans Area-Skript, sondern nur baldur.bcs.)


SpellCastRES gibt es übrigens nur in den EEs.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.199
SpellCastRES gibt es übrigens nur in den EEs.
Das ist merkwürdig. In der Trigger.IDS meines Vanilla BG2-ToB sind folgende Trigger hinzugefügt:
Code:
0x0091 SpellCastRES(S:Spell*,O:Object*)
0x00A6 SpellCastPriestRES(S:Spell*,O:Object*)
0x00A7 SpellCastInnateRES(S:Spell*,O:Object*)

Durch diesen Hinweis habe ich aber gemerkt, woran es liegt, dass der Code nicht funktioniert. Wenn man einen Priesterzauber detektieren möchte, muss man SpellCastPriest nehmen. Dann geht es.

Der richtige Code heißt also:
Code:
IF
    OR(3)
        SpellCast([ANYONE],WIZARD_PROTECTION_FROM_EVIL)  // SPWI113.SPL (Schutz vor Bösem)
        SpellCastPriest([ANYONE],CLERIC_PROTECT_FROM_EVIL)  // SPPR107.SPL (Schutz vor Bösem)
        SpellCastPriest([ANYONE],CLERIC_PROTECTION_FROM_EVIL_10_FOOT)  // SPPR408.SPL (Schutz vor Bösem, 3 m Radius)
    Global("Protect_evil","ACDT22",0)
THEN
    RESPONSE #100
        SetGlobal("Protect_evil","ACDT22",1)
        CreateVisualEffect("ICMAGICH",[557.533])
END

Um die fehlende SpellCastRES zu umgehen:
Kann ich mittels APPEND eigentlich gefahrlos Zauberbeschreibungen zur SPELL.IDS hinzufügen, um z.B. auch die Fähigkeit der Paladine, die bisher noch keine Bezeichnung hat, detektieren zu können?
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Das ist merkwürdig. In der Trigger.IDS meines Vanilla BG2-ToB sind folgende Trigger hinzugefügt
In der Tat merkwürdig. In meiner ungemoddeten ToB-Installation fehlt SpellCastRES() und das IESDP listet den Trigger auch nicht bei BG2 auf.
Der Code dafür scheint aber in der Engine schon vorhanden zu sein und das BG2-Fixpack fügt den Trigger auch hinzu. Könntest du also auch so übernehmen.
Code:
APPEND ~TRIGGER.IDS~ ~0x0091 SpellCastRES(S:Spell*,O:Object*)~
              UNLESS ~0x0091 SpellCastRES(S:Spell\*,O:Object\*)~

Kann ich mittels APPEND eigentlich gefahrlos Zauberbeschreibungen zur SPELL.IDS hinzufügen, um z.B. auch die Fähigkeit der Paladine, die bisher noch keine Bezeichnung hat, detektieren zu können?
Am besten ausprobieren.
Solange die Einträge mit der Zahl am Anfang die richtige SPL-Datei referenzieren, müsste es eigentlich funktionieren.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.199
Der Code dafür scheint aber in der Engine schon vorhanden zu sein und das BG2-Fixpack fügt den Trigger auch hinzu. Könntest du also auch so übernehmen.
Das funktioniert leider doch nicht. Der Trigger...
Code:
SpellCastInnateRES("SPCL213",[ANYONE])  // Schutz vor Bösem
... löst keine Reaktion aus. :confused:
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Ja, du hast recht, ich hab's mir gerade angeschaut.
Der Code kopiert den Spellname nicht in den generierten Trigger, d. h. der Trigger wird zwar geschickt, aber es matcht dann nicht auf den Spellname.
Folglich kann man die RES-Varianten in der ToB-Version nicht nutzen.

Für SPCL213 wird als ID 4113 generiert (4 = Innate, 1 = Spelllevel, 13 = die letzten zwei Zeichen vom Spellname).
Die ID kann man dann mit dem SpellCastInnate()-Trigger prüfen.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.199
Super, vielen Dank! Jetzt klappt es mit folgendem Code:
Code:
SpellCastInnate([PC],4113)

Einziges Problem ist, dass NI jetzt motzt, weil es davon ausgeht, dass der im Code genannte Zauber den Namen SPCL113.SPL hat und diesen nicht findet. Aber das ist ja an sich kein Problem. ;)
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Du kannst ja noch einen entsprechenden Eintrag in die SPELL.IDS packen und den dann referenzieren. (So wie oben von dir erwähnt.)
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.199
Du kannst ja noch einen entsprechenden Eintrag in die SPELL.IDS packen und den dann referenzieren. (So wie oben von dir erwähnt.)
Ja, das wäre eine elegante Lösung. Ich habe nur die Befürchtung, dass ich dann wieder darauf achten muss, dass nicht eine andere Mod die Referenz bereits einfügt, aber anders benennt.
Der gleiche Spruch heißt z.B. bei Magiern WIZARD_PROTECTION_FROM_EVIL, aber bei Klerikern CLERIC_PROTECT_FROM_EVIL. Nicht, dass dann mein Script wieder fehlerhaft wird... :hae:
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.407
Vielleicht könnte man den Eintrag in die SPELL.IDS mit UNLESS passend gestalten?
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.199
Vielleicht könnte man den Eintrag in die SPELL.IDS mit UNLESS passend gestalten?
Ja, das ginge, mein Problem ist, dass ich dann direkt im Script checken müsste, wie die Bezeichnung des Zaubers in der SPELL.IDS lautet, sonst funktioniert mein Script nicht.
Spontan würde ich den Zauber PALADIN_PROTECTION_FROM_EVIL nennen, aber vielleicht kommt auch jemand auf die Idee, die Klerikerbezeichnung PALADIN_PROTECT_FROM_EVIL zu nehmen, und dann würde es nicht funktionieren.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.960
Klingt als müsstest Du im Skript mit Variablen arbeiten, die beim Installieren aus der ids mit den entsprechenden Namen gefüllt werden. Geht sicherlich, ist aber nicht mein "Turf".
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.199
Klingt als müsstest Du im Skript mit Variablen arbeiten, die beim Installieren aus der ids mit den entsprechenden Namen gefüllt werden. Geht sicherlich, ist aber nicht mein "Turf".
Ja, genau so sehe ich das auch. Ich lasse zunächst einmal alles so, wie es ist.
Hauptursache ist, dass die Entwickler den Zauber falsch benannt haben. Eigentlich müsste der statt SPCL213 -> SPCL113 heißen, dann wäre alles kein Problem... ;)
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Mehrere Namen für denselben Spruch in der SPELL.IDS sollte kein Problem darstellen.
Die Datei ist ja nur dafür da, um von einem symbolischen Namen auf die ID zu schließen.
Im kompilierten Skript selbst ist nur die ID hinterlegt.

Der einzige Nachteil wäre, dass bei einem anschließenden Dekompilieren evtl. ein anderer Name benutzt wird, als beim ursprünglichen Kompilieren. Dürfte aber nur wenig Fälle geben, bei denen das zu Problemen führt.

In WeiDU könnte auch LOOKUP_IDS_SYMBOL_OF_INT benutzt werden, um an den potentiellen Namen zu kommen.
 
Oben