SYNOPSIS #include <sys/input_to.h> void input_to(string|closure fun); void input_to(string|closure fun, int flag, ...); void input_to(string|closure fun, int flag, string|closure prompt, ...); BESCHREIBUNG Die naechste Zeile, die der Spieler eintippt, wird als Argument an die Funktion <fun> uebergeben. Ausnahme: wenn die naechste Zeile mit einem '!' beginnt, wird sie als Kommando ausgewertet bzw. an das letzte input_to() uebergeben, das das INPUT_IGNORE_BANG Flag gesetzt hat. Die Funktion <fun> kann "static" deklariert sein, nicht aber "private" (sonst wird sie nicht gefunden). Der Aufruf von <fun> erfolgt nicht sofort, sondern erst, wenn der Spieler die Entertaste drueckt. Wenn input_to() mehr als einmal pro Funktion aufgerufen wird, wird normalerweise nur das erste input_to() beruecksichtigt. Diese Verhalten kann durch die Angabe von INPUT_APPEND modifiziert werden: in diesem Fall wird das input_to() an die Liste der bereits anhaengigen input_tos angehaengt (siehe BEISPIELE). Wird andererseits waehrend einem laufenden input_to() (mittels "!" am Zeilenanfang) eine neue Funktion aufgerufen, die wiederum ein input_to() enthaelt, wird das urspruengliche input_to() so lange unterbrochen, bis das neue input_to() abgearbeitet wurde, anschliessend wird es wieder aktiv. Das optionale <flag> kann ein binaeres Oder (|) der folgenden Werte sein: INPUT_NOECHO (1): Die vom Spieler eingegebene Zeile erzeugt kein Echo und wird auch nicht erkannt, wenn der Spieler beobachtet wird. Dieser Modus kann nur geaendert werden, wenn telnet enabled ist. INPUT_CHARMODE (2): Die Verbindung zum User wechselt von Zeilen- auf Zeichenmodus. So wird nur ein einzelnes Zeichen (!) vom Spieler empfangen. Ist telnet disabled, wird lediglich die Interpretation der einkommenden Daten durch den Driver umgeschaltet - das Clientprogramm des Spieler verbleibt im gerade aktiven Modus. Nachdem die Funktion <fun> ausgefuehrt wurde, wechselt die Verbindung zurueck in Zeilenmodus, ausser ein nachfolgendes input_to( , 2) wurde gestartet. Zeilenumbrueche werden je nach Client unterschiedlich empfangen, entweder als "", als "\r" gefolgt von "" oder als "\r" (letzteres kommt vor allem bei Windows Clients vor). Das Frontend des Spielers kann dauernd im Zeilenmodus bleiben. Auch wenn input_to() nur ein einzelnes Zeichen fordert, muss der Spieler unter Umstaenden das Zeichen und einen Zeilenumbruch druecken (und senden). Normalerweise erhaelt <fun> dann den gesamten Input auf einmal. Will man laenger im Zeichenmodus bleiben, kann der Overhead reduziert werden, indem set_combine_charset() verwendet wird. So koennen Zeichensequenzen als ein String anstelle von Zeichen-fuer-Zeichen empfangen werden. In einem screenorientierten Editor gilt dies fuer die meisten druckbaren Zeichen. INPUT_PROMPT (4): Das Argument nach dem <flag> wird als Prompt fuer die Eingabe verwendet. Wenn dieses Argument nicht angegeben (und damit kein Propmt definiert) ist, wird kein Prompt ausgegeben. INPUT_NO_TELNET (8): Modifiziert das INPUT_CHARMODE Argument: der Driver aendert seine Behandlung von eingehenden Daten entsprechend dem _CHARMODE Argument, sendet aber keine Telnetkommandos zur Anpassung des Verhaltens des Clientprogrammes. INPUT_APPEND (16): Das input_to() wird an die Liste der bereits anhaengigen input_tos angehaengt. INPUT_IGNORE_BANG (128): Eingaben, die mit ! beginnen, werden NICHT als Kommandi geparset, sondern auch als Argument an die Funkion <fun> uebergeben. Die Verwendung dieses Flags ist eingeschraenkt. Alle nachfolgenden Argumente werden als zweites bzw. drittes usw. Argument an <fun> uebergeben. BEISPIEL void func() { ... input_to("enter_name", INPUT_PROMPT, "Wie lautet dein Name?:"); /* Frueher erledigte man dies mit: * write("Wie lautet dein Name?:"); * input_to("enter_name"); */ ... } enter_name(string str) { write("Heisst du wirklich '"+str+"'?? *kicher*\n"); ... } Bei der input_to() Anweisung fuehrt der Driver die Funktion func() aus, erwartet aber gleichzeitig Input vom Spieler. Wenn dieser etwas eingegeben UND DIE ENTERTASTE GEDRUECKT HAT, arbeitet der Driver die Funktion enter_name() mit dem eingegebenen String als Argument ab. void func() { .. input_to("enter_firstname"); input_to("enter_lastname, INPUT_APPEND); ... } Diese Sequenze erzeugt zwei input_tos: Eingaben gehen zuerst an enter_firstname(); und wenn diese Funktion fertig ist (einschliesslich etwaiger eigener non-INPUT_APPEND input_tos), geht die naechste Eingabe an enter_lastname(). AENDERUNGEN Die Bedeutung von <flag> wurde in 3.2.1@93 erweitert. Die Limitierung fuer das "stapeln" von input_to()s aus !-Kommandi wurde in LDMud 3.2.8 implementiert. Seit LDMud 3.2.8 kann <fun> in Form einer Closure angegeben werden. LDMud 3.2.9 fuehrte das Flag INPUT_PROMPT samt zugehoerigem Argument ein. LDMud 3.2.11/3.3.593 fuehrte das INPUT_NO_TELNET Flag ein. LDMud 3.2.11/3.3.637 fuehrte das INPUT_APPEND Flag ein. BUGS Im Zeichenmodus sollten Zeilenumbrueche eigentlich als "\n" zurueck gegeben werden. Dies allerdings kann existierenden Code zerstoeren. SIEHE AUCH call_other(E), sscanf(E), privilege_violation(M), set_combine_charset(E), query_input_pending(E), find_input_to(E), input_to_info(E), remove_input_to(E), enable_telnet(E)