blob: bda38a2aa28b52972b178b8955aabc0fa14a51c1 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#pragma strong_types, save_types, rtt_checks
2#pragma no_inherit, no_shadow
3
4inherit "/std/container";
5
6#include <properties.h>
7#include <defines.h>
8#include <items/kraeuter/kraeuter.h>
9
10#define BS(x) break_string(x, 78, 0, BS_LEAVE_MY_LFS)
11
12// Enthaelt die raumabhaengig variable Kurzbeschreibung, die der Trockner
13// annimmt, wenn gerade ein Kraut getrocknet wird.
14private string short_desc;
15
16// Globale Variable fuer die Qualitaet, damit man den Wert nicht im
17// call_out() mitgeben muss, und sie somit auch nicht mit call_out_info()
18// abfragbar ist.
19private int drying_quality;
20
21private void dry_plant(object kraut, string *msgs);
22private void destroy_herb(object kraut);
23private string my_short();
24private int|string my_noget();
25private string my_long();
26private string* my_ids();
27private string|string* my_name();
28private mixed my_mat();
29
30protected void create() {
31 if ( !clonep(ME) ) {
32 set_next_reset(-1);
33 return;
34 }
35 ::create();
36
37 Set(P_SHORT, #'my_short, F_QUERY_METHOD);
38 Set(P_LONG, #'my_long, F_QUERY_METHOD);
39 Set(P_NOGET, #'my_noget, F_QUERY_METHOD);
40 Set(P_IDS, #'my_ids, F_QUERY_METHOD);
41 Set(P_NAME, #'my_name, F_QUERY_METHOD);
42 Set(P_MATERIAL, #'my_mat, F_QUERY_METHOD);
43 // Properties zu securen ist vielleicht etwas sehr paranoid.
44 Set(P_SHORT, SECURED|NOSETMETHOD, F_MODE_AS);
45 Set(P_LONG, SECURED|NOSETMETHOD, F_MODE_AS);
46 Set(P_NOGET, SECURED|NOSETMETHOD, F_MODE_AS);
47 Set(P_IDS, SECURED|NOSETMETHOD, F_MODE_AS);
48 Set(P_NAME, SECURED|NOSETMETHOD, F_MODE_AS);
49 SetProp(P_MAX_OBJECTS,1);
50 SetProp(P_MAX_WEIGHT,100000);
51 SetProp(P_TRANSPARENT,0);
52
53 AddCmd("trockne&@PRESENT", "cmd_trocknen", "Was willst Du trocknen?");
54}
55
56private string my_short() {
57 if ( first_inventory(ME) )
58 return short_desc;
59 return 0;
60}
61
62// Querymethoden, die Langbeschreibung und weitere Properties des im
63// Trockner enthaltenen Krautobjektes nach draussen weiterreichen, um die
64// Illusion zu erzeugen, dass wirklich das echte Kraut im Raum zu sehen sei.
65// Alle Funktionen gehen davon aus, dass das zu trocknende Kraut das erste
66// (und einzige) Objekt im Inventar des Trockners ist und geben dessen
67// Properties zurueck.
68private string my_long() {
69 object inv = first_inventory(ME);
70 if ( objectp(inv) )
71 return inv->QueryProp(P_LONG)+inv->Name(WER,1)+
72 " wird gerade getrocknet.\n";
73 return 0;
74}
75
76private string|string* my_name() {
77 object inv = first_inventory(ME);
78 if ( objectp(inv) )
79 return inv->QueryProp(P_NAME);
80 return Query(P_NAME,F_VALUE);
81}
82
83private mixed my_mat() {
84 object inv = first_inventory(ME);
85 if ( objectp(inv) )
86 return inv->QueryProp(P_MATERIAL);
87 return ([]);
88}
89
90private int|string my_noget() {
91 object inv = first_inventory(ME);
Arathorndf5954e2018-08-29 21:23:37 +020092 if ( objectp(inv) ) {
93 if ( find_call_out(#'destroy_herb) > -1 ) {
94 return inv->Name(WER,1)+" wurde zu lange getrocknet und ist inzwischen "
95 "so heiss, dass Du "+inv->QueryPronoun(WEN)+" nicht mehr an Dich "
96 "nehmen kannst. Verzweifelt tippelst Du vor dem Kraut hin und her, "
97 "siehst aber keinen Weg, es noch zu retten.";
98 }
99 else {
100 return inv->Name(WER,1)+" wird gerade getrocknet, Du solltest "+
101 inv->QueryPronoun(WEN)+" liegenlassen, bis "+
102 inv->QueryPronoun(WER)+" fertig ist.";
103 }
104 }
MG Mud User88f12472016-06-24 23:31:02 +0200105 return 1;
106}
107
108private string* my_ids() {
109 object inv = first_inventory(ME);
110 if ( objectp(inv) )
111 return inv->QueryProp(P_IDS);
112 return Query(P_IDS,F_VALUE);
113}
114
115// Kommandofunktion zum Starten des Tocknungsvorganges. Holt sich die
116// relevanten Daten aus dem Krautmaster ab, setzt Meldungen und Texte und
117// wirft den Trocknungs-Callout an.
118static int cmd_trocknen(string str, mixed *param) {
119 // Master liefert leeres Array oder eins mit 2 Elementen ({delay, quality})
120 // environment(ME) liest er selbstaendig aus
121 int *drying_data = PLANTMASTER->QueryDryingData();
122 object kraut = param[0];
123
124 // Der Trockner taeuscht vor, selbst das Kraut zu sein, das zum Trocknen
125 // im Raum liegt. Daher wird hier noch geprueft, ob der Spieler vielleicht
126 // den Trockner selbst zu trocknen versucht.
127 if ( kraut == ME ) {
128 tell_object(PL, BS(kraut->Name(WER,1)+" wird bereits getrocknet, Du "
129 "solltest "+kraut->QueryPronoun(WEN)+" besser liegenlassen."));
130 }
131 // Es muss sich auch um ein Kraut handeln und nicht irgendwas anderes.
Arathorn8e737ef2018-08-29 19:35:51 +0200132 else if ( !IS_PLANT(kraut) ) {
MG Mud User88f12472016-06-24 23:31:02 +0200133 return 0;
134 }
135 // Spieler muss das Kraut im Inventar haben.
136 else if ( environment(kraut) != PL ) {
137 tell_object(PL, BS(
138 "Du musst "+kraut->name(WEN,1)+" schon in die Hand nehmen, um "+
139 kraut->QueryPronoun(WEN)+" sorgfaeltig trocknen zu koennen."));
140 }
141 // Das Kraut darf nicht unwirksam sein, was durch eine Plant-ID von -1
142 // gekennzeichet ist.
143 else if ( param[0]->QueryPlantId() == -1 ) {
144 tell_object(PL, BS(
145 kraut->Name(WER,1)+" haette ohnehin keine Wirkung, da kannst Du Dir "
146 "die Muehe sparen, "+kraut->QueryPronoun(WEN)+" noch aufwendig zu "
147 "trocknen."));
148 }
149 // Master hat keine Daten geliefert, also befindet sich der Trockner
150 // offenbar in einem unzulaessigen Raum.
151 else if ( sizeof(drying_data) != 2 ) {
152 tell_object(PL, BS(
153 "Dieser Ort ist nicht geeignet, um "+kraut->name(WEN,1)+" hier zu "
154 "trocknen."));
155 }
156 // Kraut ist schon getrocknet? Dann waere eine weitere Trocknung unsinnig.
157 else if ( kraut->QueryDried() ) {
158 tell_object(PL, BS(kraut->Name(WER,1)+" ist schon getrocknet, eine "
159 "weitere Behandlung wuerde "+kraut->QueryPronoun(WEM)+" zu stark "
160 "zusetzen, "+kraut->QueryPronoun(WEN)+" gar zerstoeren."));
161 }
162 // Es ist schon eine Pflanze im Trockner? Dann nicht noch eine reintun.
163 else if ( first_inventory(ME) ) {
164 tell_object(PL, BS("Hier wird gerade schon etwas getrocknet."));
165 }
166 // Aus irgendeinem Grund schlaegt die Bewegung des Krautes in den Trockner
167 // fehl? Dann muss sich das ein Magier anschauen, denn das geht nicht mit
168 // rechten Dingen zu.
169 else if ( kraut->move(ME, M_PUT) != MOVE_OK ) {
170 tell_object(PL, BS("Aus einem Dir unerfindlichen Grund schaffst Du es "
171 "nicht, die Trocknung "+kraut->name(WESSEN,1)+" zufriedenstellend "
172 "durchzufuehren und brichst den Versuch wieder ab. Du solltest einem "
173 "Magier Bescheid sagen, dass hier etwas nicht stimmt."));
174 }
175 // Alles geklappt, alle Bedingungen erfuellt? Dann koennen wir jetzt
176 // tatsaechlich endlich das Kraut trocknen.
177 else {
178 int drying_delay = drying_data[0]; // nur lokal benoetigt
179 drying_quality = drying_data[1]; // globale Variable
180 string where = load_name(environment(ME));
181 string msg_self, msg_other;
182 string kr = kraut->name(WEN,1);
183 string* callout_msgs = ({
184 kraut->Name(WER,1)+" ist jetzt in einem zufriedenstellenden "
185 "Zustand. Besser wirst Du es an diesem Ort vermutlich nicht "
186 "hinbekommen, daher beendest Du die Trocknung und nimmst "+
187 kraut->QueryPronoun(WEN)+" wieder an Dich.",
188 PL->Name(WER)+" schaut "+kr+" pruefend an und "
189 "beendet dann die Trocknung, offenbar zufrieden mit dem Resultat."});
190 int blocker; // auf 1 setzen, falls das Trocknen verhindert werden soll
191 // Hier koennen jetzt abhaengig vom Raum passende Meldungen gesetzt
192 // werden. Die zulaessigen Standorte hier noch weiter zu obfuscaten
193 // waere zwar moeglich, aber zu unuebersichtlich geworden.
194 switch(where) {
195 /*
196 * GEBIRGE
197 */
198 case "/d/gebirge/silvana/cronoertal/room/th7u":
199 msg_self = "Du legst "+kr+" vorsichtig und in gebuehrendem Abstand "
200 "zu den Flammen neben die Feuerstelle und wartest gespannt, ob "
201 "die Trocknung wohl gelingen wird.";
202 msg_other = PL->Name(WER)+" legt etwas neben die Feuerstelle, "
203 "vermutlich, um es zu trocknen.";
204 short_desc = kraut->Name(WER)+" liegt zum Trocknen am Feuer";
205 break;
206 /*
207 * EBENE
208 */
209 case "/d/ebene/zardoz/burg/kueche":
210 msg_self = "Du legst "+kr+" vorsichtig an eine der kuehleren "
211 "Stellen des Bleches im Ofen, es soll ja trocknen, und nicht "
212 "backen.";
213 msg_other = PL->Name(WER)+" legt etwas Gruenzeug auf das Blech im "
214 "Ofen.";
215 short_desc = kraut->Name(WER)+" liegt zum Trocknen im Ofen";
216 break;
217 case "/d/ebene/esme/masinya/rooms/kueche":
218 msg_self = "Du haengst "+kr+" ueber den Herd, um "+
219 kraut->QueryPronoun(WEN)+" in der Abwaerme trocknen zu lassen.";
220 msg_other = PL->Name(WER)+" haengt ein Kraut zum Trocknen ueber "
221 "den Herd.";
222 short_desc = kraut->Name(WER)+" haengt zum Trocknen ueber dem Herd";
223 break;
224 case "/d/ebene/throin/brauerei/room/darre06":
225 msg_self = "Du legst "+kr+" zu dem Malz in den "
226 "Keimkasten in der Hoffnung, dass "+kraut->QueryPronoun(WER)+
227 " auf diese Weise getrocknet werden kann.";
228 msg_other = PL->Name(WER)+" legt etwas eigenes Gruenzeug zu dem "
229 "Malz in den Keimkasten.";
230 short_desc = kraut->Name(WER)+" liegt zum Trocknen im Keimkasten";
231 break;
232 case "/d/ebene/arathorn/orakel/room/zelt":
233 msg_self = "Du legst "+kr+" vorsichtig ans "
234 "Lagerfeuer. Du schaust unsicher zu Chinkuwaila, doch der "
235 "alte Schamane nickt zustimmend, Du hast wohl alles richtig "
236 "gemacht.";
237 msg_other = PL->Name(WER)+" legt eine Pflanze ans Lagerfeuer, wohl "
238 "um sie zu trocknen.";
239 short_desc = kraut->Name(WER)+" wird gerade am Lagerfeuer getrocknet";
240 break;
241 /*
242 * WUESTE
243 */
244 case "/d/wueste/tsunami/schule/rooms/kraeuter":
245 blocker = objectp(present_clone("/d/wueste/tsunami/schule/mon/hexe",
246 environment(ME)));
247 if ( !blocker ) {
248 msg_self = "Du steckst "+kr+" in Muetterchen "
249 "Isewinds Trockenofen, der wohlig zu knistern beginnt.";
250 msg_other = PL->Name(WER)+" legt vorsichtig ein Kraut ";
251 short_desc = kraut->Name(WER)+" wird gerade im Ofen getrocknet";
252 }
253 else {
254 msg_self = "Muetterchen Isewind haelt Dich auf, sie scheint "
255 "niemanden an ihren Trockenofen heranlassen zu wollen.";
256 msg_other = PL->Name(WER)+" wird von Muetterchen Isewind an der "
257 "Benutzung des Ofens gehindert.";
258 }
259 break;
260 /*
261 * WALD
262 */
263 case "/d/wald/feigling/quest/room/huette3":
264 msg_self = "Du legst "+kr+" so nah ans Feuer, "
265 "wie Du glaubst, dass es der Trocknung nicht schadet.";
266 msg_other = PL->Name()+" legt eine Pflanze an die Kochstelle.";
267 short_desc = kraut->Name(WER)+" liegt zum Trocknen an der "
268 "Feuerstelle";
269 break;
270 case "/d/wald/leusel/quest/rooms/laborsuedosten":
271 msg_self = "Du legst "+kr+" in eins der "
272 "Tonschiffchen und schiebst es in den mittelheissen Ofen hinein. "
273 "Hoffentlich geht das gut, es kommt Dir da drinnen schon fast zu "
274 "warm fuer eine ordnungsgemaesse Trocknung vor.";
275 msg_other = PL->Name(WER)+" schiebt ein Kraut in einem "
276 "Tonschiffchen in einen der Oefen hinein, um es zu trocknen.";
277 short_desc = kraut->Name(WER)+" dampft in einem Tonschiffchen im "
278 "ersten Ofen vor sich hin";
279 break;
280 /*
281 * INSELN
282 */
283 case "/d/inseln/zesstra/vulkanweg/room/r8":
284 msg_self = "Du legst "+kr+" vorsichtig auf die "
285 "heissen Felsen in der Naehe des Lavasees, auf dass die "
286 "heissen Winde "+kraut->QueryPronoun(WEN)+" trocknen moegen.";
287 msg_other = PL->Name(WER)+" legt ein Kraut auf den Felsen ab, um es "
288 "von der heissen Luft trocknen zu lassen.";
289 short_desc = kraut->Name(WER)+" liegt zum Trocknen auf dem Felsen";
290 break;
291 case "/d/inseln/miril/zyklopen/room/palast/insel1p6":
292 // QueryOven() liefert 2 fuer "Feuer", 1 fuer "Glut", 0 fuer "aus".
293 switch (environment(ME)->QueryOven()) {
294 case 2:
295 msg_self = "Du legst "+kr+" vorsichtig an das Feuer, das in "
296 "der Feuerstelle brennt, sorgsam bemueht, dass "+
297 kraut->QueryPronoun(WER)+" nicht zuviel Hitze abbekommt.";
298 msg_other = PL->Name(WER)+" legt sorgsam ein Kraut in die Naehe "
299 "des Feuers, das in der Feuerstelle brennt.";
300 break;
301 case 1:
302 msg_self = "Du legst "+kr+" an die Feuerstelle, pruefst die "
303 "Hitze und rueckst "+kraut->QueryPronoun(WEN)+" noch etwas "
304 "naeher an die Glut, dann trittst Du zufrieden einen Schritt "
305 "zurueck.";
306 msg_other = PL->Name(WER)+" legt "+kraut->name(WEN)+" an die "
307 "Feuerstelle, schubst noch ein wenig daran herum und tritt "
308 "dann von der Glut zurueck, "+PL->QueryPronoun(WER)+" scheint "
309 "recht zufrieden zu sein.";
310 break;
311 default:
312 blocker=1;
313 msg_self = "In dem Kamin findest Du nicht einmal etwas Glut, "
314 "geschweige denn offenes Feuer. So wird das mit dem Trocknen "
315 "nichts, und auf dem Herd ist Dir das Risiko zu gross, dass "
316 "Fett aus der Pfanne auf "+kr+" spritzt.";
317 break;
318 }
319 short_desc = kraut->Name(WER)+" liegt zum Trocknen an der "
320 "Feuerstelle";
321 break;
322 /*
323 * POLAR
324 */
325 case "/d/polar/tilly/llp/rentner/kueche":
326 msg_self = "Der Herd gibt eine infernalische Hitze ab. Zum Kochen "
327 "ist das toll, aber Du brauchst doch einen Moment, um ein "
328 "geeignetes Plaetzchen fuer "+kr+" zu finden.";
329 msg_other = PL->Name(WER)+" legt ein Kraut auf den heissen Herd "
330 "und schiebt es unruhig noch ein wenig hin und her, als waere "+
331 PL->QueryPronoun(WEM)+" die Hitze beinahe ein wenig zu gross.";
332 short_desc = kraut->Name(WER)+" liegt auf dem schmiedeeisernen "
333 "Herd";
334 break;
335 /*
336 * VLAND
337 */
338 case "/d/vland/morgoth/room/kata/ukat13":
339 object c = present_clone("/d/vland/morgoth/obj/kata/rfdcorpse",
340 environment(ME));
341 // Bequemer, das auf 0 zu setzen, wenn's klappt, bei sovielen
342 // Hinderungsgruenden. ;-)
343 blocker = 1;
344 // Leiche liegt da.
345 if ( objectp(c) )
346 {
347 // Feuerdaemon anwesend: der blockt den Versuch
348 if ( present_clone("/d/vland/morgoth/npc/kata/firedemon3",
349 environment(ME)) )
350 {
351 msg_self = "Der Feuerdaemon droht Dir mit sengender Hoellenpein. "
352 "Beschwichtigend trittst Du einen Schritt zurueck.";
353 msg_other = PL->Name(WER)+" tritt auf den Aschehaufen zu, wird "
354 "aber von dem Feuerdaemon bedroht und weicht wieder zurueck.";
355 }
356 // Aschehaufen nicht mehr heiss genug?
357 else if ( c->QueryDecay()<2 ) {
358 msg_self = c->Name(WER,1)+" ist schon zu sehr abgekuehlt und "
359 "wuerde nicht mehr genug Hitze spenden, um "+kr+" zu trocknen.";
360 }
361 else
362 {
363 blocker = 0;
364 msg_self = "Dich vorsichtig umschauend, legst Du "+kr+" in die "
365 "Naehe "+c->name(WESSEN,1)+". Hoffentlich gelingt das in "
366 "dieser unwirtlichen Umgebung!";
367 msg_other = PL->Name(WER)+" beugt sich zum Boden hinuntern und "
368 "legt vorsichtig ein Kraut in die Naehe "+c->name(WESSEN,1)+".";
369 }
370 short_desc = kraut->Name(WER)+" liegt neben "+c->name(WEM,1)+
371 ", offenbar soll "+kraut->QueryPronoun(WER)+" getrocknet werden";
372 }
373 // Keine Leiche da? Dann geht's nicht.
374 else {
375 msg_self = "Genausowenig, wie Dir die Flammen in diesem Inferno "
376 "etwas anhaben koennen, so wenig kannst Du sie nutzen, um "+
377 kr+" zu trocknen.";
378 }
379 break;
380 case "/d/vland/morgoth/room/kata/kata5":
381 object ob = present_clone("/d/vland/morgoth/npc/kata/ghost",
382 environment(ME));
383 blocker = 1;
384 // Geist anwesend? Keine Chance.
385 if ( objectp(ob) ) {
386 msg_self = ob->Name(WER,1)+" stoert Dich in Deiner Konzentration, "
387 "Du kannst so nicht arbeiten!";
388 }
389 // Umgebung noch neblig? Dann nicht trocknen.
390 else if ( environment(ME)->QueryFog() ) {
391 msg_self = "In diesem verdammten Nebel ist absolut nichts zu "
392 "sehen. Ausserdem ist es hier viel zu feucht, "+kr+" wuerde "
393 "ohnehin nur vor Deiner Nase wegschimmeln.";
394 }
395 // Feuer brennt nur noch 90 Sekunden? Dann lohnt sich das nicht.
396 else if ( query_next_reset(environment()) < time()+90 ) {
397 msg_self = "Ein pruefender Blick auf das Feuer zeigt Dir, dass "
398 "es wohl nicht mehr lange genug brennen wird, um "+kr+" noch "
399 "erfolgreich trocknen zu koennen.";
400 }
401 else {
402 blocker = 0;
403 msg_self = "Du legst "+kr+" in angemessenem Abstand zum Feuer "
404 "auf den Boden und wartest gespannt, ob Dir hier wohl eine "
405 "brauchbare Trocknung gelingen wird.";
406 msg_other = PL->Name(WER)+" bueckt sich zum Boden und legt etwas "
407 "ans Feuer, anscheinend ein Kraut, das "+PL->QueryPronoun(WER)+
408 " trocknen will.";
409 short_desc = kraut->Name(WER)+" liegt zum Trocknen am Feuer";
410 }
411 break;
412 case "/d/vland/alle/koomi_v/wschenke/room/waldschenke":
413 msg_self = "Dieser Kachelofen ist ungemein praktisch. Du legst "+
414 kr+" einfach oben drauf, und die kuschelige Waerme trocknet "+
415 kraut->QueryPronoun(WEN)+" beinahe von selbst.";
416 msg_other = PL->Name(WER)+" legt ein Kraut zum Trocknen oben auf "
417 "den Kachelofen, offenbar recht angetan von dessen kuscheliger "
418 "Waerme.";
419 short_desc = kraut->Name(WER)+" liegt zum Trocknen auf dem "
420 "Kachelofen";
421 break;
422 /*
423 * DEBUGZWECKE
424 */
425 case "/players/arathorn/workroom":
426 msg_self = "Du haeltst das Kraut vors Feuer und beginnst die "
427 "Trocknung.";
428 msg_other = PL->Name(WER)+" schickt sich an, ein Kraut am Feuer zu "
429 "trocknen.";
430 short_desc = kraut->Name(WER)+" liegt zum Trocknen am Feuer";
431 break;
432 }
433 // Raummeldungen entsprechend der eingestellten Texte ausgeben.
434 tell_object(PL, BS(msg_self));
435 if ( msg_other )
436 tell_room(environment(ME), BS(msg_other), ({PL}));
437 // Callout starten, wenn niemand das Trocknen verhindert.
438 if ( !blocker )
439 call_out(#'dry_plant, drying_delay, kraut, callout_msgs);
440 // Ansonsten das Kraut in den Spieler zurueck, das ja oben schon
441 // in den Trockner bewegt wurde.
442 else {
443 kraut->move(PL, M_GET);
444 }
445 }
446 return 1;
447}
448
449// Kraut wird getrocknet, sofern der Spieler noch im Raum ist, ...
450private void dry_plant(object kraut, string *msgs) {
Arathorn71bb0a92018-08-29 20:12:49 +0200451 if ( objectp(PL) && environment(PL) == environment(ME) )
452 {
453 if (kraut->move(PL, M_GET) == MOVE_OK )
454 {
455 tell_object(PL, BS(msgs[0]));
456 tell_room(environment(ME), BS(msgs[1]), ({PL}));
457 kraut->DryPlant(drying_quality);
458 return;
459 }
460 else
461 {
462 tell_object(PL, BS("Du kannst " + kraut->name(WEN,1) + " nicht mehr "
463 "tragen."));
464 }
MG Mud User88f12472016-06-24 23:31:02 +0200465 }
466 // ... ansonsten laeuft die Trocknung weiter, und das Kraut verbrennt.
Arathorn71bb0a92018-08-29 20:12:49 +0200467 tell_room(environment(ME), BS(kraut->Name(WER,1)+" wird extrem dunkel, "
468 "bald wird "+kraut->QueryPronoun(WER)+" zu nichts mehr zu gebrauchen "
469 "sein!"));
470 // Das Delay fuer diesen zweiten Callout ist immer fix. Kommt hoffentlich
471 // selten genug vor und braucht daher eher nicht extra aus dem Master
472 // geholt zu werden.
473 call_out(#'destroy_herb, 20, kraut);
MG Mud User88f12472016-06-24 23:31:02 +0200474}
475
476// Zerstoerung des Krautes. Da die Krautobjekte selbst eine Meldung
477// ausgeben, wenn DryPlant(0) gerufen wird, wird erst das Kraut ins
478// Environment bewegt und erst danach die Funktion gerufen.
479private void destroy_herb(object kraut) {
480 kraut->move(environment(ME),M_PUT);
481 kraut->DryPlant(0);
482}
483
484// Nur die korrekten Krautobjekte koennen in den Trockner bewegt werden.
485// Schuetzt natuerlich nicht vor M_NOCHECK, aber wenn das vorkommen sollte,
486// muss vielleicht noch weiter abgesichert werden, oder der verursachende
487// Magier ausgeschimpft. ;-)
488varargs int PreventInsert(object ob) {
Arathorn96e85292018-10-10 22:54:24 +0200489 if (clonep(ob) && IS_PLANT(ob))
MG Mud User88f12472016-06-24 23:31:02 +0200490 return ::PreventInsert(ob);
491 return 1;
492}