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
