Building Events
Inhaltsverzeichnis
Allgemeines
//TODO: Building Events allgemein beschreiben.
Werden in der Reihenfolge Dorf, ALL aufgerufen.
Identifiziert via BuildingID (siehe Konsole -> Tooltip)
Einmal-Trigger werden nur einmalig aufgerufen, gespeichert wird jedoch die Ereignis-ID, sodass diese ebenfalls hinreichend eindeutig sein muss, damit das funktioniert.
Es wird immer nur der erste Trigger aufgerufen (Reihenfolge im XML / Dorf vor ALL)
Ortsgebundene Ereignisse
In Dörfern sind Ortsgebundene Ereignisse (oder "Location Trigger") möglich, die ein bestimmtes Ereignis ohne Betreten eines Hauses auslösen, analog zu den Dungeon-Triggern. Einstellbar sind die Werte X/Y (für die Örtlichkeit), W/H (für Breite/Höhe) sowie R (für Rotation). Außerdem können die Trigger mithilfe der Debug-Features sichtbar gemacht und mithilfe der Javascript-Funktion modifyLocationTrigger geändert werden.
Auslösertypen
- nur Daten: Dieses dient in erster Linie dazu, bestehende Hauseingänge über die entsprechende ID mit einem anderen Haustypus zu versehen (zB einfaches Haus in Leeres Haus oder in einen Händler umwandeln)
- Skript: Das Skript wird ausgeführt
- Dialog: Der angegebene Dialog wird ausgeführt
Spezial Ereignis-IDs
enterTown
Wird aufgerufen, wenn ein Dorf betreten wird.
randomStreet
Kommt in den Pool von Zufallsbegegnungen, die beim Herumlaufen in einem Dorf passieren können. Im Spezialdorf "ALL" sind Zufallsbegegnungen, die in allen Dörfern passieren können. Hier gibt es zusätzlich die "Nicht in Dörfern"-Liste, sie enthält Komma-getrenne Dörfer, in denen eine bestimmte Zufallsbegegnung NICHT auftauchen kann.
Camp Trigger
Damit ihr die Zeugen umsetzen könnt, habe ich das "Camp Scripting", das bereits für spezielle RouteEvents (zB AbandonedHostel, lawinencamp usw.) verfügbar war, jetzt generell für alle Camps verfügbar gemacht.
Grundsätzlich werden die BuildingEvents verwendet, um das "Gesamtskript" für ein Camp zu setzen, und zwar jeweils das ERSTE gefundene BuildingEvent mit korrektem Namen und dem Typ "skript".
Für Dungeons: campDungeon
Für Lager im Dorf auf der Straße (toll für nächtlichen Diebstahl ;)): campStreet
Für Lager in einer Herberge: campHostel
Für Lager auf der Karte, sofern KEIN spezielles Lager (zB besonderer Rastplatz / RouteEvent) eingestellt ist: campNature
Angesehen werden für die jeweiligen Events, in der hier angegebenen Reihenfolge:
Für Dungeons: ALL
Für Lager im Dorf: aktuelles Dorf + ALL
Für Lager in der Herberge: aktuelles Dorf + ALL
Für Lager in der Natur: Ausgangsdorf der Route, Zieldorf der Route und ALL
Aufgerufen werden die folgenden Funktionen:
function OnSleep() { return true; }
Wird aufgerufen, sobald man die Schlafenszeit eingestellt hat. Liefert diese Funktion true zurück, so wird das Schlafengehen NICHT abgebrochen, sondern fortgesetzt. liefert sie false oder gar nichts, wird abgebrochen, allerdings nur *genau* ein mal. Man kann also das Schlafen gehen nur einmalig unterbrechen.
function OnGuard( guardshift, delay, who, guardshortname ) { return true; }
Wird direkt nach OnSleep erstmals aufgerufen (wenn nicht unterbrochen wurde), und danach jeweils am *Beginn* der Wache. delay gibt die Wachedauer in Stunden an (für alle 3 gleich), who enthält die CharacterID (-1, wenn keine Wache eingeteilt wurde). Sofern true zurückgeliefert wird, wird der Wachezyklus normal fortgesetzt, bei false wird er abgebrochen.
Noch ein paar Ergänzungen:
- Wird die Wache abgebrochen, warum auch immer, gibt es *keinen* Regenerationszyklus
- OnGuard wird auch in der Herberge aufgerufen, selbst wenn es dort keine Wachen gibt, um zB Ereignisse "Mitten in der Nacht" stattfinden lassen zu können
- Ein "unterbrechen und später fortsetzen" des Schlafens, wenn es einmal unterbrochen wurde, ist nicht möglich
function OnLeave() { return true; }
Wird beim Verlassen des Lagers (Abbruch bei Straße und Dungeon, Weiterreisen bei Natur, Zimmer verlassen bei Herberge) aufgerufen. Wiederum kann mit return false; das "normale" Verlassen unterbrochen werden, während mit return true; ganz normal verlassen wird.
Bitte beachtet jeweils, dass der Aufruf eines Dialogs IMMER asynchron verläuft, ihr könnt also Nicht "nach" dem startdlg ein return true; hinpacken, startdlg kehrt nämlich sofort wieder in die Ausführung zurück, selbst wenn der Dialog noch angezeigt wird. Ihr könnt aber zB beim OnLeave mit "leaveLocation()" das Lager verlassen, beachtet aber, dass anders als beim OnSleep diee Funktion OnLeave *beliebig oft* das Verlassen abbrechen kann, also vorsicht vor Endlosschleifen :).