
PresentEnemies()
****************


FUNKTION
========

   object *PresentEnemies();


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

   /std/living/combat.c


ARGUMENTE
=========

   keine


RUeCKGABEWERT
=============

   anwesende Feinde


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
