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