P_EFFECTIVE_WC
**************


NAME
====

   P_EFFECTIVE_WC     "effective_wc"


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

   <combat.h>


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

   Diese Property kommt sowohl in Waffen als auch Ruestungen, die Schaden
   machen sollen, zum Einsatz.

   Falls die Staerke einer Waffe noch durch eine HitFunc() modifiziert
   wird, sollte hier der Effektivwert der Waffenklasse vermerkt werden,
   soweit er sich angeben laesst.
   Diese Property dient vor allem dazu, eine Waffe mit HitFunc() korrekt
   einzuschaetzen.

   In einigen Gilden koennen Ruestungen auch als Waffen eingesetzt werden
   (z.B. ein Paar Schuhe zum Treten). In dieser Property kann man die
   Waffenklasse eintragen, die die Ruestung bei solchen Aktionen aufweisen
   soll. Dabei ist man an die ueblichen Beschraenkungen der Waffenklasse
   gebunden! (s. /sys/combat.h)
   Der Ruestung kann man dann auch einen Schadenstyp mit auf den Weg
   geben.


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

   Das Kaempferspellbook verwendet bei Ruestungen P_AC, wenn
   P_EFFECTIVE_WC nicht gesetzt ist.


BEISPIELE
=========

   * HitFuncs:
     Der doppelte Mittelwert der HitFunc wird zur Basis-WC dazuaddiert,
     da sich der 'Angriffswert = random(Basis-WC) + absolut(HitFunc-Wert)'
     berechnet.

   // #1 Waffe mit Basis-WC 120 und randomisierter HitFunc
      SetProp(P_WC, 120);
      SetProp(P_HIT_FUNC, this_object());



      int HitFunc(...) {
        return random(30);                       // Mittelwert: 15
      }
      -> SetProp(P_EFFECTIVE_WC, 150);           // 120 + 2*15 = 150



   // #2 Waffe mit Basis-WC 120 und teilweise absoluter HitFunc
      SetProp(P_WC, 120);
      SetProp(P_HIT_FUNC, this_object());



      int HitFunc(...) {
        return 30 + random(10);                  // Mittelwert: 30 + 5
      }
      -> SetProp(P_EFFECTIVE_WC, 190);           // 120 + 2*(30+5) = 190

   * Ruestungen (zB Gildennutzung):
     Der Maximalwert fuer die P_EFFECTIVE_WC bei Kaempfern ist der jeweils
     doppelte maximale P_AC-Wert. Angabe eines Schadenstyps ist sinnvoll.

   // #3 Ein paar Schuhe, mit maximalem Schlag-/Saeureschaden.
      SetProp(P_ARMOUR_TYPE, AT_BOOT);
      SetProp(P_AC, 2);
      SetProp(P_DAM_TYPE, ({DT_BLUDGEON,DT_ACID}));
      -> SetProp(P_EFFECTIVE_WC, 12);  // hoechstmoeglicher Wert bei
                                       // Schuhen, da deren max. P_AC = 6
   // aequivalent und zukunftssicher:
      -> SetProp(P_EFFECTIVE_WC, 2 * VALID_ARMOUR_CLASS[AT_BOOT]);

   // #4 Ein Schild mit spitzem Dorn. (Stichschaden beim Schildstoss.)
      SetProp(P_ARMOUR_TYPE, AT_SHIELD);
      SetProp(P_AC, 5);
      SetProp(P_DAM_TYPE, ({DT_PIERCE}));
      SetProp(P_EFFECTIVE_WC, 55);

   // #5 Ein Gummischild ist schlecht fuer Angriffe. BOING!
      SetProp(P_ARMOUR_TYPE, AT_SHIELD);
      SetProp(P_AC, 30);
      SetProp(P_DAM_TYPE, ({DT_BLUDGEON}));
      SetProp(P_EFFECTIVE_WC, 10);


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

   Waffen:     P_WC, P_TOTAL_WC, HitFunc()
   Ruestungen: P_AC, P_TOTAL_AC, P_EFFECTIVE_AC, DefendFunc()
   Files:      /std/weapon.c, /std/weapon/combat.c
   Balance:    waffen, ruestungen, properties, kaempferboni

6. Nov 2011 Gloinson
