Defend() - BEISPIELE

FUNKTION:
     varargs int Defend(int dam, mixed dam_type, mixed spell, object enemy)

BEMERKUNGEN:
     Die hier aufgefuehrten Komplexbeispiele sind zum Verstaendnis gedacht.

BEISPIELE:
  1) Ein ordinaerer Biss ins Bein.
     this_player()->Defend(random(500),
                           ({DT_PIERCE, DT_RIP}),
                           0,
                           this_object());

  2) Ein Biss ins Bein, mit der Hose als 200%ige Ruestung und Rest mit 100%.
     this_player()->Defend(random(500),
                           ({DT_PIERCE, DT_RIP}),
                           ([SP_PHYSICAL_ATTACK: 1,
                             SP_REDUCE_ARMOUR:   ([AT_TROUSERS: 200])
                           ]),
                           this_object());

  3) Der Biss, wenn ein Tier in die Hose gekrochen ist und dieser ohne
     Treffermeldung und physischen Ruestungsschutz durchgeht.
     this_player()->Defend(random(500),
                           ({DT_PIERCE, DT_RIP}),
                           ([SP_PHYSICAL_ATTACK: 0]),
                           this_object());

  4) Spell-Parameter
     // Beispiel fuer einen Spell, der nur vom Helm normal und von einem
     // Amulett mit 115% aufgehalten wird, alle anderen (angebenenen)
     // Ruestungen haben 0% Schutzwirkung.
     // Mit Ausgabe eigener Meldungen: beginnend mit -1, da der verursachte
     // Schadenswert minimal 0 wird (fuers Ersetzen: Feind: @WEx2,
     // Spieler: WEx1); maximal wird er (Empfindlichkeiten jetzt mal aussen
     // vor) 49 (499/10 = 49), nicht 499!!!
     this_player()->Defend(
       random(500),
       ({DT_PIERCE, DT_AIR}),
       ([SP_PHYSICAL_ATTACK: 1, // wegen DT_PIERCE
         SP_REDUCE_ARMOUR:   ([AT_ARMOUR:   0,
                               AT_HELMET: 100,
                               AT_RING:     0,
                               AT_GLOVE:    0,
                               AT_CLOAK:    0,
                               AT_BOOT:     0,
                               AT_TROUSERS: 0,
                               AT_SHIELD:   0,
                               AT_AMULET: 115,
                               AT_MISC:     0,
                               AT_BELT:     0,
                               AT_QUIVER:   0])
         SP_SHOW_DAMAGE:
               ({({-1,"@WER2 schrammt Dich mit einem durchbohrenden Blick.",
                      "Du schrammst @WEN1 mit einem durchbohrenden Blick.",
                      "@WER2 schrammt @WEN1 mit einem durchbohrenden Blick."
                 }),
                 ({5,"Der durchbohrende Blick von @WEM2 trifft Dich.",
                     "Dein durchbohrender Blick trifft @WEN1.",
                     "Der durchbohrende Blick von @WEM2 trifft @WEN1."
                 }),
                 ({20,"@WESSEN2 stechender Blick durchbohrt Dich.",
                      "Dein stechender Blick durchbohrt @WEN1.",
                      "@WESSEN2 stechender Blick durchbohrt @WEN1."
               })})
       ]),
       this_object());

     // Etwas geschickter geht das Ganze, wenn wir einfach aus der Mudlib
     // alle existierenden Ruestungen in ein Mapping packen und diese
     // nullen (damit sind wir auch gegen neue Ruestungstypen sicher):
     mapping amap = map_indices(VALID_ARMOUR_CLASS,#'!);
     amap[AT_HELMET]=100;
     amap[AT_AMULET]=115;

     this_player()->Defend(random(500),
                           ({DT_PIERCE, DT_AIR}),
                           ([SP_PHYSICAL_ATTACK: 1,
                             SP_REDUCE_ARMOUR: amap,
                             SP_SHOW_DAMAGE: ({ ... (siehe oben)

  5) Der Biss von weiter oben mit Meldung.
     // Eine Meldung, die nur ausgegeben wird, wenn der Biss auch mindestens
     // einen LP abzieht.
     this_player()->Defend(random(500),
                           ({DT_PIERCE, DT_RIP}),
                           ([SP_PHYSICAL_ATTACK: 1,
                             SP_REDUCE_ARMOUR:   ([AT_TROUSERS: 200]),
                             SP_SHOW_DAMAGE: ({
                               ({1,"@WER2 beisst Dich ins Bein!",
                                   "Du beisst @WEN1 ins Bein!",
                                   "@WER2 beisst @WEN1 ins Bein!"
                                })           })
                           ]),
                           this_object());

  6) DefendFunc() und Defend() in einem Objekt
     6a)
     // eine Luftangriffe reflektierende Ruestung:
     int DefendFunc(string *dtyp, mixed spell, object enemy) {
       if(member(dtyp, DT_AIR)>=0 && !spell[SP_RECURSIVE])
         enemy->Defend(random(200),
                       ({DT_AIR}),
                       ([SP_RECURSIVE: 1,
                         SP_SHOW_DAMAGE:
                         ({"Ein Luftwirbel erfasst auch Dich.",
                           "Deine Ruestung wirbelt @WEN1 herum.",
                           "@WESSEN2 Ruestung wirbelt @WEN1 herum."
                          })
                       ]),
                       QueryProp(P_WORN));

       return 0; // -> In diesem Fall gibts keinen Ruestungsbonus!
     }

     6b)
     // Eine NUR REINE Luftangriffe reflektierende Ruestung:
     int DefendFunc(string *dtyp, mixed spell, object enemy) {
       if(!sizeof(dtyp-({DT_AIR})) && !spell[SP_RECURSIVE])
         ...

SIEHE AUCH:
     Angriff:   Attack(L), P_NO_ATTACK, InsertEnemy(L)
     Schaden:   P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE, do_damage(L),
                reduce_hit_points(L), reduce_spell_points(L)
     Schutz:    P_DEFENDERS, InformDefend(L), DefendOther(L),
                P_ARMOURS, P_AC, P_DEFEND_FUNC, QueryDefend(L),
                P_BODY, A_DEX, Defend(L)
     Daten:     P_LAST_COMBAT_TIME, P_LAST_XP, P_LAST_DAMAGE,
                P_LAST_DAMTYPES, P_LAST_DAMTIME
     Resistenz: P_RESISTANCE_STRENGTHS, CheckResistance(L)
     Sonstiges: CheckSensitiveAttack(L), UseSkill(L),
                InternalModifyDefend(L)

25. Mai 2011 Gabylon
