// /bin/user/_shield.c
// from the Nightmare mudlib
// Monk and cleric ability
// created by Descartes of Borg 23 february 1993
#include <std.h>
inherit DAEMON;
int check_alignment(object ob);
int cmd_shield(string str) {
object ob;
int cost;
int prot;
int defense;
int time_of_spell;
this_player()->set_magic_round();
if(!str) {
notify_fail("Shield whom?\n");
return 0;
}
if(str == "me" || str == "myself") ob = this_player();
else ob = present(str, environment(this_player()));
if(!ob) { notify_fail("Where is "+capitalize(str)+"?\n");
return 0;
}
if(!living(ob)) {
notify_fail("It is not alive!\n");
return 0;
}
cost = 20 + (random(2000/((int)this_player()->query_stats("wisdom")+1)));
if(environment(this_player())->query_property("no magic")) {
notify_fail("Something is blocking your concentration.\n");
return 0;
}
if( (string)this_player()->query_class() == "monk" ||
(string)this_player()->query_class() == "cleric") {
if(!check_alignment(this_player())) {
notify_fail("You have betrayed the source of your powers.\n");
return 0;
}
}
defense = (int)this_player()->query_skill("magic defense");
cost = cost + (int)ob->query_magic_protection(0)*15;
if(ob == this_player()) {
if( (int)this_player()->query_mp() < cost) {
notify_fail("Too low on magic power.\n");
return 0;
}
prot = (1+defense/25);
}
else {
if( (int)this_player()->query_mp() < cost) {
notify_fail("Too low on magic power.\n");
return 0;
}
prot = (1+defense/20);
}
this_player()->add_mp(-(cost));
time_of_spell = random(defense*10)+100;
if(time_of_spell>600)
time_of_spell = 600;
ob->add_magic_protection( ({ 0, prot, time_of_spell }) );
if(ob == this_player())
this_player()->add_skill_points("magic defense", random(10));
else {
this_player()->add_skill_points("magic defense", random(20));
this_player()->add_exp(5);
if((string)this_player()->query_class()=="monk" && ob->query_alignment() < 0)
this_player()->add_alignment(-random(10));
else this_player()->add_alignment(random(10));
}
write("You mutter a prayer of protection.");
say(this_player()->query_cap_name()+" mutters a spell of protection.", this_player());
return 1;
}
int check_alignment(object ob) {
if( (int)ob->query_alignment() > 200) return 1;
if( (string)ob->query_class() == "cleric" &&
(int)ob->query_alignment() > 0) return 1;
return 0;
}
void help() {
write("Syntax: <shield [whom]>\n\nCreates a shield of magic around your body.\n");
}