Mit load_chat kann man Monster oder andere Objekte zufaellig eine Meldung
aus chat sagen lassen.
chance gibt dabei die Wahrscheinlichkeit (in Prozent der heart_beats) an.
Falls chance negativ ist, so gibt es an, alle wieviel Heartbeats (im
Durchschnitt) die Meldung ausgegeben wird. (-3 bedeutet ca. alle 6 Sekunden.)
In chat kann man entweder einzelne Meldungen oder einen Array aus Meldungen
uebergeben. Fuer die Meldungen gibt es wieder zwei Moeglichkeiten, entweder
sind es Arrays fuer send_message(..) oder einfache Strings.
Wenn die Strings mit "#" anfangen, werden sie als normales Echos ausgegeben,
bei "!" also exec_command im Monster aufgerufen, ansonsten wird es als
exec_command("sage", string) ausgegeben.
In den Strings der Meldungen duerfen auch Pseudoclosures drin sein, also
zB. "$Der()" wird auch verstanden.
Beispiele:
friedwart->load_chat(20,
({"Kennt ihr schon den Witz vom Frosch im Mixer?",
"Kuerzester Mathematikerwitz: Sei Epsilon kleiner Null..."})
);
// Zwei Chats, die per "sage" ausgegeben werden.
friedwart->load_chat(20,
"!frage Kennt ihr schon den Witz vom Frisch im Mixer?");
// Nur ein einzelner Chat, der Friedwart etwas fragen laesst.
friedwart->load_chat(20,
({ ({MT_NOISE, MA_NOISE, "Die Glocken an der Kappe des Hofnarren " +
"scheppern."}),
"Kuerzester Musikerwitz: Zwei Musiker gehen an einer Kneipe " +
"vorbei..."
}) );
// Ein Chat, der per send_message ausgegeben wird und ein Satz, den
// Friedwart sagen soll. (also beide Varianten der Meldung gemischt)
friedwart->load_chat(20,
({ ({MT_SENSE, MA_SENSE, "Du spuerst, wie dir allmaehlich dein " +
"Herz in die Hosen rutscht. $Der() scheint das mit Freude " +
"zu beobachten."}),
"!frage $den() Bin ich wirklich $der()"
}) );
// Nochmal einer fuer send_message und ein String, der als do_command
// ausgefuehrt wird. Beide enthalten Pseudoclosures.
Wer Lust hat, kann auch Closures verwenden. Sie stehen dann an den Stellen
der Strings. Dabei muss man eigentlich nur beachten, dass das was sie
zurueckliefern, sich eine der beiden Moeglichkeiten fuer Meldungen ergibt,
ansonsten wird einfach nichts ausgegeben. Sie erhalten den NPC als ersten
Paraemter.
Beispiele:
string eine_funktion() { return "Das ist ein String!"; }
mixed eine_zweite_funktion()
{
switch (random(3)) {
case 1: return "Hier kommt ein String.";
break;
case 2: return ({ MT_NOISE, MA_NOISE, "Ein lauter Array!" })
break;
default: return 0;
}
// Jetzt noch das load_chat:
friedwart->load_chat(20,
({ ({MT_NOISE, MA_NOISE, "Friedwart laeutet eine imaginaeren Glocke."}),
"!frage Wer bist du?",
#'eine_funktion,
({MT_SENSE, MA_SENSE, #'eine_funktion}),
#'eine_zweite_funktion,
({MT_UNKNOWN, MA_UNKNOWN, #'eine_zweite_funktion})
}) );
// Hier stehen die normalen Chats mit (Lfun-)Closures zusammen. Die beiden
// Aufrufe von eine_funktion sorgen immer fuer eine Ausgabe. Bei
// eine_zweite_funktion nur der erste, wenn er keine 0 liefert, die
// zweite Variante (im Array) liefert nur was, wenn der String zurueck-
// gegeben wird (ansonsten passts einfach nicht).
Wenn etwas ausgegeben werden soll, wird vorher im Monster bzw. sonstigem Objekt
und in der Umgebung noch forbidden("chat", object Objekt, mixed chat);
aufgerufen.
Wenn was ausgegeben wurde, kommt noch ein notify("chat", Objekt, chat);
dazu. chat ist dabei die einzelne Meldung (String oder Array) und Objekt
halt das Objekt, das die Meldung ausgibt.
Um load_chat auch in Nicht-Monstern nutzen zu koennen, muss man einfach
"/i/tools/chat" erben und im init chat::init() aufrufen. Sollte das Objekt
einen heart_beat haben, muss man dort auch chat::heart_beat() aufrufen.