dsI/bin/
dsI/extra/creremote/
dsI/extra/mingw/
dsI/extra/wolfpaw/
dsI/fluffos-2.7-ds2.018/
dsI/fluffos-2.7-ds2.018/ChangeLog.old/
dsI/fluffos-2.7-ds2.018/Win32/
dsI/fluffos-2.7-ds2.018/compat/
dsI/fluffos-2.7-ds2.018/compat/simuls/
dsI/fluffos-2.7-ds2.018/testsuite/
dsI/fluffos-2.7-ds2.018/testsuite/clone/
dsI/fluffos-2.7-ds2.018/testsuite/command/
dsI/fluffos-2.7-ds2.018/testsuite/data/
dsI/fluffos-2.7-ds2.018/testsuite/etc/
dsI/fluffos-2.7-ds2.018/testsuite/include/
dsI/fluffos-2.7-ds2.018/testsuite/inherit/
dsI/fluffos-2.7-ds2.018/testsuite/inherit/master/
dsI/fluffos-2.7-ds2.018/testsuite/log/
dsI/fluffos-2.7-ds2.018/testsuite/single/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
dsI/fluffos-2.7-ds2.018/testsuite/u/
dsI/fluffos-2.7-ds2.018/tmp/
dsI/lib/cfg/
dsI/lib/cmds/common/
dsI/lib/cmds/creators/include/
dsI/lib/cmds/creators/include/SCCS/
dsI/lib/daemon/services/
dsI/lib/doc/
dsI/lib/domains/Ylsrim/
dsI/lib/domains/Ylsrim/adm/
dsI/lib/domains/Ylsrim/armour/
dsI/lib/domains/Ylsrim/broken/
dsI/lib/domains/Ylsrim/fish/
dsI/lib/domains/Ylsrim/meal/
dsI/lib/domains/Ylsrim/npc/
dsI/lib/domains/Ylsrim/virtual/
dsI/lib/domains/Ylsrim/weapon/
dsI/lib/domains/default/creator/
dsI/lib/domains/default/etc/
dsI/lib/domains/default/room/
dsI/lib/lib/comp/
dsI/lib/lib/lvs/
dsI/lib/lib/user/
dsI/lib/lib/virtual/
dsI/lib/obj/
dsI/lib/obj/include/
dsI/lib/realms/
dsI/lib/save/kills/a/
dsI/lib/save/kills/b/
dsI/lib/save/kills/f/
dsI/lib/save/kills/m/
dsI/lib/save/kills/q/
dsI/lib/save/kills/r/
dsI/lib/secure/cfg/
dsI/lib/secure/cfg/classes/
dsI/lib/secure/cfg/races/SCCS/
dsI/lib/secure/cmds/creators/include/
dsI/lib/secure/cmds/players/
dsI/lib/secure/cmds/players/include/
dsI/lib/secure/daemon/include/
dsI/lib/secure/lib/
dsI/lib/secure/lib/include/
dsI/lib/secure/lib/net/
dsI/lib/secure/lib/net/include/
dsI/lib/secure/lib/std/
dsI/lib/secure/obj/
dsI/lib/secure/obj/include/
dsI/lib/secure/save/
dsI/lib/spells/
dsI/lib/verbs/admins/include/
dsI/lib/verbs/common/
dsI/lib/verbs/common/include/
dsI/lib/verbs/creators/
dsI/lib/verbs/creators/include/
dsI/lib/verbs/players/include/SCCS/
dsI/lib/verbs/rooms/
dsI/lib/verbs/rooms/include/
dsI/lib/www/
dsI/v22.2b14/
dsI/win32/
/*    /spells/buffer.c
 *    From Dead Souls LPMud
 *    Created by Blitz 
 *    Converted to new spell system by BillGates 961119
 *    Version: @(#) buffer.c 1.6@(#)
 *    Last modified: 96/11/10
 */

#include <lib.h>
#include <magic.h>
#include <damage_types.h>
#include <magic_protection.h>

inherit LIB_SPELL;

int hitCallback(object who, object agent, int x, class MagicProtection cl);
void endCallback(object who);

static void create() {
    spell::create();
    SetSpell("buffer");
    SetRules("", "LIV");
    SetSpellType(SPELL_DEFENSE);
    SetRequiredMagic(50);
    SetSkills(([ "magic defense" : 1 ]));
    SetMagicCost(40, 40);
    SetDifficulty(50);
    SetMorality(10);
    SetHelp("Syntax: <cast buffer>\n"
	    "	     <cast buffer on LIV>\n\n"
	    "A magical defense spell that allows the caster to create "
          "a glowing shield around the LIVing object named.\n\n");
}

int eventCast(object who, int level, string race, object array targets) {
    class MagicProtection protection;
    object target = targets[0];
    int prot_level, skill, wis;

    wis = who->GetStatLevel("wisdom");
    skill = who->GetSkillLevel("magic defense");
    prot_level = level;
    prot_level *= (random(skill/10) + 1);
    prot_level += random(wis/2);

    protection = new(class MagicProtection);
    protection->bits = BLUNT | BLADE | KNIFE | MAGIC;
    protection->caster = who;
    protection->absorb = 2*prot_level;
    protection->args = level;
    protection->hit = (: hitCallback :);
    protection->end = (: endCallback :);
    target->AddMagicProtection(protection);
    if( target == who ) {
	send_messages("", "A %^BOLD%^CYAN%^translucent magical shield%^RESET%^ "
	   "suddenly appears around $agent_possessive_noun body.", who, 0,
          environment(target));
    }
    else {
	send_messages("", "A %^BOLD%^CYAN%^translucent magical shield%^RESET%^ "
		 "suddenly appears around $target_possessive_noun body.", who,
		  target, environment(target));
    }
    return 1;
}

int hitCallback(object who, object agent, int x, class MagicProtection cl) {
   string str;
   object Caster = cl->caster;
 
   if( (int)agent->GetUndead() ) return 0;
   str = (string)agent->GetName() || (string)agent->GetShort();
   if( who == Caster ) {
      who->eventTrainSkill("magic defense",cl->args,x,1);
    }
   else if( Caster && playerp(who) && Caster != who ) {
      Caster->eventTrainSkill("magic defense",cl->args,0,1);
    } 

  send_messages("", "The %^YELLOW%^magical shield%^RESET%^ around "
		  "$agent_name wavers as $target_name strikes it.",
		  who, agent, environment(who));
  return x;
}
 
void endCallback(object who) {
    if( who ) {
	send_messages("", "The %^BOLD%^CYAN%^magical shield%^RESET%^ around "
       "$agent_name shatters into nothingness.", who, 0, environment(who));
    }
}