Map-Scripting Grundlagen
Wolfenstein: Enemy Territory - Article - Map-Scripting Grundlagen
Wolfenstein: Enemy Territory
04.12.07 20:29 Games
Mit diesem Artikel geben wir einen kleinen Einblick, welche Grundlagen nötig sind, um mit dem Mapping beginnen zu können.
Inhaltsverzeichnis:

1. Einleitung
2. Map-Voraussetzungen
3. Grundgerüst eines Scripts
4. Kommentare
5. Beispiel
6. Hinzufügen eines weiteren "func_explosive"-Entities
7. Schlußbemerkung
8. Ergänzungen

1. Einleitung

Ein Script dient dazu, eine Map, bzw. das Spiel interaktiver zu gestalten. Über das Verhalten von Entities werden Ereignisse ausgelöst. Diese Ereignisse werden im Script verarbeitet. Um Scripte übersichtlich zu gestalten, sollten Scripte formatiert werden. Das erleichtert gegebenenfalls die Fehlersuche.

2. Map-Voraussetzungen

  • script_multiplayer - Entity
  • key: scriptname
  • value: game_manager
  • ein Script-File mit dem Namen "mapname.script" im "maps"-Verzeichnis (mit "mapname" = Name der Map)
  • ein Script mit einem Script-Block "game_manager":

Code
game_manager
{
}


3. Grundgerüst eines Scripts

Ein Script besteht aus drei Ebenen.

- Entity-Script-Blocks

Für jedes Entity, dessen Funktionalität im Script verwendet werden soll, muss ein Entity-Script-Block erstellt werden. Der Entity-Script-Block wird mit dem "scriptname"-Value des Entities eingeleitet. Der Entity-Script-Block wird durch eine sich öffnende geschweifte Klammer ("{") geöffnet und mit einer sich schliessenden geschweiften Klammer ("}") beendet.

Beispiel:

Code
game_manager
{
}

ENTITY_1_SCRIPTNAME_VALUE
{
}


Ein Entity-Script-Block beinhaltet (innerhalb der geschweiften Klammern) die Events (Ereignisse), die z.B. von einem Spieler ausgelöst werden können.

- Event-Script-Blocks

Für jedes Event eines Entities, dessen Funktionalität im Script verwendet werden soll, muss ein Event-Script-Block erstellt werden. Der Event-Script-Block wird mit dem Event-Namen eingeleitet. Der Event-Script-Block wird durch eine sich öffnende geschweifte Klammer ("{") geöffnet und mit einer sich schliessenden geschweiften Klammer ("}") beendet.

Beispiel:

Code
game_manager
{
EVENT_NAME
{
}
}

ENTITY_1_SCRIPTNAME_VALUE
{
EVENT_NAME
{
}
}


Ein Event-Script-Block beinhaltet (innerhalb der geschweiften Klammern) die Actions (Aktionen), die bei einem Event ausgelöst (ge-"trigger"-t) werden können.

Anmerkung:

Laut Ifurita muss jeder Entity-Script-Block ein "spawn"-Event besitzen (auch wenn dieser leer sein sollte). Die Events sind vom jeweiligen Entity-Typ abhängig. Leider gibt es keine offizielle Aufstellung der zu einem Entity-Typ gehörenden Events. Eigene Events können mit Hilfe des Schlüsselwortes "trigger" erstellt werden. Der Event-Script-Block wird dann durch "trigger EIGENER_EVENT_NAME" eingeleitet.

- Actions

Die Actions beschreiben die beim Auftreten eines Events ausgelösten Aktionen. Sie stehen, gegebenenfalls unter Angabe von Parametern innerhalb der Event-Script-Blöcke.

Beispiel:

Code
game_manager
{
EVENT_NAME
{
ACTIONS_NAME_1 PAR_1
ACTIONS_NAME_2 PAR_2
}
}

ENTITY_1_SCRIPTNAME_VALUE
{
EVENT_NAME
{
ACTIONS_NAME_3 PAR_3
ACTIONS_NAME_4 PAR_4
}
}


Anmerkung:
Die Events sind vom jeweiligen Event-Typ (und somit auch vom Entity-Typ) abhängig. Leider gibt es keine offizielle Aufstellung der zu einem Event-Typ gehörenden Actions.
Mit der Action "trigger ENTITY_X_SCRIPTNAME_VALUE EVENT_NAME" lassen sich Events eines anderen oder gleichen Entity-Script-Blocks auslösen. Für die Auslösung im gleichen Entity-Script-Blocks wird auch das Schlüsselwort "self" verwendet. Eine Auslösung eines Events im gleichen Entity-Script-Block würde mit der Action "trigger self EVENT_NAME" erfolgen.

4. Kommentare

Kommentare werden durch doppelte Schrägstriche ("//") eingeleitet. Alles was diesen Schrägstrichen auf dieser Zeile folgt, wird bei der Scriptausführung ignoriert. Kommentare sollten dazu eingesetzt werden, das Verhalten von Script-Blöcken kurz zu beschreiben. Gegebenenfalls können für Testzwecke Passagen eines Scripts auskommentiert werden, um das veränderte Verhalten des Scripts zu testen.

