blob: c5cf0791d1a21aa3891b2ea086bde963bf05fcdf [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#include <properties.h>
2#include <language.h>
3#include <seil.h>
4inherit "/std/thing";
5
6#pragma strict_types,rtt_checks
7
8object tied_to_ob;
9string tied_name;
10
11void create(){
12 ::create();
13
14 AddId( ({"seil", "\nseil"}) );
15 SetProp(P_NAME, "Seil");
16
17 SetProp(P_GENDER, NEUTER);
18 SetProp(P_LONG,break_string("Du siehst ein ganz normales Seil. Du kannst es an "+
19 "Gegenstaenden festbinden und wieder loesen. Das Seil besteht "+
20 "aus solider fester Steinbeisserwolle.",78));
21 AddDetail(({"wolle","steinbeisserwolle"}),"Diese Wolle ist eine besonders feste und stabile Wolle.\n");
22 SetProp(P_VALUE, 15);
23 SetProp(P_TIE_AUTO,1);
24 SetProp(P_WEIGHT, 300);
25
26 SetProp(P_MATERIAL,({MAT_MISC_STONE,MAT_WOOL}));
27 AddCmd( ({"binde","bind","knote","befestige","mach","mache"}), "tie" );
28
29 // der Befehle loesen wird auf die anderen Befehle umgebogen und dient nur
30 // der besseren benutzbarkeit des seiles.
31 AddCmd( ({"loese" }), "loesen" );
32
33}
34
35// dieses Ding wird u.a. geerbt. Damit die BP beim Erben auch initialisiert
36// wird (fuer die Laeden), muss create_super() das create() rufen.
37protected void create_super() {
38 create();
39}
40
41string _query_short()
42{
43 string artikel;
44 switch( QueryProp(P_GENDER) )
45 {
46 case NEUTER : artikel="das";break;
47 case MALE : artikel="der";break;
48 case FEMALE : artikel="die";break;
49 default : artikel="das";
50 }
51
52 if (tied_to_ob)
53 return this_object()->Name(WER)+", "+artikel+" an "
54 + (tied_name?tied_name:(string)(tied_to_ob->name(WEM)))
55 + " festgebunden ist";
56 return (string)this_object()->Name(WER);
57
58}
59
60mixed _query_noget()
61{
62 if (tied_to_ob)
63 return "Das geht nicht, solange "+name(WER)+" festgebunden ist.\n";
64 return 0;
65}
66
67int tie(string str)
68{
69 string t1, t2;
70 object ob;
71 string verb;
72 mapping tied_map;
73
74 _notify_fail("Binde was?\n");
75
76 // zunaechst den User notieren, damit spaeter immer drauf
77 // zugegriffen werden kann.
78 // Wegen kompatibilitaet wird das nicht direkt an tie()/untie()
79 // uebergeben.
80 SetProp(P_TIE_USER,this_player());
81
82 if (!str||!stringp(str)) return 0;
83
84 verb = query_verb();
85
86 //automatischer aus objecten/raeumen generierter aufruf
87 if(QueryProp(P_TIE_VERB)) verb=QueryProp(P_TIE_VERB);
88
89 if (sscanf(str, "%s an %s", t1, t2) != 2 &&
90 sscanf(str,"%s los",t1) != 1 &&
91 sscanf(str,"%s fest",t1) != 1 )
92 return 0;
93
94 if(id(t1) && str==(t1+" fest")) str="seil an raum";
95
96 if(sscanf(str,"%s an %s",t1,t2)==2)
97 {
98 if(tied_to_ob)
99 {
100 write("Es ist bereits irgendwo festgebunden.\n");
101 return 1;
102 }
103
104 if (!id(t1)) return 0;
105
106 if (t2 == "mich")
107 {
108 _notify_fail("Warum willst Du das denn machen?\n");
109 return 0;
110 }
111
112 ob = present(t2, this_player());
113
114 if (!ob) ob = present(t2, environment(this_player()));
115
116 if (!ob)
117 {
118 if (call_other(environment(this_player()), "id", t2))
119 ob = environment(this_player());
120 }
121
122 if(!ob && str == "seil an raum")
123 {
124 ob=environment(this_player());
125 }
126
127 _notify_fail( "Soetwas findest Du hier nicht.\n" );
128 if (!ob) return 0;
129
130 if (!(tied_name=(string)call_other(ob, "tie", t2)))
131 {
132 if(ob->QueryProp(P_INVIS)) return 0;
133
134 if (ob != environment(this_player()))
135 {
136 _notify_fail("Du kannst "+name(WER)+" nicht an "+ob->name(WEM)+
137 " festbinden.\n");
138 return 0;
139 }
140 else
141 {
142 _notify_fail("Du kannst "+name(WER)+" nicht daran festbinden.\n");
143 return 0;
144 }
145
146 }
147
148 /* Is he carrying the rope ? */
149 if (environment() == this_player())
150 {
151 this_object()->move(environment(this_player()));
152 }
153
154 tied_to_ob = ob;
155
156 if (tied_to_ob != environment(this_player()) ||
157 environment(this_player())->name()!=0 )
158 {
159 tied_name = (string)(tied_to_ob->name(WEM));
160 }
161 else
162 {
163 if( !stringp(tied_name) ) tied_name="etwas";
164 }
165
166 if(QueryProp(P_TIE_VERB))
167 {
168 // das seil wird gesteuert
169 tell_room(environment(),QueryProp(P_TIE_MESSAGE));
170
171 // seil wieder in roh-zustand versetzen.
172 SetProp(P_UNTIE_MESSAGE,0);
173 SetProp(P_TIE_VERB,0);
174 }
175 else
176 {
177 write("Du bindest "+name(WER)+" an " + tied_name + " fest.\n");
178 say(this_player()->name(WER) + " bindet "+name(WER)+" an "
179 + tied_name + " fest.\n");
180 }
181
182 // den object mitteilen, an wen es gebunden ist.
183 if(tied_to_ob->QueryProp(P_TIED)==0) tied_to_ob->SetProp(P_TIED,([]) );
184 tied_to_ob->SetProp(P_TIED,tied_to_ob->QueryProp(P_TIED)+([this_object():
185 ([
186 "player":this_player(),
187 "time" :time()
188 ]) ]));
189
190 return 1;
191 }
192
193 if( (member( ({
194 "binde",
195 "bind",
196 "knote",
197 "mach",
198 "mache",
199 "loese"
200 }),verb
201 )!=-1) &&
202 sscanf(str,"%s los",t1)==1)
203 {
204 if (!tied_to_ob)
205 {
206 write(Name(WER)+" ist nirgendwo festgebunden.\n");
207 return 1;
208 }
209
210 if (!call_other(tied_to_ob, "untie"))
211 {
212 write("Das klappt leider nicht.\n");
213 return 1;
214 }
215
216 if(QueryProp(P_TIE_VERB))
217 {
218 // das seil wird gesteuert
219 tell_room(environment(),QueryProp(P_UNTIE_MESSAGE));
220
221 // wieder in roh-zustand versetzen.
222 SetProp(P_UNTIE_MESSAGE,0);
223 SetProp(P_TIE_VERB,0);
224 }
225 else
226 {
227 write("Du bindest "+name(WER)+" los.\n");
228 say(this_player()->name()+" bindet "+name(WER)+" los.\n");
229 }
230
231 tied_map=([])+tied_to_ob->QueryProp(P_TIED);
232 tied_map=m_copy_delete(tied_map,this_object());
233
234 tied_to_ob->SetProp(P_TIED,tied_map);
235
236 tied_to_ob = (object) 0;
237
238 return 1;
239 }
240 return 0;
241}
242
243int loesen(string str)
244{
245 if(str == "seil" ||
246 str == lower_case(QueryProp(P_NAME)) ||
247 id(str)
248 )
249 {
250 return tie("seil los");
251 }
252 _notify_fail("Was moechtest Du loesen?\n");
253 return 0;
254}
255
256
257object query_tied_to_ob()
258{
259 return tied_to_ob;
260}
261
262varargs int binde_seil(string ziel,string msg)
263{
264 if(!QueryProp(P_TIE_AUTO)) return 0;
265
266 // diese funktion bindet ein Seil und kann von einem object aus
267 // aufgerufen werden.
268 SetProp(P_TIE_VERB,"binde");
269
270 if(!msg) msg = Name(WER)+" wird auf magische Art und Weise festgebunden.\n";
271
272 SetProp(P_TIE_MESSAGE,msg);
273 return tie("seil an "+ziel);
274}
275
276varargs int loese_seil(string msg)
277{
278 if(!QueryProp(P_TIE_AUTO)) return 0;
279
280 if(!msg) msg = Name(WER)+" loest sich.\n";
281
282 SetProp(P_TIE_VERB,"binde");
283 SetProp(P_UNTIE_MESSAGE,msg);
284 return tie("seil los");
285}
286