MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | SYNOPSIS |
| 2 | #include <sys/input_to.h> |
| 3 | |
| 4 | void input_to(string|closure fun); |
| 5 | void input_to(string|closure fun, int flag, ...); |
| 6 | void input_to(string|closure fun, int flag, string|closure prompt, ...); |
| 7 | |
| 8 | BESCHREIBUNG |
| 9 | Die naechste Zeile, die der Spieler eintippt, wird als Argument an die |
| 10 | Funktion <fun> uebergeben. Ausnahme: wenn die naechste Zeile mit einem |
| 11 | '!' beginnt, wird sie als Kommando ausgewertet bzw. an das letzte |
| 12 | input_to() uebergeben, das das INPUT_IGNORE_BANG Flag gesetzt hat. |
| 13 | Die Funktion <fun> kann "static" deklariert sein, nicht aber "private" |
| 14 | (sonst wird sie nicht gefunden). |
| 15 | |
| 16 | Der Aufruf von <fun> erfolgt nicht sofort, sondern erst, wenn der |
| 17 | Spieler die Entertaste drueckt. |
| 18 | |
| 19 | Wenn input_to() mehr als einmal pro Funktion aufgerufen wird, |
| 20 | wird normalerweise nur das erste input_to() beruecksichtigt. |
| 21 | Diese Verhalten kann durch die Angabe von INPUT_APPEND |
| 22 | modifiziert werden: in diesem Fall wird das input_to() an die |
| 23 | Liste der bereits anhaengigen input_tos angehaengt (siehe |
| 24 | BEISPIELE). |
| 25 | |
| 26 | Wird andererseits waehrend einem laufenden input_to() (mittels "!" am |
| 27 | Zeilenanfang) eine neue Funktion aufgerufen, die wiederum ein |
| 28 | input_to() enthaelt, wird das urspruengliche input_to() so lange |
| 29 | unterbrochen, bis das neue input_to() abgearbeitet wurde, |
| 30 | anschliessend wird es wieder aktiv. |
| 31 | |
| 32 | Das optionale <flag> kann ein binaeres Oder (|) der folgenden |
| 33 | Werte sein: |
| 34 | |
| 35 | INPUT_NOECHO (1): |
| 36 | Die vom Spieler eingegebene Zeile erzeugt kein Echo und wird auch |
| 37 | nicht erkannt, wenn der Spieler beobachtet wird. |
| 38 | |
| 39 | Dieser Modus kann nur geaendert werden, wenn telnet enabled ist. |
| 40 | |
| 41 | INPUT_CHARMODE (2): |
| 42 | Die Verbindung zum User wechselt von Zeilen- auf Zeichenmodus. So |
| 43 | wird nur ein einzelnes Zeichen (!) vom Spieler empfangen. |
| 44 | |
| 45 | Ist telnet disabled, wird lediglich die Interpretation der |
| 46 | einkommenden Daten durch den Driver umgeschaltet - das |
| 47 | Clientprogramm des Spieler verbleibt im gerade aktiven Modus. |
| 48 | |
| 49 | Nachdem die Funktion <fun> ausgefuehrt wurde, wechselt die |
| 50 | Verbindung zurueck in Zeilenmodus, ausser ein nachfolgendes |
| 51 | input_to( , 2) wurde gestartet. |
| 52 | |
| 53 | Zeilenumbrueche werden je nach Client unterschiedlich empfangen, |
| 54 | entweder als "", als "\r" gefolgt von "" oder als "\r" (letzteres |
| 55 | kommt vor allem bei Windows Clients vor). |
| 56 | |
| 57 | Das Frontend des Spielers kann dauernd im Zeilenmodus bleiben. |
| 58 | Auch wenn input_to() nur ein einzelnes Zeichen fordert, muss der |
| 59 | Spieler unter Umstaenden das Zeichen und einen Zeilenumbruch |
| 60 | druecken (und senden). Normalerweise erhaelt <fun> dann den |
| 61 | gesamten Input auf einmal. |
| 62 | |
| 63 | Will man laenger im Zeichenmodus bleiben, kann der Overhead |
| 64 | reduziert werden, indem set_combine_charset() verwendet wird. So |
| 65 | koennen Zeichensequenzen als ein String anstelle von |
| 66 | Zeichen-fuer-Zeichen empfangen werden. In einem screenorientierten |
| 67 | Editor gilt dies fuer die meisten druckbaren Zeichen. |
| 68 | |
| 69 | INPUT_PROMPT (4): |
| 70 | Das Argument nach dem <flag> wird als Prompt fuer die Eingabe |
| 71 | verwendet. Wenn dieses Argument nicht angegeben (und damit kein |
| 72 | Propmt definiert) ist, wird kein Prompt ausgegeben. |
| 73 | |
| 74 | INPUT_NO_TELNET (8): |
| 75 | Modifiziert das INPUT_CHARMODE Argument: der Driver aendert |
| 76 | seine Behandlung von eingehenden Daten entsprechend dem _CHARMODE |
| 77 | Argument, sendet aber keine Telnetkommandos zur Anpassung |
| 78 | des Verhaltens des Clientprogrammes. |
| 79 | |
| 80 | INPUT_APPEND (16): |
| 81 | Das input_to() wird an die Liste der bereits anhaengigen |
| 82 | input_tos angehaengt. |
| 83 | |
| 84 | INPUT_IGNORE_BANG (128): |
| 85 | Eingaben, die mit ! beginnen, werden NICHT als Kommandi geparset, |
| 86 | sondern auch als Argument an die Funkion <fun> uebergeben. Die |
| 87 | Verwendung dieses Flags ist eingeschraenkt. |
| 88 | |
| 89 | Alle nachfolgenden Argumente werden als zweites bzw. drittes usw. |
| 90 | Argument an <fun> uebergeben. |
| 91 | |
| 92 | BEISPIEL |
| 93 | void func() |
| 94 | { |
| 95 | ... |
| 96 | input_to("enter_name", INPUT_PROMPT, "Wie lautet dein Name?:"); |
| 97 | /* Frueher erledigte man dies mit: |
| 98 | * write("Wie lautet dein Name?:"); |
| 99 | * input_to("enter_name"); |
| 100 | */ |
| 101 | ... |
| 102 | } |
| 103 | |
| 104 | enter_name(string str) |
| 105 | { |
| 106 | write("Heisst du wirklich '"+str+"'?? *kicher*\n"); |
| 107 | ... |
| 108 | } |
| 109 | |
| 110 | Bei der input_to() Anweisung fuehrt der Driver die Funktion |
| 111 | func() aus, erwartet aber gleichzeitig Input vom Spieler. Wenn |
| 112 | dieser etwas eingegeben UND DIE ENTERTASTE GEDRUECKT HAT, arbeitet |
| 113 | der Driver die Funktion enter_name() mit dem eingegebenen String |
| 114 | als Argument ab. |
| 115 | |
| 116 | |
| 117 | void func() { |
| 118 | .. |
| 119 | input_to("enter_firstname"); |
| 120 | input_to("enter_lastname, INPUT_APPEND); |
| 121 | ... |
| 122 | } |
| 123 | |
| 124 | Diese Sequenze erzeugt zwei input_tos: Eingaben gehen zuerst |
| 125 | an enter_firstname(); und wenn diese Funktion fertig ist |
| 126 | (einschliesslich etwaiger eigener non-INPUT_APPEND input_tos), geht |
| 127 | die naechste Eingabe an enter_lastname(). |
| 128 | |
| 129 | AENDERUNGEN |
| 130 | Die Bedeutung von <flag> wurde in 3.2.1@93 erweitert. |
| 131 | Die Limitierung fuer das "stapeln" von input_to()s aus !-Kommandi |
| 132 | wurde in LDMud 3.2.8 implementiert. |
| 133 | Seit LDMud 3.2.8 kann <fun> in Form einer Closure angegeben werden. |
| 134 | LDMud 3.2.9 fuehrte das Flag INPUT_PROMPT samt zugehoerigem Argument |
| 135 | ein. |
| 136 | LDMud 3.2.11/3.3.593 fuehrte das INPUT_NO_TELNET Flag ein. |
| 137 | LDMud 3.2.11/3.3.637 fuehrte das INPUT_APPEND Flag ein. |
| 138 | |
| 139 | BUGS |
| 140 | Im Zeichenmodus sollten Zeilenumbrueche eigentlich als "\n" zurueck |
| 141 | gegeben werden. Dies allerdings kann existierenden Code zerstoeren. |
| 142 | |
| 143 | SIEHE AUCH |
| 144 | call_other(E), sscanf(E), privilege_violation(M), |
| 145 | set_combine_charset(E), query_input_pending(E), find_input_to(E), |
| 146 | input_to_info(E), remove_input_to(E), enable_telnet(E) |