blob: 09f5796eb21cc4daf2ad618b5c3252fbc382c812 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001FUNKTION:
2 varargs int NewDoor(string|string* cmds, string dest, string|string* ids,
3 mapping|<int|string|string*>* props);
4DEFINIERT IN:
5 /std/room/doors.c
6
7ARGUMENTE:
8 cmds (string|string*)
9 String oder Array von Strings mit den Befehlen, mit denen man
10 durch die Tuer geht (in der Regel Richtungen wie "norden").
11 dest (string)
12 Pfad des Zielraumes, OHNE ".c", sonst wird eine zweiseitige Tuer
13 (wie sie ueblich ist) nicht als solche erkannt.
14 ids (string|string*)
15 String oder Array von Strings mit den Bezeichnern der Tuer. Kann
16 auch 0 sein; in diesem Fall laesst sich die Tuer nur als "tuer"
17 ansprechen.
18 props (mapping|<int|string|string*>*)
19 Die Eigenschaften der Tuer (s.u.).
20
21BESCHREIBUNG:
22 Es wird eine neue Tuer geschaffen. Die Tuer laesst sich, wenn sie
23 geoeffnet ist, mit den in <cmds> angegebenen Befehlen durchschreiten.
24 Man gelangt dann in den Raum <dest>.
25
26 Die Kommandos werden bei geoeffneter Tuer in die Liste der sichtbaren
27 Ausgaenge eingefuegt.
28
29 In <props> lassen sich Aussehen und Eigenschaften der Tuer festlegen.
30 Historisch ist es ein Array mit Paaren von Schluesseln und Werten, d.h.
31 es kommt immer erst ein Element, welches die Eigenschaft bezeichnet und
32 dann ein Element mit dem Wert dieser Eigenschaft.
33 Moderner ist es, ein Mapping mit den entsprechenden Schluesseln und
34 Werten zu uebergeben. Dies ist auch dringend empfohlen.
35
36 In <doorroom.h> sind dazu folgende Eigenschaften definiert:
37 D_FLAGS
38 DOOR_OPEN
39 Die Tuer ist beim Erzeugen geoeffnet.
40 DOOR_CLOSED
41 Die Tuer ist beim Erzeugen geschlossen.
42 DOOR_NEEDKEY
43 Man benoetigt einen Schluessel zum Oeffnen der Tuer.
44 DOOR_CLOSEKEY
45 Man benoetigt einen Schluessel zum Schliessen der Tuer.
46 DOOR_RESET_CL
47 Die Tuer schliesst sich beim Reset.
48 DOOR_RESET_OP
49 Die Tuer oeffnet sich beim Reset.
50
51 D_LONG
52 Die Langbeschreibung der Tuer.
53 Hier kann ein Mapping eingetragen werden, das als Keys den Tuer-
54 Status hat und die zugehoerige Langbeschreibung dazu. Beispiel:
55 ([ D_STATUS_CLOSED : "Die Tuer ist geschlossen.\n",
56 D_STATUS_OPEN : "Die Tuer ist offen.\n" ])
57
58 Default: "Eine Tuer.\n"
59
60 D_SHORT
61 Die Kurzbeschreibung der Tuer. Ein "%s" wird durch "geoeffnet"
62 bzw. "geschlossen" ersetzt.
63
64 Es werden die Kurzbeschreibungen aller im Raum vorhandenen Tueren
65 aneinandergehaengt (es wird jeweils ein Leerzeichen eingeschoben),
66 das Ganze mit break_string() umgebrochen und an P_INT_LONG
67 angehaengt.
68
69 Default: "Eine %se Tuer."
70
71 D_NAME
72 Der Name der Tuer. Dieser Name wird beim Oeffnen und Schliessen
73 der Tuer sowie bei Fehlermeldungen ausgegeben. Man kann wie bei
74 P_NAME einen String oder ein Array von Strings angeben.
75
76 Default: "Tuer"
77
78 D_GENDER
79 Das Geschlecht der Tuer.
80
81 Default: FEMALE
82
83 D_MSGS
84 String oder Array von drei Strings. Diese Strings werden beim
85 Durchschreiten der Tuer an move() als dir bzw. dir, textout und
86 textin uebergeben.
87
88 D_FUNC
89 String mit dem Namen einer Funktion, die im Startraum vor dem
90 Durchschreiten der Tuer aufgerufen werden soll. Diese Funktion
91 kann das Durchschreiten jedoch nicht verhindern!
92
93 D_FUNC2
94 String mit dem Namen einer Funktion, die im Zielraum nach dem
95 Durchschreiten der Tuer aufgerufen werden soll.
96
97 D_TESTFUNC
98 Falls auf den Namen einer Funktion gesetzt, wird diese Funktion
99 vor dem Durchschreiten im Startraum aufgerufen. Wenn sie einen
100 Wert != 0 zurueckliefert, wird die Tuer NICHT durchschritten.
101
102 D_RESET_MSG
103 Meldung, die beim Reset der Tuer ausgegeben wird.
104
105 D_OPEN_WITH_MOVE
106 Tuer oeffnet automatisch bei Eingabe des Befehls zum
107 Hindurchgehen.
108
109RUECKGABEWERT:
110 1, wenn die Tuer ordungsgemaess eingebaut werden konnte, sonst 0.
111
112BEMERKUNGEN:
113 Zwei Tuerseiten gelten als verschiedene Seiten einer Tuer, wenn als
114 Ziel in Raum A Raum B und in Raum B Raum A angegeben ist. Der Zustand
115 wird abgefragt, wenn der Raum betreten wird (init), wenn die Tuer
116 geoeffnet/geschlossen wird, P_INT_LONG oder P_EXITS abgefragt wird
117 und beim Reset.
118
119 Es sind auch Tueren moeglich, die nur auf einer Seite existieren, oder
120 auch solche, die auf beiden Seiten verschieden aussehen oder gar auf
121 einer Seite nur mit einem Schluessel zu oeffnen sind, auf der anderen
122 jedoch kein Schluessel noetig ist.
123
124 Wer aus irgendeinem Grund den Zustand einer Tuer selber abfragen oder
125 veraendern will, kann dafuer in /obj/doormaster die Funktionen
126 QueryDoorStatus(ziel) bzw. SetDoorStatus(ziel,status) aufrufen.
127
128 *** ACHTUNG ***
129 Es gibt eine Questbelohnung (Phiole aus der Sternenlicht-Quest von
130 Miril), mit der man durch Tueren hindurchschauen kann. Derzeit ist das
131 per default fuer alle Tueren erlaubt. Wenn man das nicht moechte,
132 oder andere Texte ausgeben, als die Phiole normalerweise erzeugt,
133 dann kann man dies durch Nutzung bestimmter Funktionen bzw. Flags
134 erreichen. Zur Dokumentation siehe Manpage zu GetPhiolenInfos().
135
136BEISPIELE:
137
138 ** Dies ist eine gewoehnliche Tuer ohne Besonderheiten und ohne
139 Extra-Beschreibung:
140
141 NewDoor("sueden","/players/rochus/room/test1");
142
143 ** Ein Portal:
144
145 NewDoor("norden","/players/rochus/room/test2",
146 "portal",
147 ([ D_NAME: "Portal",
148 D_GENDER: NEUTER,
149 D_SHORT: "Im Norden siehst Du ein %ses Portal.",
150 D_LONG: "Das Portal ist einfach nur gigantisch.\n",
151 ]) );
152
153 Alternativ mit props in alter Arraynotation:
154 NewDoor("norden","/players/rochus/room/test2",
155 "portal",
156 ({ D_NAME, "Portal",
157 D_GENDER, NEUTER,
158 D_SHORT, "Im Norden siehst Du ein %ses Portal.",
159 D_LONG, "Das Portal ist einfach nur gigantisch.\n"
160 }) );
161
162 ** Tueren mit Bewegungsmeldung:
163
164 NewDoor("norden","/room/see2",
165 ({ D_MSGS, ({"nach Norden","schwimmt",
166 "kommt hereingeschwommen"}) }) );
167
168 ** Eine Tuer mit Testfunktion:
169
170 NewDoor("osten","/mein/zielraum",
171 ({ D_TESTFUNC, "blocker_da" }) );
172
173 Die Funktion blocker_da:
174
175 int blocker_da() // KEINE protected-Funktion! Sie wird sonst NICHT
176 { // aufgerufen und ausgewertet!
177 if ( present("mein_fieses_mo\nster",this_object()) )
178 {
179 write("Ein fieses Monster stellt sich Dir in den Weg.\n");
180 return 1;
181 }
182 return 0; // optional
183 }
184
185 ** Nun noch eine Tuer mit einigen Extras:
186
187 NewDoor("nordwesten","/rooms/kammer",
188 ({"tuer","holztuer"}),
189 ({
190 D_FLAGS, (DOOR_CLOSED|DOOR_RESET_CL),
191 D_MSGS, ({"nach Nordwesten","geht",
192 "kommt durch eine Tuer herein"}),
193 D_SHORT, "Im Nordwesten siehst Du eine %se Holztuer.",
194 D_LONG, "Sie trennt den Laden vom dahinterliegenden Raum.\n",
195 D_NAME, "Holztuer",
196 D_FUNC, "view",
197 D_FUNC2, "look_up"
198 }) );
199
200 Im Startraum:
201
202 void view()
203 {
204 write("Der Angestellte wirft Dir einen missbilligenden Blick zu, "
205 "laesst Dich aber passieren.\n");
206 }
207
208 Im Zielraum:
209
210 void look_up()
211 {
212 write("Ein alter Mann schaut kurz zu Dir auf und vertieft sich dann "
213 "wieder in seine Akten.\n");
214 }
215
216
217SIEHE AUCH:
218 QueryDoorKey(), QueryDoorStatus(), SetDoorStatus(),
219 /std/room/doors.c, /obj/doormaster.c, GetPhiolenInfos(), QueryAllDoors()
220
221-----------------------------------------------------------------------------
22208.02.2015, Arathorn
223