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

