blob: d5b40b6c7842c7e7e8beb1554c22a86116d95da4 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// /std/food.c - Standardobjekt fuer Lebensmittel
4//
5// $Id: food.c 8248 2012-11-23 21:28:04Z Zesstra $
6#pragma strict_types,save_types,rtt_checks
7#pragma no_clone
8#pragma pedantic,range_check
9
10inherit "/std/thing";
11
12#include <food.h>
13#include <living/life.h>
14#include <break_string.h>
15
16// Standard-IDs und -Adjektive muessen gesichert werden
17#define ID_BACKUP "std_food_id_backup"
18#define ADJ_BACKUP "std_food_adj_backup"
19
20// Zeitpunkt, an dem die Speise verdorben ist
21private nosave int time_gone_bad;
22
23// Zeitpunkt, an dem die Speise verderben darf
24// wird immer erst gesetzt, wenn ein Spieler hiermit in Beruehrung kommt
25private nosave int time_togo_bad;
26
27// Zeitpunkt, an dem die Speise zerstoert werden darf
28// wird immer erst gesetzt, wenn ein Spieler hiermit in Beruehrung kommt
29private nosave int time_to_remove;
30
31// Zeitpunkt, ab dem die Speise mit einem Spieler in Beruehrung kam
32// bei ewig haltbaren Speisen ist sie immer 0;
33private nosave int start_life = 0;
34
35// Dauer des ersten Resets
36private nosave int first_reset_length = 0;
37
38// Wertet Properties aus (Ersetzungen werden durchgefuehrt)
39protected mixed eval_property(string val,object consumer) {
40 mixed what = QueryProp(val);
41 if (stringp(what)) {
42 what=capitalize(replace_personal(what,({this_object(),consumer}),1));
43 }
44 return break_string(what,78,"",BS_LEAVE_MY_LFS);
45}
46
47// wird nur verwendet, wenn der gesetzte Reset ein Timerende darstellt,
48// um zu garantieren, dass der nicht abgestellt wird.
49// Zugegebenenermassen keine schoener Hack :-/
50private void my_set_next_reset(int zeit) {
51 set_next_reset(zeit);
52 // Damit der Reset auch wirklich ausgefuehrt wird ...
53 call_out(#'id,1);
54}
55
56// Ausgabe von Meldungen an Besitzer oder Raum
57protected void message(string prop) {
58 object env = environment(this_object());
59 if (objectp(env)) {
60 if (interactive(env)) {
Zesstrab4922b12016-11-29 19:54:15 +010061 tell_object(env, eval_property(prop,env));
MG Mud User88f12472016-06-24 23:31:02 +020062 }
63 else if(!living(env)) {
Zesstrab4922b12016-11-29 19:54:15 +010064 tell_room(env, eval_property(prop,0));
MG Mud User88f12472016-06-24 23:31:02 +020065 }
66 }
67}
68
69// Flag, ob die Speise verdorben ist
70public int is_bad() {
71 return time_gone_bad > 0;
72}
73
74// Anzahl der Sekunden, die das Lebensmittel bereits hinter sich hat,
75// seit es mit einem Spieler in Beruehrung kam
76public int get_current_lifetime() {
77 if (!start_life) return 0;
78 return time() - start_life;
79}
80
81// Berechnet den Wert der Speise korrekt
82int _query_value() {
83 int result = 0;
84 if (!is_bad()) {
85 result += to_int(QueryProp(P_PORTIONS)*Query(P_VALUE,F_VALUE));
86 }
87 if (mappingp(QueryProp(P_EMPTY_PROPS))) {
88 result += QueryProp(P_EMPTY_PROPS)[P_VALUE];
89 }
90 return result;
91}
92
93// Berechnet den Wert der Speise korrekt
94int _query_weight() {
95 int result = to_int(QueryProp(P_PORTIONS)*Query(P_WEIGHT,F_VALUE));
96 if (mappingp(QueryProp(P_EMPTY_PROPS))) {
97 result += QueryProp(P_EMPTY_PROPS)[P_WEIGHT];
98 }
99 return result;
100}
101
102// Dauer des ersten Resets wird wieder hinzugerechnet
103// damit wird bei Nichtsetzen der Prop der Standard geliefert
104int _query_std_food_lifetime() {
105 return Query(P_LIFETIME,F_VALUE)+(first_reset_length);
106}
107
108// Setter fuer die Lifetime, damit die Resettime immer mitkorrigiert wird
109// und Dauer des ersten Resets abgezogen werden, da die als Standard immer
110// dazukommen
111protected void set_std_food_lifetime(int val) {
112 if (val > 0) {
113 if (!time_togo_bad && !is_bad()) {
114 Set(P_LIFETIME,val-(first_reset_length),F_VALUE);
115 // Anzahl der Resets richtet sich nach dem Mittelwert
116 Set(P_RESET_LIFETIME,to_int((val-(first_reset_length))
117 /(__RESET_TIME__*0.75))+1,F_VALUE);
118 set_next_reset(val);
119 }
120 }
121 else {
122 write("Da ist was schief gelaufen! Sprich mal mit einem Magier.\n");
123 raise_error("setting P_LIFETIME to invalid int value: "+
124 to_string(val)+"\n");
125 }
126}
127
128// Anzahl der Resets als Lebenszeit
129void _set_std_food_lifetime_reset(int value) {
130 if (value < 1) value = 1;
131
132 Set(P_RESET_LIFETIME,value,F_VALUE);
133 // per Zufall die Laenge der einzelnen Resets berechnen
134 int length = first_reset_length;
135 foreach(int i: value) {
136 length += to_int((__RESET_TIME__ + random(__RESET_TIME__)) / 2);
137 }
138 set_std_food_lifetime(length);
139}
140
141// Flag, ob Speise "essbar" ist
142public int is_eatable() {
143 return QueryProp(P_FOOD) > 0;
144}
145
146// Flag, ob Speise "trinkbar" ist
147public int is_drinkable() {
148 return QueryProp(P_FOOD) == 0 && QueryProp(P_DRINK) > 0;
149}
150
151// Flag, ob noch Portionen der Speise vorhanden sind
152public int is_not_empty() {
153 return QueryProp(P_PORTIONS) > 0;
154}
155
156// Macht eine Speise leer bzw. zerstoert sie.
157// Muss beim Ueberschreiben immer als letztes aufgerufen werden.
158// Diese Methode wird aufgerufen, wenn ein Behaelter leergefuttert wird
159// oder der Inhalt zerstoert werden soll
160// Rueckgabewert: Ergebnis von remove() bzw. 0, wenn Objekt nicht
161// zerstoert werden muss
162// Beim Aufruf bitte IMMER das Ergebnis pruefen, damit keine Aufrufe an
163// geloeschten Objekten passieren! if (make_empty()) return ...;
164public int make_empty() {
165 mixed props = QueryProp(P_EMPTY_PROPS);
166 if (mappingp(props)) {
167 foreach(string key:m_indices(props)) {
168 if (key == P_IDS) {
169 RemoveId(QueryProp(P_IDS));
170 AddId(QueryProp(ID_BACKUP));
171 AddId(props[key]);
172 }
173 else if (key == P_ADJECTIVES) {
174 RemoveId(QueryProp(P_ADJECTIVES));
175 AddAdjective(QueryProp(ADJ_BACKUP));
176 AddAdjective(props[key]);
177 }
178 else {
179 SetProp(key,props[key]);
180 }
181 }
182
183 // Sicherheitshalber :-)
184 SetProp(P_PORTIONS,0);
185 return 0;
186 }
187 else {
188 return remove(1);
189 }
190}
191
192// wird aufgerufen, wenn die Speise schlecht war und der Removetimer
193// abgelaufen ist
194// Zerstoert die Speise oder den Inhalt eines Behaelters
195// Rueckgabewert: Ergebnis von remove() bzw. 0, wenn Objekt nicht
196// zerstoert werden muss
197public int make_destroy() {
198 message(P_REMOVE_MSG);
199 set_next_reset(-1);
200 return make_empty(); // Leermachen oder zerstoeren
201}
202
203// Laesst die Speise schlecht werden (mit Meldungen)
204// muss beim Ueberschreiben immer mit aufgerufen werden
205// Rueckgabewert: Ergebnis von remove() bzw. 0, wenn Objekt nicht
206// zerstoert werden muss
207// Beim Aufruf bitte IMMER das Ergebnis pruefen, damit keine Aufrufe an
208// geloeschten Objekten passieren! if (make_bad()) return ...;
209public int make_bad() {
210 time_gone_bad = time();
211 if (is_not_empty()) {
212 message(P_BAD_MSG);
213 }
214 if (QueryProp(P_DESTROY_BAD) == DESTROY_BAD && !QueryProp(P_EMPTY_PROPS)) {
215 return remove(1);
216 }
217 return 0;
218}
219
220// Startet den Timer zum Schlechtwerden der Speise
221public void start_lifetime() {
222 // Test, ob Lebensmittel schlecht werden darf
223 if (!QueryProp(P_NO_BAD) && !time_togo_bad) {
224 start_life = time();
225 int zeit = QueryProp(P_LIFETIME);
226 // Zeitpunkt des Schlechtwerdens
227 time_togo_bad = start_life + zeit;
228 // Zeitpunkt des Zerstoerens
229 time_to_remove = time_togo_bad + QueryProp(P_DESTROY_BAD);
230 my_set_next_reset(zeit);
231 }
232}
233
234// Reset wird in 2 Situationen aufgerufen:
235// 1. Timer zum schlecht werden ist abgelaufen, das Futter muss also
236// schlecht werden und evtl. der Timer zum Zerstoeren gestartet werden
237// 2. Timer zum Zerstoeren ist abgelaufen, also wird Futter zerstoert.
238// Wird der Reset aus irgendeinem Grund zu falschen Zeiten aufgerufen,
239// wird der naechste Reset korrekt initialisiert.
240void reset() {
241 // wenn kein env, Abbruch und reset abschalten.
242 if (!environment()) {
243 set_next_reset(-1);
244 return;
245 }
246
247 // Test, ob Lebensmittel schlecht werden darf
248 if (!QueryProp(P_NO_BAD)) {
249 if (!is_bad()) {
250 // Test, ob Timer laeuft
251 if (time_togo_bad) {
252 // Pruefen, ob der Reset so in etwa zur richtigen Zeit aufgerufen wurde
253 // 10% Abweichung sind erlaubt
254 int diff = time() - time_togo_bad;
255 int std = to_int(QueryProp(P_LIFETIME)/10);
256 if (abs(diff) < std || diff > 0) {
257 if (make_bad()) return;
258 // Reset zum Zerstoeren vorbereiten
259 if (QueryProp(P_DESTROY_BAD) > 0) {
260 my_set_next_reset(time_to_remove - time());
261 }
262 else {
263 set_next_reset(-1);
264 }
265 }
266 else {
267 // Reset nochmal zum Ablauf der Frist
268 my_set_next_reset(abs(diff));
269 }
270 }
271 }
272 else if (time_to_remove && QueryProp(P_DESTROY_BAD) > 0) {
273 // wir sind im Reset nach dem Schlechtwerden
274 int diff = time() - time_to_remove;
275 int std = to_int((QueryProp(P_LIFETIME)+QueryProp(P_DESTROY_BAD))/10);
276 // Pruefen, ob der Reset so in etwa zur richtigen Zeit aufgerufen wurde
277 // 10% Abweichung sind erlaubt
278 if (abs(diff) < std || diff > 0) {
279 if (make_destroy()) return; // Leermachen oder zerstoeren
280 }
281 else {
282 // Reset nochmal zum Ablauf der Frist
283 my_set_next_reset(abs(diff));
284 }
285 }
286 } // if (P_NO_BAD)
287
288 ::reset();
289}
290
291private int safety_check() {
292 // Damit ein Spieler auch gaaaanz sicher nicht Speisen ausserhalb der
293 // P_LIFETIME nutzen kann ...
294 if (time_togo_bad && !is_bad() && time() > time_togo_bad) {
295 if (make_bad()) return 0;
296 // Reset zum Zerstoeren vorbereiten
297 if (QueryProp(P_DESTROY_BAD) > 0) {
298 my_set_next_reset(time_to_remove - time());
299 }
300 else {
301 set_next_reset(-1);
302 }
303 return 0;
304 }
305 else if (time_to_remove && time() > time_to_remove
306 && QueryProp(P_DESTROY_BAD) > 0) {
307 make_destroy(); // Leermachen oder zerstoeren
308 return 0;
309 }
310 return 1;
311}
312
313// Pruefung zum Starten ausgelagert, da das im init und in
314// NotifyMove gebraucht wird
315private void check_start_timer(object oldenv) {
316 // Test, ob Lebensmittel schlecht werden kann
317 if (!QueryProp(P_NO_BAD) && !time_togo_bad) {
318 // Wenn wir irgendwie in einem Spieler stecken oder ein Spieler in der
319 // Umgebung ist oder das Futter mehrfach bewegt wurde
320 if (sizeof(filter(all_environment(),#'query_once_interactive))
321 || sizeof(filter(all_inventory(environment()),#'query_once_interactive))
322 || objectp(oldenv)) {
323 start_lifetime();
324 }
325 }
326 else {
327 // Damit ein Spieler auch gaaaanz sicher nicht Speisen ausserhalb
328 // der P_LIFETIME nutzen kann ...
329 safety_check();
330 }
331}
332
333// hier wird geprueft, ob das Futter dem Spieler zugaenglich ist.
334void init() {
335 ::init();
336 check_start_timer(environment());
337}
338
339// hier wird geprueft, ob das Futter dem Spieler zugaenglich ist.
340// das ist sicherer als nur im init()
341protected void NotifyMove(object dest, object oldenv, int method) {
342 ::NotifyMove(dest, oldenv, method);
343 check_start_timer(oldenv);
344}
345
346void create() {
347 // Sicherheitshalber,
348 // falls jemand die Blueprint mit Props initialisieren will
349 ::create();
350 Set(P_LIFETIME, #'set_std_food_lifetime, F_SET_METHOD);
351 Set(P_LIFETIME, PROTECTED, F_MODE_AS);
352
353 time_togo_bad = 0;
354 time_to_remove = 0;
355 time_gone_bad = 0;
356
357 // Standardlaufzeit 1 Reset
358 first_reset_length = to_int((__RESET_TIME__ + random(__RESET_TIME__)) / 2);
359 // Reset wird erstmal abgeschaltet, das wird im NotifyMove geprueft
360 set_next_reset(-1);
361
362 SetProp(P_SHORT,"Ein Lebensmittel");
363 SetProp(P_LONG,"Das ist ein Lebensmittel.\n");
364 SetProp(P_NAME,"Lebensmittel");
365 SetProp(P_MATERIAL, MAT_MISC_FOOD);
366 SetProp(P_GENDER,NEUTER);
367 SetProp(P_WEIGHT,50);
368 SetProp(P_VALUE,10);
369 SetProp(P_PORTIONS,1); // einmal Abbeissen
370 SetProp(P_DESTROY_BAD,DESTROY_BAD); // Zerstoeren beim Schlechtwerden
371 SetProp(P_DISTRIBUTION,HD_STANDARD); // Heilung per Standardverteilung (5/hb)
372
373 SetProp(P_CONSUME_MSG,"@WER2 konsumiert @WEN1.");
374 SetProp(P_EATER_MSG,"Du konsumierst @WEN1.");
375 SetProp(P_EMPTY_MSG,"@WER1 ist bereits leer.");
376 SetProp(P_NOFOOD_MSG,"@WEN1 kann man nicht essen!");
377 SetProp(P_NODRINK_MSG,"@WEN1 kann man nicht trinken!");
378 SetProp(P_BAD_MSG,"@WER1 verdirbt.");
379 SetProp(P_FOOD_FULL_MSG,"Du bist zu satt, das schaffst Du nicht mehr.");
380 SetProp(P_DRINK_FULL_MSG,"So viel kannst Du im Moment nicht trinken.");
381 SetProp(P_ALC_FULL_MSG,"Soviel Alkohol vertraegst Du nicht mehr.");
382 SetProp(P_ENV_MSG,"Vielleicht solltest Du @WEN1 vorher nehmen.");
383 SetProp(P_REMOVE_MSG,"@WER1 zerfaellt zu Staub.");
384
385 // Sichern der Standards
386 SetProp(ID_BACKUP,QueryProp(P_IDS));
387 SetProp(ADJ_BACKUP,QueryProp(P_ADJECTIVES));
388
389 AddId(({"lebensmittel","nahrung","\nfood"}));
390
391 AddCmd(({"iss","esse"}),"cmd_eat");
392 AddCmd(({"trink","trinke"}),"cmd_drink");
393}
394
395// Aendert Werte der Speise, wenn sie vergammelt ist und konsumiert wird
396protected void consume_bad(mapping entry_info) {
397 entry_info[P_HP] = 0;
398 entry_info[P_SP] = 0;
399 entry_info[H_EFFECTS] = ([P_POISON:1]);
400}
401
402// Stellt Mapping zum Konsumieren zusammen und konsumiert.
403// kann mit testonly=1 aufgerufen werden, um zu pruefen, ob konsumieren klappt
404// Gibt das Ergebnis von living->consume() zurueck:
405// >0 -> erfolgreich konsumiert
406// <0 -> nicht konsumiert (siehe Hilfe zu consume)
407protected varargs int try_consume(object consumer, int testonly) {
408 mapping entry_info = ([P_FOOD:QueryProp(P_FOOD),
409 P_DRINK:QueryProp(P_DRINK),
410 P_HP:QueryProp(P_HP),
411 P_SP:QueryProp(P_SP),
412 P_POISON:QueryProp(P_POISON),
413 P_ALCOHOL:QueryProp(P_ALCOHOL),
414 H_DISTRIBUTION:QueryProp(P_DISTRIBUTION)]);
415
416 if (is_bad()) consume_bad(entry_info);
417
418 int result = (int)consumer->consume(entry_info, testonly);
419 if (!result) {
420 tell_object(consumer,
421 "Da ist was schief gelaufen! Sprich mal mit einem Magier.\n");
422 raise_error("living->consume() mit falschen Parametern aufgerufen:\n"+
423 sprintf("%O\n",entry_info));
424 }
425
426 return result;
427}
428
429// Konsumieren war erfolgreich
430// Hier kann man beim Ueberschreiben noch zusaetzliche Sachen machen
431// P_PORTIONS ist bereits runtergezaehlt, Speise ist aber noch nicht leer!
432// make_empty() wird also eventuell noch danach aufgerufen
433// entspricht alter Func BeimEssen()
434protected void success_consume(object consumer) {
435 tell_room(environment(consumer),eval_property(P_CONSUME_MSG,consumer),({consumer}));
436 tell_object(consumer,eval_property(P_EATER_MSG,consumer));
437}
438
439// Konsumieren war nicht erfolgreich
440// Hier kann man beim Ueberschreiben noch zusaetzliche Sachen machen
441// in reason wird der Grund des Fehlschlagens uebergeben (siehe 'man consume')
442protected void failed_consume(object consumer, int reason) {
443 if (reason & HC_MAX_FOOD_REACHED)
444 tell_object(consumer,eval_property(P_FOOD_FULL_MSG,consumer));
445 else if (reason & HC_MAX_DRINK_REACHED)
446 tell_object(consumer,eval_property(P_DRINK_FULL_MSG,consumer));
447 else if (reason & HC_MAX_ALCOHOL_REACHED)
448 tell_object(consumer,eval_property(P_ALC_FULL_MSG,consumer));
449}
450
451// Konsumiert die Speise
452// Gibt das Ergebnis von living->consume() zurueck:
453// >0 -> erfolgreich konsumiert
454// <0 -> nicht konsumiert (siehe Hilfe zu consume)
455protected int consume(object consumer) {
456 if (!objectp(consumer) || !living(consumer)) {
457 raise_error("argument pl not a living:\n"+
458 sprintf("%O\n",consumer));
459 }
460 // damit abgelaufene Speisen auch wirklich abgelaufen sind
461 if (!safety_check()) return 0;
462
463 if (!is_not_empty()) {
464 notify_fail(eval_property(P_EMPTY_MSG,consumer));
465 return 0;
466 }
467 int result = try_consume(consumer);
468 if (result > 0) {
469 SetProp(P_PORTIONS,QueryProp(P_PORTIONS)-1);
470 success_consume(consumer);
471 if (!is_not_empty()) make_empty();
472 }
473 else if (result < 0) {
474 failed_consume(consumer,result);
475 }
476 return result;
477}
478
479// Futtern
480int cmd_eat(string str) {
481 notify_fail("WAS moechtest Du essen?\n");
482 if (!str || !id(str)) return 0;
483 object env = environment(this_object());
484 if (env != this_player() && QueryProp(P_ENV_MSG)) {
485 notify_fail(eval_property(P_ENV_MSG,env));
486 return 0;
487 }
488
489 if (!is_eatable() && !is_drinkable()) {
490 write("Mit diesem Futter stimmt was nicht!"
491 " Sprich mal mit einem Magier.\n");
492 raise_error("Food ohne Werte.\n");
493 return 0;
494 }
495
496 if (!is_eatable()) {
497 notify_fail(eval_property(P_NOFOOD_MSG,env));
498 return 0;
499 }
500
501 return consume(this_player());
502}
503
504// Trinken
505int cmd_drink(string str) {
506 notify_fail("WAS moechtest Du trinken?\n");
507 if (!str || !id(str)) return 0;
508 object env = environment(this_object());
509 if (env != this_player() && QueryProp(P_ENV_MSG)) {
510 notify_fail(eval_property(P_ENV_MSG,env));
511 return 0;
512 }
513
514 if (!is_eatable() && !is_drinkable()) {
515 write("Mit diesem Futter stimmt was nicht!"
516 " Sprich mal mit einem Magier.\n");
517 raise_error("Food ohne Werte.\n");
518 return 0;
519 }
520
521 if (!is_drinkable()) {
522 notify_fail(eval_property(P_NODRINK_MSG,env));
523 return 0;
524 }
525
526 return consume(this_player());
527}
528
529//============================================================================
530// Kompatibilitaetscode
531// um eventuell vergessenes Food oder Zugriff von aussen auf altes Food
532// mitzubekommen
533
534nosave deprecated int alc, alc_pp, food, food_pp, heal, p, soft, soft_pp, c;
535
536deprecated int eat_this( string str ) {
537 return cmd_eat(str);
538}
539
540deprecated int drink_this(string str) {
541 return cmd_drink(str);
542}
543
544deprecated void MakeDrink() {
545 SetProp(P_DRINK,1);
546 SetProp(P_FOOD,0);
547}
548
549deprecated mixed _query_old_is_food() {
550 return is_eatable();
551}
552
553deprecated void _set_old_is_food(mixed value) {
554 SetProp(P_DRINK,0);
555 SetProp(P_FOOD,value);
556}
557
558deprecated mixed _query_old_is_drink() {
559 return is_drinkable();
560}
561
562deprecated void _set_old_is_drink(mixed value) {
563 SetProp(P_DRINK,value);
564 SetProp(P_FOOD,0);
565}
566
567deprecated mixed _query_old_is_full() {
568 return is_not_empty();
569}
570
571deprecated void _set_old_is_full(mixed value) {
572 SetProp(P_PORTIONS,value);
573}
574
575deprecated mixed _query_old_alc() {
576 return QueryProp(P_ALCOHOL);
577}
578
579deprecated void _set_old_alc(mixed value) {
580 SetProp(P_ALCOHOL,value);
581}
582
583deprecated mixed _query_old_water() {
584 return QueryProp(P_DRINK);
585}
586
587deprecated void _set_old_water(mixed value) {
588 SetProp(P_DRINK,value);
589}
590
591deprecated mixed _query_old_food_size() {
592 return QueryProp(P_FOOD);
593}
594
595deprecated void _set_old_food_size(mixed value) {
596 SetProp(P_FOOD,value);
597}
598
599deprecated mixed _query_old_potion() {
600 return QueryProp(P_PORTIONS);
601}
602
603deprecated void _set_old_potion(mixed value) {
604 SetProp(P_PORTIONS,value);
605}
606
607deprecated mixed _query_old_heal_hp() {
608 return QueryProp(P_HP);
609}
610
611deprecated void _set_old_heal_hp(mixed value) {
612 SetProp(P_HP,value);
613}
614
615deprecated mixed _query_old_heal_sp() {
616 return QueryProp(P_SP);
617}
618
619deprecated void _set_old_heal_sp(mixed value) {
620 SetProp(P_SP,value);
621}
622
623deprecated mixed _query_old_bad() {
624 return is_bad();
625}
626
627deprecated void _set_old_bad(mixed value) {
628 return;
629}
630
631deprecated mixed _query_old_mess() {
632 return QueryProp(P_CONSUME_MSG);
633}
634
635deprecated void _set_old_mess(mixed value) {
636 SetProp(P_CONSUME_MSG,value);
637}
638
639deprecated mixed _query_old_eater() {
640 return QueryProp(P_EATER_MSG);
641}
642
643deprecated void _set_old_eater(mixed value) {
644 SetProp(P_EATER_MSG,value);
645}
646
647deprecated mixed _query_old_poison() {
648 return QueryProp(P_POISON);
649}
650
651deprecated void _set_old_poison(mixed value) {
652 SetProp(P_POISON,value);
653}
654
655// interne Methode
656private mixed get_old_empty(string prop) {
657 mixed props = QueryProp(P_EMPTY_PROPS);
658 if (mappingp(props)) return props[prop];
659 return 0;
660}
661// interne Methode
662private void set_old_empty(string prop, mixed value) {
663 mixed props = QueryProp(P_EMPTY_PROPS);
664 if (!mappingp(props)) props = ([prop:value]);
665 else props[prop] = value;
666 SetProp(P_EMPTY_PROPS,props);
667}
668
669deprecated mixed _query_old_empty_con() {
670 return get_old_empty(P_SHORT);
671}
672
673deprecated void _set_old_empty_con(mixed value) {
674 set_old_empty(P_SHORT,value);
675}
676
677deprecated mixed _query_old_empty_gender() {
678 return get_old_empty(P_GENDER);
679}
680
681deprecated void _set_old_empty_gender(mixed value) {
682 set_old_empty(P_GENDER,value);
683}
684
685deprecated mixed _query_old_empty_id() {
686 return get_old_empty(P_IDS);
687}
688
689deprecated void _set_old_empty_id(mixed value) {
690 set_old_empty(P_IDS,value);
691}
692
693deprecated mixed _query_old_empty_long() {
694 return get_old_empty(P_LONG);
695}
696
697deprecated void _set_old_empty_long(mixed value) {
698 set_old_empty(P_LONG,value);
699}
700
701deprecated mixed _query_old_no_con() {
702 return mappingp(QueryProp(P_EMPTY_PROPS));
703}
704
705deprecated void _set_old_no_con(mixed value) {
706 if (value) SetProp(P_EMPTY_PROPS,([]));
707 else SetProp(P_EMPTY_PROPS,0);
708}
709
710// Mupfel
711deprecated int Essbar() {
712 return 1;
713}
714
715deprecated mixed _query_food_info() {
716 return ([]);
717}
718
719deprecated void _set_food_info(mixed value) {
720 return;
721}
722
723// Troy
724deprecated void food_decay() {
725 return;
726}
727
728deprecated int eat_me(string str) {
729 return 0;
730}