EINFACHES SCRIPT (TEIL 1)

Autor: Fragpoint
Downloads: Beispielmap und Script


So, dann wollen wir unser Mapper-Können mal an einem Script testen. Ich greife hierzu ebenfalls wieder auf das Script meiner Map "Starkbier" zurück. Eine kleine Beispiel-Map sowie das dazugehörige Script findet ihr unter dem o. g. Downloadlink. Wir benötigen diese beiden Dateien aber zunächst erst einmal nicht, da wir uns alles selbst Schritt für Schritt erarbeiten wollen.
Wir öffnen hierzu Notepad oder einen anderen einfachen Texteditor in Windows (kein Word o.ä.) und speichern die Datei im Maps-Verzeichnis (richtig gelesen, bei den Maps, nicht im Scriptordner) ab. Als Dateinamen könnt ihr zum Beispiel mapname.script verwenden. Bedenkt immer, dass diese den gleichen Namen, wie Eure Map haben muss! Schauen wir uns erst einmal den 1. Teil unseres Scripts an:

game_manager
{
spawn
{

// Allgemeine Mapdaten
wm_axis_respawntime 10
wm_allied_respawntime 10
wm_number_of_objectives 2
wm_set_round_timelimit 15

// Anzahl der Hauptziele je Team (Anzahl-Team)
wm_set_main_objective 2 0
wm_set_main_objective 2 1

// Status der Objectives bei Mapstart (Objective-Team-Status)
wm_objective_status 1 0 0
wm_objective_status 1 1 0
wm_objective_status 2 0 0
wm_objective_status 2 1 0

// Die Axis verteidigen
wm_set_defending_team 0

// Die Axis sind Sieger, falls die Allierten versagen
wm_setwinner 0
wait 500

}

trigger objective2
{
// Siegesmeldung der Allierten
wm_announce "ALLIED ESCAPES WITH THE SECRET BEER FORMULA!"
wait 400
wm_setwinner 1 // 1=Allied 0=Axis
wm_endround // Runde beenden
}
}
Beachtet bitte, dass dieses Script im jetzigen Zustand noch nicht funktioniert. Wie wir es vollenden, erfahrt ihr im 2. und 3. Teil des Tutorials. Dieser 1. Abschnitt des Scripts enthält allgemeine Informationen zu Eurer Map, damit das Programm zum Bespiel weiß, wie viele Aufträge es gibt, oder wer siegt, wenn keine Partei ihre Ziele erfüllt. Nun, nehmen wir das Script einmal abschnittsweise auseinander.

Erstellt dazu im Radiant eine Map in Form eines einfachen spielbaren Raumes (Playerstart und Light nicht vergessen). Setzt mit einem Rechtsklick in eine der Ansichten einen "Script -> script_multiplayer". Als kleine Beispiel könnt ihr das nachstehende Bild betrachten.



Wozu dient dieses sogenannte Entity? Dieses kleine Teil ist der Vermittler zwischen Eurem Spiel und Eurem Script. Über dieses Entity läuft sozusagen der ganze Funkverkehr zwischen Spiel und Script. Fehlt es, funktioniert Eurer Script nur teilweise. Alles was in dem Abschnitt "game_manager" steht, wird dann nicht beachtet. Es darf jedoch maximal nur einmal in der Map vorhanden sein und sollte sich irgendwo innerhalb der Skybox befinden. Es darf auch in keinem Brush stecken, sondern muss sozusagen frei im Raum "schweben".
Markiert dieses Entity nun und drückt die Taste "N", tragt dort folgenden Text ein:



Dies hilft dem Spiel später zu erkennen, dass es ein Script abarbeiten muss. Der Eintrag ist zwingend notwendig! Der Eintrag Origin kann von Euren Daten abweichen, da dort die Koordinaten angegeben werden, anden das Model zu finden ist (wird vom Editor automatisch gesetzt).

