WC.de TD – Trigger

[nocontentad]

WC.de TD – Trigger


zum Anfang


1. Vorwort

In diesem Teil des
Tutorials möchte ich auf die Trigger eingehen, die für eine
Tower Defense benötigt werden. Das umfasst die Sieg und Niederlagebedingungen
sowie alles was mit Creeps zu tun hat sowie wie im Einheiten Tutorial
schon angesprochen die getriggerten Ausbaustufen und Fähikeiten.


zum Anfang


2. Der Triggereditor und Trigger
Allgemein

Zuerst möchte ich
auf die grundlegenden Aspekte des Triggereditors eingehen. Denn dies
ist das Tool, das uns beim Steuern der Gegner, Fähigkeiten der
eigenen Türme sowie den Sieg und Niederlagebedingungen hilft. Alles
in allem ein sehr wichtiger Bestandteil des Editors und seit The
Frozen Throne
um einiges mächtiger als zuvor.

Diesen Triggereditor erreicht man über die Taste F4

oder den Button ,
den man unterhalb der Menüleiste im Hauptfenster des World-Editors
findet. Wenn man nun den Triggereditor geöffnet hat, so ist dieser
ebenfalls in mehrere Fenster unterteilt. Dabei ist links der „Trigger-Explorer“
der alle Trigger die man hat anzeigt – diese kann man in Kategorien
ordnen, so dass es übersichtlicher wird. Auf der rechten Seite
das Hauptfenster zeigt den eigentlichen Trigger, oberhalb dieses Fensters
befindet sich das Kommentarfeld für den jeweiligen Trigger, in
das man eine zusätzliche Beschreibung einfügen kann. In der
Buttonreihe gibt es ebenfalls eine Reihe neuer Schaltflächen, die
sich auf den Triggereditor beziehen – dazu jedoch nachher mehr.

Doch was sind Trigger eigentlich:
Ein Trigger (zu deutsch Auslöser) ist eigentlich eine Art Script/Programmiersprache
mit der man selber die unterschiedlichsten sachen machen kann. Beispielsweise
kann man Einheiten bewegen, töten oder aber auch Videos selber
machen – dies ist aber nur ein Bruchteil der Möglichkeiten die
man hat, und auch die TD wird nur einen geringen Teil der Trigger ausreizen.

Wie ist so ein Trigger aufgebaut:

Im Grunde besteht er aus drei Teilen: dem Ereignis (oder auch
mehreren), der Bedingung (oder auch mehreren) und dann noch
den Aktionen. Auf Ereignis und Bedingung kann man verzichten,
Aktionen sollte ein Trigger jedoch immer haben, da er sonst nichts macht.
Den Trigger selber kann man über den Button

erstellen, allerdings ist dieser vorerst noch „leer“ und muss
„programmiert“ werden.

  • Event/Ereignis: (Strg + E oder Button )Damit
    kann man festlegen wann die nachfolgenden Aktionen durchgeführt
    werden, also der Trigger generell in Aktion tritt.
    zB A unit dies – dieser Trigger wird
    ausgelöst, wenn eine Unit stirbt.

    Ein Event ist aber optional, dh. man kann ihn weglassen, allerdings
    kann sich der Trigger dann nicht mehr selber auslösen, und muss
    durch einen anderen Trigger ausgelöst werden.

  • Bedingung/Condition: (Strg + D oder Button )Hierbei
    handelt es sich um eine Beschränkung, damit ein Trigger nur in
    bestimmten Fällen abgearbeitet wird, auch wenn er dem Event nach
    aufgerufen wird. Ist also ein Flaschenhals, mit dem man den Trigger
    \’steuern\‘ kann…

    zB <Dying Unit> is of type \’Soldat\‘
    dass hat zur folge, dass die nachfolgenden aktionen nur dann ausgelöst
    werden, wenn die Einheit die gestorben ist ein Soldat/Footie war,
    andernfalls passiert nichts.

  • Aktion/Action: (Strg + R oder Button )Hier
    kann man dann unterschiedliche Aktionen durchführen. Dabei stehen
    einem unzählige zur Auswahl – einfach mal durchschauen, sind
    eh meist selbsterklärend.

    zb Spiel – Display Message – mit dieser
    Aktion kann man einen Text anzeigen lassen (den man natürlich
    selbst bestimmen kann)

Im endeffekt würde das so aussehen:

    E: A unit dies
    B: <dying unit> is of type ‚Soldat‘

    A: Game – Display Message („Ein Soldat ist gefallen“)

Wenn immer jetzt ein Soldat stirbt erscheint die nachricht, dass ein Soldat
gestorben ist – stirbt hingegen eine andere Einheit, passiert nichts,
da der Trigger aufgrund der Bedingung nicht weiter ausgeführt wird.

 

zum Anfang


3. Regionen

Bevor wir aber nun
endgültig in den Triggereditor eintauchen, müssen vorher noch
sogenannte Regionen erstellt werden (Diese werden benötigt, dass
man die Gegner erstellen und steuern, also mittels Trigger bewegen kann.)

Diese Regionen kann man mittels der Regionenpalette erstellen, die über
die Taste R aus dem Hauptfenster des Editors erreichbar
ist. Wenn man nun den Hinzufügen Button in der Regionenpalette
gedrückt hat, kann man die Regionen einfach in der Landschaft aufziehen.
Ist das geschehen sollte man sie umbennen (Rechtsklick/Umbennen auf
den Eintrag in der Liste der Regionen in der Palette) und zwar so, dass
man sich danach auch auskennt.

Das nachfolgende Bild zeigt wie die Regionen (rote Flächen) auf
der Karte verteilt werden sollten. Dabei geben die Pfeile die spätere
Bewegungsrichtung der Gegner an. In den Ecken sind dabei die Startpunkte,
in der Mitte der Zielpunkt.


zum Anfang


4. Initialisierungstrigger
und Variablen


zum Anfang

4.1. Variablen

Für unsere Tower
Defense benötigen wir auch eine Variblen. Sie dienen einfach dazu,
dass man Werte abspeichern und später nochmals darauf zugreifen
und arbeiten kann (also genaus wie beim Programmieren). Variablen erstellen
kann man in einem eigenen Fenster, dass man über Strg + B oder
Button vom Triggereditor aus erreicht.
In dem sich öffnenden Fenster kann man mit Strg+N

eine neue Variable anlegen. Hierbei muss man den Namen vergeben, danach
den Typ (was kann später darin gespeichert werden) aus einer Kombobox
auswählen. Dann kann man noch eventuell einen Startwert angeben,
und festlegen, ob es sich bei der Variable um ein Array handelt und
wie groß dies ist (ermöglich das speichern mehrerer Werte
in einer Variable).

