
P_TMP_DEFEND_HOOK
*****************

********************* VERALTETE PROPERTY
****************************** * Diese Property ist veraltet. Bitte
nicht mehr in neuem Code nutzen. * **********************************
************************************* P_TMP_DEFEND_HOOK


NAME
====

   P_TMP_DEFEND_HOOK             "defend_hook"


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

   /sys/new_skills.h


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

   Mittels dieser Property koennen die Abwehren eines Livings temporaer
   veraendert werden.

   Es wird an dem Living die Property als mindestens 3-elementiges Array
   ({zeitpunkt, objekt, methode, ...})
   gesetzt und die Methode 'methode' wird dann waehrend des Defend() des
   Lebewesens in 'objekt' aufgerufen, solange time()<'zeitpunkt'.

   Der Methode werden die Parameter der Defend() uebergeben:
   int dam, mixed dam_type, mixed spell, object enemy
   - spell ist definitiv ein Mapping - ein an Defend() uebergebener
     int-Wert wurde aequivalent umgesetzt.
   - dam_type ist definitiv ein Array von Schadenswerten oder einem Wert

   Zudem findet der Aufruf der Methode nach dem Abarbeiten der P_DEFENDERS
   statt, diese koennen also weitere Modifikationen vorgenommen haben.

   Gibt die Funktion:
   - 0 zurueck, wird Defend() abgebrochen (und damit der Schaden voellig
     abgefangen) - nur noch die Flucht wird geprueft
   - ein 3-elementiges Array ({schaden, schadenstypen, spell}) zurueck,
     werden diese Werte in der Defend() an Stelle der uebergebenen Werte
     verwendet
   - weder noch zurueck, wird das Ergebnis ignoriert und die Defend laeuft
     regulaer weiter


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

   - Bitte das neuere Hooksystem (s. Manpage std/hooks) benutzen.
   - falls die Zeit abgelaufen oder das Objekt zerstoert ist, wird die
     Property auf 0 gesetzt
   - vor dem Setzen immer auf die Existenz eines gueltigen Hooks
     pruefen, einfaches Ueberschreiben fuehrt einerseits zu Fehlern
     im Code anderer und ist andererseits unfair gegenueber ihnen


BEISPIEL
========

   *** ein gruener Schutzzauber ***
   // Setzen der Prop
   ...
   tmp=TP->QueryProp(P_TMP_DEFEND_HOOK);

   // ein etwas ausfuehrlicher Check, ob wir ueberschreiben koennen,
   // Existenz && Gueltigkeit
   if(pointerp(tmp) && sizeof(tmp) && intp(tmp[0]) && (time()<tmp[0]))
    write("Der Zauber klappt nicht!\n");
   else {
    // der Zauber gilt eine Stunde
    TP->SetProp(P_TMP_DEFEND_HOOK,({time()+3600,TO,"abwehrfun");
    write("Ein Zauber legt sich auf dich.\n");
   }
   ...

   // die gerufene Methode
   mixed abwehrfun(int dam, string* dam_type, mapping spell, object en) {
    // keine rekursiven Schaeden abfangen ... mindestens ein magischer
    // muss auch dabei sein
    if((!mappingp(spell) || !spell[SP_RECURSIVE]) &&
       sizeof(filter(dam_type,MAGICAL_DAMAGE_TYPES))) {

     // mit 10% Whkeit schuetzt der Zauber total
     if(!random(10)) {
      tell_object(previous_object(),
        "Dein Zauber gleisst rund um dich gruen auf.\n");
      tell_room(environment(previous_object()), break_string(
        previous_object()->Name(WESSEN)+" Haut gleisst rund um "+
        previous_object()->QueryPronoun(WEN)+" gruen auf.",78),
        ({previous_object()}));

      // manchmal geht der Zauber dabei endgueltig kaputt
      if(!random(10)) previous_object()->SetProp(P_TMP_DEFEND_HOOK, 0);

      return 0;                       // volles Abfangen des Angriffs
     }

     // der Zauber schuetzt auf jeden Fall immer ein bischen
     tell_object(previous_object(),
       "Dein Zauber flackert rund um dich gruen auf.\n");
     tell_room(environment(previous_object()), break_string(
       previous_object()->Name(WESSEN)+" Haut flackert rund um "+
       previous_object()->QueryPronoun(WEN)+" gruen auf.",78),
       ({previous_object()}));
     dam=(7+random(2))*dam/10;        // Schaden reduzieren

     return(({dam, dam_type, spell}));
    }

    // der Zauber schuetzt dann gar nicht ...
    return 1;
   }


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

   Angriff:   Attack(L)
   Schutz:    Defend(L)
   Verwandt:  InternalModifyDefend(L), P_TMP_ATTACK_MOD
   Hooks:     P_TMP_DIE_HOOK, P_TMP_MOVE_HOOK, P_TMP_ATTACK_HOOK
   neue Hooks: std/hooks

08.12.2008, Zesstra
