Blog Info Screens Videos Impressum/Datenschutz

"… und Action!" – Aufbau einer Scriptdatei

Scripten, testen, scripten, testen. Robin und ich sind weiterhin fleißig und haben es mittlerweile geschafft, das zweite Kapitel (von der Vertonung abgesehen) komplett fertig zu stellen. Wenn Ihr Euch daran erinnert, habe ich in einem der ersten Posts beschrieben, dass jede Szene wie ein Drehbuch verfasst ist. So besitzt jede Spielszene ihre eigene Scriptdatei, in der alle Vorgänge innerhalb der Szene beschrieben sind und die auf die Befehle, die Ihr als Spieler unserem Helden gebt, reagiert.
Solch eine Szenen-Scriptdatei beinhaltet alle in einer Szene möglichen Aktionen:
  • Anschauen, Nehmen, Reden und Benutzen von Gegenständen / Charakteren
  • Kombinieren von Inventargegenständen mit anderen Gegenständen oder Charakteren in der Szene
  • Steuern des Hintergrundgeschehens in einer Szene (z.B. Wetter, Verhalten von NPCs, ...)
Für die Kellerszene sieht sie auszugsweise wie folgt aus:

[INIT]
    // Vorder- und Hintergrundgrafik setzen:
    SetBackground("01 - Basement (Background).jpg");
    SetForeground("01 - Basement (Foreground black).png");

    // Akteure auf die Szene setzen:
    AddActor(STONE, "", false, 530, 390, 250, "", "Animation (Charles Stone).plist", "01_WP - Basement (Charles Stone).plist");
    AddActor(LIGHTSWITCH, "Lichtschalter", true, 446.5, 243.5, 302, "01 - Basement (Switch).png", "", "");
    AddActor(WALLPAINT, "Farbeimer", true, 775.5,554.5, 0, "01 - Basement (Wall paint).png", "", "");
    AddActor(CROWBAR, "Brechstange", true, 727, 402, 0, "01 - Basement (Crowbar).png", "", "");
    AddActor(DOOR, "Ausgang zum Treppenhaus", true, 528.5, 255, 301, "01 - Basement (Door).png", "", "");
    AddActor(PIGGYBANK, "Sparschweinchen", true, 825, 391, 0, "01 - Basement (Piggybank).png", "", "");
    AddActor(POSTER, "Poster", true, 761, 215, 0, "01 - Basement (Poster).png", "", "");

    // Actor "DOOR" als Ausgang zu einer anderen Szene definieren:
    DOOR: SetExitFlag(true);
[END]

[START_SCENE_FROM_STAIRWAY]
    Lock();
        // Szene initialisieren:
        Gosub("INIT", SCENE);

        // Charles Stone auf seine Anfangsposition setzen:
        STONE: SetToXYZ(530, 390, 250);
        STONE: TurnToDirection(Down);

        // … und Vorhang auf:
        FadeInScene();
    Unlock();
[END]

[LOOK PIGGYBANK]
    STONE: Say("Ein Sparschwein.", "15.mp3");
[END]

[TAKE PIGGYBANK]
    // Stone zum Sparschwein gehen lassen:
    STONE: GotoActor(PIGGYBANK);
    Wait();

    // "Nimm-Animation" abspielen:
    STONE: PlayTakeAnimation();
    Wait();

    // Das Sparschwein dem Inventar hinzufügen:
    STONE: AddItem(PIGGYBANK, "Sparschweinchen", 1, "Item (Piggybank).png", false);
[END]

[USE PIGGYBANK WITH COIN]
    // Stone zum Sparschwein gehen lassen:
    STONE: GotoActor(PIGGYBANK);
    Wait();

    // "Nimm-Animation" abspielen:
    STONE: PlayTakeAnimation();
    Wait();

    // Münze aus dem Inventar entfernen und Aktion kommentieren:
    STONE: RemoveItem(COIN);
    STONE: Say("… und schon wieder bisschen was gespart.");
[END]

Neben der Szenen-Scriptdatei gibt es noch die Welt-Scriptdatei. Diese beinhaltet alle folgenden Aktionen:
  • Anschauen, Reden und Benutzen von Inventargegenständen
  • Kombinieren von Inventargegenständen untereinander
  • Abgeben von Standardkommentaren zu Aktionen, die im jeweiligen Szenen-Script nicht berücksichtigt sind
