blob: 11cbd97079b0634553f6a6c4530c57a80bbd8eed [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001SYNOPSIS
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
8BESCHREIBUNG
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
92BEISPIEL
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
129AENDERUNGEN
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
139BUGS
140 Im Zeichenmodus sollten Zeilenumbrueche eigentlich als "\n" zurueck
141 gegeben werden. Dies allerdings kann existierenden Code zerstoeren.
142
143SIEHE 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)