// _mist.c // Monk/Cleric/Kataan ability // created by Drakken and Aleas 24 June 1994 #include <std.h> #include <rooms.h> inherit OBJECT; // not a bug - a feature ! object caster; object org_env; int org_scry; // this function is used to setup a cloned copy of the spell object // here the actual functionality is implemented. void setup_mist(object ob) { object env; int faith, wis, duration; caster = ob; org_env = env = environment(caster); org_scry = (int)env->query_property("no scry"); faith = (int)caster->query_skill("faith"); wis = (int)caster->query_stats("wisdom"); duration = faith + wis * 3; call_out("remove_mist",duration); if (org_scry == 0) org_env->set_property("no scry",1); set_short(""); set_long(""); set_weight(0); set_value(0); this_object()->move(environment(caster)); } void init() { // no :: here add_action("checkdest",({ "go", "enter" }) ); } int query_invis() { return 1; } void remove_mist() { if (org_scry == 0) org_env->remove_property("no scry"); message("my_action","The misty cloud vailing you disappears.",caster); destruct(this_object()); } int checkdest(string str) { string verb; object env; int i; verb = query_verb(); if (!verb || !str) return notify_fail("What?\n"); if (verb == "enter") i = (int)org_env->cmd_enter(str); else i = (int)org_env->cmd_go(str); if (i) { env = environment(caster); if (env != org_env) { if (org_scry == 0) org_env->remove_property("no scry"); org_env = env; org_scry = (int)env->query_property("no scry"); if (org_scry == 0) org_env->set_property("no scry",1); } move_object(env); } return i; } int cmd_mist(string str) { object ob; int cost, faith; string Class; if(str) return notify_fail("What?\n"); Class = (string)this_player()->query_class(); if(Class != "monk" && Class != "kataan" && Class != "cleric") return notify_fail("Your aren't a faithfull one!\n"); if(this_player()->query_ghost()) return notify_fail("Your voice is hollow.\n"); if(Class == "monk") { if((int)this_player()->query_alignment() < 200) return notify_fail("You have betrayed the source of your powers.\n"); } if(Class == "cleric") { if((int)this_player()->query_alignment() < 0) return notify_fail("You have betrayed the source of your powers.\n"); } if(Class == "kataan") { if((int)this_player()->query_alignment() > -200) return notify_fail("The demons of the underworld aren't with you!\n"); } if(environment(this_player())->query_property("no magic")) return notify_fail("Something seems to be blocking your concentration.\n"); faith = (int)this_player()->query_skill("faith"); cost = 20 + random(60 - (int)this_player()->query_stats("wisdom")/2); if((int)this_player()->query_mp() < cost) return notify_fail("Too low on magic power.\n"); this_player()->add_mp(-cost); this_player()->add_skill_points("faith", cost/3); switch(Class) { case "monk": message("my_action","You mutter a prayer of disorientation." " You feel that noone is watching you.",this_player()); break; case "cleric": message("my_action","You pray to Tempos for a vailing." " You feel that noone is watching you.",this_player()); break; case "kataan": message("my_action","You pray to the demons of the underworld for a vailing." " You feel that noone is watching you.",this_player()); break; } message("other_action",this_player()->query_cap_name()+" speaks a mystical prayer" " and looks shadowy for a moment.",environment(this_player()),this_player()); ob = new(base_name(this_object())); // clone a copy of us. ob->setup_mist(this_player()); return 1; } void help() { message("help", "Usage : <mist>\n\n" "This spell creates a cloud of mist preventing " "others from sensing your location.\n\nSee also: scry", this_player()); return; }