| SYNOPSIS |
| #include <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 Kommandos geparst, |
| 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. |
| |
| |
| BEISPIELE |
| 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"); |
| */ |
| ... |
| } |
| |
| void 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(). |
| |
| GESCHICHTE |
| Die Bedeutung von <flag> wurde in 3.2.1@93 erweitert. |
| Die Limitierung fuer das "stapeln" von input_to()s aus !-Kommandos |
| 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. |
| |
| FEHLER |
| 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) |