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
