die()
*****


FUNKTION
========

   public varargs void die(int poisondeath,int extern);


DEFINIERT IN
============

   /std/living/life.c


ARGUMENTE
=========

   poisondeath
      Dieses Flag sollte bei einem Gifttod (P_POISON) gesetzt sein.

   extern
      Ex- oder interner Aufruf.


BESCHREIBUNG
============

   Das Lebewesen stirbt, meist automatisch von do_damage() ausgeloest,
   wenn 0 HP unterschritten werden. In diesem Fall wird der Kampf
   beendet, Gift, Alkohol, Trink- und Esswerte, Blindheit, Taubheit
   u.s.w. auf Null gesetzt oder geloescht.

   Es wird automatisch eine Leiche (siehe auch P_CORPSE, P_NOCORPSE)
   nebst Todesmeldungen (siehe auch P_DIE_MSG) erzeugt, und fuer
   Spieler werden Killstupse vergeben, sofern notwendig.

   Ueber den Hook H_HOOK_DIE kann man jedoch auf den Automatismus
   Einfluss nehmen, z.B. koennte ein temporaerer Todesbann-Zauber das
   Sterben fuer kurze Zeit verhindern.


RUeCKGABEWERT
=============

   keiner


BEMERKUNGEN
===========

   Diese Funktion sollte nur selten direkt verwendet werden. Meist ist
   der uebliche Weg ueber Defend() -> do_damage() -> die() die logisch
   bessere und balancetechnisch guenstigere Loesung.

   Diese Funktion sollte nur ueberschrieben werden,  wenn tatsaechlich
   einfluss auf das Sterben genommen werden soll. Wird nur ein Item
   hinzugefuegt, ist es sinnvoller second_life() zu verwenden.

   Wird die() ueberschrieben, sollte man nicht nur das Argument extern
   uebergeben, sondern mit extern_call() verodern (siehe Beispiel),
   weil das geerbte die() den externen Aufruf nicht mehr erkennen
   kann.


BEISPIEL
========

   public varargs void die(int poisondeath, int extern)
   {
     // Dieser NPC soll nicht an Gift sterben.
     if(poisondeath) return;

     // Das geerbte die() aufrufen, dabei die Argumente uebergeben und ggf.
     // extern setzen.
     ::die(poisondeath, extern||extern_call());
   }


SIEHE AUCH
==========

   Defend(), do_damage(), second_life(), P_POISON, P_DEADS,
   P_KILL_NAME, P_KILL_MSG, P_MURDER_MSG, P_DIE_MSG, P_ZAP_MSG,
   P_ENEMY_DEATH_SEQUENCE, P_CORPSE, P_NOCORPSE, extern_call,
   /std/corpse, /std/hooks

Letzte Aenderung: 17.03.2019, Bugfix
