Fausts Cutscene System

Wie kommt nun die Handlung in das Modul?

Nachdem wir nun schon dem System einiges erzählt haben, was in unserer Scene passieren soll, fehlt doch noch immer die Handlung.
Aber keine Sorge, auch das ist einfach zu machen.

Wie Ihr ja gesehen habt, ist die Scene in Mini-Scenen (Chapter) eingeteilt. In unserem Fall sind das 4.
In einem Chapter können alle teilnehmenden Kreaturen Aktionen ausführen, wobei wir festlegen, wie lange diese Aktionen dauern sollen.
Wichtig ist jedoch, dass ein Chapter erst dann beendet ist, wenn alle an der Scene teilnehmenden Kreaturen dem Scenenverwalter ( das ist im Falle meines Systems das Modul ), bescheid sagen, dass sie in diesem Chapter fertig sind.
Das tun sie, indem sie an das Modul ein Event schicken.
Und Ihr erratet sicherlich wie das Event heisst.
Richtig, es ist die eindeutige Nummer die wir der Scene zugeordnet haben - nämlich die 2000.

Wie sieht das aber nun im Code aus?

Diese Frage möchte ich eigentlich ganz gerne einwenig aufschieben, um noch mal daran zu erinnern, dass wir einmal gesagt haben, dass in dem UserDefined Slot eines Objektes vom Benutzer angelegte Events ausgewertet werden.(s.o.)

Damit Ihr nun ein genaueres Bild davon erhaltet, wie das System im Detail funktioniert möchte ich Euch das Folgende kurz erklären. Es ist nicht wichtig, das komplett zu verstehen, aber ein Versuch kann ja nicht schaden:

Durch den Trigger, dessen Script im OnEnter - Slot wir ja breits oben geschrieben haben, wird ja wie bereits erwähnt die Zwischensequenz gestartet.
Dabei wird später von der InitScene Funktion die Funktion SignalEvent aufgerufen, die an das Module die Nachricht schickt, dass jetzt eine Zwischensequenz gestartet werden soll.
Das Modul kann aufgrund der eindeutigen Nummer, die wir der Scene gegeben haben erkennen, welche Aktoren and er Scene teilnehmen werden und aus wie vielen Miniscenen, die Cutscene besteht.

Jetzt schickt das Modul an ALLE teilnehmenden NPCs ein Event raus, und zwar genau das, welches durch unsere Nummer 2000 repräsentiert wird. (EventUserDefined erstellt ein Event zu einer gegebenen Eventnummer)
Jetzt wird das UserDefind Eventscript der NPC Aktoren aufgerufen und es wird der Code ausgeführt, der zu der Scene UND dem Chapter (Mini Scene) gehört.

Hier nimmt der Spieler eine besondere Rolle ein.
Denn erstens ist das eigentliche Spielerobjekt nicht dasjenige, was wir nacher im Spiel sehen, sondern eine vom Spieler erzeugte Kopie, die lokal als Objekt auf dem Modul gespeichert wird.
Wenn Ihr auf Ihn zugreifen wollt, müsst Ihr folgenden Code schreiben:

object oPC = GetLocalObject(GetModule(),"PC_Copy");

Die Kamera, also den echten, unsichtbaren Spieler, also nicht dessen Kopie können wir folgendermassen heranholen:
object oCam = GetLocalObject(GetModule(),"CutscenePlayer");

Da wir keine Möglichkeit haben, dem Spieler oder seiner Kopie Scripte in diverse Eventslots zu packen, ruft das Modul eine Funktion auf, die das ausführen des Userdefined Eventscriptes simuliert.
In dieser Funktion wird, genau wie in den UserDefined Events auch, durch die Nutzung von "IF - Anweisungen" unteschieden, in welcher Scene und welcherm Chapter sich der Char gerade befindet und abhängig davon Aktionen zugewiesen. Bitte erinnert Euch: Der Char ist nur eine Kopie der Spielerobjektes.

Nun kommt der eigentliche Clou des Systems:
Am Ende der Aktionen, die die NPCs und der Spieler in einer Miniscene ausgeführt haben, wird - getimed durch ein DelayCommand - ein Signal zurück an das Modul geschickt, um ihm zu sagen:"Hallo ich bin fertig"
Jedoch erst, wenn alle an der Scene teilnehmenden Aktoren (auch der PC) dem Modul diese Nachricht geschickt haben, geht das nächste Chapter los, indem das Modul wieder seine Events aussendet.

Ablaufdiagramm

Bildschirmfoto

Im Detail

1. Der Trigger wird aktiviert und InitScene signalisiert dem Modul den Start der Scene.

Bildschirmfoto

2. Der Spieler hat in der ersten Scene nichts zu tun und meldet "FERTIG" zurück.

Bildschirmfoto

3. Fritz hat "Hallo." gesagt und sendet mit einem DelayCommand getimtes Signal zurück an das Modul und meldet "Ich bin fertig"

Bildschirmfoto

4. Jetzt sind alle Aktoren für das nächste Chapter bereit und werden vom Modul angestossen... etc.

Nun sind wir endlich soweit den Code einzubauen, der die Aktoren handeln lässt.

Erstellt von Faust | am 17.07.2007