
P_TMP_ATTACK_MOD
****************

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


NAME
====

   P_TMP_ATTACK_MOD              "attack_mod"


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

   /sys/new_skills.h


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

   Mittels dieser Property koennen die Attacken 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 Attack() des
   Lebewesens in 'objekt' aufgerufen, solange time()<'zeitpunkt'.

   Der Methode wird beim Aufruf ein Kopie des Mappings uebergeben, in dem
   die bisherigen Werte des Angriffes vermerkt sind.
   Aufbau von Mapping 'ainfo':
   ([ SI_ENEMY :           object Angreifer,                  (-> Defend)
      SI_SPELL :           0/1/array Spellparameter,          (-> Defend)
      P_WEAPON :           - oder Waffe,
      SI_SKILLDAMAGE_MSG:  string Angriffsmeldungsende an Raum,
      SI_SKILLDAMAGE_MSG2: string Angriffsmeldungsende an Kaempfende,
      SI_SKILLDAMAGE:      int Schaden in Zehntel HP (Skills bis auf Rasse
                           drin!)                             (-> Defend),
      SI_SKILLDAMAGE_TYPE: string/string* Schadenstypen,      (-> Defend)
      P_WEAPON_TYPE:       string Waffentyp (combat.h),
      P_WC:                - oder int WC der Waffe/Hand,
      P_NR_HANDS:          - oder int Hands der Waffe/Hand,
   ]);

   Gibt die Methode:
   - 0 oder kein Mapping zurueck, fuehrt das zum Abbruch der Attacke
     -> da inzwischen Waffen abgefragt wurden, koennen schon Meldungen
        von diesen ausgegeben worden sein
   - ein leeres Mapping ( ([]) ) zurueck, fuehrt das zu keiner Modifikation
   - ein Mapping mit veraenderten Werten zurueck, werden diese in das
     Angriffsmapping kopiert
     Die geaenderten Werte werden teilweise von SkillResTransfer() in
     den eigentlichen Angriff uebernommen.


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

   - falls die Zeit abgelaufen oder das Objekt zerstoert ist, wird die
     Property auf 0 gesetzt
   - vor dem Setzen immer auf die Existenz eines gueltigen Modifiers
     pruefen, einfaches Ueberschreiben fuehrt einerseits zu Fehlern
     im Code anderer und ist andererseits unfair gegenueber ihnen


BEISPIELE
=========

   *** ein besonder heisser Segen modifiziert die Attacken des Spielers ***
   int action_segen() {
     ...
     mixed *tmp;

     // pruefen, ob nicht ein anderer Modifier existiert
     if(!pointerp(tmp=TP->QueryProp(P_TMP_ATTACK_MOD)) ||
        sizeof(tmp)<3 || tmp[0]<=time()) {

       object wield;
       wield=TP->QueryProp(P_WEAPON);

       write(break_string(
         "Der Priester der Flamme weiht "+
         (wield?wield->name(WEN,1):"deine Haende")+".", 78));

       // setzen des Modifiers .. 30-40 Sekunden gueltig
       TP->SetProp(P_TMP_ATTACK_MOD,
                    ({time()+30+random(10), this_object(), "modfun"}));
      } else ...
      ...
    return 1;
   }

   // die eigentlich Methode, die waehrend des Angriffs gerufen wird
   mapping modfun(mapping ainfo) {
     mapping ret;

     // Returnwert ist immer ein Mapping, damit die Attacke weitergeht
     ret=m_allocate(0,1);

     // magische Waffen oder Sprueche werden nicht verbessert
     if(ainfo[P_WEAPON_TYPE]!=WT_MAGIC) {
       // sonst Verbesserungen ... Feuer addieren ...
       ret[SI_SKILLDAMAGE_TYPE]=(ainfo[SI_SKILLDAMAGE_TYPE]||({}))+
                              ({DT_FIRE});
       // ... und bei Waffe Meldungen anpassen
       if(ainfo[P_WEAPON]) {
         ret[SI_SKILLDAMAGE_MSG]=
           " mit sengendem "+ainfo[P_WEAPON]->name(RAW);
         ret[SI_SKILLDAMAGE_MSG2]=
           " mit sengendem "+ainfo[P_WEAPON]->name(RAW);
       }
     }

     return ret;
   }


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

   Angriff:   Attack(L)
   Schutz:    Defend(L)
   Verwandt:  InternalModifyAttack(L)
              P_TMP_ATTACK_HOOK
              P_TMP_DEFEND_HOOK
   Sonstiges: SkillResTransfer(L)
   Hooks:     P_TMP_DIE_HOOK, P_TMP_MOVE_HOOK

10.Feb 2005 Gloinson
