// _dispell.c // Monk and Cleric ability // written 151092 by Descartes of Borg #include <std.h> inherit DAEMON; int dispell_all(object tp); int cmd_dispell(string str) { int which, skip, i, faith, wisdom, cost; string whom, cl; object tp, ob; object *inv; this_player()->set_magic_round(); if(!str) { if(!(ob=(object)this_player()->query_current_attacker())) { notify_fail("Dispell whom?\n"); return 0; } } tp = this_player(); if((cl = (string)this_player()->query_class()) != "monk" && cl != "cleric" && cl != "kataan") { notify_fail("You feel confused.\n"); return 0; } if(!alignment_ok(this_player())) { notify_fail("You have betrayed the source of your powers.\n"); return 0; } if(tp->query_casting()) return 1; if(environment(tp)->query_property("no magic")) { notify_fail("Something is blocking your concentration.\n"); return 0; } if(str == "all") return dispell_all(tp); if(!ob) ob = present(str, environment(tp)); if(!ob) { inv = all_inventory(environment(tp)); sscanf(str, "%s %d", whom, which); for(i=0, skip = 0; i<sizeof(inv) && !ob; i++) { if(inv[i]->id(whom)) { skip ++; if(skip == which) ob = inv[i]; } } if(!ob) { notify_fail("Dispell whom?\n"); return 0; } } if(!living(ob)) { notify_fail(ob->query_cap_name()+" is not a living thing!\n"); return 0; } if(cl == "kataan" && (int)ob->query_alignment() < 0) { write(ob->query_cap_name()+" is not good!\n"); tp->add_alignment(10); tp->add_mp(-5); return 1; } else if(cl != "kataan" && (int)ob->query_alignment() > 0) { write(ob->query_cap_name()+" is not evil!\n"); this_player()->add_alignment(-10); this_player()->add_mp(-5); return 1; } if(!ob->kill_ob(tp, 0)) return 1; /* hack by Val to keep out PK */ faith = (int)tp->query_skill("faith"); wisdom = (int)ob->query_stats("wisdom"); faith -= wisdom; if(faith < 2) faith = 2; faith = random(faith); cost = faith/2 + faith/7; if((int)tp->query_mp() < cost) { notify_fail("Too low on magic power.\n"); return 0; } tp->add_mp(-cost); tp->set_casting(faith); say(tp->query_cap_name()+" mutters a prayer against enemies of the faith.\n"); write("You mutter a prayer against enemies of the faith.\n"); tell_room(environment(tp), ob->query_cap_name()+" is struck by the force of "+tp->query_cap_name()+"'s faith!\n", ({tp, ob }) ); tell_object(ob, "You are struck by the force of "+tp->query_cap_name()+"'s faith.\n"); write(ob->query_cap_name()+" is struck by the force of your faith.\n"); tp->add_skill_points("faith", faith); return 1; } int dispell_all(object tp) { object *inv; mixed *who; int faith, wisdom, i, cost, tot; who = ({}); faith = (int)tp->query_skill("faith"); tot = faith; if(faith < 20) { notify_fail("Your faith is not strong enough.\n"); return 0; } inv = all_inventory(environment(tp)); if((string)this_player()->query_class() == "kataan") { for(i=0; i<sizeof(inv); i++) if(living(inv[i]) && (int)inv[i]->query_alignment()>0) who+=({inv[i]}); } else { for(i=0; i<sizeof(inv); i++) { if(living(inv[i]) && (int)inv[i]->query_alignment() < 0) who += ({ inv[i] }); } } if(who == ({})) { if((string)this_player()->query_class() == "kataan") write("Nothing good around here!\n"); else write("Nothing evil around here!\n"); tp->add_mp(-5); return 1; } for(i=0; i<sizeof(who); i++) { wisdom = (int)who[i]->query_skills("wisdom"); faith = tot - wisdom; if(faith < 2) faith = 2; faith = random(faith); cost = faith/3 + faith/7; if((int)tp->query_mp() < cost) { notify_fail("Too low on magic power.\n"); return 0; } if(!who[i]->kill_ob(tp, 0)) continue; /* hack by Val to keep out PK */ tp->add_mp(-cost); who[i]->add_hp(-faith); write(who[i]->query_cap_name()+" is struck by the force of your faith.\n"); tell_room(environment(tp), who[i]->query_cap_name()+" is struck by the force of "+tp->query_cap_name()+"'s faith.\n", ({ who[i], tp })); tell_object(who[i], "You are struck by the force of "+tp->query_cap_name()+"'s faith.\n"); tp->add_skill_points("faith", faith); } tp->set_casting(faith/5+1); return 1; } void help() { write("Syntax: <dispell [enemy]> or <dispell all>\n\n" "This prayer of faith does damage to the enemies of your faith.\n" "It naturally taxes you more to cast upon on all enemies in a room\n" ); }