TakeFlaw()

FUNKTION:
     varargs void TakeFlaw(object enemy); (Waffen)
     varargs void TakeFlaw(mixed 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>

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

     TakeFlaw()
     {
       int flaw;

       /* erst mal den Zaehler erhoehen... */
       ::TakeFlaw();

       /* jetzt den aktuellen Zaehlerstand abfragen */
       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_QUIALITY, /std/armour/combat.c,
     /std/weapon/combat.c

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