#include <std.h>
inherit DAEMON;
void send_messages(object tp, object ob, string Class, string limb);
int cmd_heal(string str) {
string whom, limb, Class;
int amount, cost, healing, i, wisdom;
object tp, ob;
string * limbs;
if(!str) {
notify_fail("Heal 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(!alignment_ok(this_player())) {
notify_fail("You have betrayed the source of your powers.\n");
return 0;
}
healing = (int)tp->query_skill("healing");
wisdom = (int)tp->query_stats("wisdom");
Class = (string)tp->query_class();
if(str == "me" || str == "myself") ob = tp;
else ob = present(str, environment(tp));
if(!ob) {
if(sscanf(str, "%s %s", whom, limb) != 2) {
notify_fail("Correct syntax: <heal [who] [(limb)]\n");
return 0;
}
if(whom == "me" || whom == "myself") ob = tp;
else ob = present(whom, environment(tp));
}
if(!ob) {
notify_fail("Heal whom?\n");
return 0;
}
if(!limb) cost = 22;
else if(limb == "all") cost = 44;
else if(member_array(limb, (string *)tp->query_limbs()) == -1) {
notify_fail("You do not have a "+limb+".\n");
return 0;
}
else cost = 14;
if(ob != tp) cost = random(cost);
if((int)tp->query_mp() < cost) {
notify_fail("Too low on magic power.\n");
tp->add_mp(-cost);
return 0;
}
this_player()->set_magic_round();
tp->add_mp(-cost);
if(healing < 5) amount = 0;
else amount = random(wisdom + (healing/10));
if(!amount) {
write("You do not have the skill to do that.");
return 1;
}
if(tp == ob) tp->add_skill_points("healing", amount);
else {
tp->add_skill_points("healing", amount * 2);
if(this_player() != ob) {
if((string)tp->query_class()=="monk" && ob->query_alignment() < 0)
tp->add_alignment(-amount);
else tp->add_alignment(amount);
}
tp->add_exp(random((amount/2)+2));
}
if(!limb) {
ob->add_hp(amount);
send_messages(tp, ob, Class, 0);
}
else if(limb == "all") {
limbs = (string *)ob->query_limbs();
for(i=0; i<sizeof(limbs); i++) {
ob->heal_limb(limbs[i], (amount / 2));
}
ob->add_hp(amount / 2);
send_messages(tp, ob, Class, limb);
}
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 healing";
}
else if(Class == "mage") {
thing = "magic";
what = "a spell of healing";
}
else {
thing = "nonsense";
what = "nonsense";
}
if(tp == ob) {
tell_object(tp, "You heal your own wounds through " + thing + ".");
tell_room(environment(tp), tp->query_cap_name() +
" mutters " + what + ".", ({ tp }) );
}
else {
tell_object(tp, "You heal " + ob->query_cap_name() +
"'s wounds through " + thing + ".");
tell_object(ob, tp->query_cap_name() + " heals your wounds through " +
thing + ".");
tell_room(environment(tp), tp->query_cap_name() + " mutters " +
what + ".", ({ tp, ob }) );
}
}
void help() {
write("Syntax: <heal [player] [(limb)]>\n\n"+
"Heals the player named. If no limb is given, then\n"+
"it heals hp. Otherwise it heals the limb named. The arg \"all\"\n"+
"is a valid arg for the limb.\n");
}