StopHuntText()
**************


FUNKTION
========

   void StopHuntText(object arg);


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

   /std/living/combat.c


ARGUMENTE
=========

   arg
     Der Gegner, welcher nicht mehr bekaempft wird.


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

   Mit der Funktion StopHuntFor() kann man ein Lebewesen als Gegner
   austragen. Dabei erhalten sowohl der Gegner, als auch das Lebewesen,
   welches (einseitig!) Frieden schliesst, jeweils eine Meldung, sofern
   man dies nicht mittels eines Flags unterbindet.
   Es ist nun moeglich, auf diese Meldung Einfluss zu nehmen, indem
   man die Funktion StopHuntText() ueberschreibt, welche dafuer
   verantwortlich ist.


BEISPIEL
========

   Ein Lebewesen moechte einen Kampf sofort abbrechen, wenn es von
   einem Frosch angegriffen wird:
     int Defend(int dam,mixed dam_type,mixed spell,object enemy)
     { if(enemy&&enemy->QueryProp(P_FROG))
       { if(StopHuntFor(enemy))
         { // wenn Frosch angreifen will, der noch kein Gegner war
           tell_object(arg,
    this_object()->Name(WER)+" kaempft nicht mit Dir.\n"
   +"Wahrscheinlich werden Froesche verschont.\n");
           tell_object(this_object(),
    "Der bloede Frosch wollte Dich doch tatsaechlich angreifen.\n");
         }
         enemy->StopHuntFor(this_object(),1);
         return 0;
       }
       return::Defend(dam,dam_type,spell,enemy);
     }
     // wird nur aufgerufen, wenn der Gegner irgendwann Frosch wurde
     void StopHuntText(object arg)
     { tell_object(arg,
    this_object()->Name(WER)+" jagd Dich nicht mehr.\n"
   +"Wahrscheinlich werden Froesche verschont.\n");
       tell_object(this_object(),
   "Dein Gegner ist doch tatsaechlich ploetzlich Frosch geworden!\n");
     }
   Warum braucht man nun das erste StopHuntFor(), wenn doch Gegner erst
   in ::Defend() eingetragen werden, welches doch gar nicht ausgefuehrt
   wird, wenn der Gegner ein Frosch ist? Man beachte hierbei, dass der
   Gegner ja auch waehrend des Kampfes oder waehrend der Feindschaft
   irgendwann Frosch werden koennte und dann schon Gegner war.


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

   StopHuntFor(), SelectEnemy(), QueryEnemies(), IsEnemy()

Last modified: Wed May 26 16:47:51 1999 by Patryn
