/* A simple trap object that can be used to trap any item that uses * /std/basic/trap */ #include <move_failures.h> #include <tasks.h> inherit "/std/object"; int difficulty; string trigger; string description; mixed message; mixed effect; /** @ignore yes */ void create() { add_help_file("door_trap"); do_setup++; ::create(); do_setup--; if ( !do_setup ) { this_object()->setup(); this_object()->reset(); } } void make_trap(int diff, string trig, string desc, mixed mess, mixed eff) { difficulty = diff; trigger = trig; description = desc; message = mess; effect = eff; } /** @ignore yes */ void init() { this_player()->add_command("rig", this_object(), "<indirect:object:here> with <direct:object:me>"); } int do_rig(mixed *in_dir, string direct, string indirect, mixed *args, string) { object ob; object other; if(sizeof(in_dir) > 1) { this_player()->add_failed_mess(this_object(), "A trap can only be rigged " "on a single item.\n"); return 0; } if(!difficulty) { this_player()->add_failed_mess(this_object(), "$D appears to be " "broken.\n"); return 0; } ob = in_dir[0]; if(ob->query_trap_difficulty() && ob->query_trap_armed()) { this_player()->add_failed_mess(this_object(), "$I already has an armed trap on it.\n", ({ in_dir[0] })); return 0; } if(!function_exists("setup_trap", ob, 0)) { this_player()->add_failed_mess(this_object(), "$I cannot be $Ved with " "$D.\n", ({ ob })); return 0; } if((trigger == "pick" || trigger == "unlock") && (!ob->query_key() || ob->query_key() == "generic_key")) { this_player()->add_failed_mess(this_object(), "$I doesn't have a lock " "so $Vging it with $D which is triggered " "by " + trigger + "ing makes no sense.\n", ({ ob })); return 0; } switch(TASKER->perform_task(this_player(), "covert.items.traps", difficulty, TM_FREE)) { case AWARD: write("%^YELLOW%^You feel you have learned something about rigging " "traps.%^RESET%^\n"); case SUCCEED: difficulty += random(this_player()->query_skill_bonus("covert.items.traps") / 10); break; default: // Either it goes off, or they succeed but botch it somewhat :) if(random(difficulty) > this_player()->query_skill_bonus("covert.items.traps") || difficulty > this_player()->query_skill_bonus("covert.items.traps") * 2) { // display the message if(arrayp(message)) { write(message[0]); say(message[1], this_player()); } else write(message); // numeric, just reduce their hps. if(intp(effect)) { if(effect > this_player()->query_hp()) this_player()->do_death(); else this_player()->adjust_hp(-(effect)); } else if(arrayp(effect)) { // array, then add an effect with params switch(sizeof(effect)) { case 1: this_player()->add_effect(effect[0]); break; case 2: this_player()->add_effect(effect[0], effect[1]); break; default: this_player()->add_effect(effect[0], effect[1..]); } } else this_player()->add_effect(effect); this_object()->move("/room/rubbish"); this_player()->add_succeeded_mess(this_object(), "As $N attempt$s to " "$V $D it goes off!\n"); return 1; } else { difficulty -= random(difficulty - this_player()->query_skill_bonus("covert.items.traps")); } } ob->setup_trap(difficulty, trigger, description, message, effect); if(function_exists("query_my_room", ob)) { other = load_object( (string)( ob->query_dest() ) ); other = other->query_door_control( (string)( ob->query_other_id() ) ); other->setup_trap(difficulty, trigger, description, message, effect); environment(this_player())->update_doors(); } this_player()->add_succeeded_mess(this_object(), "$N carefully $V $I " "with $D.\n", ({ ob })); call_out("break_me", 1); return 1; } void break_me() { object ob; ob = clone_object("/std/object"); ob->set_name("trap"); ob->set_short("busted trap"); ob->set_long("A broken trap.\n"); ob->set_value(0); ob->set_weight(this_object()->query_weight()); ob->move(environment()); if(this_object()->move("/room/rubbish") != MOVE_OK) this_object()->dest_me(); } mapping int_query_static_auto_load() { mapping tmp; tmp = ::int_query_static_auto_load(); return ([ "::" : tmp, "difficulty" : difficulty, "trigger" : trigger, "description" : description, "message" : message, "effect" : effect ]); } /** @ignore yes */ mixed query_static_auto_load() { if ( base_name(this_object()) + ".c" == __FILE__ ) return int_query_static_auto_load(); return ([ ]); } /** @ignore yes */ void init_static_arg(mapping map) { if(!mapp(map)) return; if(!undefinedp(map["::"])) ::init_static_arg(map["::"]); if(!undefinedp(map["difficulty"])) difficulty = map["difficulty"]; if(!undefinedp(map["trigger"])) trigger = map["trigger"]; if(!undefinedp(map["description"])) description = map["description"]; if(!undefinedp(map["message"])) message = map["message"]; if(!undefinedp(map["effect"])) effect = map["effect"]; }