
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
