Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/doc/efun/say b/doc/efun/say
new file mode 100644
index 0000000..6f0958f
--- /dev/null
+++ b/doc/efun/say
@@ -0,0 +1,98 @@
+SYNOPSIS
+ void say(string str);
+ void say(string str, object exclude);
+ void say(string str, object *excludes);
+
+ void say(mixed *|mapping|struct|object msg);
+ void say(mixed *|mapping|struct|object msg, object exclude);
+ void say(mixed *|mapping|struct|object msg, object *excludes);
+
+BESCHREIBUNG
+ Es bestehen zwei Hauptanwendungen fuer say():
+
+ Wenn das erste Argument ein String <str> ist, wird er an alle
+ lebendigen Objekte im aktuellen Raum gesendet, ausser zum Objekt,
+ das die Funktion aufgerufen hat.
+
+ Ist die Nachricht ein String, wird der Text an interaktive Objekte
+ direkt ausgegeben, fuer andere Objekte wird die lfun catch_tell()
+ in diesen aufgerufen.
+ Falls ein Lewebesen die Funktion catch_tell() definiert (-> shadow),
+ so wird der Text hier ausgewertet und nicht an den User ausgegeben.
+
+ Wenn das zweite Argument, die Nachricht, kein String ist, wird in
+ allen Lebewesen, die den Text erhalten, catch_msg() anstatt
+ catch_tell() aufgerufen.
+
+ Mit dem Array <*exclude> kann man verhindern, dass die Nachricht an
+ die darin enthaltenen Objekte gesendet wird. Der Sender muss nicht
+ noch einmal aufgefuehrt werden.
+ Das ist sinnvoll, wenn zB eine Spielergruppe Ausloeser einer Meldung
+ ist und diese selbst nicht erhalten soll.
+
+ Das aufrufende Objekt wird nach folgenden Regeln bestimmt:
+ - Wenn say() aus einem lebendigen Objekt aufgerufen wird, gilt
+ dieses als das aufrufende Objekt.
+ - Wenn say() aus einem nicht-lebendigen Objekt als Resultat einer
+ Handlung eines Benutzers aufgerufen wird (das heisst,
+ this_player() ist gueltig), gilt this_player() als aufrufendes
+ Objekt.
+ - In allen anderen Faellen (Aufruf aus reset zB) gilt das Objekt,
+ das say() aufgerufen hat, als aufrufendes Objekt.
+
+BEMERKUNGEN
+ - fuer laengere Meldungen sollte break_string() verwendet werden
+ - wird in einem catch_msg() der Wert von <msg> veraendert, erhalten
+ alle nachfolgenden Objekte das veraenderte <msg> (Referenz!)
+
+ - say(<str>) ist verhaltensgleich zu
+ tell_room(environment(), <str>, ({this_player()||this_object()}))
+
+BEISPIELE
+ // Folgende Aufrufe sind gleich, wenn sie durch ein Spielerkommando
+ // in einem nicht lebendigen Objekt aufgeloest werden:
+
+ say("Hi!\n");
+ say("Hi!\n", this_player());
+
+ // Das folgende Beispiel zeigt, wie say() zusammen mit catch_tell()
+ // funktioniert. Das zweite Objekt darf nicht lebendig sein, damit
+ // write() an den aktuellen Benutzer geht.
+
+ Objekt 1 (living):
+ void catch_tell(string str) {
+ write("Empfangen: "+str+"\n");
+ }
+
+ Objekt 2 (nicht living):
+ void func() {
+ ...
+ say("HiHo!\n");
+ ...
+ }
+
+ // Ein etwas komplexeres Beispiel zeigt das Zusammenspiel von say()
+ // und catch_msg(). Auch hier wird ein nicht-lebendiges Objekt
+ // verwendet, das die Nachricht ausgibt, sodass das 'wer' in
+ // catch_msg() auf den aktuellen Benutzer zeigt.
+
+ Object 1 (living):
+ void catch_msg(mixed *arr, object who) {
+ foreach(mixed element: arr)
+ tell_object(who, sprintf("%O\n", element));
+ }
+
+ Object 2 (nicht living):
+ void func() {
+ ...
+ say( ({ "Hello", "there!" }) );
+ ...
+ }
+
+SIEHE AUCH
+ Aehnlich: tell_room(E), write(E), shout(E), tell_object(E),
+ printf(E)
+ Verwandt: catch_tell(E), catch_msg(A)
+ Sonstiges: object_name(E)
+
+7.Aug 2007 Gloinson
\ No newline at end of file