blob: e05f009138b5bd1a2508dd2df3546669ea7b0c98 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// room/doors.c -- new doors, managed by doormaster
4//
5// $Id: doors.c 9134 2015-02-02 19:26:03Z Zesstra $
6
7#pragma strong_types
8#pragma save_types
9#pragma pedantic
10#pragma range_check
11#pragma no_clone
12
13#include <config.h>
14#include <properties.h>
15#include <defines.h>
16#include <language.h>
17#include <doorroom.h>
18#define NEED_PROTOTYPES
19#include <thing/properties.h>
20#include <room/exits.h>
21
22protected void create()
23{
24 if (object_name(this_object()) == __FILE__[0..<3])
25 {
26 set_next_reset(-1);
27 return;
28 }
29 SetProp(P_DOOR_INFOS,0);
30}
31
32protected void create_super() {
33 set_next_reset(-1);
34}
35
36varargs int NewDoor(string|string* cmds, string dest, string|string* ids,
37 mapping|<int|string|string*>* props)
38{
39/*
40 cmds: Befehl(e), um durch die Tuer zu gehen (String oder Array von Strings)
41 dest: Zielraum
42 ids: Id(s) der Tuer, default "tuer" (String, Array von Strings oder 0)
43 props: besondere Eigenschaften der Tuer (optional)
44 Array mit Paaren Nummer der Eigenschaft, Inhalt
45 definierte Properties sind:
46 D_FLAGS: Flags wie bei Sir's Tueren
47 default: DOOR_CLOSED | DOOR_RESET_CL
48 Bei Schluesseln wird getestet, ob der String, den
49 QueryDoorKey zurueckliefert, gleich
50 "raumname1:raumname2" ist, wobei raumname1,2 die
51 kompletten Filenamen der beiden Raeume in sortierter
52 Reihenfolge sind.
53 D_LONG: lange Beschreibung der Tuer
54 default: "Eine Tuer.\n"
55 D_SHORT: kurze Beschreibung der Tuer, wird an die Raumbeschreibung
56 angefuegt, wobei %s durch geoeffnet bzw. geschlossen
57 ersetzt wird.
58 default: "Eine %se Tuer. "
59 D_NAME: Name, der beim Oeffnen/Schliessen und bei Fehlermeldungen
60 angezeigt wird.
61 default: "Tuer"
62 D_GENDER: default: FEMALE
63 D_FUNC: Funktion, die im Raum aufgerufen werden soll, wenn die
64 Tuer erfolgreich durchschritten wird.
65 default: 0
66 D_MSGS: Falls String: ausgegebene Richtung fuer move
67 Falls Array: ({direction, textout, textin}) fuer move
68 default: 0
69
70 Beispiel:
71 NewDoor("norden","/players/rochus/room/test2","portal",
72 ({D_NAME,"Portal",
73 D_GENDER,NEUTER,
74 D_SHORT,"Im Norden siehst Du ein %ses Portal. ",
75 D_LONG,"Das Portal ist einfach nur gigantisch.\n"
76 }));
77
78*/
79
80 if (!cmds || !dest) return 0;
81 return call_other(DOOR_MASTER,"NewDoor",cmds,dest,ids,props);
82}
83
84void init()
85{
86 mixed *info;
87 string *cmds;
88 int i,j;
89
90 if (!pointerp(info=(mixed *)QueryProp(P_DOOR_INFOS))) return;
91 add_action("oeffnen","oeffne");
92 add_action("schliessen","schliesse");
93 add_action("schliessen","schliess");
94 for (i=sizeof(info)-1;i>=0;i--) {
95 cmds=(string *)(info[i][D_CMDS]);
96 for (j=sizeof(cmds)-1;j>=0;j--)
97 add_action("go_door",cmds[j]);
98 // Befehle IMMER anfuegen, gechecked wird sowieso erst beim Durchgehen.
99 }
100}
101
102void reset()
103{
104 if (QueryProp(P_DOOR_INFOS))
105 call_other(DOOR_MASTER,"reset_doors");
106}
107
108int oeffnen (string str)
109{
110 if (!str || !QueryProp(P_DOOR_INFOS))
111 return 0;
112 return (int) call_other(DOOR_MASTER,"oeffnen",str);
113}
114
115int schliessen (string str)
116{
117 if (!str || !QueryProp(P_DOOR_INFOS))
118 return 0;
119 return (int) call_other(DOOR_MASTER,"schliessen",str);
120}
121
122varargs int
123go_door (string str)
124{
125 if (!QueryProp(P_DOOR_INFOS))
126 return 0;
127 if (call_other(DOOR_MASTER,"go_door",query_verb()))
128 return 1;
129 return 0;
130}
131
132int set_doors(string *cmds,int open)
133{
134 int j;
135
136 if (!previous_object())
137 return 0;
138 if (object_name(previous_object())!=DOOR_MASTER)
139 return 0;
140 // Andere sollen nicht rumpfuschen.
141 if (!this_player()) return 0;
142 if (environment(this_player())!=this_object())
143 return 0;
144 // Ist sowieso keiner da...
145 if (!pointerp(cmds))
146 return 0;
147 if (open)
148 AddSpecialExit(cmds,"go_door");
149 else
150 RemoveSpecialExit(cmds);
151 for (j=sizeof(cmds)-1;j>=0;j--)
152 add_action("go_door",cmds[j]);
153 return 1;
154}
155
156/* Fuer Tueren, die flexible Langbeschreibungen haben, wird ein
157 * SpecialDetail eingefuehrt.
158 */
159
160string special_detail_doors(string key){
161 return DOOR_MASTER->special_detail_doors(key);
162}