blob: 5fe900a0cfa708de0f7bec448115218a216ea52e [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// clothing/wear.c -- Funktionen rund ums Anziehen/Tragen von Kleidung.
4//
5// $Id: combat.c 6243 2007-03-15 21:10:21Z Zesstra $
6
7#pragma strict_types
8#pragma save_types
9#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +020010#pragma range_check
11
12#define NEED_PROTOTYPES
13
14#include <thing/properties.h>
15#include <thing/commands.h>
16#include <thing/description.h>
17#include <living/clothing.h>
18#include <clothing.h>
19#include <living/combat.h>
20#include <language.h>
21#include <defines.h>
22#include <new_skills.h>
23#include <moving.h>
24
25// Globale Variablen
26nosave int flaw, ftime;
27
28void create()
29{
30 // Einige Properties sollten nicht von aussen gesetzt werden koennen
31 Set(P_WORN, PROTECTED, F_MODE);
32 Set(P_LAST_USE, PROTECTED, F_MODE_AS);
33 Set(P_RESTRICTIONS,([]),F_VALUE);
34
35 // Bekleidung benoetigt Kommandos, mit denen man sie an- und
36 // ausziehen kann
37 AddCmd( ({"zieh","ziehe"}),"ziehe" );
38 AddCmd( ({"trag","trage"}),"do_wear" );
39}
40
41// aktuelles Lebewesen, was diese Kleidung (oder auch Ruestung) zur Zeit
42// traegt.
43public object QueryUser()
44{
45 return QueryProp(P_WORN);
46}
47
48
49// Ausgabe von Meldungen ueber write() oder _notify_fail(), je nachdem, ob der
50// Spieler alles anzieht oder was bestimmtes.
51protected void msg(string str, mixed fl) {
52 if (!stringp(str)) {
53 return;
54 }
55 if (fl) {
56 write(str);
57 }
58 else {
59 _notify_fail(str);
60 }
61}
62
63/*
64 * Ausgabe einer Meldung beim Anziehen geht nur an Spieler, nicht an NPC.
65 * Die Umgebung bekommt immer eine Meldung.
66 */
67varargs void doWearMessage(int all) {
68 string *str,s1;
69 mixed wearmsg;
70
71 if(wearmsg=QueryProp(P_WEAR_MSG)) { // Ist eine WearMsg gesetzt?
72 if(closurep(wearmsg)) { // Evtl. gar als extra Fkt.?
73
74 str = funcall(wearmsg, PL);
75 if(interactive(PL)) {
76 // Im Falle, dass all gesetzt ist, wird als Indent der Name des
77 // angezogenen Objektes gesetzt. (trag alles)
78 write(break_string(str[0],78,
79 (all?(Name(WER)+": "):0), BS_LEAVE_MY_LFS));
80 }
81 //(Zesstra): say() ist hier bloed, weil es an das Env vom this_player()
82 //ausgibt, sofern der existiert. So koennen Spieler die meldung kriegen,
83 //obwohl die laengst woanders sind (z.B. Sequenzen)
84 //Daher nun Ausgabe an das Env vom Env (wenn das kein Raum sein sollte,
85 //was durchaus sein koennte, macht tell_room() nix).
86 if ( objectp(environment()) && objectp(environment(environment())) )
87 tell_room(environment(environment()),
88 break_string(str[1], 78, 0, BS_LEAVE_MY_LFS),({PL}) );
89
90 return;
91 }
92 else if(interactive(PL)) {
93 s1 = replace_personal(sprintf(wearmsg[0],"@WEN2"), ({PL,ME}), 1);
94
95 write(break_string(s1,78,(all?(Name(WER)+": "):0), BS_LEAVE_MY_LFS));
96 }
97
98 s1 = replace_personal(sprintf(wearmsg[1],"@WER1","@WENU2"),
99 ({PL, ME}), 1);
100
101 if ( objectp(environment()) && objectp(environment(environment())) )
102 tell_room(environment(environment()),
103 break_string(s1, 78, 0, BS_LEAVE_MY_LFS),({ PL }) );
104
105 return;
106 }
107 /*
108 * Keine WearMsg gesetzt. Ausgabe der Default-Meldungen.
109 */
110 else if(interactive(PL)) {
111 write(break_string("Du ziehst " + name(WEN,1) + " an.",78,
112 (all?(Name(WER)+": "):0)));
113 }
114 if ( objectp(environment()) && objectp(environment(environment())) )
bugfixaf2be4f2020-03-22 19:13:07 +0100115 tell_room(environment(environment()),break_string(
116 ({string})PL->Name(WER)
MG Mud User88f12472016-06-24 23:31:02 +0200117 + " zieht " + name(WEN,0) +" an.",78), ({PL}));
118}
119
120/*
121 * Ausgabe einer Meldung beim Ausziehen geht nur an Spieler, nicht an NPC.
122 * Die Umgebung bekommt natuerlich immer eine Meldung.
123 */
124void doUnwearMessage(object worn_by, int all)
125{
126 string *str,s1;
127 mixed msg;
128
129 if(!objectp(worn_by)) { // Na huch, gar nicht angezogen? Abbruch.
130 return;
131 }
132
133 if(msg=QueryProp(P_UNWEAR_MSG)) { // Ist eine UnwearMsg gesetzt?
134 if(closurep(msg)) { // Oho! Gar gleich als Fkt.?
135
136 str = funcall(msg, worn_by);
137 if(interactive(worn_by)) {
138 tell_object(worn_by,break_string(str[0], 78,
139 (all?(Name(WER)+": "):0),BS_LEAVE_MY_LFS));
140 }
141
142 //(Zesstra): say() ist hier bloed, weil es an das Env vom this_player()
143 //ausgibt, sofern der existiert. So koennen Spieler die meldung kriegen,
144 //obwohl die laengst woanders sind (z.B. Sequenzen)
145 //Daher nun Ausgabe an das Env vom worn_by (wenn das kein Raum sein sollte,
146 //macht tell_room() nix).
147 if ( objectp(environment(worn_by)) )
148 tell_room(environment(worn_by),
149 break_string(str[1],78, 0, BS_LEAVE_MY_LFS),({ worn_by }) );
150
151 return;
152 }
153 else if(interactive(worn_by)) {
154 s1 = replace_personal(sprintf(msg[0],"@WEN2"),
155 ({worn_by,ME}), 1);
156
157 tell_object(worn_by,break_string(s1,78,
158 (all?(Name(WER)+": "):0), BS_LEAVE_MY_LFS));
159 }
160
161 s1 = replace_personal(sprintf(msg[1],"@WER1","@WENU2"),
162 ({worn_by, ME }), 1);
163
164 if ( objectp(environment(worn_by)) )
165 tell_room(environment(environment()),
166 break_string(s1,78, 0, BS_LEAVE_MY_LFS),({ worn_by }) );
167 return;
168 }
169 /*
170 * Keine UnwearMsg gesetzt. Ausgabe der Default-Meldungen.
171 */
172 else if(interactive(worn_by)) {
173 tell_object(worn_by,break_string("Du ziehst " + name(WEN,1) + " aus.",78,
174 (all?(Name(WER)+": "):0)));
175 }
176 if ( objectp(environment(worn_by)) )
bugfixaf2be4f2020-03-22 19:13:07 +0100177 tell_room(environment(worn_by), break_string(
178 ({string})worn_by->Name(WER)
MG Mud User88f12472016-06-24 23:31:02 +0200179 + " zieht " + name(WEN,0) + " aus.",78), ({ worn_by }) );
180}
181
182// Diese Funktion wird aufgerufen, wenn die Ruestung wirklich angezogen
183// wird
184protected void InformWear(object pl, int silent, int all) {
185 return;
186}
187
188// Diese Funktion wird aufgerufen, wenn die Ruestung wirklich ausgezogen
189// wird
190protected void InformUnwear(object pl, int silent, int all) {
191 return;
192}
193
194// liefert Werte <0 zurueck, wenn der Spieler die Kleidung _nicht_
195// anziehen darf.
196// Hierbei steht -1 dafuer, dass der Aufrufer return 0 machen sollte,
197// <= -2 sollte zur einem return !all fuehren.
198protected int _check_wear_restrictions(int silent, int all) {
Arathornb3051452021-05-13 21:13:03 +0200199 mixed res;
MG Mud User88f12472016-06-24 23:31:02 +0200200
201 // Man kann nur Kram anziehen, die man bei sich traegt
202 if (environment()!=PL) {
203 msg(break_string("Du musst "+name(WEN,1)+" erst nehmen!",78,
204 (all?(Name(WER)+": "):0)), all);
205 return(-1);
206 }
207
208 // Eine getragene Ruestung kann man nicht nochmal anziehen
209 if (QueryProp(P_WORN)) {
210 msg(break_string("Du traegst "+name(WEN,1)+" bereits.",78,
211 (all?(Name(WER)+": "):0)), all);
212 return(-1);
213 }
214
215 // Diese Funktion versucht immer, TP anzuziehen (*args*). Es gibt aber viele
216 // Magier, die ohne TP oder mit dem falschen TP anziehen wollen. Daher mal
217 // pruefen und ggf. Fehler ausloesen.
218 if (!this_player())
219 raise_error("Kein this_player() existent beim Anziehen!\n");
220 else if (this_player() != environment())
221 raise_error("Meine Umgebung beim Anziehen ist nicht this_player()!\n");
222
223 // Ueber P_RESTRICTIONS kann man einige Restriktionen definieren, ohne
224 // gleich auf eine WearFunc zurueckgreifen zu muessen.
225 // Die Auswertung erfolgt ueber den RestrictionChecker
226 if ((res=QueryProp(P_RESTRICTIONS)) && mappingp(res) &&
bugfixaf2be4f2020-03-22 19:13:07 +0100227 (res=({string})"/std/restriction_checker"->check_restrictions(PL,res))
MG Mud User88f12472016-06-24 23:31:02 +0200228 && stringp(res)) {
229 msg(break_string(res,78,(all?(Name(WER)+": "):0)),all);
230 return(-1);
231 }
232
233 // Ist eine WearFunc gesetzt, wird diese aufgerufen.
234 if (objectp(res=QueryProp(P_WEAR_FUNC)) &&
bugfixaf2be4f2020-03-22 19:13:07 +0100235 !(({int})res->WearFunc(ME, silent, environment()))) {
MG Mud User88f12472016-06-24 23:31:02 +0200236 // Eine Meldung muss von der WearFunc ausgegeben werden
237 return(-2);
238 }
239
240 // scheinbar darf man das hier anziehen. ;-)
241 return 0;
242}
243
244protected void _informwear(int silent, int all) {
245
246 // Eine Meldung ausgeben, wenn das silent-Flag nicht gesetzt ist
247 if (!silent) {
248 doWearMessage(all);
249 }
250
251 // Inform-Funktion aufrufen
252 InformWear(PL, silent, all);
253}
254
255// Die Funktion, die das eigentliche Anziehen durchfuehrt
256varargs int DoWear(int silent, int all) {
257 int nh;
258
259 // Bedingungen pruefen, _check_restrictions() gibt die notwendigen Meldungen
260 // an den Spieler aus.
261 int res = _check_wear_restrictions(silent, all);
262 if (res == -1)
263 return(0);
264 else if (res <= -2)
265 return(!all);
266
267 // Der Check auf freie Haende muss nach allen anderen Checks aus Kleidung
268 // und Ruestung erfolgen und ist im Prinzip identisch fuer beide. Daher wird
269 // der hier in dieser Funktion gemacht.
270 // Soll das Objekt Haende "benutzen"? Steht da auch wirklich ein
271 // Integer-Wert drin? ich mach da jetzt ein raise_error(), das soll
272 // schliesslich gefixt werden. Ausserdem spart es nen Workaround beim
273 // Ausziehen.
274 if (!intp(nh=QueryProp(P_NR_HANDS))) {
275 raise_error(sprintf("Invalid P_NR_HANDS in %O",object_name()));
276 }
277 // Wenn Haende benutzt werden sollen, muss natuerlich auch getestet
278 // werden, ob das ueberhaupt geht
279 if (nh>0) {
bugfixaf2be4f2020-03-22 19:13:07 +0100280 if (!(({int})PL->UseHands(ME, nh))) {
MG Mud User88f12472016-06-24 23:31:02 +0200281 // Schade, nicht genug Haende frei -> Meldung ausgeben
282 write(break_string("Du hast keine Hand mehr frei.",78,
283 (all?(Name(WER)+": "):0)));
284 return(!all);
285 }
286 }
287
288 // OK, die Ruestung kann angezogen werden.
289 // Behinderung beim Wechsel nur fuer Spieler
290 if (query_once_interactive(PL))
291 // Wenn das Ganze ,,wirklich'' eine Kleidung/Ruestung ist und kein SMS
292 // oder aehnliches...
293 if (!QueryProp(P_WEAPON_TYPE)) {
294 // Aktion noch setzen, Spieler hat ja was angezogen
bugfixaf2be4f2020-03-22 19:13:07 +0100295 ({int*})PL->SetProp(P_LAST_WEAR_ACTION,({WA_WEAR,time()}));
MG Mud User88f12472016-06-24 23:31:02 +0200296 // Im Kampf verliert der Spieler durch Kleidungswechsel eine Runde.
Arathorn6fa8c9e2020-08-05 13:29:02 +0200297 if (({object})PL->InFight()) {
bugfixaf2be4f2020-03-22 19:13:07 +0100298 ({int})PL->SetProp(P_ATTACK_BUSY,1);
MG Mud User88f12472016-06-24 23:31:02 +0200299 }
300 }
301 // Eintragen in P_CLOTHING/P_ARMOURS
bugfixaf2be4f2020-03-22 19:13:07 +0100302 ({int})PL->Wear(this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200303
bugfixaf2be4f2020-03-22 19:13:07 +0100304 ({int})PL->SetProp(P_EQUIP_TIME,time());
MG Mud User88f12472016-06-24 23:31:02 +0200305 SetProp(P_WORN, PL);
306 SetProp(P_EQUIP_TIME,time());
307
308 // ggf. andere Objekte informieren etc.
309 _informwear(silent, all);
310
311 // Fertig mit dem Anziehen. Vorgang beenden bzw. mit anderen
312 // Ruestungen fortfahren
313 return !all;
314}
315
316
317// liefert 0 zureck, wenn die Kleidung/Ruestung ausgezogen werden kann
318// bei M_NOCHECK ist das Ausziehen immer erlaubt, allerdings wird
319// P_REMOVE_FUNC auch dann gerufen (wenn auch ignoriert).
320// <0 verbietet das Ausziehen
321protected int _check_unwear_restrictions(object worn_by, int silent,
322 int all)
323{
324 // Nicht getragene Ruestungen kann man auch nicht ausziehen
325 if (!objectp(worn_by)) {
326 return(-2);
327 }
328
329 // Ist eine RemoveFunc gesetzt, wird diese aufgerufen
330 // Im Falle von M_NOCHECK wird das Ergebnis allerdings ignoriert.
331 mixed res=QueryProp(P_REMOVE_FUNC);
332 if (objectp(res)
bugfixaf2be4f2020-03-22 19:13:07 +0100333 && !({int})res->RemoveFunc(ME,silent,worn_by)
MG Mud User88f12472016-06-24 23:31:02 +0200334 && !(silent & M_NOCHECK)
335 )
336 {
337 // Eine Meldung muss von der RemoveFunc ausgegeben werden
338 return(-2);
339 }
340
341 // generell hebt M_NOCHECK die Restriktionen auf - sonst kommt es zu
342 // massiven Inkonsistenzen beim Bewegen mit M_NOCHECK.
343 if (silent & M_NOCHECK)
344 return 1;
345
346 // Eine verfluchte Ruestung kann man natuerlich nicht ausziehen
347 res=QueryProp(P_CURSED);
Arathorn2aa7b582020-08-14 14:22:25 +0200348 if (res)
349 {
350 if (!(silent&M_SILENT))
351 {
352 if (stringp(res))
353 {
354 // Stand in P_CURSED ein String? Dann diesen ausgeben
355 tell_object(worn_by,
356 (res[<1]=='\n' ? res : break_string(res,78,
357 (all?(Name(WER)+": "):0))));
358 }
359 else
360 {
361 // Sonst eine Standard-Meldung ausgeben
362 tell_object(worn_by,break_string(
363 "Du kannst "+name(WEN)+" nicht ausziehen, "+QueryPronoun(WER)+
364 " ist verflucht worden.\n",78,(all?(Name(WER)+": "):0)));
365 }
MG Mud User88f12472016-06-24 23:31:02 +0200366 }
367 return(-2);
368 }
369
370 // Ausziehen moeglich
371 return(1);
372}
373
374protected void _informunwear(object worn_by, int silent, int all) {
375
376 // Inform-Funktion aufrufen
377 InformUnwear(worn_by, silent, all);
378
379 // Meldung ausgeben, wenn das silent-Flag nicht gesetzt ist
380 if (!(silent&M_SILENT)) {
381 doUnwearMessage( worn_by, all );
382 }
383}
384
385// Die Funktion, die das eigentliche Ausziehen durchfuehrt
386// hier steht nur drin, was auf jeden Fall fuer Kleidungen und Ruestungen
387// gleich ist, damit man bei Ruestungen diese Funktion nicht ueberschreiben
388// muss.
389varargs int DoUnwear(int silent, int all) {
390 object worn_by;
391 int nh;
392
393 // Das Flag "silent" wird in der RemoveFunc() etwas anders behandelt
394 // als ueberall anders. Deshalb wird M_SILENT gesetzt, sofern "silent"
395 // _irgendeinen_ Wert ausser M_NOCHECK hatte.
396 if ( silent & ~M_NOCHECK )
397 silent |= M_SILENT;
398
399 // Standard-Notfiyfail setzen.
400 if (all)
401 notify_fail("Alles ausgezogen, was ging.\n");
402
403 // Hat das Objekt Haende "benutzt"? Steht da auch wirklich ein
404 // Integer-Wert drin? Wenn nicht, mach ich nen raise_error(), das duerfte
405 // eigentlich gar nicht passieren. Pruefung mal am Anfang machen, bevor
406 // irgendwas anderes (RemoveFunc()) passiert ist.
407 if (!intp(nh=QueryProp(P_NR_HANDS))) {
408 raise_error(sprintf("Invalid P_NR_HANDS in %O",object_name()));
409 }
410
411 worn_by=QueryProp(P_WORN);
412 // darf ausgezogen werden? Wenn nicht, Ende.
413 int res = _check_unwear_restrictions(worn_by,silent,all);
414 if (res < 0)
415 return(!all);
416
417 // OK, alles klar, die Ruestung wird ausgezogen
bugfixaf2be4f2020-03-22 19:13:07 +0100418 ({int})worn_by->Unwear(ME);
MG Mud User88f12472016-06-24 23:31:02 +0200419
420 // Benutzte Haende wieder freigeben
421 if (nh>0) {
bugfixaf2be4f2020-03-22 19:13:07 +0100422 ({int})worn_by->FreeHands(ME);
MG Mud User88f12472016-06-24 23:31:02 +0200423 }
424
bugfixaf2be4f2020-03-22 19:13:07 +0100425 ({int})worn_by->SetProp(P_EQUIP_TIME, time());
MG Mud User88f12472016-06-24 23:31:02 +0200426 SetProp(P_WORN, 0);
427
428 // Flag noch setzen, Spieler hat ja was ausgezogen
429 // Aber nur wenns auch der Spieler selbst ist.
430 // und wenn das wirklich eine Ruestung und kein SMS o.ae. ist.
431 if (PL && PL==worn_by && !QueryProp(P_WEAPON_TYPE)) {
432 //Behinderung beim Wechsel nur fuer Spieler
433 if (query_once_interactive(PL)) {
bugfixaf2be4f2020-03-22 19:13:07 +0100434 ({int*})PL->SetProp(P_LAST_WEAR_ACTION,({WA_UNWEAR,time()}));
Arathorn6fa8c9e2020-08-05 13:29:02 +0200435 if (({object})PL->InFight()) {
bugfixaf2be4f2020-03-22 19:13:07 +0100436 ({int})PL->SetProp(P_ATTACK_BUSY,1);
MG Mud User88f12472016-06-24 23:31:02 +0200437 }
438 }
439 }
440
441 // ok, nun noch andere Objekte informieren.
442 _informunwear(worn_by,silent,all);
443
444 // Fertig mit dem Anziehen. Vorgang beenden bzw. mit anderen
445 // Ruestungen fortfahren
446 return !all;
447}
448
449protected int _do_wear(string str, int silent, int all) {
450 int *last;
451
452 // Standard-Notfiy-Fail setzen.
453 if (all)
Zesstra1fd31172018-12-18 21:34:49 +0100454 notify_fail("Alles angezogen was ging.\n");
MG Mud User88f12472016-06-24 23:31:02 +0200455
456 // Ist diese Ruestung ueberhaupt gemeint? Bei "trage alles" ist dies
457 // natuerlich immer der Fall
458 if (!str || (!all && !id(str))) {
459 return 0;
460 }
461
462 // Vielleicht darf der Spieler ja gar nix mehr anziehen.
Arathorn5fecd832020-07-27 23:46:37 +0200463 if (({object})PL->InFight()) {
bugfixaf2be4f2020-03-22 19:13:07 +0100464 last=({int*})PL->QueryProp(P_LAST_WEAR_ACTION);
MG Mud User88f12472016-06-24 23:31:02 +0200465 if (pointerp(last) && (last[0]==WA_UNWEAR) && ((time()-last[1])<2)) {
466 notify_fail("Du hast doch gerade erst etwas ausgezogen!\n"
467 "So schnell bist Du nicht!\n");
468 return 0;
469 }
470 }
471
472 // Auf zum eigentlichen Anziehen
473 return DoWear(silent, all);
474
475}
476
477// Funktion, die das "trage"/"ziehe * an"-Kommando auswertet
478varargs int do_wear(string str, int silent) {
479 int all;
480
481 // Hat der Spieler "trage alles" eingegeben?
482 all=(str=="alles" || str=="alle kleidung" || str=="alle bekleidung");
483
484 return(_do_wear(str,silent,all));
485}
486
487protected int _do_unwear(string str, int silent, int all) {
488 int * last;
489
490 // Ist diese Ruestung ueberhaupt gemeint? Und hat dieser Spieler sie
491 // auch wirklich an?
492 if (!stringp(str) || (!all && !id(str))) {
493 return 0;
494 }
495
496 if (!QueryProp(P_WORN)) {
497 if (all) {
498 notify_fail("Alles ausgezogen, was ging.\n");
499 return 0;
500 }
Arathorn01cbe082020-09-12 03:37:06 +0200501 if (!Query(P_ARTICLE) && !QueryProp(P_PLURAL)) {
MG Mud User88f12472016-06-24 23:31:02 +0200502 notify_fail( break_string(
503 "Du traegst k"+name(WEN,0)+".",78) );
504 }
505 else {
506 notify_fail( break_string(
507 "Du traegst "+name(WEN,1)+" nicht.",78) );
508 }
509 return 0;
510 }
511
512 // Vielleicht darf der Spieler ja gar nichts mehr ausziehen.
Arathorn6fa8c9e2020-08-05 13:29:02 +0200513 if (({object})PL->InFight()) {
bugfixaf2be4f2020-03-22 19:13:07 +0100514 last=({int*})PL->QueryProp(P_LAST_WEAR_ACTION);
MG Mud User88f12472016-06-24 23:31:02 +0200515 if (pointerp(last) && (last[0]==WA_WEAR) && ((time()-last[1])<2)) {
516 notify_fail("Du hast doch gerade erst etwas angezogen!\n"
517 "So schnell bist Du nicht!\n");
518 return 0;
519 }
520 }
521 // Auf zum eigentlichen Ausziehen
522 return DoUnwear(silent, all);
523}
524
525// Die Funktion, die das "ziehe * aus"-Kommando auswertet
526varargs int do_unwear(string str, int silent) {
527 int all;
528
529 all=(str=="alles" || str=="alle kleidung" || str=="alle bekleidung");
530
531 return(_do_unwear(str,silent,all));
532}
533
534// Funktion, die das "ziehe"-Kommando auswertet
535int ziehe(string str) {
536 string ob;
537
538 // Uebergebenes Argument pruefen
539 if (!stringp(str)) {
540 return 0;
541 }
542
543 // Ist ANziehen gemeint?
544 if (sscanf(str, "%s an", ob)==1) {
545 return do_wear(ob );
546 }
547
548 // Oder ist AUSziehen gemeint?
549 if (sscanf(str, "%s aus", ob)==1 ) {
550 return do_unwear(ob);
551 }
552
553 // Ok, es geht wohl weder ums an- noch ums ausziehen
554 return 0;
555}
556
557
558// Beschaedigen des Kleidungsstuecks
559
560// Direktes Beschaedigen der Kleidung durch Setzen der Prop gibts nicht. ;-)
561// Das geht aus Kompatibilitaetgruenden bei Ruestungen, aber nicht mehr bei
562// Kleidung. Punkt.
563static mixed _set_item_damaged(mixed arg) {
564 return(QueryProp(P_DAMAGED));
565}
566
567// Will man eine Kleidung beschaedigen oder reparieren, so macht man das
568// am besten ueber die Funktion Damage(argument). Positive Argumente
569// bedeuten eine Beschaedigung, negative eine Reparatur. Der Rueckgabewert
570// ist die wirklich durchgefuehrte Aenderung des Beschaedigungswertes
571int Damage(int new_dam) {
572 return 0;
573}
574
575// Wird die Kleidung einer Belastung ausgesetzt (bei Ruestungen z.B. bei einem
576// Angriff eines Gegners), dann wird TakeFlaw() aufgerufen. Bei Kleidungen
577// koennte man ja per P_SENSITIVE arbeiten oder ein Magier ruft bei Aktionen
578// TakeFlaw() auf.
579varargs void TakeFlaw(mixed dam_types,mapping einfos) {
580 int quality;
581
582 // Ist der Ruestung eine Qualitaet gesetzt worden, so kann es zu einer
583 // allmaehlichen Beschaedigung der Ruestung kommen. Im if() flaw gleich
584 // hochzaehlen.
585 if ((quality=QueryProp(P_QUALITY)) && !((++flaw) % quality)) {
586 Damage(1);
587 }
588
589 // Zeitpunkt des ersten Aufrufes festhalten
590 if (!ftime)
591 ftime=time();
592}
593
594// Die Flaw-Daten koennen natuerlich auch abgerufen werden
595mixed *QueryFlaw() {
596 return ({flaw,ftime,dtime(ftime)});
597}
598
599public status IsClothing() {return 1;}
600