#include <std.h>
inherit DAEMON;
void send_messages(object tp, object ob, string Class, string limb);
int cmd_rot(string str) {
string whom, limb, Class;
int amount, cost, healing, i, wisdom;
object tp, ob;
string *limbs, *weakness, *strengths;
this_player()->set_magic_round();
if(this_player()->query_ghost()) return 0;
if(!str) {
notify_fail("Rot whom?\n");
return 0;
}
tp = this_player();
if(tp->query_casting()) {
notify_fail("You are in the middle of another spell!\n");
return 0;
}
if(environment(tp)->query_property("no attack")) {
notify_fail("A magic force prevents your power.\n");
return 0;
}
if(!alignment_ok(this_player())) {
notify_fail("You have betrayed the source of your powers.\n");
return 0;
}
healing = (int)tp->query_skill("healing");
Class = (string)tp->query_class();
if(sscanf(str, "%s %s", whom, limb) != 2) {
notify_fail("Correct syntax: <rot [who] [limb]>\n");
return 0;
}
if(whom == "me" || whom == "myself") ob = tp;
else ob = present(whom, environment(tp));
if(!ob) {
notify_fail("Rot whom?\n");
return 0;
}
if(!living(ob)) {
notify_fail("What? Rot that?\n");
return 0;
}
strengths = (string *)ob->query_property("strengths");
if(strengths && member_array("magic", strengths) != -1) {
write(ob->query_cap_name()+" resists your magic!");
return 1;
}
weakness = (string *)ob->query_property("weakness");
if(!weakness) weakness = ({});
if(limb == "all") cost = 200;
else if(member_array(limb, (string *)ob->query_limbs()) == -1) {
if (ob == tp)
notify_fail("You do not have a "+limb+".\n");
else
notify_fail(ob->query_cap_name()+" does not have a "+limb+".\n");
return 0;
}
else if(limb == "head" || limb == "torso") cost = 90;
else cost = 35;
cost = cost/2 + random(cost/2);
if((int)tp->query_mp() < cost) {
notify_fail("Too low on magic power.\n");
return 0;
}
if(healing < 15) {
notify_fail("You are not skilled enough to do that!\n");
return 0;
}
if(ob != tp) if (!ob->kill_ob(tp,0)) return 1;
tp->add_mp(-cost);
if(limb == "all") {
amount = (healing - (int)ob->query_stats("wisdom"))/3;
}
else {
amount = (healing-(int)ob->query_stats("wisdom"))/2;
}
if(member_array("magic", weakness) != -1) amount += random(20);
tp->add_skill_points("healing", amount * 2);
if((int)ob->query_alignment() < -140) tp->add_alignment(amount/10);
else tp->add_alignment(-5);
if(limb == "all") {
limbs = (string *)ob->query_limbs();
for(i=0; i<sizeof(limbs); i++) {
ob->heal_limb(limbs[i], -(amount / 2));
}
send_messages(tp, ob, Class, limb);
}
else {
if(limb == "head" || limb == "torso")
ob->heal_limb(limb, -(random(amount)));
else ob->heal_limb(limb, -amount);
send_messages(tp, ob, Class, limb);
}
return 1;
}
void send_messages(object tp, object ob, string Class, string limb) {
string what, thing;
if(Class == "monk" || Class == "cleric") {
thing = "prayer";
what = "a prayer of deathly rot";
}
else if(Class == "mage") {
thing = "magic";
what = "a spell of deathly rot";
}
else {
thing = "nonsense";
what = "nonsense";
}
if(tp == ob) {
message("my_action","%^RESET%^%^RED%^You rot your own limbs through "+
thing+"!%^RESET%^",tp);
message("other_action",
tp->query_cap_name()+" mutters "+what+".", environment(tp), tp);
} else {
message("my_action", "%^RESET%^%^ORANGE%^You rot "+possessive_noun(ob)+
" "+limb+" through "+thing+".%^RESET%^",tp);
message("other_action","%^RESET%^%^ORANGE%^"+tp->query_cap_name()+
" rots your "+limb+" through "+thing+".%^RESET%^",ob);
message("other_action", tp->query_cap_name()+
" mutters "+what+".", environment(tp),({tp, ob}));
}
}
void help() {
message("help",
"Syntax: <rot [enemy] [limb]>\n\n"
"Brings a plague of rotting wounds onto the named limb of your "
"opponent. Casters of this spell should be careful indeed! For "
"the casting of this spell against the wrong people also rots "
"the moral fiber which forms the base of your powers!\n"
"Note: <all> can be used in place of <limb> ",this_player()
);
}