FindGroup()
***********


FUNKTION
========

   object*FindGroup(object pl,int who);


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

   /std/spellbook.c


ARGUMENTE
=========

   pl
     Lebewesen, von welchem die Freunde oder Feinde in der Umgebung
     gefunden werden sollen.
   who
     Flag, welches anzeigt, ob Freunde oder Feinde gefunden werden
     sollen (Konstanten definiert in '/sys/new_skills.h'):
       FG_ENEMIES - (Wert -1) Feinde sollen gefunden werden
       FG_FRIENDS - (Wert  1) Freunde sollen gefunden werden
       FG_ALL     - (Wert  0) alle Lebewesen sollen gefunden werden


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

   Array mit gefundenen Lebewesen


BESCHREIBUNG
============

   Bei Spells, die sich auf mehrere Gegner auswirken oder bei denen man
   per Hand ein Opfer auswaehlen moechte, laesst sich mittels der
   Funktion FindGroup() eine Liste von Lebewesen ermitteln, welche in
   der Umgebung von <pl> zu finden sind.
   Je nachdem, was man denn genau vorhat, kann man sich von der
   Funktion freundlich oder feindlich gesinnte Lebewesen heraussuchen
   lassen.
   Will man die freundlich gesinnten Lebewesen ermitteln, so uebergibt
   man in <who> die Konstante FG_FRIENDS, bei feindlich gesinnten die
   Konstante FG_ENEMIES, und wenn man alle Lebewesen bekommen moechte
   schliesslich FG_ALL.
   Bei der Auswahl gelten folgende Regeln:
     (1) Lebewesen, mit denen <pl> im Kampf ist, sind grundsaetzlich
         feindlich gesinnt.
     (2) Teammitglieder von <pl> sind grundsaetzlich freundlich
         gesinnt.
     (3) Spieler sind gegenueber Spielern freundlich gesinnt, NPCs
         gegenueber NPCs. NPCs kann man hierbei mit Hilfe der Property
         P_FRIEND den Spielern zuordnen.
     (4) Daraus folgt natuerlich, dass Spieler und NPCs grundsaetzlich
         eine feindliche Einstellung gegenueber haben, sofern die NPCs
         nicht die Property P_FRIEND gesetzt haben
          (was standardmaessig natuerlich nicht der Fall ist).
     (5) Netztote werden nicht erkannt.
     (6) Magier werden nicht erkannt, wenn sie unsichtbar sind.
     (7) Ein Magier wird als feindlich gesinnt nur dann erkannt, wenn
         <pl> mit ihm im Kampf ist.
     (6) Sucht man feindlich gesinnte Lebewesen, so werden die, welche
         eine von den Properties P_NO_ATTACK oder P_NO_GLOBAL_ATTACK
         gesetzt haben, nicht erkannt.
   Die Property P_FRIEND sollte man in NPCs setzen, die dem Spieler
   hilfreich beiseite stehen, z.B. vom Spieler beschworene HilfsNPCs.


BEISPIELE
=========

   Wenn man einen Feuerball nach jemandem wirft, so trifft dieser unter
   Umstaenden auch andere, wenn er gross genug ist. Man nimmt hierbei
   an, dass sich die freundlich gesinnten Lebewesen des Gegners auch
   naeher bei ihm befinden als die feindlich gesinnten:
     victim->Defend(500,DT_FIRE,([SP_SHOW_DAMAGE:1]),caster);
     victimList=FindGroup(victim,FG_FRIENDS);
     map_objects(victimList,
                     "Defend",
                     100,
                     DT_FIRE,
                     ([SP_SHOW_DAMAGE:1]),
                     caster);
   Hiermit trifft man also auch die Freunde von <victim>.


SIEHE AUCH
==========

   FindGroupN(), FindGroupP(), P_FRIEND, P_NO_GLOBAL_ATTACK

Last modified: Mon Jan 28 21:45:00 2002 by Tiamak
