/* Pagan and Taniwha 1996 generic trap object */ inherit "/obj/monster"; static int detect_skill; static int disarm_skill; string myzot = "/std/spells/wizard/fireball"; string mylong = "A complex trap, partially hidden in the shadows.\n"; int detected; int disarmed; int target; int trap_power; // 100 is damn good. int max_time = 500; int query_alive() { return 0; } int query_dead() { return 1; } void attack_by(object ob) { if(ob) { ob->stop_fight(this_object()); } } void setup() { int i; set_gender(0); set_long(""); i = 2+random(7); set_int(i); set_wis(i); set_level(i); trap_power = i * 10; } /* setup() */ void set_trap(string spell,int targ,int power,int d,string xlong) { if(power > 200) power = 200; if(power) { set_wis(power/10); set_int(power/10); set_level(power/10); trap_power = power/2; } target = targ; if(d) max_time = d; if(stringp(spell)) myzot = spell; if(stringp(xlong)) mylong = xlong; } query_power() { return trap_power; } void init() { add_action("do_search","search"); add_action("do_disarm","disarm"); ::init(); } void trap_found(object ob) { ob->add_timed_property("trap_aware",1,50); detected = 1; set_name("trap"); set_short("trap"); set_long(mylong); } do_search(string str,object ob) // this IS correct, so NPC's can do it { if(!ob) ob = TP; if(random(trap_power) < random(query_detect_skill(ob)*3)) // * 3 bonus for searching for it { trap_found(ob); tell_object(ob,"You search around and come across a trap " "hidden in the shadows.\n"); return 1; } // and if you are REALLY unlucky *BANG* if(random(ob->query_cha()) < 1) zotem(ob->query_name()); return 0; } do_disarm(string str,object ob) { if(str != "trap") return 0; if(!detected) return 0; if(!ob) ob = TP; tell_object(ob,"You check the trap out carefully and with great skill "); tell_room(ETO,(string)ob->query_cap_name()+"attempts to disarm a trap and ",({ob})); if(random(trap_power) < random(query_disarm_skill(ob))) { tell_object(ob,"suceed in disarming it.\n"); tell_room(ETO,"succeds in disarming the trap.\n",({ob})); call_out("dest_me",0); return 1; } call_out("zotem",0,ob->query_name()); tell_object(ob,"you succeed in setting it off.\n"); tell_room(ETO,"succeeds in setting it off.\n",({ob})); return 1; } int query_detect_skill(object ob) { int bonus; string race; int level; string g_name; int stat_wis; stat_wis = ob->query_wis(); g_name = ob->query_guild_name(); level = ob->query_level(); race = ob->query_race(); bonus = (int)ob->query_property("detection"); // detect traps spell switch(g_name) { case "thief": detect_skill = level+20+stat_wis; break; case "wizthief": detect_skill = ((level*3)/2)+10+stat_wis; break; case "grimbrand": detect_skill = ((level*3)/4)+stat_wis; break; default: detect_skill = level/4+stat_wis; break; } switch(race) { case "gnome": case "halfling": bonus += 20; break; case "orc": case "troll": bonus -= 20; break; case "lizard_man": bonus -=20; break; } return (detect_skill+ bonus); } // all dex, needs steady hands int query_disarm_skill(object ob) { int level = ob->query_level(); string g_name = ob->query_guild_name(); string race = ob->query_race(); int stat_dex = ob->query_dex(); switch(g_name) { case "thief": disarm_skill = level+random(30)+stat_dex; break; case "wizthief": disarm_skill = (level*3/4)+random(30)+stat_dex; break; case"grimbrand": disarm_skill = (level*3/4)+random(30)+stat_dex; break; default: disarm_skill = (level/4)+random(20)+stat_dex; break; } switch(race) { case "dwarf": case "duegar": disarm_skill = disarm_skill +10; break; case "halfling": case "gnome": disarm_skill = disarm_skill +20; break; case "orc": case "lizard-man": disarm_skill = disarm_skill -20; break; case "goblin": disarm_skill = disarm_skill -10; break; } return disarm_skill; } /* string long(string s, int dark) { if(this_player()->query_timed_property("trap_aware")) { return "You see in complex trap hidden in front of you.\n " "Caution should be used to keep it from going off.\n"; } else return "You do not think that the trap is here.\n"; } */ void dest_me() { if(ETO) tell_room(ETO,"A trap crumbles into dust, it's purpose served.\n"); ::dest_me(); } void zotem(string victim) { if(!disarmed) { set_name("trap"); set_short("Booby trap"); call_other(myzot,"cast_spell",victim,this_object(),target); } call_out("dest_me",15); } event_enter(object ob) { mixed str; if(this_object()->query_hb_counter() > max_time) { call_out("dest_me",0); return; } if(!ob->query_alive()) return; if(ob->query_property("trap_aware")) return; if(ob->query_level() < 10) return; // too easy otherwose str = query_property("player"); if( stringp(str) && str != ob->query_name()) return; str = query_property("race"); if( stringp(str) && str != ob->query_race()) return; str = query_property("guild"); if(stringp(str) && str != ob->query_guild_name()) return; if(random(trap_power) < random(query_detect_skill(ob))) // just walk in { trap_found(ob); tell_object(ob,"You notice something hidden in the shadow....\n"); return; } if(target > 1) call_out("zotem",0,"all"); else call_out("zotem",0,ob->query_name()); }