5. Beispiel


- Einfaches "game_manager"-Script

Da der "game_manager"-Script-Block als erstes ausgeführt wird, werden in ihm zentrale Einstellungen des Spiels vorgenommen.

Kommentiertes Script-Beispiel:

Code
game_manager
{
spawn
{
// Game rules
wm_axis_respawntime 15 // legt die Respawnzeit der axis fest ( in sec. )
wm_allied_respawntime 15 // legt die Respawnzeit der allied fest ( in sec. )
wm_set_round_timelimit 20 // legt die Rundenzeit fest ( in min. )

// Stopwatch Modedefending team
wm_set_defending_team 0

// Gewinner Team, wenn Zeit abläuft
wm_setwinner 0 // legt das Gewinnerteam fest, wenn die Zeit abgelaufen ist (Axis = 0 | Allied = 1)

wait 1000 // "Wartebefehl" in msec.
}
}


Anmerkungen:
Der "spawn"-Event wird beim Erstellen der Welt ausgelöst und daher bei Mapstart ausgeführt. "wait"-Actions sorgen dafür, dass die entsprechenden Entities erstellt wurden, bevor das Script ausgeführt wird.

- Hinzufügen eines "func_explosive"-Entities (kein Objective)

Der Entity-Script-Block des "func_explosive"-Entities wird unter die letzte geschlossene Klammer des "game_manager"-Script-Blocks eingefügt (Erklärung siehe oben).

Kommentiertes Script-Beispiel:

Code
game_manager
{
spawn
{
// Game rules
wm_axis_respawntime 15 // legt die Respawnzeit der axis fest ( in sec. )
wm_allied_respawntime 15 // legt die Respawnzeit der allied fest ( in sec. )
wm_set_round_timelimit 20 // legt die Rundenzeit fest ( in min. )

// Stopwatch Modedefending team
wm_set_defending_team 0

// Gewinner Team, wenn Zeit abläuft
wm_setwinner 0 // legt das Gewinnerteam fest, wenn die Zeit abgelaufen ist (Axis = 0 | Allied = 1)

wait 1000 // "Wartebefehl" in msec.
}
}

// **********************************************************************
// Entity-Script-Block des "func_explosive"-Entities
// Scriptname: Klotz1
// Construction Class: func_explosive
Klotz1
{
//Wird beim Spawnen ausgelöst
spawn
{
wait 200
constructible_class 3 //classes: 1 (explosives), 2 (satchel), 3 (dynamite)
}

//Wird beim Tod (Explodieren) ausgelöst
death
{
wm_announce "Allied have blown the Klotz1!" // Textausgabe im Bildschirm
setstate Klotz1 invisible // der Entity-Zustand wird auf unsichtbar gesetzt
}
}
// **********************************************************************


Anmerkung:

Der "death"-Event wird bei Zerstörung des "func_exposive"-Entities ausgelöst. Die "setstate"-Action ist meines Wissens nicht notwendig, wurde aber von mir in einem Script so gefunden.

Vorüberlegung:
  • um den Zustand des Entities "Klotz1" festzuhalten, wird eine Variable benötigt
  • um den Zustand der Erfüllung der Objectives festzuhalten, wird eine Variable benötigt.
  • um den Zustand der Variablen (die Erfüllung des Objectives) zu prüfen, muss an zentraler Stelle eine Prüfung vorgenommen werden
  • an zentraler Stelle muss auf die Erfüllung des Objectives reagiert werden, d.h. ein Gewinner muss festgelegt und die Runde muss beendet werden


Kommentiertes Script-Beispiel:

[code]
game_manager
{
spawn
{
// Game rules
wm_axis_respawntime 15 // legt die Respawnzeit der axis fest ( in sec. )
wm_allied_respawntime 15 // legt die Respawnzeit der allied fest ( in sec. )
wm_set_round_timelimit 20 //
legt die Rundenzeit fest ( in min. )

// Stopwatch Modedefending team
wm_set_defending_team 0

// Gewinner Team, wenn Zeit abläuft
wm_setwinner 0 // legt das Gewinnerteam fest, wenn die Zeit abgelaufen ist (Axis = 0 | Allied = 1)

// ****************************************************************
//
// Änderungen gegenüber vorhergehenden Scripten
//
accum 1 set 0 // Status des primären Objectives
accum 2 set 0 // Anzahl der zerstörten Hauptziele

wm_number_of_objectives 1 // Anzahl der Objectives

// Objectives
// 1: Primary: Klotz1 zerstören

// Anzahl Primary objectives ( )
// Sowohl Allies als auch Axis haben 1 Primärziel
wm_set_main_objective 1 0
wm_set_main_objective 1 1

// wm_objective_status

KommentareInhalt:Kommentare

Dieser Beitrag hat noch keine Einträge.
Logo for Wolfenstein: Enemy Territory
Erstellt von nilius
Zuletzt online: gerade
Kategorie:
Games
Veröffentlicht
Aktualisiert
04. 12. 2007 um 20:29
04. 12. 2007 um 20:29
1880
Einzelaufrufe
50
ePoints verdient durch Artikel