PresentEnemies()
================

FUNKTION
--------
::

	object *PresentEnemies();

DEFINIERT IN
------------
::

	/std/living/combat.c

ARGUMENTE
---------
::

	keine

RUeCKGABEWERT
-------------
::

  Array mit anwesenden Feinden. Wenn keine Feinde anwesend sind, ist 
  das Array leer, es wird jedoch immer ein Array zurueckgegeben.

BESCHREIBUNG
------------
::

	Diese Funktion liefert genau die Feinde zurueck, die sich derzeit im
	selben Raum befinden. Die Feinde unterliegen hierbei noch gewissen
	Einschraenkungen:
	  (1) Sie duerfen als NPC nicht gestorben sein, das heisst, sie
	      muessen als Objekt noch existieren.
	  (2) Sie duerfen als Spieler nicht gestorben sein, das heisst, sie
	      duerfen keine Geister sein (Property P_GHOST nicht gesetzt).
	  (3) Sie muessen angreifbar sein, das heisst, die Property
	      P_NO_ATTACK darf nicht gesetzt sein.
	Wird eine dieser Bedingungen verletzt, so wird der Gegner aus der
	internen Gegnerliste entfernt. Zusaetzlich gilt:
	  Netztote werden nur als Gegner erkannt, wenn keine anderen Gegner
	  zur Verfuegung stehen.

BEISPIEL
--------
::

	Im Folgenden erblinden alle Gegner im Raum:
	  string blindThemAll()
	  { ob*livList;
	    if(!livList=PresentEnemies())
	      return break_string(
	 "Mist...keiner da, der blind werden moechte.",77,
	 Name(WER)+" grummelt: ");
	    for(i=sizeof(livList);i--;)
	    { if(livList[i]->QueryProp(P_BLIND))
	      { tell_object(this_object(),break_string(
	 livList[i]->Name(WER)+" ist schon blind.",77));
	        continue;
	      }
	      tell_object(this_object(),break_string(
	 "Du kratzt "+livList[i]->name(WEM)+" die Augen aus.",77));
	      tell_object(livList[i],break_string(
	 Name(WER)+" kratzt Dir die Augen aus!",77));
	      tell_room(environment(this_object()),break_string(
	 Name(WER)+" kratzt "+livList[i]->name(WEM)
	+" die Augen aus.",77),({this_object(),livList[i]}));
	      livList[i]->SetProp(P_BLIND,1);
	    }
	    return"";
	  }
	Aufgerufen wird das ganze am Besten in einem Chat:
	  void create()
	  { ::create();
	    ...
	    SetProp(P_CHAT_CHANCE,10);
	    SetChats(20,({break_string(
	 "Nicht angreifen, sonst wirst Du noch blind!",77,
	 Name(WER)+" bruellt: "),
	                  "@@blindThemAll@@"}));
	  }
	Natuerlich sind auch noch mehr Funktionen und Meldungen als Chats
	moeglich: Die zwei im Beispiel sind im Normalfall etwas wenig.

SIEHE AUCH
----------
::

	SelectEnemy(), QueryEnemies(), IsEnemy(), P_GHOST, P_NO_ATTACK,
	SetChats, P_CHAT_CHANCE


Last modified: Thu May 27 15:01:48 1999 by Patryn

