blob: 692186b7e7a3233347fbf80351931fbaa0314f86 [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;
Arathorn15edec12020-01-08 21:33:57 +01009int|string tied_name;
MG Mud User88f12472016-06-24 23:31:02 +020010
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)
bugfix038d5302020-03-26 14:15:12 +010053 return Name(WER)+", "+artikel+" an "
bugfixaf2be4f2020-03-22 19:13:07 +010054 + (tied_name?tied_name:(({string})tied_to_ob->name(WEM)))
MG Mud User88f12472016-06-24 23:31:02 +020055 + " festgebunden ist";
bugfix038d5302020-03-26 14:15:12 +010056 return Name(WER);
MG Mud User88f12472016-06-24 23:31:02 +020057
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 {
Arathorn5fecd832020-07-27 23:46:37 +0200118 if (({int})call_other(environment(this_player()), "id", t2))
MG Mud User88f12472016-06-24 23:31:02 +0200119 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
Arathorn5fecd832020-07-27 23:46:37 +0200130 if (!(tied_name=({string|int})call_other(ob, "tie", t2)))
MG Mud User88f12472016-06-24 23:31:02 +0200131 {
bugfixaf2be4f2020-03-22 19:13:07 +0100132 if(({int})ob->QueryProp(P_INVIS)) return 0;
MG Mud User88f12472016-06-24 23:31:02 +0200133
134 if (ob != environment(this_player()))
135 {
bugfixaf2be4f2020-03-22 19:13:07 +0100136 _notify_fail("Du kannst "+name(WER)+" nicht an "+({string})ob->name(WEM)+
MG Mud User88f12472016-06-24 23:31:02 +0200137 " 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 {
bugfix038d5302020-03-26 14:15:12 +0100151 move(environment(this_player()));
MG Mud User88f12472016-06-24 23:31:02 +0200152 }
153
154 tied_to_ob = ob;
155
156 if (tied_to_ob != environment(this_player()) ||
bugfixaf2be4f2020-03-22 19:13:07 +0100157 ({string})environment(this_player())->name()!=0 )
MG Mud User88f12472016-06-24 23:31:02 +0200158 {
bugfixaf2be4f2020-03-22 19:13:07 +0100159 tied_name = (({string})tied_to_ob->name(WEM));
MG Mud User88f12472016-06-24 23:31:02 +0200160 }
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");
bugfixaf2be4f2020-03-22 19:13:07 +0100178 say(({string})this_player()->name(WER) + " bindet "+name(WER)+" an "
MG Mud User88f12472016-06-24 23:31:02 +0200179 + tied_name + " fest.\n");
180 }
181
182 // den object mitteilen, an wen es gebunden ist.
bugfixaf2be4f2020-03-22 19:13:07 +0100183 if(({mapping})tied_to_ob->QueryProp(P_TIED)==0)
184 ({mapping})tied_to_ob->SetProp(P_TIED,([]) );
185 ({mapping})tied_to_ob->SetProp(P_TIED,
186 ({mapping})tied_to_ob->QueryProp(P_TIED)+([this_object():
MG Mud User88f12472016-06-24 23:31:02 +0200187 ([
188 "player":this_player(),
189 "time" :time()
190 ]) ]));
191
192 return 1;
193 }
194
195 if( (member( ({
196 "binde",
197 "bind",
198 "knote",
199 "mach",
200 "mache",
201 "loese"
202 }),verb
203 )!=-1) &&
204 sscanf(str,"%s los",t1)==1)
205 {
206 if (!tied_to_ob)
207 {
208 write(Name(WER)+" ist nirgendwo festgebunden.\n");
209 return 1;
210 }
211
Arathorn5fecd832020-07-27 23:46:37 +0200212 if (!({int})call_other(tied_to_ob, "untie"))
MG Mud User88f12472016-06-24 23:31:02 +0200213 {
214 write("Das klappt leider nicht.\n");
215 return 1;
216 }
217
218 if(QueryProp(P_TIE_VERB))
219 {
220 // das seil wird gesteuert
221 tell_room(environment(),QueryProp(P_UNTIE_MESSAGE));
222
223 // wieder in roh-zustand versetzen.
224 SetProp(P_UNTIE_MESSAGE,0);
225 SetProp(P_TIE_VERB,0);
226 }
227 else
228 {
229 write("Du bindest "+name(WER)+" los.\n");
bugfixaf2be4f2020-03-22 19:13:07 +0100230 say(({string})this_player()->name()+" bindet "+name(WER)+" los.\n");
MG Mud User88f12472016-06-24 23:31:02 +0200231 }
232
bugfixaf2be4f2020-03-22 19:13:07 +0100233 tied_map=([])+({mapping})tied_to_ob->QueryProp(P_TIED);
MG Mud User88f12472016-06-24 23:31:02 +0200234 tied_map=m_copy_delete(tied_map,this_object());
235
bugfixaf2be4f2020-03-22 19:13:07 +0100236 ({mapping})tied_to_ob->SetProp(P_TIED,tied_map);
MG Mud User88f12472016-06-24 23:31:02 +0200237
bugfixaf2be4f2020-03-22 19:13:07 +0100238 tied_to_ob = 0;
MG Mud User88f12472016-06-24 23:31:02 +0200239
240 return 1;
241 }
242 return 0;
243}
244
245int loesen(string str)
246{
247 if(str == "seil" ||
248 str == lower_case(QueryProp(P_NAME)) ||
249 id(str)
250 )
251 {
252 return tie("seil los");
253 }
254 _notify_fail("Was moechtest Du loesen?\n");
255 return 0;
256}
257
258
259object query_tied_to_ob()
260{
261 return tied_to_ob;
262}
263
264varargs int binde_seil(string ziel,string msg)
265{
266 if(!QueryProp(P_TIE_AUTO)) return 0;
267
268 // diese funktion bindet ein Seil und kann von einem object aus
269 // aufgerufen werden.
270 SetProp(P_TIE_VERB,"binde");
271
272 if(!msg) msg = Name(WER)+" wird auf magische Art und Weise festgebunden.\n";
273
274 SetProp(P_TIE_MESSAGE,msg);
275 return tie("seil an "+ziel);
276}
277
278varargs int loese_seil(string msg)
279{
280 if(!QueryProp(P_TIE_AUTO)) return 0;
281
282 if(!msg) msg = Name(WER)+" loest sich.\n";
283
284 SetProp(P_TIE_VERB,"binde");
285 SetProp(P_UNTIE_MESSAGE,msg);
286 return tie("seil los");
287}
288