/* A simple trap object that can be used to trap any item that uses
* /std/basic/trap
*/
#include <tasks.h>
inherit OBJECT_OBJ;
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 ) {
TO->setup();
TO->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");
if(creatorp(TP))
tell_creator(this_player(), "In_dir: %O\n", in_dir);
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 = ob->query_dest();
other = other->query_door_control(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() {
set_short("busted trap");
set_long("A broken trap.\n");
difficulty = 0;
set_value(0);
}