#include <std.h>
inherit DAEMON;
int cmd_rapture(string str) {
object env;
object *inv;
int i, tmp;
if(str) return 0;
env = environment(this_player());
if(!env) return 0;
if(this_player()->query_ghost()) {
notify_fail("Bah! You have already experienced rapture!\n");
return 0;
}
if(env->query_property("no magic") || env->query_property("no attack")) {
notify_fail("A holy force prevents the rapture.\n");
return 0;
}
if((int)this_player()->query_mp() < 20) {
notify_fail("Too low on magic power.\n");
return 0;
}
if((int)this_player()->query_skill("faith") < 65) {
notify_fail("You do not have the faith to bring about rapture.\n");
return 0;
}
if(!alignment_ok(this_player())) {
notify_fail("You have betrayed the source of your powers.\n");
return 0;
}
for(i=0, tmp =sizeof((inv=users())); i<tmp; i++) {
if(inv[i]->query_blocked("shout")) continue;
if(creatorp(inv[i])) continue;
tell_object(inv[i],
"%^RED%^The air begins to thicken and bleed red with impending death through rapture.\n%^RESET%^");
}
this_player()->set_magic_round();
call_out("do_rapture", 7, env);
this_player()->add_mp(-(int)this_player()->query_mp()); //abuse fix 930907 blodgett
this_player()->set_paralyzed(8);
return 1;
}
void do_rapture(object env) {
mapping who;
object *inv, *chambres;
string *sorties;
int i, j, tmp2, tmp, tmp_al, damage;
object tmp_ob;
if(!present(this_player(), env)) {
write("The force of your spell causes you to return to the place\n"
"of rapture.");
if(env)
this_player()->move(env);
}
for(i=0, tmp = (sizeof(inv = users())); i<tmp; i++) {
if(creatorp(inv[i])) continue;
if(inv[i]->query_blocked("shout")) continue;
tell_object(inv[i], "%^BLUE%^BOLD%^Rapture is here.%^RESET%^");
}
chambres = ({ env });
sorties = (string *)env->query_exits();
if(sorties && sizeof(sorties)) {
for(i=0, tmp = sizeof(sorties); i<tmp; i++) {
call_other((object)env->query_exit(sorties[i]),"???");
if(!(tmp_ob = find_object(env->query_exit(sorties[i])))) continue;
if(tmp_ob->query_property("no magic")) continue;
chambres += ({ tmp_ob });
}
chambres = distinct_array(chambres);
}
for(i=0, tmp=sizeof(chambres), who = ([]); i<tmp; i++) {
inv = all_inventory(chambres[i]);
for(j=0, tmp2=sizeof(inv); j<tmp2; j++) {
if(!living(inv[j])) continue;
who[inv[j]] = ({
(int)inv[j]->query_alignment(), (int)inv[j]->query_max_mp(),
(int)inv[j]->query_hp()
});
}
}
tmp = sizeof((inv=keys(who)));
write("Your prayers bring rapture to the world.\n");
for(i=0; i<tmp; i++) {
if(creatorp(inv[i])) continue;
if(this_player() != inv[i] && !inv[i]->kill_ob(this_player(),0) && !this_player()->kill_ob(inv[i],0))
continue;
tmp_al = who[inv[i]][0] + 2000;
inv[i]->add_mp(-(who[inv[i]][1]));
damage = (int)this_player()->query_skill("faith") - to_int(percent(tmp_al, 3000));
if(damage < 1) damage = 1;
damage = (damage*(who[inv[i]][2]))/100;
damage -= (int)inv[i]->query_spiritual();
if(damage>3*(int)this_player()->query_max_hp())
damage=3*(int)this_player()->query_max_hp();
inv[i]->add_hp(-damage);
if(!inv[i]->query_property("no paralyze")) {
inv[i]->set_paralyzed(random(100-(int)inv[i]->query_level()));
}
if(inv[i] != this_player()) {
tell_object(inv[i],
this_player()->query_cap_name()+" has brought rapture to our reality.\n");
}
}
return;
}
void help() {
write("Syntax: <rapture>\n\n"
"The faithful may use this prayer to bring rapture to their\n"
"area of reality. This should be used with *extreme* caution.\n"
);
}