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