Der Aufbau des Weltscripts ist identisch mit dem des Szenenscripts. Trotzdem ebenfalls ein Auszug:

[DEFAULT LOOK]
    STONE: Say("Ich sehe hier nichts Besonders.");
[END]

[DEFAULT USE]
    STONE: Say("Ich weiß nicht, wie ich das benutzen soll.");
[END]


[DEFAULT TALK]
    STONE: Say("Sorry, kein Gesprächsbedarf.");
[END]


[LOOK DRIVING_LICENSE]
    STONE: Say("Das ist mein Führerschein.");

[END]
[USE COIN WITH DRIVING_LICENSE]
    STONE: Say("Warum soll ich mit der Münze an meinem Führerschein rubbeln?");
[END]

Über den Gosub-Befehl ist es möglich, innerhalb eines Scriptblocks einen anderen Scriptblock aufzurufen. Soll beispielsweise das Benutzen des Sparschweins mit einem Geldschein das gleiche bewirken, wie das Benutzen des Sparschweins mit einer Geldmünze, dann sieht der entsprechende Block wie folgt aus:

[USE PIGGYBANK WITH NOTE]
    Gosub("USE PIGGYBANK WITH COIN");
[END]

Damit sparen wir uns eine Menge Tipparbeit, das Script wird übersichtlicher und vor allem weniger fehleranfällig.

Wenn wir eine Szene planen, überlegen wir uns zunächst, welche Gegenstände in der Szene enthalten sein sollen, mit denen man interagieren kann. Diese werden über den Inventargegenständen in einer Matrix eingetragen, um direkt sehen zu können, welche Kombinations- und Aktionsmöglichkeiten auftreten können. Die folgende Grafik zeigt eine Aktions-Matrix für das bereits fertige zweite Kapitel. Zu sehen sind die Kombinationsmöglichkeiten zweier Inventargegenstände (im Bereich "02 - World.script") sowie die Kombinationsmöglichkeiten der Inventargegenstände mit Objekten in zwei Spielszenen. Um nicht zu Spoilern habe ich natürlich "einige wenige" Gegenstände unkenntlich gemacht ;-)




  • Rote Felder bedeuten, dass dort aus dem Weltscript ein Standardkommentar von Stone abgegeben werden soll (DEFAULT-Blöcke).
  • Felder mit einem grünen "x" sind Scriptblöcke, die einen besonderen Kommentar oder eine besondere Aktion ausführen. 
  • Gelbe "a"-Felder sind Aktionen, die zum direkten Lösen des Spiels durchgeführt werden müssen. 
  • Grüne Felder mit einer Koordinatenangabe beziehen sich auf Scriptblöcke, die durch einen Gosub-Befehl aufgerufen werden. Die Koordinate gibt den Befehl innerhalb der Matrix an (Buchstaben sind die Spalten der Matrix, Zahlen die Zeilen der Matrix).
Weiterhin gibt es noch blaue Felder und violette Felder. Blaue Felder bedeuten, dass dieser Scriptblock noch gecodet werden muss. Ein violettes Feld bedeutet, dass der Scriptblock fertig erstellt ist, aber noch getestet werden muss. Da (wie bereits erwähnt) das zweite Kapitel bereits fertig ist, sind diese Farbfelder in der Matrix nicht mehr vorhanden.

Anhand der Matrix habe ich mich dann an die Arbeit gemacht und die Scriptdatei wie oben beschrieben mit allen möglichen Aktionen erstellt. Und bevor Ihr fragt: Ja, es ist eine Menge Arbeit, aber durch die Matrix behält man definitiv die Übersicht und baut kaum Fehler ein. Müssen trotzdem im Nachhinein Änderungen an der Szene vorgenommen werden, kann die Matrix und die Scriptdatei anschließend problemlos angepasst werden. 

Das war's auch schon wieder für heute. Auf geht's ans fröhliche Scripten des dritten Kapitels ;-)
Bis zum nächsten Mal,
Roland

Blog-Archiv

Labels