TakeFlaw()
**********


FUNKTION
========

   varargs void TakeFlaw(object enemy); (Waffen)
   varargs void TakeFlaw(string* dam_types,mapping einfos) (Ruestungen)


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

   /std/armour/combat.c,
   /std/weapon/combat.c


ARGUMENTE
=========

   keine


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

   Diese Funktion wird in Waffen und Ruestungen waehrend des Kampfes
   aufgerufen. In einer Waffe erfolgt der Aufruf bei jedem Schlag mit
   dieser Waffe, bei Ruestungen wird TakeFlaw() in einer zufaellig
   ausgewaehlten getragenen Ruestung aufgerufen.
   Waffen bekommen das Gegnerobjekt uebergeben, Ruestungen die erweiterten
   DefendInfos (s. dort fuer Details). Aufgrund dieser Informationen kann
   man den Schaden, den ein Gegenstand nimmt, flexibler gestalten (z.B. bei
   einer Waffe in Abhaengigkeit von P_BODY des Gegners.)

   Soweit man die Funktion nicht ueberlaedt, bewirkt sie nichts weiter als
   das Erhoehen eines Zaehlers, der mit QueryFlaw() abgefragt werden kann.


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

   keiner


BEMERKUNGEN
===========

   Die Waffen-/ Ruestungsklasse wird nicht automatisch reduziert! Wenn
   eine Waffe oder Ruestung sich abnutzen soll, muss man TakeFlaw()
   ueberladen und dort entsprechend handeln, oder (fuer einfache
   Faelle) die Property P_QUALITY setzen.


BEISPIELE
=========

   Eine Waffe, deren Waffenklasse alle 20 Schlaege um 1 abnimmt:

   inherit "/std/weapon";

   #include <properties.h>
   #include <combat.h>

   protected void create() {
     /* Das Uebliche... */
   }

   varargs void TakeFlaw(object enemy) {
     /* erstmal den Zaehler erhoehen... */
     ::TakeFlaw(enemy);

     /* jetzt den aktuellen Zaehlerstand abfragen */
     int flaw = QueryFlaw()[0];

     /* Abzug nur jeden 20. Schlag */
     if (!(flaw % 20)) {
       /* So, jetzt fuer den Schaden sorgen. Hierfuer benutzt */
       /* man am sichersten die eingebaute Funktion Damage() */
       Damage(1);
     }
   }

   Dieses einfache Beispiel haette natuerlich auch ueber ein
   SetProp(P_QUALITY,20); im create() realisiert werden koennen.


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

   QueryFlaw(), Damage(), DefendInfo, P_QUALITY, /std/armour/combat.c,
   /std/weapon/combat.c

Last modified: Thu May 22 10:30:10 1997 by Paracelsus
