diff --git a/std/corpse.c b/std/corpse.c
new file mode 100644
index 0000000..8e4d8ae
--- /dev/null
+++ b/std/corpse.c
@@ -0,0 +1,727 @@
+// MorgenGrauen MUDlib               
+//
+// corpse.c -- corpse standard object
+//
+// $Id: corpse.c 9391 2015-12-07 22:28:53Z Arathorn $
+
+// A corpse.
+// 
+// Ekeltexte by Boing
+//
+// This is a decaying corpse. It is created automatically
+// when a player or monster dies.
+//
+// Erweiterung Raschaua:
+// - Kopieren von P_CLASS
+// - Teilweises aufessen
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma pedantic
+
+//#define NEED_PROTOTYPES
+
+inherit "std/container";
+
+#include <properties.h>
+#include <language.h>
+#include <defines.h>
+#include <moving.h>
+#include <wizlevels.h>
+#include <living/life.h>
+#include "/secure/scoremaster.h"
+
+#define CORPSE_OBJ "/std/corpse.c"
+#define PILE_OBJ "/std/pile.c"
+
+nosave int _decay = 4;
+nosave string _name = "Unbekannt";
+nosave object moerder;
+private nosave int gespottet = 0;
+nosave int nahrung_gesamt = 1;
+nosave int nahrung_aktuell = 1;
+// Spielerleiche?
+private nosave status spielerleiche;
+
+void Identify( object ob );
+void do_decay();
+int QueryDecay();
+static int mampf( string str );
+static int spott(string str);
+void ChannelMessageJeer( mixed sender, string text, int flag );
+object _channel( object ob );
+void transform_into_pile();
+
+void create()
+{
+  if (object_name(ME) == __FILE__[0..<3]) {
+    set_next_reset(-1);
+  }
+  ::create();
+  if( clonep(this_object()) )
+  {
+    AddId(({ "leiche","\nleiche","rest","ueberrest"}));
+    SetProp( P_GENDER, FEMALE );
+    SetProp( P_NAME, "Leiche" );
+    SetProp( P_MATERIAL, ([ MAT_MISC_DEAD: 100 ]) );
+    SetProp( P_CORPSE_DECAY_TIME, 30 );
+    SetProp(P_NO_SCORE,1);
+    AddCmd(({"iss","verspeise"}),"mampf");
+    AddCmd("spotte","spott");
+    SetProp(P_ARTICLE, 1);
+  }
+  else
+    SetProp( P_ARTICLE, 0 );
+}
+
+/* Damit die Leiche nicht voll wird... */
+int MayAddWeight( int weight ) { return 0; }
+int MayAddObject( object ob ) { return 1; }
+
+
+/* Humni, 2004-06-16: Entstatict */
+string _query_leichen_name()
+{   return _name;   }
+
+/* Uebernehme den Namen von ob */
+void Identify( object ob )
+{
+    closure cl;
+    int i;
+    string info;
+
+    spielerleiche = query_once_interactive(ob);
+    cl=symbol_function("QueryProp", ob);
+    _name = (string) ob->name(WESSEN,0);
+    SetProp( P_SHORT, "Die Leiche "+ _name );
+    SetProp( P_LONG, "Du siehst die sterblichen Ueberreste "+ _name + ".\n" );
+    _decay = 4;
+    SetProp( P_ORIG_NAME, to_string(ob->name(RAW))      );
+    SetProp( P_PILE_NAME, to_string(ob->name(WEM))      );
+    AddId( "\nleiche "+ QueryProp(P_PILE_NAME)          );
+    SetProp( P_KILLER,        (object)   funcall(cl, P_KILLER)        );
+    SetProp( P_ATTRIBUTES,    (mapping)  funcall(cl, P_ATTRIBUTES)    );
+    SetProp( P_LAST_DAMTYPES, (string *) funcall(cl, P_LAST_DAMTYPES) );
+    SetProp( P_XP,     to_int(funcall(cl, P_XP))        );
+    SetProp( P_SIZE,   to_int(funcall(cl, P_SIZE))      );
+    SetProp( P_LEVEL,  to_int(funcall(cl, P_LEVEL))     );
+    SetProp( P_MAX_HP, to_int(funcall(cl, P_MAX_HP))    );
+    SetProp( P_RACE,   to_string(funcall(cl, P_RACE))   );
+    SetProp( P_CLASS,  (string *)(funcall(cl, P_CLASS)) );
+    SetProp( P_HANDS,  (mixed *) funcall(cl, P_HANDS)   );
+    SetProp( P_WEIGHT, (mixed *) funcall(cl, P_WEIGHT)  );
+    SetProp( P_ALIGN,  to_int(funcall(cl, P_ALIGN))     );
+    SetProp( P_ORIG_FILE_NAME, object_name(ob)          );
+    SetProp( P_HEAL,   to_int(funcall(cl, P_HEAL))      );
+    
+    // Saettigung der Leiche berechnen
+    // P_WEIGHT und P_SIZE werden verwendet, Mittel bilden
+    // Ein Saettigungspunkt fuer (konservative Rechnung):
+    //           5 kg
+    //          12 cm
+    // Beispiele:
+    //          Mensch, 1.80 m gross, 75 kg schwer:
+    //          180/12 + 75/5 = 15 + 15 = 30
+    //          Kuh, 1.50 m gross, 500 kg schwer:
+    //          150/12 + 500/5 = 12 + 100 = 112
+    //          Drache, 5 m gross, 1500 kg schwer:
+    //          500/12 + 1500/5 = 41 + 300 = 341
+    nahrung_gesamt = QueryProp(P_WEIGHT)/5000 + QueryProp(P_SIZE)/12;
+    if (nahrung_gesamt <= 0)
+      nahrung_gesamt = 1;
+    nahrung_aktuell = nahrung_gesamt;
+
+    if ( intp(i = funcall(cl, P_CORPSE_DECAY_TIME)) && i > 2 )
+        SetProp( P_CORPSE_DECAY_TIME, i );
+
+    call_out( "do_decay", QueryProp(P_CORPSE_DECAY_TIME) );
+
+    if ( !query_once_interactive(ob) )
+        moerder = (object) "/std/corpse"->_channel(ob);
+}
+
+public int IsPlayerCorpse() { return spielerleiche; }
+
+public string QueryHealInfo()
+{
+  string info = "Solltest Du auf die aberwitzige Idee verfallen, diese "
+    "Leiche zu essen, ";
+  switch( QueryProp(P_HEAL) )
+  {
+    case -__INT_MAX__..-100:
+      info += "wird Dir das erheblichen Schaden zufuegen.";
+      break;
+    case -99..-11:
+      info += "ist das ausgesprochen ungesund fuer Dich.";
+      break;
+    case -10..-1:
+      info += "wird Dir sicher ein wenig uebel werden.";
+      break;
+    case 0..5:
+      info += "wird Dir nichts schlimmes passieren.";
+      break;
+    case 6..__INT_MAX__:
+      info += "koenntest Du sogar ein wenig geheilt werden.";
+      break;
+  }
+  return info;
+}
+
+private string knabber_text()
+{
+  string txt;
+  switch (nahrung_aktuell * 4 / nahrung_gesamt) {
+  case 4:
+    // Leiche noch komplett
+    txt = "";
+    break;
+  case 3:
+    // noch maximal 99%
+    txt = " mit Knabberspuren uebersaete";
+    break;
+  case 2:
+    // noch maximal 74%
+    txt = " angefressene";
+    break;
+  case 1:
+    // noch maximal 49%
+    txt = " schon halb aufgefutterte";
+    break;
+  default:
+    // noch maximal 24%
+    txt = " total abgenagte";
+    break;
+  }
+  return txt;
+}
+
+static string _query_short()
+{
+  string txt;
+  switch(_decay) {
+  case 4:
+    txt = "Die"+knabber_text()+" Leiche ";
+    break;
+  case 3:
+    txt = "Die bereits ziemlich stinkende"+knabber_text()+" Leiche ";
+    break;
+  case 2:
+    txt = "Die schimmelnde und halbverweste"+knabber_text()+" Leiche ";
+    break;
+  case 1:
+    txt = "Die verfaulten"+(sizeof(knabber_text()) ?
+                            "n":"")+" Einzelteile ";
+    break;
+  }
+  txt += _name;
+  return txt;
+}
+
+void do_decay()
+{
+    _decay -= 1;
+    
+    if ( _decay > 0 ) 
+        {
+          if ( (_decay == 2) && (QueryProp( P_HEAL ) >= -4) )
+            SetProp( P_HEAL, -4 );
+            call_out( "do_decay", QueryProp(P_CORPSE_DECAY_TIME) );
+            return;
+        }
+   
+    transform_into_pile();
+    remove();
+}
+
+/* Haeh? Das move ins env macht der Master im prepare_destruct() doch eh? */
+/*
+varargs int remove()
+{
+    // units bekommen eine Chance zur Vereinigung...
+    filter_objects( all_inventory(ME), "move", environment(ME), M_SILENT );
+    return ::remove();
+}
+*/
+
+int QueryDecay() { return _decay; }
+
+static int * _query_nahrung()
+{   return ({nahrung_aktuell, nahrung_gesamt});   }
+
+private string mampf_heilung(int wieviel)
+{
+  int heal;
+  string msg;
+  heal = QueryProp(P_HEAL);
+  // Anteil an Gesamtheilung ausrechnen
+  heal = heal * wieviel / nahrung_gesamt;
+  if ( ( heal ) < 0 ) {
+    // 
+    this_player()->do_damage( random(-heal), this_object() );
+    msg = "Buah, diese Leiche war zweifellos nicht besonders gesund.\n";
+  } else {
+    this_player()->heal_self( random(heal) );
+    msg = "Hmmm, lecker!\n";
+  }
+  return msg;
+}
+
+static int mampf( string str )
+{
+    int gegessen;
+
+    _notify_fail("Was moechtest Du essen?\n");
+    
+    if ( !str || !id(str) )
+        return 0;
+
+    if (this_player()->QueryProp(P_GHOST))
+    {
+	_notify_fail("Das wuerde durch Dich hindurch fallen.\n");
+	return 0;
+    }
+
+    // Das folgende ist nicht ganz sauber, da die Staerke bei eat_food nicht
+    // unbedingt dem Saettigungswert entsprechen muss (wegen FOOD_VALUE).
+    gegessen = (int) this_player()->QueryProp(P_MAX_FOOD) -
+      (int) this_player()->QueryProp(P_FOOD);
+    if (gegessen <= 0) {
+      // Spieler ist proppenvoll, Meldung ausgeben
+      gegessen = 0;
+      write("Du bekommst von der Leiche nicht einen Bissen mehr runter.\n");
+    } else if (gegessen >= nahrung_aktuell) {
+      // spieler kann die gesamte Leiche essen, also entfernen.
+      this_player()->eat_food(nahrung_aktuell);
+      // Verdammt. eat_food() kann TP umgebracht haben und im Falle eines NPC
+      // ist der dann weg.
+      if (objectp(this_player())) {
+	write(mampf_heilung(nahrung_aktuell));
+	say( sprintf("%s wird von %s voll Hingebung verspeist.\n",
+                   capitalize(name(WER)),
+                   (string) this_player()->name(WEM)) );
+      }
+      transform_into_pile();
+      remove();
+    } else {
+      // Auch teilweise Verspeisung ist moeglich, nahrung_aktuell anpassen
+      this_player()->eat_food(gegessen);
+      if (objectp(this_player())) {
+	write(mampf_heilung(gegessen)+"Leider bist Du nicht in der Lage,"
+               " alles aufzuessen.\n");
+      say( sprintf("%s knabbert an %s herum.\n",
+                   (string) this_player()->name(),
+                   capitalize(name(WEM)) ) );
+      }
+      nahrung_aktuell -= gegessen;
+    }
+    return 1;
+}
+
+
+static int spott( string str )
+{
+    if ( !str )
+        return _notify_fail( "Syntax: spotte <text>\n" ), 0;
+    
+    if ( !objectp(moerder) )
+        return _notify_fail( "Dieses Opfer ist den Spott nicht wert.\n" ), 0;
+    
+    if ( PL != moerder )
+        return _notify_fail( "Du kannst nur Deine eigenen Opfer "
+                             +"verspotten!\n" ), 0;
+
+    if ( gespottet )
+        return _notify_fail( "Du kannst Dein Opfer nur einmal verspotten!\n" )
+            , 0;
+
+    if ( _decay < 4 )
+        return _notify_fail( "Da solltest Du schon etwas spontaner sein.\n" )
+            , 0;
+
+    str = (string) PL->_unparsed_args();
+    
+    switch ( str[0] )
+        {
+        case ':':
+            "/std/corpse"->ChannelMessageJeer( PL, str[1..], MSG_EMOTE );
+            break;
+          
+        case ';':
+            "/std/corpse"->ChannelMessageJeer( PL, str[1..], MSG_GEMOTE );
+            break;
+          
+        default:
+            "/std/corpse"->ChannelMessageJeer( PL, str, MSG_SAY );
+            break;
+        }
+  
+  gespottet = 1;
+  write( "Du verspottest Dein totes Opfer.\n" );
+  
+  return 1;
+}
+
+
+void ChannelMessageJeer( mixed sender, string text, int flag )
+{
+  if (member(inherit_list(previous_object()),CORPSE_OBJ)>-1)
+      CHMASTER->send( "Moerder", sender, text, flag );
+}
+
+
+// _channel() --
+#define KILL_MESSAGES \
+"Jetzt hat mich doch glatt %s erwischt :(", \
+"Wie soll das noch enden, %s?", \
+"Unglaublich, wie hat %s das geschafft?", \
+"RACHE! Bringt %s um!", \
+"%s ist staerker als ich dachte.", \
+"Wenn ich Dich erwische, %s!", \
+"%s hat mich ermordet!", \
+"Welche Schmach! %s hat mich besiegt.", \
+"Huetet Euch vor %s!", \
+"Warum hat mir niemand gegen %s geholfen?", \
+"%s, Du Monsterschaender!", \
+"Monster aller Regionen, vereinigt Euch gegen %s!", \
+"Danke, %s, Du hast mich von dieser schrecklichen, " \
+"sterblichen Huelle befreit.", \
+"%s? Ich bin dann jetzt weg.", \
+"Macht Euch keine Muehe, %s hat mich mal kurz zu " \
+"Gevatter Tod geschickt.", \
+"Oh nein, %s hat mich schon wieder kaltgemacht!", \
+"Sheriff! Verhafte %s!", \
+"Hilfe! Diebe! Moerder! Halsabschneider! %s!", \
+"Wieder mal an %s gestorben, find ich albern!", \
+"%s, probier das bei Anne!", \
+"Und wieder ein Drittel Erfahrung weg wegen %s...", \
+"Oh waer ich doch ein Spieler, dann duerfte mich "\
+"%s nicht mehr toeten!", \
+"Wenn Du das noch oefter machst, %s, dann spiele "\
+"ich hier nicht mehr!", \
+"%s, wieso redet der Kerl hier in Grossbuchstaben "\
+"zu mir? CAPS-LOCK kaputt?", \
+"%s ist schuld!",\
+"So schaff ich's wohl nie, Seher zu werden, %s :(",\
+"Musste das WIRKLICH sein, %s?",\
+"Wuenscht mir ne kurze Todessequenz, ich hab sie "\
+"%s zu verdanken...",\
+"Naechstes Mal bring mir lieber Post statt mich "\
+"zu ermorden, %s!",\
+"%s, wieso sagt der Typ: KOMM MIT MIR, STERBLICHER?",\
+"Ich glaub, jetzt kenne ich ALLE Todessequenzen, %s!",\
+"Was, %s hat mir WIE VIELE Lebenspunkte abgezogen???",\
+"Verdammt, %s wollte nicht sterben...",\
+"Tod den Monsterschaendern! Straft %s!",\
+"Naechstes Mal werde ICH siegen, %s!",\
+"Findest Du das fair, %s?",\
+"Das war ein gemeiner Tiefschlag, %s!",\
+"Wenn ich mal gross bin, zahl ich Dir das alles "\
+"heim, %s!",\
+"ALAAAAAARM! %s IST AUSGEBROCHEN!",\
+"Ein Koenigreich fuer den, der mir den Kopf von "\
+"%s bringt!",\
+"Suche Killer, zahle gut, Zielperson %s.",\
+"Das sag ich alles Boing, %s!",\
+"Das sag ich alles Rumata, %s!",\
+"Das sag ich alles Jof, %s!",\
+"Das sag ich alles dem Sheriff, %s!",\
+"Komm Du mir nur wieder, %s!",\
+"Ich fordere Revanche, %s!",\
+"Sheriff! Unternimm was gegen %s!",\
+"%s, wer hat DICH denn eingeladen?",\
+"NAECHSTES MAL NEHM ICH DICH AUCH MIT, %s!",\
+"Haetten wir das nicht ausdiskutieren koennen, %s?",\
+"Dich merk ich mir, %s!",\
+"Na prima, schon wieder dieser dunkle Typ! Und "\
+"alles nur wegen %s.",\
+"Hallo? Hat jemand meinen Koerper gesehen? Muesste "\
+"irgendwo bei %s liegen!",\
+"%s, waer jetzt nicht eigentlich Vorlesung?",\
+"Lern lieber, statt unschuldige Monster zu er"\
+"morden, %s!",\
+"Ohne dieses Lag haette mich %s nicht umgebracht!",\
+"In spaetestens einer Stunde komme ich wieder, %s!",\
+"Na warte %s, beim naechsten Mal trete ich Dir "\
+"kraeftig in den Gedan-Bereich!",\
+"SCHIEBUNG, der letzte Schlag von %s war nicht "\
+"regelgerecht!",\
+"Lieber eine H2O-Vergiftung, als von %s ermordet "\
+"zu werden!",\
+"Die Ehre werd ich %s nicht antun, und hier "\
+"herumposaunen, wer mich umgenietet hat!",\
+"Is mir doch egal %s, ich glaube an "\
+"die Wiedergeburt!",\
+"Aber vorsicht, %s isch kuuul maen!",\
+"Ok, %s, Du wirst von meiner Erwarteliste gestrichen!",\
+"Das naechste Mal sieht man unsere beiden Namen auf [Tod:], %s!",\
+"Magier zu mir, hier ist ein Bug: %s ist immer noch nicht tot!",\
+"Morgen frueh um halb sechs in der Arena, %s! Ich hab die Wahl der Waffen.",\
+"%s ist schlimmer als das Mensaessen. Absolut toedlich.",\
+"Mist, meine Vorsicht hat versagt! Und das bei %s!",\
+"%s, die Hydra ist mir lieber...",\
+"So, meine Ignoriereliste ist schon wieder um einen Namen laenger, %s."
+
+#define KILL_MESSAGES2 \
+"Feierabend! Danke, %s!",\
+"Toll! GENAU das hab ich jetzt gebraucht! Super, %s! :(",\
+"Schon wieder ein Tag versaut wegen %s!",\
+"Ihr sagt, ICH sei ein Monster? Ihr kennt %s nicht!!!",\
+"Sperrt %s mal in's Polargebiet! Gaebe ein gutes Untier ab...",\
+"Freiheit fuer Nicht-Spieler! Vernichtet %s!",\
+"Merlin, mach %s zum Magier!",\
+"%s ist NICHT zu meiner Beerdigung eingeladen!",\
+"Ich hab keine Angst vor Dir, %s!",\
+"%s ist doof und stinkt!",\
+"Moegest Du im Lag verrotten, %s!",\
+"%s wird gleich das Spiel verlassen, um meiner Rache zu entgehen!",\
+"Der Todestag von %s wird fuer mich ein Feiertag sein!",\
+"%s ist ein Metzelskript, ich hab's genau gesehen!", \
+"Waer ich Tanjian, haettest Du das nicht geschafft, %s!", \
+"Das naechste Mal komme ich als Kaempfer wieder, %s!", \
+"Ich lass' mich aufwerten und werde Zauberer, %s!", \
+"Gildenbalance! %s ist viel zu stark!", \
+"Jetzt ist mir das Kleingeld zum Tanken ausgegangen, %s...", \
+"%s hat ein Zap-Tool!", \
+"%s, Du <zensiert>!", \
+"%s, das ist doch Hullepanz. (c) Catweazle", \
+"Bald bin ich SuperSeher, %s!", \
+"Mit Dir 'piel ich nich' mehr, %s, Du hast in mein Foermssen depinkelt!", \
+"Verdammt, %s muss mir den Feenring geklaut haben...", \
+"Nie ist ein Kleriker in der Naehe, wenn man ihn braucht, %s...", \
+"Menno, %s, wo war hier noch mal die Heilstelle?", \
+"Hoffentlich werde ich naechstes Mal als Kuh wiedergeboren, %s...", \
+"Wenn Du sonst noch Probleme hast, %s, geh' zu Marvin und red' " \
+"mit ihm darueber.", \
+"Du, %s, Gewalt ist keine Loesung, lass uns darueber diskutieren.", \
+"Das naechste Mal zeig' ich Dir meine Mateteesammlung, %s.", \
+"%s eunt domum!", \
+"%s, ist es so kalt hier oder bin ich das?", \
+"Ich war schon wieder zur falschen Zeit am falschen Ort, %s...", \
+"Danke, %s. Im Namen des Mondes werde ich Dich bestrafen!", \
+"Das war mal wieder ein Schuss in den Ofen, %s...", \
+"Kannst Du das mit Deinem Gewissen vereinbaren, %s?", \
+"Und Kandri sprach: Mein ist die Rache, %s!", \
+"%s, Du haettest meine Leiche nicht auch noch schaenden muessen...", \
+"%s, ich kann so nicht arbeiten!", \
+"%s, ich geb' Dir mal 2 Muenzen, dann kannst Du Deine Sorgen " \
+"jemand anderem erzaehlen...", \
+"Manchmal verspeist Du den Baer, %s, manchmal verspeist " \
+"der Baer Dich...", \
+"Das naechste Mal betrittst _Du_ die Welt des Schmerzes, %s!", \
+"Wenn ich wiederkomme, %s, werde ich erst Dich toeten, dann " \
+"Deinen Partner, dann Deine Brueder und Schwestern und jeden " \
+"der Dich kennt!", \
+"Oh nein, %s! Schon wieder diese ewig lange Todessequenz mit der " \
+"Drachenschule!", \
+"%s, wo bekomme ich jetzt einen neuen Koerper her?", \
+"Lass Dir meine Leiche schmecken, %s.", \
+"Haeh?", \
+"Ja, aber wieso das denn? Och menno, %s!", \
+"So ein Mist, %s, ich hatte 'nen Disconnect...", \
+"*winkewinke*, %s!", \
+"Heute ist nicht alle Tage, ich komm' wieder, keine Frage.", \
+"Lass das, %s!", \
+"Niemand! Niemand nennt mich eine feige Sau, %s!", \
+"Da hab' ich jetzt wohl verloren, %s...", \
+"%s, ich kann nicht metzeln, ich kann nur sterben...", \
+"Hattest Du ueberhaupt einen Termin, %s?", \
+"Du warst gar nicht an der Reihe, %s!", \
+"Aetsch, %s, der Kill zaehlt nicht!", \
+"Jetzt noch mal mit Gefuehl, %s.", \
+"Tschuess erstmal, %s.", \
+"Ich weiss nicht ob Du es gemerkt hast, %s, aber " \
+"ich bin schon tot...", \
+"%s, ich haette nicht gedacht, dass ich noch mal sterbe " \
+"bevor Taramis angeschlossen wird...", \
+"Ich wollte sowieso grade gehen, %s.", \
+"Shit happens, %s.", \
+"Dazu faellt mir jetzt nix mehr ein, %s."
+
+#define KILL_MESSAGES3 \
+"Was heisst denn \"Dein Teddy knuddelt Dich ein letztes Mal\", %s?", \
+"Ich bin beeindruckt, %s.", \
+"Ok, Dein Gesicht merke ich mir, %s!", \
+"Kaum da, haut mich %s schon wieder tot... *grummel*", \
+"Ich werde Dich verfolgen, %s! Ich werde in Deine Traeume eindringen " \
+"und Dich in den Wahnsinn treiben! Du wirst diesen Tag noch verfluchen!", \
+"Ich geh ja schon, %s.", \
+"Auf den ersten Blick sieht %s gar nicht so gefaehrlich aus.", \
+"Von %s besiegt - wie peinlich.", \
+"Mist. Einmal nicht aufgepasst, schon wird man von %s ermordet.", \
+"Das war ein Glueckstreffer, %s!", \
+"Hah, das ist doch nur eine Fleischwunde! Gibst Du etwa schon auf, %s?", \
+"%s macht gerade eine destruktive Phase durch.", \
+"Zum Glueck ist das ja nur ein Spiel, %s. Sonst waere ich jetzt wirklich " \
+"boese.", \
+"Begrabe mich wenigstens anstaendig, %s.", \
+"Hm, die Flatrate brauch' ich dann wohl doch nicht, %s.", \
+"Na warte, %s! Zur Strafe werde ich gleich das Mud crashen!", \
+"Ich sollte nicht mehr soviel mudden. Dann muesste ich mich auch nicht mehr " \
+"ueber %s aergern.", \
+"Auf am Boden Liegende einzuschlagen! Schaem Dich, %s!", \
+"Einigen wir uns auf unentschieden, %s?", \
+"Ich sagte doch \"Ich ergebe mich!\", %s.", \
+"Aeh, %s, koennte das unter uns bleiben? Ich habe schliesslich einen " \
+"Ruf zu verlieren...", \
+"Du bist vielleicht staerker, %s, aber dafuer bin ich schoener.", \
+"Die Rechnung fuer die Behandlung meiner Minderwertigkeitskomplexe geht " \
+"an %s.", \
+"Ab und zu muss man %s ja gewinnen lassen, sonst gibt es wieder Traenen.", \
+"Bis eben war mir %s noch sympathisch.", \
+"Geht's Dir jetzt besser, %s?", \
+"Macht kaputt, was mich kaputt macht! Toetet %s!", \
+"Beim naechsten Mal mach' ich es Dir nicht mehr so einfach, %s!", \
+"Weisst Du, %s, ich habe nur verloren, weil Du... aeh, weil ich... " \
+"aeh... weil Du gewonnen hast.", \
+"Jo, immer feste druff, %s. Ist ja nur ein dummer NPC. *grummel*", \
+"Ich muss sagen, %s kann feste schlagen.", \
+"Also %s! Kommst hier rein, haust mich um und tust dann so, als sei nichts " \
+"gewesen...", \
+"In welcher Gilde konnte man nochmal \"befriede\" lernen, %s?", \
+"Tja, %s, aus diesem Kampf bist Du wohl nur als Vorletzter hervorgegangen" \
+"...", \
+"Vorsicht, %s greift immer von hinten an!", \
+"Was meint %s mit \"Sparringspartner\"?", \
+"Ich habe mir bei Dir nur deshalb keine Muehe gegeben, %s, weil Du eh nicht " \
+"stupst.", \
+"Huch, ich bin ja schon wieder auf -Moerder!", \
+"Ich spuck' Dir in's Auge und blende Dich, %s!", \
+"Huch, wo seid ihr alle hin?", \
+"Wer war das?", \
+"Moegest Du in interessanten Zeiten leben, %s.", \
+"Ich sehe was, was Du nicht siehst, %s, und es ist... schwarz.", \
+"Hey Maedels! Ratet, wen ich gerade getroffen habe!", \
+"%s?", \
+"Noch einmal sowas, %s, und ich lasse Deine Gilde abwerten. Ich kann das!", \
+"Was bedeutet 'Jemand beschwoert Dein Bild herauf.'? Warst Du das, %s?"
+
+private string *moerder_msgs = ({KILL_MESSAGES, KILL_MESSAGES2, KILL_MESSAGES3,
+"Sterben ist schoen, Sterben ist toll - Ach waer ich wie ein Kaempfer voll!",
+"Lauschige Nacht - ich geh mir die Sterne anschauen. Bis spaeter!",
+"Echt %s, das war 0815, keine Kreativitaet beim Toeten!",
+"%s, Du kannst ja gar ni... Verdammt!",
+"Kaempfer, Zauberer, Tanjian, alles Luschen! Ich werde Abenteurer, da ist "
+    "wenigstens Thrill!", 
+"Toeten, Toeten, Toeten. Ist das alles, was Du kannst, %s?",
+"Ach geh doch Bluemchen pfluecken %s!", 
+"Mein Tod war KEIN FP %s... HA!",
+"Lars gibt mir nen Whisky, wenn ich komme. Und Dir?",
+"Geh lernen, Depp!",
+"Auf der naechsten Mud-Party haut Dich mein Magier zurueck!",
+"Lass gut sein, tat eh nicht weh!", 
+"Ich lass Dich von Zook abhaengen, %s!",
+"Koennen wir naechstes Mal nicht lieber einen trinken gehen, %s?",
+"Verdammt, meine neue Gilde ist ja noch gar nicht angeschlossen!",
+"Yohoho und ne Buddel voll Rum!",
+"Beim Kartenspiel haettest Du keine Chance gehabt %s!",
+"%s, Du hast echt keine Ahnung von stilvollem Metzeln...",
+"Was muss ich noch tun fuer Deinen Aufstieg, %s? *seufz*",
+"EK-Poser!",
+"Leistung ist was anderes, %s!",
+"Lass mich leeeeeeb... Arrrrggggh!",
+"Hast Du sonst nix in der Drachenschule gelernt, %s?",
+"Und wer kuemmert sich jetzt um meine Haustiere, %s?",
+"Ich musste sterben, Du willst mich nur beerben. Ich gehe "
+    "mit Stil, Du findest nicht viel.",
+"Ich habe nun mehr Tode als Du, %s. Topp mich, wenn Du kannst!",
+"Ok, dann geh ich halt WOW spielen.",
+"Toll, freut sich der Naechste. Wieder ne Todesfolge, %s.",
+"Du gucktest so traurig, %s, ich machte Dir meinen Tod zum Geschenk. "
+    "Sollst ja auch mal 'n Erfolgserlebnis haben!",
+"Nun reiche ich den letzten Becher, trinke den Wein, erkenne Dein Sein.",
+"%s hat nicht einmal getroffen. Ich habe mich wortwoertlich totgelacht.",
+"Lass mich nachdenken, %s. Ich starb fuer nen EK?",
+"Ich kann nicht glauben, dass das gerade passiert ist!",
+"Du Suender. Du sollst _nicht_ toeten!",
+"%s, mein Testament steckt im rechten Schuh!",
+"Sterben und sterben lassen, mein Freund. Wir sehen uns wieder!",
+"Und ich sag noch, %s... Das ist KEINE Schwertscheide... Aber Du musst "
+  "ja alles selbst ausprobieren.",
+"Soll das jetzt alles gewesen sein, %s?",
+"In meinem Code ist ein Fehler und gleich gibt's 'nen Crash.",
+"Ach, auch egal, %s. Ist eh gleich Schichtwechsel.",
+"Jofverdammt... warst Du gut, %s!",
+"Duelle von Killern enden meist fuer einen toedlich und das wirst "
+  "Du s... Argh!",
+"Bist Du sicher, dass Du den EK bekommen hast, %s?",
+"Danke %s! Weisst Du, ich hatte mit Zook gewettet, wer mich "
+  "toetet. Und ich habe eine Wiedergeburt gewonnen!",
+"Nun bin ich sicher vor Dir, %s!",
+"Ich mache jetzt Urlaub und habe Zook gebeten, meinen Reset "
+  "um einen Monat zu verschieben. Gluecklich, %s?",
+});
+
+
+int _query_kma() { return sizeof(moerder_msgs); }
+
+
+object _channel( object ob )
+{
+  int m_FMM, m_HP, m_WC, m_AC, s_HP, s_WC, s_AC;
+  string msg;
+  object rueck;
+
+  if (member(inherit_list(previous_object()),CORPSE_OBJ)>-1)
+      {
+          string killer;
+          int i, x, y, z, nr;
+          closure m_q, s_q;
+    
+          while( previous_object(i) &&
+                 !query_once_interactive(previous_object(i)) )
+              i++;
+          
+          if( !previous_object(i) || IS_LEARNER(previous_object(i)) )
+              return rueck;
+
+          killer = (string) previous_object(i)->name();
+          
+          if ( lower_case(killer) != getuid(previous_object(i)) )
+              killer = capitalize(getuid(previous_object(i)));
+          
+          m_q = symbol_function( "QueryProp", ob ); // Monster
+          s_q = symbol_function( "QueryProp", previous_object(i) ); // Spieler
+          
+          if ( (m_FMM = (int) funcall( m_q, P_FORCE_MURDER_MSG )) >= 0 )
+              if ( (object_name(ob) == "/obj/shut") ||
+                   (m_FMM > 0) ||
+                   (nr = (random(100) >= 99) ? 1 : 0 ) || 
+                   (nr = ((x = (m_HP = (int) funcall( m_q, P_MAX_HP )) * 
+                           ((m_WC = (int) funcall( m_q, P_TOTAL_WC )) +
+                            (m_AC = (int) funcall( m_q, P_TOTAL_AC ))))
+                          > 200000) ? 2 : 0) ||
+                   (nr = (((y = m_HP * (m_WC + m_AC)) >
+                           (z = 5 * (s_HP = (int) funcall( s_q, P_MAX_HP )) *
+                            ((s_WC = (int) funcall( s_q, P_TOTAL_WC )) +
+                             (s_AC = (int) funcall( s_q, P_TOTAL_AC )))))
+                          ? 3 : 0)))
+                  {
+                      SetProp( P_NAME, "Geist "+(string) ob->name(WESSEN, 0) );
+
+                      if( !(msg = (string) ob->QueryProp(P_MURDER_MSG)) )
+                          msg = moerder_msgs[random(sizeof(moerder_msgs))]; 
+
+		      if ( stringp(msg) )
+			  msg = sprintf( msg, killer || "Moerder" );
+
+                      CHMASTER->send( "Moerder", this_object(), funcall(msg) );
+
+                      rueck = previous_object(i);
+                  }
+          
+          log_file( "moerder.log",
+                    sprintf( "MON(%O) COND(%d) NPC(%d), DIFF(%d,%d)\n",
+                             ob, nr, x, y, z) );
+      }
+
+  return rueck;
+}
+
+void transform_into_pile() {
+	if( environment()->QueryProp(P_PREVENT_PILE) ) return;
+	object* inv = all_inventory();
+	if( sizeof(inv)<2 ) return;
+	object p = clone_object(PILE_OBJ);
+	filter_objects( inv, "move", p, M_SILENT | M_NOCHECK );
+	p->move( environment(), M_SILENT | M_NOCHECK );
+}