So, nun schauen wir uns den entsprechenden Code-Abschnitt im Script an:

game_manager
{
spawn
{
game_manager
Hier erkennt das Spiel: "Ah, das ist doch der Game-Manager aus der Map, hier bin ich richtig.". Die geöffnet Klammer zeigt ihm an, dass ab hier die allgemeinen Informationen zur Map beginnen.

spawn
Frei übersetzt könnte man sagen, dass es so viel bedeutet wie: "Jetzt geht´s los, hol dir hier die benötigten Mapinformationen.". Die geöffnete Klammer sagt nur wieder aus, dass hier die Informationen stehen.

// Allgemeine Mapdaten
wm_axis_respawntime 10
wm_allied_respawntime 10
wm_number_of_objectives 2
wm_set_round_timelimit 15
wm_axis_respawntime 10
Die Zeit in Sekunden, wie lang ein Spieler der Achsenmächte benötigt, bevor er nach dem virtuellen Tod wieder zum Leben erwacht (Respawnzeit).

wm_allied_respawntime 10
Die Zeit in Sekunden, wie lang ein Spieler der Allierten benötigt, bevor er nach dem virtuellen Tod wieder zum Leben erwacht (Respawnzeit).

wm_number_of_objectives 2
Wieviele Aufträge gibt es in der Map zu erledigen. Beachtet bitte, dass, wenn ein Team eine Mauer sprengen und das andere diese verteidigen soll, das nur als ein Objectiv (Auftrag) zählt.

wm_set_round_timelimit 15
Die Zeit in Minuten, wie lange eine Spielrunde andauert, falls keine der Parteien gewinnt.

// Anzahl der Hauptziele je Team (Anzahl-Team)
wm_set_main_objective 2 0
wm_set_main_objective 2 1
Unter Hauptziel versteht man das Ziel, dass die Spielrunde beendet, wenn es erfüllt wurde. Oder besser gesagt, durch dessen Erfüllung eine der Parteien siegt.

wm_set_main_objective 2 0
Die erste Zahl steht für die Anzahl der Objekte des Teams, die zweite Zahl für das Team. Hierbei steht die 0 für die Achsenmächte und die 1 für die Allierten. Im vorliegenden Fall bedeutet es, dass 2 Missionsziele für die Axis (0) vorliegen.

wm_set_main_objective 2 1
Die erste Zahl steht für die Anzahl der Objekte des Teams, die zweite Zahl für das Team. Hierbei steht die 0 für die Achsenmächte und die 1 für die Allierten. Im vorliegenden Fall bedeutet es, dass 2 Missionsziele für die Allied (1) vorliegen.

// Status der Objectives bei Mapstart (Objective-Team-Status)
wm_objective_status 1 0 0
wm_objective_status 1 1 0
wm_objective_status 2 0 0
wm_objective_status 2 1 0
Hier wird festgelegt, welchen Status ein Objectiv für jedes einzelne Team hat. Die erste Zahl steht für Nr. des Objectives und die zweite Zahl für das Team, dem das Objectiv gehört.
Die dritte Zahl gibt an, ob das Objectiv schon erledigt wurde = 1 oder ob der Auftrag noch erfüllt werden muss = 0. Sollte der Auftrag fehlgeschlagen sein, so steht dort eine 2, was aber zum Start einer Spielrunde noch keinen Sinn macht. ;)

wm_objective_status 1 0 0
Status für das Objectiv Nr. 1, das von den Achsenmächten (0) noch nicht erfüllt wurde (0). Diese könnte zum Beispiel dafür stehen, dass die Achsenmächte verhindern müssen, dass eine Mauer weggesprengt wird.

wm_objective_status 1 1 0
Status für das Objectiv Nr. 1, das von den Allierten (1) noch nicht erfüllt wurde (0). Dies könnte das vorgenannte Objectiv der Achsenmächte sein, jedoch steht es hier für die Allierten, die den Auftrag haben, die Mauer zu sprengen.

wm_objective_status 2 0 0
Status für das Objectiv Nr. 2, das von den Achsenmächten (0) noch nicht erfüllt wurde (0). Diese könnte zum Beispiel dafür stehen, dass die Achsenmächte verhindern müssen, dass ihnen ihre geheimen Dokumente gestohlen werden.

wm_objective_status 2 1 0
Status für das Objectiv Nr. 2, das von den Allierten (1) noch nicht erfüllt wurde (0). Dies könnte das vorgenannte Objectiv der Achsenmächte sein, jedoch steht es hier für die Allierten, die den Auftrag haben, die geheimen Dokumente zu stehlen.

// Die Axis verteidigen
wm_set_defending_team 0
Hier könnt ihr festlegen, ob eines der beiden Teams der "Verteidiger" ist. In diesem Fall steht die 0 wieder für die Achsenmächte. Eine 1 würde die Allierten als Verteidiger klassifizieren.

// Die Axis sind Sieger, falls die Allierten versagen
wm_setwinner 0
wait 500
wm_setwinner 0
Das legt den Sieger der Map fest, falls keine der Parteien, seine Ziele innerhalb der von Euch unter "wm_set_round_timelimit" festgelegten Spielzeit erfüllt hat. 0 steht für die Axis, 1 für die Allied. Tragt ihr dort -1 ein, läuft die Runde ewig weiter, bis eine der Parteien gewinnt.

wait 500
Die Zeit in Millisekunden zwischen dem Ablauf der Spielzeit und dem Erscheinen der Punkteanzeige, wenn keine der beiden Parteien gewonnen hat bzw. die von uns vorher angegebene Partei automatisch gewinnt.

trigger objective2
{
// Siegesmeldung der Allierten
wm_announce "ALLIED ESCAPES WITH THE SECRET BEER FORMULA!"
wait 400
wm_setwinner 1 // 1=Allied 0=Axis
wm_endround // Runde beenden
}
}
Hier wird festgelegt, was passiert, wenn das nicht angreifende Team gewinnt, in diesem Fall wären es die Allierten. Den Verteidiger habt ihr ja schon unter "wm_set_defending_team" festgelegt. Hier wird eine neue Klammer geöffnet, weil sozusagen ein kleines Unterprogramm gestartet wird.

