blob: 8e4d8ae7b878baf1212290395922c98bdb1fbee9 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// corpse.c -- corpse standard object
4//
5// $Id: corpse.c 9391 2015-12-07 22:28:53Z Arathorn $
6
7// A corpse.
8//
9// Ekeltexte by Boing
10//
11// This is a decaying corpse. It is created automatically
12// when a player or monster dies.
13//
14// Erweiterung Raschaua:
15// - Kopieren von P_CLASS
16// - Teilweises aufessen
17#pragma strict_types
18#pragma save_types
19#pragma range_check
20#pragma pedantic
21
22//#define NEED_PROTOTYPES
23
24inherit "std/container";
25
26#include <properties.h>
27#include <language.h>
28#include <defines.h>
29#include <moving.h>
30#include <wizlevels.h>
31#include <living/life.h>
32#include "/secure/scoremaster.h"
33
34#define CORPSE_OBJ "/std/corpse.c"
35#define PILE_OBJ "/std/pile.c"
36
37nosave int _decay = 4;
38nosave string _name = "Unbekannt";
39nosave object moerder;
40private nosave int gespottet = 0;
41nosave int nahrung_gesamt = 1;
42nosave int nahrung_aktuell = 1;
43// Spielerleiche?
44private nosave status spielerleiche;
45
46void Identify( object ob );
47void do_decay();
48int QueryDecay();
49static int mampf( string str );
50static int spott(string str);
51void ChannelMessageJeer( mixed sender, string text, int flag );
52object _channel( object ob );
53void transform_into_pile();
54
55void create()
56{
57 if (object_name(ME) == __FILE__[0..<3]) {
58 set_next_reset(-1);
59 }
60 ::create();
61 if( clonep(this_object()) )
62 {
63 AddId(({ "leiche","\nleiche","rest","ueberrest"}));
64 SetProp( P_GENDER, FEMALE );
65 SetProp( P_NAME, "Leiche" );
66 SetProp( P_MATERIAL, ([ MAT_MISC_DEAD: 100 ]) );
67 SetProp( P_CORPSE_DECAY_TIME, 30 );
68 SetProp(P_NO_SCORE,1);
69 AddCmd(({"iss","verspeise"}),"mampf");
70 AddCmd("spotte","spott");
71 SetProp(P_ARTICLE, 1);
72 }
73 else
74 SetProp( P_ARTICLE, 0 );
75}
76
77/* Damit die Leiche nicht voll wird... */
78int MayAddWeight( int weight ) { return 0; }
79int MayAddObject( object ob ) { return 1; }
80
81
82/* Humni, 2004-06-16: Entstatict */
83string _query_leichen_name()
84{ return _name; }
85
86/* Uebernehme den Namen von ob */
87void Identify( object ob )
88{
89 closure cl;
90 int i;
91 string info;
92
93 spielerleiche = query_once_interactive(ob);
94 cl=symbol_function("QueryProp", ob);
95 _name = (string) ob->name(WESSEN,0);
96 SetProp( P_SHORT, "Die Leiche "+ _name );
97 SetProp( P_LONG, "Du siehst die sterblichen Ueberreste "+ _name + ".\n" );
98 _decay = 4;
99 SetProp( P_ORIG_NAME, to_string(ob->name(RAW)) );
100 SetProp( P_PILE_NAME, to_string(ob->name(WEM)) );
101 AddId( "\nleiche "+ QueryProp(P_PILE_NAME) );
102 SetProp( P_KILLER, (object) funcall(cl, P_KILLER) );
103 SetProp( P_ATTRIBUTES, (mapping) funcall(cl, P_ATTRIBUTES) );
104 SetProp( P_LAST_DAMTYPES, (string *) funcall(cl, P_LAST_DAMTYPES) );
105 SetProp( P_XP, to_int(funcall(cl, P_XP)) );
106 SetProp( P_SIZE, to_int(funcall(cl, P_SIZE)) );
107 SetProp( P_LEVEL, to_int(funcall(cl, P_LEVEL)) );
108 SetProp( P_MAX_HP, to_int(funcall(cl, P_MAX_HP)) );
109 SetProp( P_RACE, to_string(funcall(cl, P_RACE)) );
110 SetProp( P_CLASS, (string *)(funcall(cl, P_CLASS)) );
111 SetProp( P_HANDS, (mixed *) funcall(cl, P_HANDS) );
112 SetProp( P_WEIGHT, (mixed *) funcall(cl, P_WEIGHT) );
113 SetProp( P_ALIGN, to_int(funcall(cl, P_ALIGN)) );
114 SetProp( P_ORIG_FILE_NAME, object_name(ob) );
115 SetProp( P_HEAL, to_int(funcall(cl, P_HEAL)) );
116
117 // Saettigung der Leiche berechnen
118 // P_WEIGHT und P_SIZE werden verwendet, Mittel bilden
119 // Ein Saettigungspunkt fuer (konservative Rechnung):
120 // 5 kg
121 // 12 cm
122 // Beispiele:
123 // Mensch, 1.80 m gross, 75 kg schwer:
124 // 180/12 + 75/5 = 15 + 15 = 30
125 // Kuh, 1.50 m gross, 500 kg schwer:
126 // 150/12 + 500/5 = 12 + 100 = 112
127 // Drache, 5 m gross, 1500 kg schwer:
128 // 500/12 + 1500/5 = 41 + 300 = 341
129 nahrung_gesamt = QueryProp(P_WEIGHT)/5000 + QueryProp(P_SIZE)/12;
130 if (nahrung_gesamt <= 0)
131 nahrung_gesamt = 1;
132 nahrung_aktuell = nahrung_gesamt;
133
134 if ( intp(i = funcall(cl, P_CORPSE_DECAY_TIME)) && i > 2 )
135 SetProp( P_CORPSE_DECAY_TIME, i );
136
137 call_out( "do_decay", QueryProp(P_CORPSE_DECAY_TIME) );
138
139 if ( !query_once_interactive(ob) )
140 moerder = (object) "/std/corpse"->_channel(ob);
141}
142
143public int IsPlayerCorpse() { return spielerleiche; }
144
145public string QueryHealInfo()
146{
147 string info = "Solltest Du auf die aberwitzige Idee verfallen, diese "
148 "Leiche zu essen, ";
149 switch( QueryProp(P_HEAL) )
150 {
151 case -__INT_MAX__..-100:
152 info += "wird Dir das erheblichen Schaden zufuegen.";
153 break;
154 case -99..-11:
155 info += "ist das ausgesprochen ungesund fuer Dich.";
156 break;
157 case -10..-1:
158 info += "wird Dir sicher ein wenig uebel werden.";
159 break;
160 case 0..5:
161 info += "wird Dir nichts schlimmes passieren.";
162 break;
163 case 6..__INT_MAX__:
164 info += "koenntest Du sogar ein wenig geheilt werden.";
165 break;
166 }
167 return info;
168}
169
170private string knabber_text()
171{
172 string txt;
173 switch (nahrung_aktuell * 4 / nahrung_gesamt) {
174 case 4:
175 // Leiche noch komplett
176 txt = "";
177 break;
178 case 3:
179 // noch maximal 99%
180 txt = " mit Knabberspuren uebersaete";
181 break;
182 case 2:
183 // noch maximal 74%
184 txt = " angefressene";
185 break;
186 case 1:
187 // noch maximal 49%
188 txt = " schon halb aufgefutterte";
189 break;
190 default:
191 // noch maximal 24%
192 txt = " total abgenagte";
193 break;
194 }
195 return txt;
196}
197
198static string _query_short()
199{
200 string txt;
201 switch(_decay) {
202 case 4:
203 txt = "Die"+knabber_text()+" Leiche ";
204 break;
205 case 3:
206 txt = "Die bereits ziemlich stinkende"+knabber_text()+" Leiche ";
207 break;
208 case 2:
209 txt = "Die schimmelnde und halbverweste"+knabber_text()+" Leiche ";
210 break;
211 case 1:
212 txt = "Die verfaulten"+(sizeof(knabber_text()) ?
213 "n":"")+" Einzelteile ";
214 break;
215 }
216 txt += _name;
217 return txt;
218}
219
220void do_decay()
221{
222 _decay -= 1;
223
224 if ( _decay > 0 )
225 {
226 if ( (_decay == 2) && (QueryProp( P_HEAL ) >= -4) )
227 SetProp( P_HEAL, -4 );
228 call_out( "do_decay", QueryProp(P_CORPSE_DECAY_TIME) );
229 return;
230 }
231
232 transform_into_pile();
233 remove();
234}
235
236/* Haeh? Das move ins env macht der Master im prepare_destruct() doch eh? */
237/*
238varargs int remove()
239{
240 // units bekommen eine Chance zur Vereinigung...
241 filter_objects( all_inventory(ME), "move", environment(ME), M_SILENT );
242 return ::remove();
243}
244*/
245
246int QueryDecay() { return _decay; }
247
248static int * _query_nahrung()
249{ return ({nahrung_aktuell, nahrung_gesamt}); }
250
251private string mampf_heilung(int wieviel)
252{
253 int heal;
254 string msg;
255 heal = QueryProp(P_HEAL);
256 // Anteil an Gesamtheilung ausrechnen
257 heal = heal * wieviel / nahrung_gesamt;
258 if ( ( heal ) < 0 ) {
259 //
260 this_player()->do_damage( random(-heal), this_object() );
261 msg = "Buah, diese Leiche war zweifellos nicht besonders gesund.\n";
262 } else {
263 this_player()->heal_self( random(heal) );
264 msg = "Hmmm, lecker!\n";
265 }
266 return msg;
267}
268
269static int mampf( string str )
270{
271 int gegessen;
272
273 _notify_fail("Was moechtest Du essen?\n");
274
275 if ( !str || !id(str) )
276 return 0;
277
278 if (this_player()->QueryProp(P_GHOST))
279 {
280 _notify_fail("Das wuerde durch Dich hindurch fallen.\n");
281 return 0;
282 }
283
284 // Das folgende ist nicht ganz sauber, da die Staerke bei eat_food nicht
285 // unbedingt dem Saettigungswert entsprechen muss (wegen FOOD_VALUE).
286 gegessen = (int) this_player()->QueryProp(P_MAX_FOOD) -
287 (int) this_player()->QueryProp(P_FOOD);
288 if (gegessen <= 0) {
289 // Spieler ist proppenvoll, Meldung ausgeben
290 gegessen = 0;
291 write("Du bekommst von der Leiche nicht einen Bissen mehr runter.\n");
292 } else if (gegessen >= nahrung_aktuell) {
293 // spieler kann die gesamte Leiche essen, also entfernen.
294 this_player()->eat_food(nahrung_aktuell);
295 // Verdammt. eat_food() kann TP umgebracht haben und im Falle eines NPC
296 // ist der dann weg.
297 if (objectp(this_player())) {
298 write(mampf_heilung(nahrung_aktuell));
299 say( sprintf("%s wird von %s voll Hingebung verspeist.\n",
300 capitalize(name(WER)),
301 (string) this_player()->name(WEM)) );
302 }
303 transform_into_pile();
304 remove();
305 } else {
306 // Auch teilweise Verspeisung ist moeglich, nahrung_aktuell anpassen
307 this_player()->eat_food(gegessen);
308 if (objectp(this_player())) {
309 write(mampf_heilung(gegessen)+"Leider bist Du nicht in der Lage,"
310 " alles aufzuessen.\n");
311 say( sprintf("%s knabbert an %s herum.\n",
312 (string) this_player()->name(),
313 capitalize(name(WEM)) ) );
314 }
315 nahrung_aktuell -= gegessen;
316 }
317 return 1;
318}
319
320
321static int spott( string str )
322{
323 if ( !str )
324 return _notify_fail( "Syntax: spotte <text>\n" ), 0;
325
326 if ( !objectp(moerder) )
327 return _notify_fail( "Dieses Opfer ist den Spott nicht wert.\n" ), 0;
328
329 if ( PL != moerder )
330 return _notify_fail( "Du kannst nur Deine eigenen Opfer "
331 +"verspotten!\n" ), 0;
332
333 if ( gespottet )
334 return _notify_fail( "Du kannst Dein Opfer nur einmal verspotten!\n" )
335 , 0;
336
337 if ( _decay < 4 )
338 return _notify_fail( "Da solltest Du schon etwas spontaner sein.\n" )
339 , 0;
340
341 str = (string) PL->_unparsed_args();
342
343 switch ( str[0] )
344 {
345 case ':':
346 "/std/corpse"->ChannelMessageJeer( PL, str[1..], MSG_EMOTE );
347 break;
348
349 case ';':
350 "/std/corpse"->ChannelMessageJeer( PL, str[1..], MSG_GEMOTE );
351 break;
352
353 default:
354 "/std/corpse"->ChannelMessageJeer( PL, str, MSG_SAY );
355 break;
356 }
357
358 gespottet = 1;
359 write( "Du verspottest Dein totes Opfer.\n" );
360
361 return 1;
362}
363
364
365void ChannelMessageJeer( mixed sender, string text, int flag )
366{
367 if (member(inherit_list(previous_object()),CORPSE_OBJ)>-1)
368 CHMASTER->send( "Moerder", sender, text, flag );
369}
370
371
372// _channel() --
373#define KILL_MESSAGES \
374"Jetzt hat mich doch glatt %s erwischt :(", \
375"Wie soll das noch enden, %s?", \
376"Unglaublich, wie hat %s das geschafft?", \
377"RACHE! Bringt %s um!", \
378"%s ist staerker als ich dachte.", \
379"Wenn ich Dich erwische, %s!", \
380"%s hat mich ermordet!", \
381"Welche Schmach! %s hat mich besiegt.", \
382"Huetet Euch vor %s!", \
383"Warum hat mir niemand gegen %s geholfen?", \
384"%s, Du Monsterschaender!", \
385"Monster aller Regionen, vereinigt Euch gegen %s!", \
386"Danke, %s, Du hast mich von dieser schrecklichen, " \
387"sterblichen Huelle befreit.", \
388"%s? Ich bin dann jetzt weg.", \
389"Macht Euch keine Muehe, %s hat mich mal kurz zu " \
390"Gevatter Tod geschickt.", \
391"Oh nein, %s hat mich schon wieder kaltgemacht!", \
392"Sheriff! Verhafte %s!", \
393"Hilfe! Diebe! Moerder! Halsabschneider! %s!", \
394"Wieder mal an %s gestorben, find ich albern!", \
395"%s, probier das bei Anne!", \
396"Und wieder ein Drittel Erfahrung weg wegen %s...", \
397"Oh waer ich doch ein Spieler, dann duerfte mich "\
398"%s nicht mehr toeten!", \
399"Wenn Du das noch oefter machst, %s, dann spiele "\
400"ich hier nicht mehr!", \
401"%s, wieso redet der Kerl hier in Grossbuchstaben "\
402"zu mir? CAPS-LOCK kaputt?", \
403"%s ist schuld!",\
404"So schaff ich's wohl nie, Seher zu werden, %s :(",\
405"Musste das WIRKLICH sein, %s?",\
406"Wuenscht mir ne kurze Todessequenz, ich hab sie "\
407"%s zu verdanken...",\
408"Naechstes Mal bring mir lieber Post statt mich "\
409"zu ermorden, %s!",\
410"%s, wieso sagt der Typ: KOMM MIT MIR, STERBLICHER?",\
411"Ich glaub, jetzt kenne ich ALLE Todessequenzen, %s!",\
412"Was, %s hat mir WIE VIELE Lebenspunkte abgezogen???",\
413"Verdammt, %s wollte nicht sterben...",\
414"Tod den Monsterschaendern! Straft %s!",\
415"Naechstes Mal werde ICH siegen, %s!",\
416"Findest Du das fair, %s?",\
417"Das war ein gemeiner Tiefschlag, %s!",\
418"Wenn ich mal gross bin, zahl ich Dir das alles "\
419"heim, %s!",\
420"ALAAAAAARM! %s IST AUSGEBROCHEN!",\
421"Ein Koenigreich fuer den, der mir den Kopf von "\
422"%s bringt!",\
423"Suche Killer, zahle gut, Zielperson %s.",\
424"Das sag ich alles Boing, %s!",\
425"Das sag ich alles Rumata, %s!",\
426"Das sag ich alles Jof, %s!",\
427"Das sag ich alles dem Sheriff, %s!",\
428"Komm Du mir nur wieder, %s!",\
429"Ich fordere Revanche, %s!",\
430"Sheriff! Unternimm was gegen %s!",\
431"%s, wer hat DICH denn eingeladen?",\
432"NAECHSTES MAL NEHM ICH DICH AUCH MIT, %s!",\
433"Haetten wir das nicht ausdiskutieren koennen, %s?",\
434"Dich merk ich mir, %s!",\
435"Na prima, schon wieder dieser dunkle Typ! Und "\
436"alles nur wegen %s.",\
437"Hallo? Hat jemand meinen Koerper gesehen? Muesste "\
438"irgendwo bei %s liegen!",\
439"%s, waer jetzt nicht eigentlich Vorlesung?",\
440"Lern lieber, statt unschuldige Monster zu er"\
441"morden, %s!",\
442"Ohne dieses Lag haette mich %s nicht umgebracht!",\
443"In spaetestens einer Stunde komme ich wieder, %s!",\
444"Na warte %s, beim naechsten Mal trete ich Dir "\
445"kraeftig in den Gedan-Bereich!",\
446"SCHIEBUNG, der letzte Schlag von %s war nicht "\
447"regelgerecht!",\
448"Lieber eine H2O-Vergiftung, als von %s ermordet "\
449"zu werden!",\
450"Die Ehre werd ich %s nicht antun, und hier "\
451"herumposaunen, wer mich umgenietet hat!",\
452"Is mir doch egal %s, ich glaube an "\
453"die Wiedergeburt!",\
454"Aber vorsicht, %s isch kuuul maen!",\
455"Ok, %s, Du wirst von meiner Erwarteliste gestrichen!",\
456"Das naechste Mal sieht man unsere beiden Namen auf [Tod:], %s!",\
457"Magier zu mir, hier ist ein Bug: %s ist immer noch nicht tot!",\
458"Morgen frueh um halb sechs in der Arena, %s! Ich hab die Wahl der Waffen.",\
459"%s ist schlimmer als das Mensaessen. Absolut toedlich.",\
460"Mist, meine Vorsicht hat versagt! Und das bei %s!",\
461"%s, die Hydra ist mir lieber...",\
462"So, meine Ignoriereliste ist schon wieder um einen Namen laenger, %s."
463
464#define KILL_MESSAGES2 \
465"Feierabend! Danke, %s!",\
466"Toll! GENAU das hab ich jetzt gebraucht! Super, %s! :(",\
467"Schon wieder ein Tag versaut wegen %s!",\
468"Ihr sagt, ICH sei ein Monster? Ihr kennt %s nicht!!!",\
469"Sperrt %s mal in's Polargebiet! Gaebe ein gutes Untier ab...",\
470"Freiheit fuer Nicht-Spieler! Vernichtet %s!",\
471"Merlin, mach %s zum Magier!",\
472"%s ist NICHT zu meiner Beerdigung eingeladen!",\
473"Ich hab keine Angst vor Dir, %s!",\
474"%s ist doof und stinkt!",\
475"Moegest Du im Lag verrotten, %s!",\
476"%s wird gleich das Spiel verlassen, um meiner Rache zu entgehen!",\
477"Der Todestag von %s wird fuer mich ein Feiertag sein!",\
478"%s ist ein Metzelskript, ich hab's genau gesehen!", \
479"Waer ich Tanjian, haettest Du das nicht geschafft, %s!", \
480"Das naechste Mal komme ich als Kaempfer wieder, %s!", \
481"Ich lass' mich aufwerten und werde Zauberer, %s!", \
482"Gildenbalance! %s ist viel zu stark!", \
483"Jetzt ist mir das Kleingeld zum Tanken ausgegangen, %s...", \
484"%s hat ein Zap-Tool!", \
485"%s, Du <zensiert>!", \
486"%s, das ist doch Hullepanz. (c) Catweazle", \
487"Bald bin ich SuperSeher, %s!", \
488"Mit Dir 'piel ich nich' mehr, %s, Du hast in mein Foermssen depinkelt!", \
489"Verdammt, %s muss mir den Feenring geklaut haben...", \
490"Nie ist ein Kleriker in der Naehe, wenn man ihn braucht, %s...", \
491"Menno, %s, wo war hier noch mal die Heilstelle?", \
492"Hoffentlich werde ich naechstes Mal als Kuh wiedergeboren, %s...", \
493"Wenn Du sonst noch Probleme hast, %s, geh' zu Marvin und red' " \
494"mit ihm darueber.", \
495"Du, %s, Gewalt ist keine Loesung, lass uns darueber diskutieren.", \
496"Das naechste Mal zeig' ich Dir meine Mateteesammlung, %s.", \
497"%s eunt domum!", \
498"%s, ist es so kalt hier oder bin ich das?", \
499"Ich war schon wieder zur falschen Zeit am falschen Ort, %s...", \
500"Danke, %s. Im Namen des Mondes werde ich Dich bestrafen!", \
501"Das war mal wieder ein Schuss in den Ofen, %s...", \
502"Kannst Du das mit Deinem Gewissen vereinbaren, %s?", \
503"Und Kandri sprach: Mein ist die Rache, %s!", \
504"%s, Du haettest meine Leiche nicht auch noch schaenden muessen...", \
505"%s, ich kann so nicht arbeiten!", \
506"%s, ich geb' Dir mal 2 Muenzen, dann kannst Du Deine Sorgen " \
507"jemand anderem erzaehlen...", \
508"Manchmal verspeist Du den Baer, %s, manchmal verspeist " \
509"der Baer Dich...", \
510"Das naechste Mal betrittst _Du_ die Welt des Schmerzes, %s!", \
511"Wenn ich wiederkomme, %s, werde ich erst Dich toeten, dann " \
512"Deinen Partner, dann Deine Brueder und Schwestern und jeden " \
513"der Dich kennt!", \
514"Oh nein, %s! Schon wieder diese ewig lange Todessequenz mit der " \
515"Drachenschule!", \
516"%s, wo bekomme ich jetzt einen neuen Koerper her?", \
517"Lass Dir meine Leiche schmecken, %s.", \
518"Haeh?", \
519"Ja, aber wieso das denn? Och menno, %s!", \
520"So ein Mist, %s, ich hatte 'nen Disconnect...", \
521"*winkewinke*, %s!", \
522"Heute ist nicht alle Tage, ich komm' wieder, keine Frage.", \
523"Lass das, %s!", \
524"Niemand! Niemand nennt mich eine feige Sau, %s!", \
525"Da hab' ich jetzt wohl verloren, %s...", \
526"%s, ich kann nicht metzeln, ich kann nur sterben...", \
527"Hattest Du ueberhaupt einen Termin, %s?", \
528"Du warst gar nicht an der Reihe, %s!", \
529"Aetsch, %s, der Kill zaehlt nicht!", \
530"Jetzt noch mal mit Gefuehl, %s.", \
531"Tschuess erstmal, %s.", \
532"Ich weiss nicht ob Du es gemerkt hast, %s, aber " \
533"ich bin schon tot...", \
534"%s, ich haette nicht gedacht, dass ich noch mal sterbe " \
535"bevor Taramis angeschlossen wird...", \
536"Ich wollte sowieso grade gehen, %s.", \
537"Shit happens, %s.", \
538"Dazu faellt mir jetzt nix mehr ein, %s."
539
540#define KILL_MESSAGES3 \
541"Was heisst denn \"Dein Teddy knuddelt Dich ein letztes Mal\", %s?", \
542"Ich bin beeindruckt, %s.", \
543"Ok, Dein Gesicht merke ich mir, %s!", \
544"Kaum da, haut mich %s schon wieder tot... *grummel*", \
545"Ich werde Dich verfolgen, %s! Ich werde in Deine Traeume eindringen " \
546"und Dich in den Wahnsinn treiben! Du wirst diesen Tag noch verfluchen!", \
547"Ich geh ja schon, %s.", \
548"Auf den ersten Blick sieht %s gar nicht so gefaehrlich aus.", \
549"Von %s besiegt - wie peinlich.", \
550"Mist. Einmal nicht aufgepasst, schon wird man von %s ermordet.", \
551"Das war ein Glueckstreffer, %s!", \
552"Hah, das ist doch nur eine Fleischwunde! Gibst Du etwa schon auf, %s?", \
553"%s macht gerade eine destruktive Phase durch.", \
554"Zum Glueck ist das ja nur ein Spiel, %s. Sonst waere ich jetzt wirklich " \
555"boese.", \
556"Begrabe mich wenigstens anstaendig, %s.", \
557"Hm, die Flatrate brauch' ich dann wohl doch nicht, %s.", \
558"Na warte, %s! Zur Strafe werde ich gleich das Mud crashen!", \
559"Ich sollte nicht mehr soviel mudden. Dann muesste ich mich auch nicht mehr " \
560"ueber %s aergern.", \
561"Auf am Boden Liegende einzuschlagen! Schaem Dich, %s!", \
562"Einigen wir uns auf unentschieden, %s?", \
563"Ich sagte doch \"Ich ergebe mich!\", %s.", \
564"Aeh, %s, koennte das unter uns bleiben? Ich habe schliesslich einen " \
565"Ruf zu verlieren...", \
566"Du bist vielleicht staerker, %s, aber dafuer bin ich schoener.", \
567"Die Rechnung fuer die Behandlung meiner Minderwertigkeitskomplexe geht " \
568"an %s.", \
569"Ab und zu muss man %s ja gewinnen lassen, sonst gibt es wieder Traenen.", \
570"Bis eben war mir %s noch sympathisch.", \
571"Geht's Dir jetzt besser, %s?", \
572"Macht kaputt, was mich kaputt macht! Toetet %s!", \
573"Beim naechsten Mal mach' ich es Dir nicht mehr so einfach, %s!", \
574"Weisst Du, %s, ich habe nur verloren, weil Du... aeh, weil ich... " \
575"aeh... weil Du gewonnen hast.", \
576"Jo, immer feste druff, %s. Ist ja nur ein dummer NPC. *grummel*", \
577"Ich muss sagen, %s kann feste schlagen.", \
578"Also %s! Kommst hier rein, haust mich um und tust dann so, als sei nichts " \
579"gewesen...", \
580"In welcher Gilde konnte man nochmal \"befriede\" lernen, %s?", \
581"Tja, %s, aus diesem Kampf bist Du wohl nur als Vorletzter hervorgegangen" \
582"...", \
583"Vorsicht, %s greift immer von hinten an!", \
584"Was meint %s mit \"Sparringspartner\"?", \
585"Ich habe mir bei Dir nur deshalb keine Muehe gegeben, %s, weil Du eh nicht " \
586"stupst.", \
587"Huch, ich bin ja schon wieder auf -Moerder!", \
588"Ich spuck' Dir in's Auge und blende Dich, %s!", \
589"Huch, wo seid ihr alle hin?", \
590"Wer war das?", \
591"Moegest Du in interessanten Zeiten leben, %s.", \
592"Ich sehe was, was Du nicht siehst, %s, und es ist... schwarz.", \
593"Hey Maedels! Ratet, wen ich gerade getroffen habe!", \
594"%s?", \
595"Noch einmal sowas, %s, und ich lasse Deine Gilde abwerten. Ich kann das!", \
596"Was bedeutet 'Jemand beschwoert Dein Bild herauf.'? Warst Du das, %s?"
597
598private string *moerder_msgs = ({KILL_MESSAGES, KILL_MESSAGES2, KILL_MESSAGES3,
599"Sterben ist schoen, Sterben ist toll - Ach waer ich wie ein Kaempfer voll!",
600"Lauschige Nacht - ich geh mir die Sterne anschauen. Bis spaeter!",
601"Echt %s, das war 0815, keine Kreativitaet beim Toeten!",
602"%s, Du kannst ja gar ni... Verdammt!",
603"Kaempfer, Zauberer, Tanjian, alles Luschen! Ich werde Abenteurer, da ist "
604 "wenigstens Thrill!",
605"Toeten, Toeten, Toeten. Ist das alles, was Du kannst, %s?",
606"Ach geh doch Bluemchen pfluecken %s!",
607"Mein Tod war KEIN FP %s... HA!",
608"Lars gibt mir nen Whisky, wenn ich komme. Und Dir?",
609"Geh lernen, Depp!",
610"Auf der naechsten Mud-Party haut Dich mein Magier zurueck!",
611"Lass gut sein, tat eh nicht weh!",
612"Ich lass Dich von Zook abhaengen, %s!",
613"Koennen wir naechstes Mal nicht lieber einen trinken gehen, %s?",
614"Verdammt, meine neue Gilde ist ja noch gar nicht angeschlossen!",
615"Yohoho und ne Buddel voll Rum!",
616"Beim Kartenspiel haettest Du keine Chance gehabt %s!",
617"%s, Du hast echt keine Ahnung von stilvollem Metzeln...",
618"Was muss ich noch tun fuer Deinen Aufstieg, %s? *seufz*",
619"EK-Poser!",
620"Leistung ist was anderes, %s!",
621"Lass mich leeeeeeb... Arrrrggggh!",
622"Hast Du sonst nix in der Drachenschule gelernt, %s?",
623"Und wer kuemmert sich jetzt um meine Haustiere, %s?",
624"Ich musste sterben, Du willst mich nur beerben. Ich gehe "
625 "mit Stil, Du findest nicht viel.",
626"Ich habe nun mehr Tode als Du, %s. Topp mich, wenn Du kannst!",
627"Ok, dann geh ich halt WOW spielen.",
628"Toll, freut sich der Naechste. Wieder ne Todesfolge, %s.",
629"Du gucktest so traurig, %s, ich machte Dir meinen Tod zum Geschenk. "
630 "Sollst ja auch mal 'n Erfolgserlebnis haben!",
631"Nun reiche ich den letzten Becher, trinke den Wein, erkenne Dein Sein.",
632"%s hat nicht einmal getroffen. Ich habe mich wortwoertlich totgelacht.",
633"Lass mich nachdenken, %s. Ich starb fuer nen EK?",
634"Ich kann nicht glauben, dass das gerade passiert ist!",
635"Du Suender. Du sollst _nicht_ toeten!",
636"%s, mein Testament steckt im rechten Schuh!",
637"Sterben und sterben lassen, mein Freund. Wir sehen uns wieder!",
638"Und ich sag noch, %s... Das ist KEINE Schwertscheide... Aber Du musst "
639 "ja alles selbst ausprobieren.",
640"Soll das jetzt alles gewesen sein, %s?",
641"In meinem Code ist ein Fehler und gleich gibt's 'nen Crash.",
642"Ach, auch egal, %s. Ist eh gleich Schichtwechsel.",
643"Jofverdammt... warst Du gut, %s!",
644"Duelle von Killern enden meist fuer einen toedlich und das wirst "
645 "Du s... Argh!",
646"Bist Du sicher, dass Du den EK bekommen hast, %s?",
647"Danke %s! Weisst Du, ich hatte mit Zook gewettet, wer mich "
648 "toetet. Und ich habe eine Wiedergeburt gewonnen!",
649"Nun bin ich sicher vor Dir, %s!",
650"Ich mache jetzt Urlaub und habe Zook gebeten, meinen Reset "
651 "um einen Monat zu verschieben. Gluecklich, %s?",
652});
653
654
655int _query_kma() { return sizeof(moerder_msgs); }
656
657
658object _channel( object ob )
659{
660 int m_FMM, m_HP, m_WC, m_AC, s_HP, s_WC, s_AC;
661 string msg;
662 object rueck;
663
664 if (member(inherit_list(previous_object()),CORPSE_OBJ)>-1)
665 {
666 string killer;
667 int i, x, y, z, nr;
668 closure m_q, s_q;
669
670 while( previous_object(i) &&
671 !query_once_interactive(previous_object(i)) )
672 i++;
673
674 if( !previous_object(i) || IS_LEARNER(previous_object(i)) )
675 return rueck;
676
677 killer = (string) previous_object(i)->name();
678
679 if ( lower_case(killer) != getuid(previous_object(i)) )
680 killer = capitalize(getuid(previous_object(i)));
681
682 m_q = symbol_function( "QueryProp", ob ); // Monster
683 s_q = symbol_function( "QueryProp", previous_object(i) ); // Spieler
684
685 if ( (m_FMM = (int) funcall( m_q, P_FORCE_MURDER_MSG )) >= 0 )
686 if ( (object_name(ob) == "/obj/shut") ||
687 (m_FMM > 0) ||
688 (nr = (random(100) >= 99) ? 1 : 0 ) ||
689 (nr = ((x = (m_HP = (int) funcall( m_q, P_MAX_HP )) *
690 ((m_WC = (int) funcall( m_q, P_TOTAL_WC )) +
691 (m_AC = (int) funcall( m_q, P_TOTAL_AC ))))
692 > 200000) ? 2 : 0) ||
693 (nr = (((y = m_HP * (m_WC + m_AC)) >
694 (z = 5 * (s_HP = (int) funcall( s_q, P_MAX_HP )) *
695 ((s_WC = (int) funcall( s_q, P_TOTAL_WC )) +
696 (s_AC = (int) funcall( s_q, P_TOTAL_AC )))))
697 ? 3 : 0)))
698 {
699 SetProp( P_NAME, "Geist "+(string) ob->name(WESSEN, 0) );
700
701 if( !(msg = (string) ob->QueryProp(P_MURDER_MSG)) )
702 msg = moerder_msgs[random(sizeof(moerder_msgs))];
703
704 if ( stringp(msg) )
705 msg = sprintf( msg, killer || "Moerder" );
706
707 CHMASTER->send( "Moerder", this_object(), funcall(msg) );
708
709 rueck = previous_object(i);
710 }
711
712 log_file( "moerder.log",
713 sprintf( "MON(%O) COND(%d) NPC(%d), DIFF(%d,%d)\n",
714 ob, nr, x, y, z) );
715 }
716
717 return rueck;
718}
719
720void transform_into_pile() {
721 if( environment()->QueryProp(P_PREVENT_PILE) ) return;
722 object* inv = all_inventory();
723 if( sizeof(inv)<2 ) return;
724 object p = clone_object(PILE_OBJ);
725 filter_objects( inv, "move", p, M_SILENT | M_NOCHECK );
726 p->move( environment(), M_SILENT | M_NOCHECK );
727}