next up previous contents
Nächste Seite: Das Skript für das Aufwärts: Das Charakterskript Vorherige Seite: EP-Anpassung   Inhalt

Skript, um Dialoge zu starten

Man will ja nicht immer, dass sofort ein Dialog startet, wenn man den neuen NPC in seine Gruppe aufnimmt. Dadurch muss man gewisse Auslöser (Trigger) für den Dialog definieren. Das kann das Betreten eines Gebietes, das setzen einer Variable durch eine Handlung oder einen anderen Dialog oder einfach das Verstreichen von Zeit sein.

Zuerst mal ein allgemeines Beispiel eines Dialoges, der sozusagen als Begrüssung nach der Aufnahme in die Gruppe gestartet wird.

IF

InParty(Myself)

IsValidForPartyDialog(``DV des Gesprächspartners'')

Global(``X#WirUnterhaltenUns'',''GLOBAL'',0)

THEN

RESPONSE #100

SetGlobal(``X#WirUnterhaltenUns'',''GLOBAL'',1)

Interact(``DV des Gesprächspartners'')

END

Die erste Bedingung (InParty(Myself)) legt fest, dass derjenige, um dessen Skript es sich handelt in der Gruppe ist. Danach wird geschaut, ob der Gesprächspartner überhaupt für ein Gespräch zur Verfügung steht (IsValidForPartyDialog(``DV des Gesprächspartners'')), denn er könnte ja schlafen oder sich gerade mit jemandem anderen unterhalten. Allerdings funktioniert diese Abfrage nicht mit Player1. Für ihn muss man InParty(Player1) und !CheckStat(Player1,STATE_SLEEPING) abfragen. Die nächste Variable dient dazu, dass der Dialog nur einmal gestartet wird, deshalb wird sie auf einen anderen Wert gesetzt. Sie kann auch im Dialog mit diesem Wert abgefragt werden, um einen bestimmten Dialog zu starten. Interact() startet dann den Dialog, der sich in der Bchar.dlg befinden muss. Soll ein Dialog aus der charJ.dlg benutzt werden, ist der Dialog mit StartDialogue() zu beginnen.

Wenn man nun möchte, dass das Gespräch nach Betreten eines Gebietes gestartet wird, muss man zu den Bedingungen unter IF noch eine weitere hinzufügen:

AreaCheck(``ARxxxx'')

wobei xxxx für die Nummer des gewünschten Gebietes steht. Da es immer eine gewisse Ladezeit beim Betreten eines neuen Gebietes gibt, empfiehlt es sich, zu den Aktionen (nach RESPONSE #100) noch ein kurzes Wait(x) einzufügen, dass x Sekunden wartet, bevor der Dialog beginnt.

Wenn man den Dialog nach einer längeren Zeit erst starten will, sollte man das nicht mit Wait(x) machen, da während des Wait-Befehls das Skript des Charakters angehalten ist. Hierfür ist eine ``Zeitschaltuhr'' zu benutzen (SetGlobalTimer), dessen Benutzung im folgenden erklärt wird:

IF

InParty(Myself)

InParty(``DV des Gesprächspartners'')

Global(``NurEinmalTimerSetzen'',''LOCALS'',0)

THEN

RESPONSE #100

SetGlobal(``NurEinmalTimerSetzen'',''LOCALS'',1)

SetGlobalTimer(``X#NameDesTimers'',''GLOBAL'',ONE_DAY)

END

Nachdem sichergestellt wurde, dass alle relevanten Leute in der Gruppe sind, und die Uhr noch nicht gesetzt wurde, wird diesselbe dann gesetzt mit dem Befehl SetGlobalTimer. Danach steht der Variablenname der Uhr, dann ob sie GLOBAL (also im ganzen Spiel abfragbar) oder LOCALS (nur in diesem Skript verwendet) ist. Am Schluss steht dann die Zeit, wann die Uhr abgelaufen ist. ONE_DAY hat den Wert eines Tages in Spielzeit. Man kann auch mehrere Tage angeben (z.B. FOUR_DAYS). Wenn man ein etwas feineres Raster bevorzugt, dann kann man auch die Zeit in Sekunden (in Realzeit) angeben, wobei 7200 Sekunden einem Tag entsprechen, bzw. 6 Sekunden einer Runde. Zumindest in der Theorie; in der Praxis hängt das wohl von der Rechnerkonfiguration und den Spieleinstellungen ab. Nachdem die Uhr gestellt ist, muss man nachschauen, wann sie abgelaufen ist. Das sieht dann wie folgt aus:

IF

InParty(Myself)

IsValidForPartyDialog(``DV des Gesprächpartners'')

GlobalTimerExpired(``X#NameDesTimers'',''GLOBAL'')

Global(``NurEinmalTimerSetzen'',''LOCALS'',1)

THEN

RESPONSE #100

SetGlobal(``NurEinmalTimerSetzen'',''LOCALS'',2)

Interact(``DV des Gesprächpartners'')

END

Zuerst wird überprüft, ob der Char nicht in der Zwischenzeit hinausgeworfen wurde, dann wird geschaut, ob der Gesprächspartner zu Verfügung steht. Dann wird mit dem Syntax GlobalTimerExpired abgefragt, ob die Uhr abgelaufen ist. Danach kommt die Variable, die angschliessend wieder hochgesetzt wird, damit der Dialog nur einmal stattfindet. Man kann dafür natürlich auch eine neue Variable einfügen, aber ich bin halt ein Freund des Variablenrecyclings. Weitere Bedinungen können sowohl beim Stellen der Uhr als auch beim Starten des Dialoges eingeführt werden.


next up previous contents
Nächste Seite: Das Skript für das Aufwärts: Das Charakterskript Vorherige Seite: EP-Anpassung   Inhalt
maus 2003-02-14