Nachfolgend welche Variablen für die TD benötigt werden:

  • BL_Info: speichert eine Bestenliste
  • ET_SpawnCreeps: Hier werden später die einzelnen
    Creeptypen abgespeichert, und zwar so, dass Index = Runde
  • I_CreepAmount: gibt dann später an, wieviele
    Creeps pro Runden erscheinen sollen
  • I_EnemyReached: zählt die Gegner, die ins
    Zielgebiet gekommen sind
  • I_RundenCount: Zählt mit in welcher Runde
    man gerade ist…
  • SG_AllHumanPlayer: speichert eine Spielergruppe,
    in der Alle Spieler gespeichert werden
  • T_NextRound: speichert den Timer, der die nächste
    Runde anzählt
  • TW_NextRound: das Fenster in dem der Timer angezeigt
    wird


zum Anfang

4.2. Initialsierung Allgmein

Als erstes wird der
Trigger für die Nahkampfinitialisierung gelöscht (im linken
Menü markieren, und dann Entfernen drücken). Danach
wird folgender Trigger erstellt:

Das Ereignis Map-Initialisation bedeutet, dass diese Aktionen
während des Ladenvorganges durchgeführt werden, also wenn
man noch den Ladebildschirm der Karte vor Augen hat.

Der erste Schritt ist, dass alle Spieler die tatsächlich spielen
(also nicht vom Computer gesteuerte Spieler die tatsächlich im
Spiel sind) gepickt, dh. es wird eine Schleife durchlaufen, und zwar
für jeden dieser Spieler einmal. Danach wird der gerade aktuelle
Spieler zu einer Spielergruppenvariable hinzugefügt (was es danach
einfacher macht, zB allen 4 Spieler eine Niederlage zu erteilen), sein
Gold auf den gewünschten Wert gesetzt, die Startansicht auf seinen
Tempel der Macht gesetzt. Hierfür nimmt man alle Einheiten die
dem aktuellen (picked) Spieler gehören und den Typ Tempel der Macht
haben. Bei dieser Aktion kann man Random Unit nehmen, da jeder Spieler
nur einen Tempel hat, und deshalb auch nur dieser genommen werden kann.Anschließend
wird für ihn noch die ganze Karte sichtbar gemacht. Dies sind 2
Aktionen, zum einen einen Visibilty Modifier erzeugen, und
danach muss man den noch einschalten.

Diese Schleife wird wie schon gesagt für jeden tatsächlich
vorhandenen Spieler durchlaufen (also max. 4 mal)

Danach stellt man ein, dass Spieler 5 Gold ausgibt, wenn man eine Einheit
von ihm tötet (also so als ob die Einheiten normale Creeps werden).
Da dies jedoch für alle anderen Spieler als neutral feindlich deaktiviert
ist, muss dies eben mit der Aktion eingeschalten werden.

Danach deklariert man das vorhin angesprochene Unit-Type Array, dass
die einzelnen Gegner für die einzelnen Runden beinhaltet. Bei erstellen
des Arrays wurde eine Größe von 11 angegeben, tatsächlich
brauchen wir aber nur 10. Das ist deshalb der Fall, weil der Index eines
Arrays bei 0 anfängt. Wenn man nun aber das Array um 1 größer
macht, dann kann jeweils den Index verwenden, der der tatsächlichen
Rundennummer entspricht.


zum Anfang


4.3. Initialsierung Bestenliste

Eine Bestenliste ist
diese kleine Tafel, die man öfters bei Funmaps oder auch in der
Kampagne rechts oben sieht. So etwas wollen wir auch für unsere
TD verwenden. Dabei sollen auf dieser Liste angezeigt werden, in der
wievielten Runde man gerade ist, und wieviele Gegner schon durchgekommen
sind. Dazu wird folgender Trigger erstellt:

Als Bedingung wird hierbei nicht Map Initialisation genommen (obwohl
die Bestenliste von Anfang an sichtbar sein soll) sondern Time Elapsed
0 seconds,
weil man mit Map Init keine Bestenlisten erzeugen kann
(funktioniert einfach nicht).

Zuerst wird die Bestenliste erzeugt (hierbei wird der Titel mit angegeben)
und danach wird sie in eine Variable gespeichert.
Danach werden 2 Spieler hinzugefügt, wobei man für diese ein
Label angeben muss (das ist der Name der in der Bestenliste für
sie erscheint) und einen Startwert. Für die durchgekommenen Gegner
kann die entsprechende Variable angegeben werden, für die Runde
hingegen einfach 0 schreiben, denn die Variable für die Runden
hat ja den Startwert 1.

zum Anfang


5. Creep Spawning

Nun kommen die Trigger,
die mehr oder weniger direkt mit dem erzeugen der Creeps und mit dem
Steuern der Runden zu tun haben. All diese Trigger findet man in der
Kategorie Creep Spawn. Diese Kategorie besteht aus 4 Triggern, auf die
nachfolgend eingegangen wird:


zum Anfang

5.1 Initial Activation

Das Erzeugen der der
Creeps für die einzelnen Runden wird durch einen Timer ausgelöst,
wie man bei den jeweiligen Trigger dann erkennen kann. Dieser Timer
wird aufgerufen, wenn alle Gegner getötet sind, oder die Mitte
erreicht haben. Wenn dann der Timer abgelaufen ist, wird die nächste
Runde gestartet. Der Timer muss aber auch 1x „von außen“
angestoßen werden, um den ganzen Vorgang in Gang zu setzen. Dies
passiert mit dem nachfolgenden Trigger:

Den Time-Elapsed Event kennen wir nun schon – nach 30 Sekunden
Spielzeit wird der Trigger ausgelöst. Nach diesen 30 Sekunden wird
ein Timer erzeugt. Dies funktioniert einfach mit Countdown-Timer – Start
und der Angabe der vorhin deklarierten Timer-Variable. Angegeben wird,
dass der Timer 1x abläuft und eine „Lebenszeit“ von 30
Sekunden hat.
Dann läuft der Timer, ist aber noch nicht sichtbar, deshalb muss
man noch ein Timer-Window erzeugen. Dabei gibt man den Timer an, für
den das Fenster sein soll. Beim Titel wählt man die Funktion Concentrate
String
. Beim ersten String schreibt man „Runde „, beim
2. wählt man nochmals diese Funktion und gibt dann beim ersten
Teil Umwandlung – Convert Integer to String (für I_RundenCount)
an, und beim zweiten Teil “ in:“. Das hat zur Folge, dass
der Titel folgendermaßen aussieht: „Runde X in: Zeit“.
Danach wird das eben erzeugte Fenster noch in die dafür vorgesehene
Variable gespeichert.


