
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
