Building Events: Unterschied zwischen den Versionen
(→generalScene) |
|||
(5 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
+ | = Allgemeines = | ||
//TODO: Building Events allgemein beschreiben. | //TODO: Building Events allgemein beschreiben. | ||
− | Werden in der Reihenfolge '''Dorf''', '''ALL''' aufgerufen. | + | |
+ | Werden in der Reihenfolge '''Dorf''', '''ALL''' aufgerufen. Speziell für randomStreet ist das wichtig, der Pool an Ereignissen wird erst dann mit "All"-Ereignissen befüllt, wenn es keine "Dorf"-Ereignisse mehr gibt. Sollte auch nur ein randomStreet-Ereignis immer im Pool bleiben, so werden dadurch NIEMALS "All"-Ereignisse in den Pool aufgenommen! | ||
Identifiziert via BuildingID (siehe Konsole -> Tooltip) | 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) | Es wird immer nur der erste Trigger aufgerufen (Reihenfolge im XML / Dorf vor ALL) | ||
− | = Ortsgebundene Ereignisse = | + | == 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. | 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. | ||
− | = Spezial | + | == Auslösertypen == |
+ | * '''Scene''': Dieses dient 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), dort Charaktere zu platzieren oder das Menü zu modifizieren bzw. zu erweitern | ||
+ | * '''Skript''': Das Skript wird ausgeführt | ||
+ | * '''Dialog''': Der angegebene Dialog wird ausgeführt | ||
+ | |||
+ | = Spezial Ereignis-IDs = | ||
+ | == generalScene == | ||
+ | Wird als generelles Script ausgeführt, quasi als "Standard" für einen bestimmten Haustyp. Achtung, ohne Haustyp unwirksam! Dabei werden globale (in TownID ALL) gesetzte von dorfspezifischen Events überschrieben. Je nach Existenz Dorfspezifische oder Globale Events werden dann vor einem etwaigen ID-Spezifischen Event ausgeführt. | ||
+ | |||
== enterTown == | == enterTown == | ||
Wird aufgerufen, wenn ein Dorf betreten wird. | Wird aufgerufen, wenn ein Dorf betreten wird. |
Aktuelle Version vom 18. Oktober 2016, 13:43 Uhr
Inhaltsverzeichnis
Allgemeines
//TODO: Building Events allgemein beschreiben.
Werden in der Reihenfolge Dorf, ALL aufgerufen. Speziell für randomStreet ist das wichtig, der Pool an Ereignissen wird erst dann mit "All"-Ereignissen befüllt, wenn es keine "Dorf"-Ereignisse mehr gibt. Sollte auch nur ein randomStreet-Ereignis immer im Pool bleiben, so werden dadurch NIEMALS "All"-Ereignisse in den Pool aufgenommen!
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
- Scene: Dieses dient 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), dort Charaktere zu platzieren oder das Menü zu modifizieren bzw. zu erweitern
- Skript: Das Skript wird ausgeführt
- Dialog: Der angegebene Dialog wird ausgeführt
Spezial Ereignis-IDs
generalScene
Wird als generelles Script ausgeführt, quasi als "Standard" für einen bestimmten Haustyp. Achtung, ohne Haustyp unwirksam! Dabei werden globale (in TownID ALL) gesetzte von dorfspezifischen Events überschrieben. Je nach Existenz Dorfspezifische oder Globale Events werden dann vor einem etwaigen ID-Spezifischen Event ausgeführt.
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 :).