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