wm_announce "textmitteilung"
Hier wird eine Textmitteilung am Bildschirm ausgegeben, wenn das angreifende Team gewonnen hat.

wait 400
Dann wird kurz gewartet, bevor es weiter geht (hier 400 Millisekunden).

wm_setwinner 1
Anschließend teilen wir dem Spiel mit, dass das Team 1 (also die Allierten) als Angreifer seine Ziele erfüllt hat und somit der Sieger ist.

wm_endround
Hiermit wird dem Spiel offiziell mitgeteilt, dass die Runde wegen des Siegs der Allierten beendet und das Ergebnis angezeigt werden kann.

} }
Nachdem die vorherigen Befehle ausgeführt wurden, wird die soeben geöffnete Klammer wieder geschlossen, denn das Unterprogramm ist jetzt abgearbeitet und wir nicht mehr benötigt. Anschließend wird dem Spiel noch mitgeteilt, dass hier die allgemeinen Informationen zur Map fertig sind. Dies Kennzeichnen wir durch eine weitere geschlossene Klammer.

Randbemerkung:
{ = Offene Klammer oder Klammer auf
} = Geschlossene Klammer oder zugehende Klammer
Achtet in Eurem Script immer darauf, dass Ihr genauso viele Klammern öffnet, wie ihr schließt. Zählt diese durch. Kommt ihr zum Beispiel auf 9 geöffnet und 10 geschlossene, liegt ein Fehler vor. Findet die fehlende Klammer und ergänzt sie, denn das Script arbeitet sonst nicht.