Effekte erstellen
Beispiel 1: Ortsgebundenener Effekt
Die Effekte von Zaubersprüchen aus den Kämpfen können auch auf der Abenteuerkarte eingesetzt werden. In diesem Beispiel nützt ein mächtiger Dämonenheld den Armageddonzauber, um seine Ankunft anzukündigen; d.h. zuerst wird der Effekt abgespielt und dann der Held über DeployReserveHero eingefügt. Daneben werden noch ein paar Kamerafunktionen eingebaut, damit der Spieler den Effekt auch sieht:
function NewDay()
if GetDate(DAY) == 2 then
OpenCircleFog(52, 25, 0, 7 , PLAYER_1);
MoveCamera( 52, 25 , 0, 25, 0, 5.24, 0, 1, 1 );
sleep (10);
PlayVisualEffect( "/Effects/_(Effect)/Spells/Armageddon.xdb#xpointer(/Effect)", "", "stop1", 52, 25, 0, 0, 0 );
sleep(30);
DeployReserveHero("Deleb",51, 24,0);
end;
end;
Trigger( NEW_DAY_TRIGGER, "NewDay" );
Erklärung
In Zeile 3 lösen wir den Nebel in der Region auf, in der der neue Held auftauchen soll. Die ersten beiden Zahlen geben die Ortskoordinaten an, 0 steht für GROUND und die vierte Zahl ist der Radius des Kreises, der sichtbar wird. In der nächsten Zeile wird die Kamera an die gleiche Position bewegt; im Unterschied zu oben steht hier die vierte Zahl für den Zoom und die beiden folgenden für die Rotation (genauer kann man das in der PDF-Datei für Scripts nachlesen).
Die Wartefunktion sleep(10) stellt sicher, dass der Effekt erst beginnt, wenn die Kamera die entsprechende Position erreicht hat.
Mit PlayVisualEffect starten wir dann logischerweise den Effekt. Der Pfad ist immer der gleiche, man braucht nur die Spells zu variieren. Zauberspruchnamen, die aus mehreren Wörtern bestehen werden zusammengeschrieben, also z.B. AnimateDead bzw. der gesamte Pfad:
"/Effects/_(Effect)/Spells/AnimateDead.xdb#xpointer(/Effect)"
Die folgende Variable wird bei ortsgebundenen Effekten leergelassen (""), die dritte ("stop1") ist normalerweise auch überflüssig, und dient nur dazu, dass man den Effekt einen Namen gibt, durch den man ihn zwischendurch abbrechen könnte (mit StopVisualEffects ("stop1"); ). (52,25) sind wieder die Ortskoordinaten.
Mit DeployReserveHero fügen wir schließlich den Held ein.
Beispiel 2: Objektgebundener Effekt
Das gleiche Prinzip umgekehrt: Wir lassen einen Held mit CelestialShield explodieren: :devil:
function NewDay()
if GetDate(DAY) == 2 then
O_x,O_y,O_z = GetObjectPosition("Deleb");
MoveCamera(O_x,O_y,O_z,50,1,0,0,0);
sleep(10);
PlayVisualEffect( "/Effects/_(Effect)/Spells/CelestialShield.xdb#xpointer(/Effect)", "Deleb", "stop2", 0, 0, 0, 0, 0 );
sleep(25);
RemoveObject("Deleb");
end;
end;
Trigger( NEW_DAY_TRIGGER, "NewDay" );
Erklärung
Wir müssen zuerst bestimmen, an welchem Ort sich der Held "Deleb" befindet. GetObjectPosition gibt diese Koordinaten aus und wir bezeichnen sie mit O_x, O_y und O_z. MoveCamera funktioniert wie oben.
Bei PlayVisualEffect kann man entweder wie im ersten Beispiel die Koordinaten einsetzen (also O_x, O_y, O_z) oder wie hier in der zweiten Variable den Heldennamen eingeben; der Effekt wird dann direkt über ihm ausgelöst.
RemoveObject entfernt den Held. Leider scheint die Remove-Funktion aber nicht bei festen Kartenobjekten, z.B. Gebäuden zu wirken.
Question Box
Die QuestionBox funktioniert eigentlich genauso wie die MessageBox, nur hat man hier zwei Auswahlmöglichkeiten, nämlich OK oder Abbrechen und je nach Wahl können verschiedene Funktionen ausgelöst werden. In diesem Beispiel bietet der Held "Aberrar" an, sich dem Spieler anzuschließen. Lehnt man ab, d.h. drückt man Abbrechen, dann greift er stattdessen an:
function Solveig(heroname)
QuestionBox("Maps/SingleMissions/Test/SolveigQ.txt", "OK", "Abbrechen");
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "rsolveig", nil );
end;
function OK()
SetObjectOwner("Aberrar", PLAYER_1);
end;
function Abbrechen()
MoveHeroRealTime("Aberrar",167,66);
end;
Trigger( REGION_ENTER_AND_STOP_TRIGGER, "rsolveig", "Solveig" );
Erklärung
Die QuestionBox enthält natürlich einen Text, den man genauso eingibt wie bei der MessageBox (siehe oben unter Nachrichten-Boxen). Nach dem Pfad kann man zwei Funktionsnamen eingeben, hier habe ich sie einfach "OK" und "Abbrechen" genannt.
Wird die Funktion "OK" ausgelöst, so wechselt der Held zu Spieler 1 durch SetObjectOwner. Bei "Abbrechen" wird das Spiel kurz geblockt, während sich der feindliche Held zu den Koordinaten (167,66) bewegt. Diese sind exakt neben der (nur 1 Feld großen) Region "rsolveig", so dass automatisch der Kampfmodus gestartet wird.