// _protect.c
// Monk and Cleric ability
// written by Descartes 081192
#include <std.h>
inherit DAEMON;
int check_alignment(object tp);
int cmd_protect(string str) {
object ob;
int cost;
int defense;
string limb, who;
if(!str) {
notify_fail("Protect whom?\n");
return 0;
}
if((int)this_player()->query_mp() < 25) {
notify_fail("Too low on magic power.\n");
return 0;
}
if(sscanf(str, "%s %s", who, limb) != 2) {
limb = str;
who = 0;
}
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;
}
}
if(!who) ob = this_player();
else ob = present(who, environment(this_player()));
if(!ob) {
notify_fail("No "+str+" here!\n");
return 0;
}
if(!living(ob)) {
notify_fail(ob->query_cap_name()+" is not a living thing.\n");
return 0;
}
defense = (int)this_player()->query_skill("magic defense");
if(member_array(limb, (string *)ob->query_limbs()) == -1) {
if(ob == this_player()) write("You have no such limb!\n");
else write(ob->query_cap_name()+" has no such limb!\n");
return 1;
}
this_player()->set_magic_round();
ob->add_magic_protection( ({ limb, (1+defense/10), random(defense*10) }));
if(ob == this_player()) {
this_player()->add_mp(-20);
this_player()->add_skill_points("magic defense", random(30));
}
else {
this_player()->add_mp(-10);
this_player()->add_skill_points("magic defense", 30);
this_player()->add_exp(30);
if((string)this_player()->query_class()=="monk" && ob->query_alignment() < 0)
this_player()->add_alignment(-10);
else this_player()->add_alignment(10);
}
write("You mutter a prayer of protection.\n");
say(this_player()->query_cap_name()+" mutters a prayer of protection.\n", this_player());
return 1;
}
void remove_spell(mixed *arr) {
if(!arr[0]) return;
arr[0]->add_magic_protection(arr[1], -arr[2]);
tell_object(arr[0], "The magical protection had faded.\n");
}
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: <protect [(who)] [limb]>\n\n"+
"A prayer to add magical protection to a specified limb.\n"+
"When no player or monster is specified, the caster is considered\n"+
"the benificiary. Recipient must be specified with a limb that has\n"+
"a name greater than one word.\n");
}