EVENT-TYP
ET_COMM -- Kommunikations-Ereignis
BEDEUTUNG
Jegliche Kommunikations zwischen Spielern und zwischen Spielern
und NPCs laeuft ueber diese Ereignisse. Von welchen Verben sie
ausgeloest werden koennen, ist weiter unten zu sehen.
Auf das Ereignis kann dann reagiert werden. In Ausnahmefaellen
(bitte mit Erzmagier absprechen) kann es auch modifiziert oder
ganz abgebrochen werden. Letzteres ist die schlechteste Loesung,
besser ist ein Modifizieren in der Art, dass nur der Erzeuger
eine entsprechende Meldung erhaelt.
Moeglichkeiten der Ereignisbeeinflussung:
o Adverbien einfuegen bzw fest vorgeben
o Lautaeusserungen verhindern
- Meldung komplett nur an Spieler
- Meldung an Spieler und andere Anwesende
o Sprachtexte modifizieren
o Reaktionen auf Gespraeche allgemein
DEFAULT HANDLER
/global/handler/comm.c
EVENT DEFINES
/sys/events.h
/sys/living/comm.h
EVENT DATEN
Das Event-Mapping enthaelt folgende Daten:
Key | Inhalt
-----------------+--------------------------------------------------
Eintraege, die nicht veraendert werden duerfen:
E_SENDER | (object) Event-Erzeuger. Normalfall: das Lebewesen.
E_DESTINATIONS | (array) Objekte, an die das Event gesandt wird.
| Im Normalfall das aeusserste Environment, ggf.
| auch des Ziels.
E_COMMAND | (string) Das eingegebene Kommando von this_player(),
| das das Ereignis ausloeste.
E_COMM_VERB | (string) Das Kommunikations-Verb in Normalform.
| Dieses sollte fuer Auswahl bestimmter Verben benutzt
| werden (siehe Bemerkung unten).
E_COMM_FLAGS | (int) Einige Angaben ueber das Ereignis (s.u.).
E_ACTOR | Das eigentlich aktive Lebewesen, welches das
| Verb ausfuehren moechte.
E_COMM_VICTIM | (object) Das 'Opfer' des Verbs (bei Interaktion
| direkt mit einem anderen Lebewesen) oder die Zahl
| 1 (bei Verb mit 'alle') oder Null.
E_COMM_VICSTR | (string) Der String mit dem der Spieler das
| Opfer des Verbs identifiziert hat (zB: "fio").
| Wird fuer Fehlermeldungen gebraucht.
E_COMM_H_INTERN | Hier wird bei Emotes und Illusionen das Kommando
| abgelegt. E_COMM_TEXT ist dabei leer!
E_COMM_CHANNAME | Name der Zielebene bei Ebenenkommunikation
E_COMM_CHANVICS | (array) Uids der Leute, die der Zielebene lauschen
Eintraege, die veraendert werden duerfen:
E_COMM_TEXT | (array of strings) Die einzelnen Elemente duerfen
| evtl. veraendert werden. Hierbei ist jedoch grosse
| Sorgfalt walten zu lassen. Die Elemente selbst sind
| unten beschrieben.
Nach oder waehrend der Abarbeitung EVENTUELL enthalten:
E_HANDLED | (int) Wenn gesetzt, wurde das Event ausgefuehrt.
E_HANDLER | (object) Der ausfuehrende Handler. Im Normalfall
| der Defaulthandler.
E_CANCELLED | (mixed) Wenn gesetzt, wurde das Event abgebrochen.
| Wenn ein String gesetzt wurde, so wird versucht
| diesen an den Akteur als Begruendung auszugeben.
E_CANCELLER | (object) Das abbrechende Object.
SYNTAX EVENT-LAUSCHER
Siehe allgemeine Syntaxen in event_listeners(WL).
Globales Lauschen ist nicht erlaubt.
Wichtig: Ebenso ist das Abhoeren von (auch einzelnen) Spielern
*strengstens* verboten! Dies schliesst Erzeugen von Logfiles der
Kommunikation oder Ausgeben derselben an einem selbst oder andere
mit ein.
SYNTAX EVENT-SENDER
Siehe allgemeine Syntaxen in event_senders(WL).
Normalerweise darf nur das Lebewesen diese Ereignisse erzeugen.
SYNTAX EVENT-ABBRECHER
Meldungen und Aktionen duerfen wie ueblich nur in REACT_CANCEL
vorgenommen werden. Zur Vereinfachung kann ein einfacher Text auch
direkt beim Abbrechen angegeben werden (cancel_event("Begruendung\n"))
welcher an mehr oder weniger passender Stelle dann an den Akteur
ausgegeben wird.
Notify_fail()s sind nicht erlaubt. Tells usw nur im REACT_CANCEL.
Siehe auch Flussdiagramm in events(WL) und cancel_event(S).
BESCHREIBUNG
Wird von einem Spieler oder Npc ein Kommunikationsverb benutzt,
so wird je nach Verb ein Ereignis erzeugt. Dieses enthaelt in
E_COMM_TEXT die auszugebenden Texte, die modifiziert werden
koennten. Folgende Verben gibt es:
"sage", "rufe", "mrufe", "erzaehle", "fluestere", "antworte",
"frage", "emote", "gemote" und "illusion".
(Ausnahme sind hier "emote", "gemote" und "illusion", welche
nicht veraendert (nur abgebrochen) werden koennen.)
Soll jedoch das 'Opfer' veraendert werden, so sollte dieses aufgrund
der Abhaengigkeit der Texte vom Opfer nicht ueber E_COMM_VICTIM
geschehen. Vielmehr muss ein neuen Ereignis erzeugt und das alte
dann abgebrochen werden. Eine solche Vorgehensweise ist jedoch
unbedingt mit einem Erzmagier abzusprechen.
Wird das Ereignis (ohne Ersatz) abgebrochen, so hat der Abbrecher
eine Begruendung im notify_fail(E) zu hinterlegen.
Die auszugebenden Texte in E_COMM_TEXT sind:
C_TEXT_ADVERB | Das verwendete Adverb
C_TEXT_SELF | Inhalt der Kommunikation an Akteur/Aktrice
C_TEXT_OTHER | Inhalt der Kommunikation an andere
C_PRE_SELF | Text vor Kommunikationsinhalt fuer Akteur
C_PRE_VICT | Text vor Kommunikationsinhalt fuer Opfer
C_PRE_OTHER | Text vor Kommunikationsinhalt fuer andere
In den C_PRE_* sind noch die Schluesselworte fuer die Namen usw
enthalten, die erst bei der Ausgabe des Ereignisses ersetzt werden:
@@Name@@ | wird durch den Namen des Akteurs ersetzt
@@wen@@ | wird durch den Namen des Opfers ersetzt
@@wem@@ | wird durch den Namen des Opfers ersetzt
@@Wer@@ | wird durch den Namen des Opfers ersetzt
@@Dir@@ | wird durch 'Dir' bzw 'Dich' oder bei 'alle'
@@Dich@@ | durch Opfernamenliste ersetzt
@@adverb@@ | wird durch das Adverb ersetzt
Weiterhin kann man ueber E_COMM_FLAGS einiges ueber das Verb
erfahren. Im Einzelnen:
* Eigenschaften des Verbs (eher uninteressant):
C_LEADING_VIC | Opferreferenz mit '>' erlaubt
C_VIC_NEEDED | Opferreferenz benoetigt
C_VIC_ALLOWED | Opferreferenz erlaubt
C_DOTTED_ADV | Adjektiv mit ":: " erlaubt
C_ADV_ALLOWED | Adjektiv erlaubt
C_SVIC_ALLOWED | Spezialopfer zB "." erlaubt
C_REMOTE_VIC | Opfer in der Ferne erlaubt
C_ALLOW_HIDDEN | Unsichtbares/netztotes Opfer erlaubt
C_ALLOW_ALL | 'alle' als Opfer erlaubt
C_ALLOW_INTER | Intermudopfer erlaubt
C_NO_OTHER_TXT | Keinen Text an andere anhaengen
C_KOB_IGN | Kobold kann Ausgabe verhindern
C_KOB_SAVE | Kobold kann verhindern, muss dann mitloggen
C_SHOUT | Other-Text geht an alle Spieler
* Konkrete Eigenschaften fuer diese Anwendung des Verbs
C_ME_GHOST | Akteur ist Geist
C_ME_WIZ | Akteur ist Magier
C_ALL | Opfer ist 'alle'
C_IS_REMOTE | Ereignis ist nicht raumbasiert
C_IS_INTER | Intermudopfer
C_FROM_INTER | Das Ereignis stammt aus dem Intermud
C_VIC_HIDDEN | Opfer ist unsichtbar (vorsicht!)
C_VIC_NDEAD | Opfer ist netztot
* Spezielle Flags fuer die Ausgabe via Message()
C_MSG_TELL | ist Tell-Meldung
C_MSG_ILLU | ist Illusions-Meldung
C_MSG_IGNCHK | siehe Message(L)
C_MSG_SOUL | (nie in diesem E-Typ) ist Soulmeldung
C_MSG_CHAN | ist Ebenenmeldung
Wenn C_SHOUT gesetzt ist, bekommen alle eingeloggten Spieler die
'andere'-Meldung. Bei ihnen wird jedoch dazu kein Ereignis erzeugt!
Wenn C_NO_OTHER_TXT gesetzt ist, so bekommen andere nur den
C_PRE_OTHER ohne dass daran der C_TEXT_OTHER angehaengt wird. Dies
wird zB fuers (heimliche) Fluestern benutzt.
BEISPIEL
Moechte man erreichen, dass alle Verben eines Spielers immer und
aussschliesslich mit dem Adverb 'traurig' verwendet werden koennen:
void create() {
...
listen_event(ET_COMM, EPRIO_MODIFY, #'receive_comm_verb
...
}
void receive_comm_verb(mapping data, string type, int prio) {
if (data[E_ACTOR] != environment()) return;
data[E_COMM_TEXT][C_TEXT_ADVERB] = "traurig";
}
SIEHE AUCH
events(WL), event_types(WL), event_prioritaeten(WL), send_event(S),
listen_event(S), Message(L), CheckIgnore(L)
|