zum Anfang


5.2 Next Round

Dieser Trigger wird
dann ausgelöst, wenn Spieler 5 (also der dem die Creeps gehören)
keine Einheiten mehr hat, also alle die Mitte erreicht haben, oder getötet
wurden. Zuerst wird dann nachgesehen, ob man schon in der 10. Runde
ist – wenn ja, dann hat man gewonnen. Andernfalls wird die Rundenvariable
um eines erhöht, und dann wieder der schon bekannte Timer erzeugt.

Dieser Trigger wird immer dann ausgelöst, wenn eine Einheit des
Creep-Besitzers stirbt. Allerdings wird erst dann mit der Ausführung
fortgefahren, wenn dieser Spieler keine lebenden Einheiten mehr hat
(man muss dabei darauf achten, dass man die lebenden Einheiten zählt,
denn auch tote Einheiten zählen als Einheiten).

Danach folgt ein if mit mehreren Aktionen das dann durchlaufen wird,
wenn man in der 10 Runde ist. Sollte dies der Fall sein, dann wird der
Sieg-Trigger laufen gelassen (wie vorher, einfach vorläufig einen
leeren Trigger hierfür erstellen) und danach überspringt man
mit Skip remaining actions alle nachfolgenden Aktionen dieses Triggers
– damit verhindert man, dass noch einmal ein Timer erzeugt wird.
Nach dem If kommen die Aktionen, die im Normalfall nach Abschluss einer
Runde durchgeführt werden. Zum einen wird die Rundenanzahl erhöht
(dies macht man mit Set Variable dabei
wählt man I_RundenCount links vom \’=\‘ und rechts davon Arithmetic
– dabei gibt man beim ersten Teil die Variable an, dann das + un
beim zweiten Teil 1, und dann wird (wie vorher schon) ein Timer erzeugt,
der die nächste Runde auslöst.


zum Anfang


5.3 Control

Dieser Trigger dient
im Prinzip zur genaueren Steuerung der einzelnen Runden:

Dieser Trigger wird ausgelöst wenn der Timer der zur ßberbrückung
der Runden dient abläuft, also 0 erreicht.
Als erstes wird die Rundennummer die auf der Bestenliste angezeigt wird
upgedatet, schließlich wird ja nun die neue Runde wirklich aktiviert.

Danach wird das Timerfenster in dem der Timer angezeigt wird vernichtet,
damit der Timer nicht mehr angezeigt wird.
Danach folgen 10 if mit Multiple Conditions. Dabei dient als
Bedingung ein Integervergleich, bei den man die RundenNr-Variable angibt.
Innerhalb des If\’s werden dann Aktionen durchgeführt, die Auswirkungen
auf die Runde haben. In diesem Beispiel wird hier die Anzahl der spawnenden
Creeps festgelegt, aber natürlich kann man hier noch diverse andere
Sachen unterbringen… Dann wird der Spawning Trigger ausgelöst,
wo dann Einheiten tatsächlich erstellt werden.

Hie ist nur ein IF (für die erste Runde) abgebildet. Das ganze
kopiert man einfach, und fügt es dann noch 9 mal ein, bei den IF\’s
ändert man dann einfach die Zahl um, sodass jede Runde (von 1-10)
einmal vertreten ist.


zum Anfang


5.4 Spawning

In diesem Trigger werden
die Monster erstellt, und dann wird ihnen der erste Bewegungsbefehl
zur ersten Region erteilt.

Und zwar wird in der jeweiligen Eckregion eine Einheit vom Einheitentyp
ET_SpawnCreeps[I_RundenCount] erstellt. Wir erinnern uns, in
ET_SpawCreeps wurden bei der Map-Initialisation die Einheiten Typen
für die jeweiligen Runden gespeichert, und zwar so das Index =
Runde. Dies kommt uns nun zugute.

Danach folgt ein if, in dem verglichen wird, ob eine Zufallszahl zwischen
1 und 2 erzeugt wird. Abhäning davon erteilt man der gerade erstellten
Einheit (last created Unit) den Befehl in eine andere Region (schließlich
gibt es ja 2 Möglichkeiten, in welche Richtung sich die Einheit
bewegen kann). Um der Einheit den Bewegungsbefehl zu erteilen benutzt
man den Trigger Einheit – Issue Order Targeting
a Point

Das macht man dann noch 3 mal, sodass man in jeder Ecke eine Einheit
erstellt.
Das ganze befindet sich in einer Schleife, die sooft durchlaufen wird,
wie es in der Variable I_CreepAmount festgehalten ist. Dh. wenn die
Variable den Wert 15 hat, dann werden an jeder Ecke (also in jeder der
4 Regionen) 15 Creeps erzeugt (und zwar immer zu Runde passende).


zum Anfang


6. Movement

So, nun zu den Triggern,
die die Creeps in ihrer Bewegung steuern. Natürlich könnte
man den Creeps gleich zu Beginn (also nach dem Erstellen) einen Bewegungsbefehl
in die Mitte geben. Allerdings ist die Tower Defense ja so designed,
dass es auch Abzweigungen gibt, weshalb man eben zusätzlich Regionen
braucht und eben auch Trigger. Ich werde im folgenden nicht jeden Movement
Trigger beschreiben, sondern nur die 3 vorkommenden Typen.
Alle Trigger die mit der Bewegung der Gegnereinheiten zu tun haben,
sind übrigends in der Kategorie Creep Movement.
Bei allen Move-Triggern gibt es auch immer die Bedingung, dass nur dann
weitergemacht wird, wenn die Einheit um die es sich dreht dem Spieler
gehört, dem die Creeps gehören, denn man will ja nicht, dass
auf einmal die eigenen Einheiten (also die Baueinheiten) sich ohne Zutun
bewegen.


zum Anfang


6.1 Einfach

Hierbei handelt es sich
um einen einfachen Trigger, der nur dazu dient, Einheiten die ein Gebiet
erreichen den Befehl zu geben, in ein anderes Gebiet weiter zu marschieren
– ein Beispiel hierfür:

Wenn eine Einheit das Gebiet betritt, und diese Einheit ein Gegner ist
(also zu Spieler 5 gehört), dann bekommt sie den Befehl in ein
anderes Gebiet weiter zu gehen.


zum Anfang

6.2 Split

Hierbei gibt es 2 Möglichkeiten,
in welches Gebiet die Einheit weitergeht, also im Prinzip das gleiche,
wie es anfangs beim Erstellen der Einheiten war:

Hierbei wird im IF wieder eine Zufallszahl erzeugt und abhänging
vom Ergebnis dann die Einheit in das eine Gebiet oder in das andere
Gebiet weiterbefehligt.


zum Anfang


6.3 Finish

Hierbei geht es jetzt
darum, dass sich alle Einheiten in die Mitte bewegen. Das ist der letzte
Move-Befehl, den die Einheiten erteilt bekommen.

Hierbei kann man erkennen, dass 4 Ereignisse verwendet wurden. Das bedeutet,
dass der Trigger immer dann ausgelöst wird, wenn eines der 4 Ereignisse
eintritt. Man könnte stattdessen diesen Trigger auch auf 4 aufteilen,
allerdings ist das Ziel (nämlich die Mitte) bei jedem Trigger gleich,
also kann man sie gleich in einen zusammenfassen.

zum Anfang


7. CG Finishes

CG Finishes (steht für
die Kategorie Creep General), ist der einzige Trigger in seiner Kategorie
und sieht wie folgt aus:

Finish ist hierbei die Region im Zentrum der Karte (also die,
welche die Creeps erreichen müssen). Wenn nun eine Einheit von
Spieler 5 (also derjenige Spieler, dem die Creeps „gehören“),
was durch die Bedinung festgelegt wird, die Mitte erreicht, dann wird
zuerst die Variable I_EnemyReached (diejenige die die durchgekommenen
Gegner zählt) eins hinaufgezählt. Diese Beschränkung,
dass nur dann fortgefahren wird, wenn die Einheit mit der etwas passiert
dem Spieler gehört, der die Creeps „steuert“ wird im
folgend häufiger vorkommen.
Bei der Bedingung fällt vielleicht das Entering Unit auf.
Standardmäßig ist bei der Player Comparision (die
man für die Bedingung braucht) Triggering Unit ausgewählt.
Dies würde auch funktionieren, jedoch sollte man sich angewöhnen
statt dieser allgemeinen Ereignis-Reaktion die spezielleren (wie eben
zB.: entering unit) nehmen, da dies zum einen sauberer ist,
und zum anderen manchmal nur die spezielleren funktionieren. Auswählen
kann man dies in der selben Kombobox in der auch Triggering

Unit eingetragen ist.
In der nachfolgenden Zeile wird dann die Bestenliste aktualisiert, schließlich
soll die ja immer zeigen, wieviel Gegner schon durchgekommen sind.
Dann wird die Einheit die die Region in der Mitte erreicht hat gesprengt
– so wird vermieden, dass sich die Einheiten in der Mitte sammeln, und
dann alles blockieren.
Zum Schluss kommt noch eine if-Abfrage, ob schon 100 Gegner die Mitte
erreicht haben. Sollte dies der Fall sein, dann wird ein anderer Trigger
laufen gelassen, der die Niederlage durchführt. Diesen Trigger
sollte man am besten gleich erstellen, damit man ihn hier angeben kann,
allerdings kann man ihn vorerst leer lassen, die „Programmierung“
dieses Triggers folgt dann nach.


zum Anfang


8. Diverses

Jetzt folgen die letzten
4 Trigger die für die TD benötigt werden.


zum Anfang


8.1 Blitzspitze Angriff

Bei den Einheiten wurde
ja ein Turm mit der Fähigkeit Blitzschlag erstellt. Allerdings
nutzt er diese ja nicht von alleine und muss deshalb getriggert werden.
Dies wird nun endlich gemacht. Und hier noch der Trigger:

Dieser Trigger wird ausgelöst wenn eine Einheit angegriffen wird,
und danach schaut man, ob die Attacking Unit vom Typ Blitzspitze angegriffen
hat. Wenn dies der Fall ist, wird der Blitzspitze (also der Attacking
Unit) mit Unit – Issue Order Targeting a Unit
befohlen, den Angriff Gabelblitz auf die Einheit durchzuführen,
die sie angegriffen hat. Man nimmt deshalb hier Gabelbitz als Befehl,
weil der eigene Skill auf einem Gabelbitz basiert und deshalb auch den
gleichen Befehlsstring hat.


zum Anfang


8.2 Technologie

Desweiteren gibt es
ja noch eine Technologie, und in dieser Verbindung Feuerbunker, die
jeweils eine andere Einheit als Vorraussetzung haben:

Als Event dient das Abschließen einer Forschung. Durch die Bedinung
wird dann festgelegt, dass die Forschung „Macht der Flamme“
sein muss.

Danach „pickt“ man jede Einheit des Types Macht der Fackel
(ist zwar nur eine, aber dadurch erspart man sich Variablen) vom Spieler
der die Technologie erforscht hat, und ersetzt sie durch die Macht der
Flamme. Dadurch wird der Bau von den Bunkern der Fackel unmöglich
(die Einheit die sie als Vorraussetzung haben wird entfernt), während
man jetzt Bunker der Flamme bauen kann (die Einheit die sie als Vorraussetzung
haben wird erstellt).

Danach „pickt“ man noch jeden Bunker der Fackel des jeweiligen
Spielers und tauscht sie durch die stärkere Variante aus.


zum Anfang


8.3 Sieg und Niederlage

Diese 2 Trigger sollten
schon existieren, allerdings noch vollkommen leer – dies soll nun nachgeholt
werden.


Niederlage:

Der Niederlage Trigger wird durch einen anderen Trigger ausgelöst,
weshalb man sich Ereignis und Bedingung sparen kann.
Als allererstes wird eine Nachricht angezeigt, dass man verloren hat
(an alle Spieler) und 10 Sekunden gewartet (game-time-seconds deswegen,
weil dies für den Multiplayergebrauch sicherer ist (in Sachen Diconnects).
Dann pickt man alle Spieler (deswegen auch die Variable) und erklärt
ihnen die Niederlage.

Sieg:

Dieser Trigger wird ebenfalls durch einen anderen augeslöst. Auch
sonst ist er dem Niederlage-Trigger sehr ähnlich. Der Einzige Unterschied
sind die Nachrichten, und das in der Schleife dann der Spieler statt
einer Niederlage den Sieg bekommt.


zum Anfang


9. Schlußwort

Dies war nun der 3
und letzte Teil des Tutorials. Jetzt sollte man eine fertige Tower Defense
haben.
Ich hoffe wir konnten euch einiges erklären und es gibt bald ein
paar gute TD\’s mehr im Battle.net.
Viel Spaß noch beim Mappen und gutes Gelingen.

zum Anfang

Wie mache ich eine Maze/Tower-Defence Map AoS-Tutorial

WC.de TD – Trigger

[nocontentad]

WC.de TD – Trigger


zum Anfang


1. Vorwort

In diesem Teil des
Tutorials möchte ich auf die Trigger eingehen, die für eine
Tower Defense benötigt werden. Das umfasst die Sieg und Niederlagebedingungen
sowie alles was mit Creeps zu tun hat sowie wie im Einheiten Tutorial
schon angesprochen die getriggerten Ausbaustufen und Fähikeiten.


zum Anfang


2. Der Triggereditor und Trigger
Allgemein

Zuerst möchte ich
auf die grundlegenden Aspekte des Triggereditors eingehen. Denn dies
ist das Tool, das uns beim Steuern der Gegner, Fähigkeiten der
eigenen Türme sowie den Sieg und Niederlagebedingungen hilft. Alles
in allem ein sehr wichtiger Bestandteil des Editors und seit The
Frozen Throne
um einiges mächtiger als zuvor.

Diesen Triggereditor erreicht man über die Taste F4

oder den Button ,
den man unterhalb der Menüleiste im Hauptfenster des World-Editors
findet. Wenn man nun den Triggereditor geöffnet hat, so ist dieser
ebenfalls in mehrere Fenster unterteilt. Dabei ist links der „Trigger-Explorer“
der alle Trigger die man hat anzeigt – diese kann man in Kategorien
ordnen, so dass es übersichtlicher wird. Auf der rechten Seite
das Hauptfenster zeigt den eigentlichen Trigger, oberhalb dieses Fensters
befindet sich das Kommentarfeld für den jeweiligen Trigger, in
das man eine zusätzliche Beschreibung einfügen kann. In der
Buttonreihe gibt es ebenfalls eine Reihe neuer Schaltflächen, die
sich auf den Triggereditor beziehen – dazu jedoch nachher mehr.

Doch was sind Trigger eigentlich:
Ein Trigger (zu deutsch Auslöser) ist eigentlich eine Art Script/Programmiersprache
mit der man selber die unterschiedlichsten sachen machen kann. Beispielsweise
kann man Einheiten bewegen, töten oder aber auch Videos selber
machen – dies ist aber nur ein Bruchteil der Möglichkeiten die
man hat, und auch die TD wird nur einen geringen Teil der Trigger ausreizen.

Wie ist so ein Trigger aufgebaut:

Im Grunde besteht er aus drei Teilen: dem Ereignis (oder auch
mehreren), der Bedingung (oder auch mehreren) und dann noch
den Aktionen. Auf Ereignis und Bedingung kann man verzichten,
Aktionen sollte ein Trigger jedoch immer haben, da er sonst nichts macht.
Den Trigger selber kann man über den Button

erstellen, allerdings ist dieser vorerst noch „leer“ und muss
„programmiert“ werden.

  • Event/Ereignis: (Strg + E oder Button )Damit
    kann man festlegen wann die nachfolgenden Aktionen durchgeführt
    werden, also der Trigger generell in Aktion tritt.
    zB A unit dies – dieser Trigger wird
    ausgelöst, wenn eine Unit stirbt.

    Ein Event ist aber optional, dh. man kann ihn weglassen, allerdings
    kann sich der Trigger dann nicht mehr selber auslösen, und muss
    durch einen anderen Trigger ausgelöst werden.

  • Bedingung/Condition: (Strg + D oder Button )Hierbei
    handelt es sich um eine Beschränkung, damit ein Trigger nur in
    bestimmten Fällen abgearbeitet wird, auch wenn er dem Event nach
    aufgerufen wird. Ist also ein Flaschenhals, mit dem man den Trigger
    \’steuern\‘ kann…

    zB <Dying Unit> is of type \’Soldat\‘
    dass hat zur folge, dass die nachfolgenden aktionen nur dann ausgelöst
    werden, wenn die Einheit die gestorben ist ein Soldat/Footie war,
    andernfalls passiert nichts.

  • Aktion/Action: (Strg + R oder Button )Hier
    kann man dann unterschiedliche Aktionen durchführen. Dabei stehen
    einem unzählige zur Auswahl – einfach mal durchschauen, sind
    eh meist selbsterklärend.

    zb Spiel – Display Message – mit dieser
    Aktion kann man einen Text anzeigen lassen (den man natürlich
    selbst bestimmen kann)

Im endeffekt würde das so aussehen:

    E: A unit dies
    B: <dying unit> is of type ‚Soldat‘

    A: Game – Display Message („Ein Soldat ist gefallen“)

Wenn immer jetzt ein Soldat stirbt erscheint die nachricht, dass ein Soldat
gestorben ist – stirbt hingegen eine andere Einheit, passiert nichts,
da der Trigger aufgrund der Bedingung nicht weiter ausgeführt wird.

 

zum Anfang


3. Regionen

Bevor wir aber nun
endgültig in den Triggereditor eintauchen, müssen vorher noch
sogenannte Regionen erstellt werden (Diese werden benötigt, dass
man die Gegner erstellen und steuern, also mittels Trigger bewegen kann.)

Diese Regionen kann man mittels der Regionenpalette erstellen, die über
die Taste R aus dem Hauptfenster des Editors erreichbar
ist. Wenn man nun den Hinzufügen Button in der Regionenpalette
gedrückt hat, kann man die Regionen einfach in der Landschaft aufziehen.
Ist das geschehen sollte man sie umbennen (Rechtsklick/Umbennen auf
den Eintrag in der Liste der Regionen in der Palette) und zwar so, dass
man sich danach auch auskennt.

Das nachfolgende Bild zeigt wie die Regionen (rote Flächen) auf
der Karte verteilt werden sollten. Dabei geben die Pfeile die spätere
Bewegungsrichtung der Gegner an. In den Ecken sind dabei die Startpunkte,
in der Mitte der Zielpunkt.


zum Anfang


4. Initialisierungstrigger
und Variablen


zum Anfang

4.1. Variablen

Für unsere Tower
Defense benötigen wir auch eine Variblen. Sie dienen einfach dazu,
dass man Werte abspeichern und später nochmals darauf zugreifen
und arbeiten kann (also genaus wie beim Programmieren). Variablen erstellen
kann man in einem eigenen Fenster, dass man über Strg + B oder
Button vom Triggereditor aus erreicht.
In dem sich öffnenden Fenster kann man mit Strg+N

eine neue Variable anlegen. Hierbei muss man den Namen vergeben, danach
den Typ (was kann später darin gespeichert werden) aus einer Kombobox
auswählen. Dann kann man noch eventuell einen Startwert angeben,
und festlegen, ob es sich bei der Variable um ein Array handelt und
wie groß dies ist (ermöglich das speichern mehrerer Werte
in einer Variable).

Nachfolgend welche Variablen für die TD benötigt werden:

  • BL_Info: speichert eine Bestenliste
  • ET_SpawnCreeps: Hier werden später die einzelnen
    Creeptypen abgespeichert, und zwar so, dass Index = Runde
  • I_CreepAmount: gibt dann später an, wieviele
    Creeps pro Runden erscheinen sollen
  • I_EnemyReached: zählt die Gegner, die ins
    Zielgebiet gekommen sind
  • I_RundenCount: Zählt mit in welcher Runde
    man gerade ist…
  • SG_AllHumanPlayer: speichert eine Spielergruppe,
    in der Alle Spieler gespeichert werden
  • T_NextRound: speichert den Timer, der die nächste
    Runde anzählt
  • TW_NextRound: das Fenster in dem der Timer angezeigt
    wird


zum Anfang

4.2. Initialsierung Allgmein

Als erstes wird der
Trigger für die Nahkampfinitialisierung gelöscht (im linken
Menü markieren, und dann Entfernen drücken). Danach
wird folgender Trigger erstellt:

Das Ereignis Map-Initialisation bedeutet, dass diese Aktionen
während des Ladenvorganges durchgeführt werden, also wenn
man noch den Ladebildschirm der Karte vor Augen hat.

Der erste Schritt ist, dass alle Spieler die tatsächlich spielen
(also nicht vom Computer gesteuerte Spieler die tatsächlich im
Spiel sind) gepickt, dh. es wird eine Schleife durchlaufen, und zwar
für jeden dieser Spieler einmal. Danach wird der gerade aktuelle
Spieler zu einer Spielergruppenvariable hinzugefügt (was es danach
einfacher macht, zB allen 4 Spieler eine Niederlage zu erteilen), sein
Gold auf den gewünschten Wert gesetzt, die Startansicht auf seinen
Tempel der Macht gesetzt. Hierfür nimmt man alle Einheiten die
dem aktuellen (picked) Spieler gehören und den Typ Tempel der Macht
haben. Bei dieser Aktion kann man Random Unit nehmen, da jeder Spieler
nur einen Tempel hat, und deshalb auch nur dieser genommen werden kann.Anschließend
wird für ihn noch die ganze Karte sichtbar gemacht. Dies sind 2
Aktionen, zum einen einen Visibilty Modifier erzeugen, und
danach muss man den noch einschalten.

Diese Schleife wird wie schon gesagt für jeden tatsächlich
vorhandenen Spieler durchlaufen (also max. 4 mal)

Danach stellt man ein, dass Spieler 5 Gold ausgibt, wenn man eine Einheit
von ihm tötet (also so als ob die Einheiten normale Creeps werden).
Da dies jedoch für alle anderen Spieler als neutral feindlich deaktiviert
ist, muss dies eben mit der Aktion eingeschalten werden.

Danach deklariert man das vorhin angesprochene Unit-Type Array, dass
die einzelnen Gegner für die einzelnen Runden beinhaltet. Bei erstellen
des Arrays wurde eine Größe von 11 angegeben, tatsächlich
brauchen wir aber nur 10. Das ist deshalb der Fall, weil der Index eines
Arrays bei 0 anfängt. Wenn man nun aber das Array um 1 größer
macht, dann kann jeweils den Index verwenden, der der tatsächlichen
Rundennummer entspricht.


zum Anfang


4.3. Initialsierung Bestenliste

Eine Bestenliste ist
diese kleine Tafel, die man öfters bei Funmaps oder auch in der
Kampagne rechts oben sieht. So etwas wollen wir auch für unsere
TD verwenden. Dabei sollen auf dieser Liste angezeigt werden, in der
wievielten Runde man gerade ist, und wieviele Gegner schon durchgekommen
sind. Dazu wird folgender Trigger erstellt:

Als Bedingung wird hierbei nicht Map Initialisation genommen (obwohl
die Bestenliste von Anfang an sichtbar sein soll) sondern Time Elapsed
0 seconds,
weil man mit Map Init keine Bestenlisten erzeugen kann
(funktioniert einfach nicht).

Zuerst wird die Bestenliste erzeugt (hierbei wird der Titel mit angegeben)
und danach wird sie in eine Variable gespeichert.
Danach werden 2 Spieler hinzugefügt, wobei man für diese ein
Label angeben muss (das ist der Name der in der Bestenliste für
sie erscheint) und einen Startwert. Für die durchgekommenen Gegner
kann die entsprechende Variable angegeben werden, für die Runde
hingegen einfach 0 schreiben, denn die Variable für die Runden
hat ja den Startwert 1.

zum Anfang


5. Creep Spawning

Nun kommen die Trigger,
die mehr oder weniger direkt mit dem erzeugen der Creeps und mit dem
Steuern der Runden zu tun haben. All diese Trigger findet man in der
Kategorie Creep Spawn. Diese Kategorie besteht aus 4 Triggern, auf die
nachfolgend eingegangen wird:


zum Anfang

5.1 Initial Activation

Das Erzeugen der der
Creeps für die einzelnen Runden wird durch einen Timer ausgelöst,
wie man bei den jeweiligen Trigger dann erkennen kann. Dieser Timer
wird aufgerufen, wenn alle Gegner getötet sind, oder die Mitte
erreicht haben. Wenn dann der Timer abgelaufen ist, wird die nächste
Runde gestartet. Der Timer muss aber auch 1x „von außen“
angestoßen werden, um den ganzen Vorgang in Gang zu setzen. Dies
passiert mit dem nachfolgenden Trigger:

Den Time-Elapsed Event kennen wir nun schon – nach 30 Sekunden
Spielzeit wird der Trigger ausgelöst. Nach diesen 30 Sekunden wird
ein Timer erzeugt. Dies funktioniert einfach mit Countdown-Timer – Start
und der Angabe der vorhin deklarierten Timer-Variable. Angegeben wird,
dass der Timer 1x abläuft und eine „Lebenszeit“ von 30
Sekunden hat.
Dann läuft der Timer, ist aber noch nicht sichtbar, deshalb muss
man noch ein Timer-Window erzeugen. Dabei gibt man den Timer an, für
den das Fenster sein soll. Beim Titel wählt man die Funktion Concentrate
String
. Beim ersten String schreibt man „Runde „, beim
2. wählt man nochmals diese Funktion und gibt dann beim ersten
Teil Umwandlung – Convert Integer to String (für I_RundenCount)
an, und beim zweiten Teil “ in:“. Das hat zur Folge, dass
der Titel folgendermaßen aussieht: „Runde X in: Zeit“.
Danach wird das eben erzeugte Fenster noch in die dafür vorgesehene
Variable gespeichert.


zum Anfang


5.2 Next Round

Dieser Trigger wird
dann ausgelöst, wenn Spieler 5 (also der dem die Creeps gehören)
keine Einheiten mehr hat, also alle die Mitte erreicht haben, oder getötet
wurden. Zuerst wird dann nachgesehen, ob man schon in der 10. Runde
ist – wenn ja, dann hat man gewonnen. Andernfalls wird die Rundenvariable
um eines erhöht, und dann wieder der schon bekannte Timer erzeugt.

Dieser Trigger wird immer dann ausgelöst, wenn eine Einheit des
Creep-Besitzers stirbt. Allerdings wird erst dann mit der Ausführung
fortgefahren, wenn dieser Spieler keine lebenden Einheiten mehr hat
(man muss dabei darauf achten, dass man die lebenden Einheiten zählt,
denn auch tote Einheiten zählen als Einheiten).

Danach folgt ein if mit mehreren Aktionen das dann durchlaufen wird,
wenn man in der 10 Runde ist. Sollte dies der Fall sein, dann wird der
Sieg-Trigger laufen gelassen (wie vorher, einfach vorläufig einen
leeren Trigger hierfür erstellen) und danach überspringt man
mit Skip remaining actions alle nachfolgenden Aktionen dieses Triggers
– damit verhindert man, dass noch einmal ein Timer erzeugt wird.
Nach dem If kommen die Aktionen, die im Normalfall nach Abschluss einer
Runde durchgeführt werden. Zum einen wird die Rundenanzahl erhöht
(dies macht man mit Set Variable dabei
wählt man I_RundenCount links vom \’=\‘ und rechts davon Arithmetic
– dabei gibt man beim ersten Teil die Variable an, dann das + un
beim zweiten Teil 1, und dann wird (wie vorher schon) ein Timer erzeugt,
der die nächste Runde auslöst.


zum Anfang


5.3 Control

Dieser Trigger dient
im Prinzip zur genaueren Steuerung der einzelnen Runden:

Dieser Trigger wird ausgelöst wenn der Timer der zur Überbrückung
der Runden dient abläuft, also 0 erreicht.
Als erstes wird die Rundennummer die auf der Bestenliste angezeigt wird
upgedatet, schließlich wird ja nun die neue Runde wirklich aktiviert.

Danach wird das Timerfenster in dem der Timer angezeigt wird vernichtet,
damit der Timer nicht mehr angezeigt wird.
Danach folgen 10 if mit Multiple Conditions. Dabei dient als
Bedingung ein Integervergleich, bei den man die RundenNr-Variable angibt.
Innerhalb des If\’s werden dann Aktionen durchgeführt, die Auswirkungen
auf die Runde haben. In diesem Beispiel wird hier die Anzahl der spawnenden
Creeps festgelegt, aber natürlich kann man hier noch diverse andere
Sachen unterbringen… Dann wird der Spawning Trigger ausgelöst,
wo dann Einheiten tatsächlich erstellt werden.

Hie ist nur ein IF (für die erste Runde) abgebildet. Das ganze
kopiert man einfach, und fügt es dann noch 9 mal ein, bei den IF\’s
ändert man dann einfach die Zahl um, sodass jede Runde (von 1-10)
einmal vertreten ist.


zum Anfang


5.4 Spawning

In diesem Trigger werden
die Monster erstellt, und dann wird ihnen der erste Bewegungsbefehl
zur ersten Region erteilt.

Und zwar wird in der jeweiligen Eckregion eine Einheit vom Einheitentyp
ET_SpawnCreeps[I_RundenCount] erstellt. Wir erinnern uns, in
ET_SpawCreeps wurden bei der Map-Initialisation die Einheiten Typen
für die jeweiligen Runden gespeichert, und zwar so das Index =
Runde. Dies kommt uns nun zugute.

Danach folgt ein if, in dem verglichen wird, ob eine Zufallszahl zwischen
1 und 2 erzeugt wird. Abhäning davon erteilt man der gerade erstellten
Einheit (last created Unit) den Befehl in eine andere Region (schließlich
gibt es ja 2 Möglichkeiten, in welche Richtung sich die Einheit
bewegen kann). Um der Einheit den Bewegungsbefehl zu erteilen benutzt
man den Trigger Einheit – Issue Order Targeting
a Point

Das macht man dann noch 3 mal, sodass man in jeder Ecke eine Einheit
erstellt.
Das ganze befindet sich in einer Schleife, die sooft durchlaufen wird,
wie es in der Variable I_CreepAmount festgehalten ist. Dh. wenn die
Variable den Wert 15 hat, dann werden an jeder Ecke (also in jeder der
4 Regionen) 15 Creeps erzeugt (und zwar immer zu Runde passende).


zum Anfang


6. Movement

So, nun zu den Triggern,
die die Creeps in ihrer Bewegung steuern. Natürlich könnte
man den Creeps gleich zu Beginn (also nach dem Erstellen) einen Bewegungsbefehl
in die Mitte geben. Allerdings ist die Tower Defense ja so designed,
dass es auch Abzweigungen gibt, weshalb man eben zusätzlich Regionen
braucht und eben auch Trigger. Ich werde im folgenden nicht jeden Movement
Trigger beschreiben, sondern nur die 3 vorkommenden Typen.
Alle Trigger die mit der Bewegung der Gegnereinheiten zu tun haben,
sind übrigends in der Kategorie Creep Movement.
Bei allen Move-Triggern gibt es auch immer die Bedingung, dass nur dann
weitergemacht wird, wenn die Einheit um die es sich dreht dem Spieler
gehört, dem die Creeps gehören, denn man will ja nicht, dass
auf einmal die eigenen Einheiten (also die Baueinheiten) sich ohne Zutun
bewegen.


zum Anfang


6.1 Einfach

Hierbei handelt es sich
um einen einfachen Trigger, der nur dazu dient, Einheiten die ein Gebiet
erreichen den Befehl zu geben, in ein anderes Gebiet weiter zu marschieren
– ein Beispiel hierfür:

Wenn eine Einheit das Gebiet betritt, und diese Einheit ein Gegner ist
(also zu Spieler 5 gehört), dann bekommt sie den Befehl in ein
anderes Gebiet weiter zu gehen.


zum Anfang

6.2 Split

Hierbei gibt es 2 Möglichkeiten,
in welches Gebiet die Einheit weitergeht, also im Prinzip das gleiche,
wie es anfangs beim Erstellen der Einheiten war:

Hierbei wird im IF wieder eine Zufallszahl erzeugt und abhänging
vom Ergebnis dann die Einheit in das eine Gebiet oder in das andere
Gebiet weiterbefehligt.


zum Anfang


6.3 Finish

Hierbei geht es jetzt
darum, dass sich alle Einheiten in die Mitte bewegen. Das ist der letzte
Move-Befehl, den die Einheiten erteilt bekommen.

Hierbei kann man erkennen, dass 4 Ereignisse verwendet wurden. Das bedeutet,
dass der Trigger immer dann ausgelöst wird, wenn eines der 4 Ereignisse
eintritt. Man könnte stattdessen diesen Trigger auch auf 4 aufteilen,
allerdings ist das Ziel (nämlich die Mitte) bei jedem Trigger gleich,
also kann man sie gleich in einen zusammenfassen.

zum Anfang


7. CG Finishes

CG Finishes (steht für
die Kategorie Creep General), ist der einzige Trigger in seiner Kategorie
und sieht wie folgt aus:

Finish ist hierbei die Region im Zentrum der Karte (also die,
welche die Creeps erreichen müssen). Wenn nun eine Einheit von
Spieler 5 (also derjenige Spieler, dem die Creeps „gehören“),
was durch die Bedinung festgelegt wird, die Mitte erreicht, dann wird
zuerst die Variable I_EnemyReached (diejenige die die durchgekommenen
Gegner zählt) eins hinaufgezählt. Diese Beschränkung,
dass nur dann fortgefahren wird, wenn die Einheit mit der etwas passiert
dem Spieler gehört, der die Creeps „steuert“ wird im
folgend häufiger vorkommen.
Bei der Bedingung fällt vielleicht das Entering Unit auf.
Standardmäßig ist bei der Player Comparision (die
man für die Bedingung braucht) Triggering Unit ausgewählt.
Dies würde auch funktionieren, jedoch sollte man sich angewöhnen
statt dieser allgemeinen Ereignis-Reaktion die spezielleren (wie eben
zB.: entering unit) nehmen, da dies zum einen sauberer ist,
und zum anderen manchmal nur die spezielleren funktionieren. Auswählen
kann man dies in der selben Kombobox in der auch Triggering

Unit eingetragen ist.
In der nachfolgenden Zeile wird dann die Bestenliste aktualisiert, schließlich
soll die ja immer zeigen, wieviel Gegner schon durchgekommen sind.
Dann wird die Einheit die die Region in der Mitte erreicht hat gesprengt
– so wird vermieden, dass sich die Einheiten in der Mitte sammeln, und
dann alles blockieren.
Zum Schluss kommt noch eine if-Abfrage, ob schon 100 Gegner die Mitte
erreicht haben. Sollte dies der Fall sein, dann wird ein anderer Trigger
laufen gelassen, der die Niederlage durchführt. Diesen Trigger
sollte man am besten gleich erstellen, damit man ihn hier angeben kann,
allerdings kann man ihn vorerst leer lassen, die „Programmierung“
dieses Triggers folgt dann nach.


zum Anfang


8. Diverses

Jetzt folgen die letzten
4 Trigger die für die TD benötigt werden.


zum Anfang


8.1 Blitzspitze Angriff

Bei den Einheiten wurde
ja ein Turm mit der Fähigkeit Blitzschlag erstellt. Allerdings
nutzt er diese ja nicht von alleine und muss deshalb getriggert werden.
Dies wird nun endlich gemacht. Und hier noch der Trigger:

Dieser Trigger wird ausgelöst wenn eine Einheit angegriffen wird,
und danach schaut man, ob die Attacking Unit vom Typ Blitzspitze angegriffen
hat. Wenn dies der Fall ist, wird der Blitzspitze (also der Attacking
Unit) mit Unit – Issue Order Targeting a Unit
befohlen, den Angriff Gabelblitz auf die Einheit durchzuführen,
die sie angegriffen hat. Man nimmt deshalb hier Gabelbitz als Befehl,
weil der eigene Skill auf einem Gabelbitz basiert und deshalb auch den
gleichen Befehlsstring hat.


zum Anfang


8.2 Technologie

Desweiteren gibt es
ja noch eine Technologie, und in dieser Verbindung Feuerbunker, die
jeweils eine andere Einheit als Vorraussetzung haben:

Als Event dient das Abschließen einer Forschung. Durch die Bedinung
wird dann festgelegt, dass die Forschung „Macht der Flamme“
sein muss.

Danach „pickt“ man jede Einheit des Types Macht der Fackel
(ist zwar nur eine, aber dadurch erspart man sich Variablen) vom Spieler
der die Technologie erforscht hat, und ersetzt sie durch die Macht der
Flamme. Dadurch wird der Bau von den Bunkern der Fackel unmöglich
(die Einheit die sie als Vorraussetzung haben wird entfernt), während
man jetzt Bunker der Flamme bauen kann (die Einheit die sie als Vorraussetzung
haben wird erstellt).

Danach „pickt“ man noch jeden Bunker der Fackel des jeweiligen
Spielers und tauscht sie durch die stärkere Variante aus.


zum Anfang


8.3 Sieg und Niederlage

Diese 2 Trigger sollten
schon existieren, allerdings noch vollkommen leer – dies soll nun nachgeholt
werden.


Niederlage:

Der Niederlage Trigger wird durch einen anderen Trigger ausgelöst,
weshalb man sich Ereignis und Bedingung sparen kann.
Als allererstes wird eine Nachricht angezeigt, dass man verloren hat
(an alle Spieler) und 10 Sekunden gewartet (game-time-seconds deswegen,
weil dies für den Multiplayergebrauch sicherer ist (in Sachen Diconnects).
Dann pickt man alle Spieler (deswegen auch die Variable) und erklärt
ihnen die Niederlage.

Sieg:

Dieser Trigger wird ebenfalls durch einen anderen augeslöst. Auch
sonst ist er dem Niederlage-Trigger sehr ähnlich. Der Einzige Unterschied
sind die Nachrichten, und das in der Schleife dann der Spieler statt
einer Niederlage den Sieg bekommt.


zum Anfang


9. Schlußwort

Dies war nun der 3
und letzte Teil des Tutorials. Jetzt sollte man eine fertige Tower Defense
haben.
Ich hoffe wir konnten euch einiges erklären und es gibt bald ein
paar gute TD\’s mehr im Battle.net.
Viel Spaß noch beim Mappen und gutes Gelingen.

zum Anfang

Wie mache ich eine Maze/Tower-Defence Map defining Stars und DNA zu RevolutionGames