P_EFFECTIVE_AC
**************


NAME
====

   P_EFFECTIVE_AC      "effective_ac"


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

   <combat.h>


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

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

   In Ruestungen kann hier der Effektivwert der Ruestungsklasse vermerkt
   werden, wenn diese noch durch eine DefendFunc() modifiziert wird
   (soweit sich ein solcher Effektivwert angeben laesst).

   In einigen Gilden koennen Waffen auch als Ruestung eingesetzt werden
   (z.B. beim Parieren eines Angriffs). In dieser Property kann man die
   Ruestungsklasse eintragen, die die Waffe bei solchen Aktionen aufweisen
   soll. Dabei ist man an die ueblichen Beschraenkungen der
   Ruestungsklasse gebunden! (s. /sys/combat.h)


BERMERKUNGEN
============

   Das Kaempferspellbook verwendet fuer Paraden etc. P_EFFECTIVE_AC anstatt
   P_AC, wenn verfuegbar.


BEISPIELE
=========

   * DefendFuncs:
     Der doppelte Mittelwert der DefendFunc wird zur Basis-AC dazuaddiert,
     da sich der 'Schutzwert = random(Basis-AC) + absolut(DefendFunc-Wert)'
     berechnet.

   // #1 Eine Ruestung mit P_AC von 35 und randomisierter DefendFunc
      SetProp(P_AC, 35);
      SetProp(P_DEFEND_FUNC, this_object());

      int DefendFunc(...) {
        return random(20);                       // Mittelwert: 10
      }
      -> SetProp(P_EFFECTIVE_AC, 55);            // 35 + 2*10 = 55

   // #2 Eine Ruestung mit P_AC von 35 und teilrandomisierter DefendFunc
      SetProp(P_AC, 35);
      SetProp(P_DEFEND_FUNC, this_object());

      int DefendFunc(...) {
        return 20 + random(10);                  // Mittelwert: 20 + 5
      }
      -> SetProp(P_EFFECTIVE_AC, 85);            // 35 + 2*(20+5) = 85

   * Sonderfunktion im Kontext der Kaempfergilde:
     Auch wenn der eigentliche AC-Wert durch keine DefendFunc oAe
     modifiziert wird, sind abweichende Werte in P_EFFECTIVE_AC zB in der
     Kaempfergilde fuer Paraden oder aehnliches sinnvoll. Maximalwert ist
     dafuer der doppelte Wert des Basis-AC-Wertes.

   // #3 Ein schon sehr gutes Schild, welches bei der Schildparade aber
   //    noch besser schuetzen soll.
      SetProp(P_ARMOUR_TYPE, AT_SHIELD);
      SetProp(P_AC, 38);
      SetProp(P_EFFECTIVE_AC, 55);

   // #4 Ein sehr labbriges Schild schuetzt zwar gegen normale Schlaege,
   //    ist zum Parieren aber irgendwie ungeeignet weil unkontrollierbar.
      SetProp(P_ARMOUR_TYPE, AT_SHIELD);
      SetProp(P_AC, 38);
      SetProp(P_EFFECTIVE_AC, 20);

   * Waffen:
     P_EFFECTIVE_AC wird im Kaempferspellbook als Bonus dazugezaehlt! Daher
     sollten gute Parierwaffen auch einen niedrigeren P_WC-Wert haben.
     Reine Parierwaffen duerfen den maximalen AC-Wert von Schilden als
     Maximum gesetzt haben - die Balance klaert ggf, ob das auch auf den
     Gildenparierwert anwendbar ist.

   // #5 Eine maessige Hellebarde/Axtwaffe mit Parierhaken.
      SetProp(P_WEAPON_TYPE, WT_AXE);
      SetProp(P_WC, 100);
      SetProp(P_EFFECTIVE_AC, 25);


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

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

6. Nov 2011 Gloinson
