/* Edded to put inside rather than outside. Deutha 23/8/93
* Changed to make it more safe, also removes ran_talk. Olorin 7/4/96
* Patch added to stop the few killings that seem to get through. Terano 10/3/98
* "Attack" command wasn't blocked. Weird. Fixed it. Red Scharron will be
* unable to use it here. *sigh* Also, I added some "violent" souls to the
* list. - Fiona 7/6/98
* Added restriction against "iai" command. Dragonkin 98-07-18
* Rewritten - 21 July, 1998. Terano
* Added restriction against "hurl" and "guard", fixed bug with magic smoke.
* Aragorn 98-09-06
* Added restriction against "plant" - Aragorn 98-09-30
* Added restriction against "invoke" - Aragorn 98-11-07
* Protection from range attacks (longshot) and KLK insects added.
* Aragorn 98-11-08
* Made Brother David unique, hopefully this will protect him from fleas.
* Aragorn 98-11-08
* Added restriction against "twist" and "hedgehog" - Aragorn 99-01-18
* Added protection from longshot that actually works - Gerbil 13-3-1999
* Added restriction against "berserk" - Saffra June 3, 2000
* Added restrictions against "perform", which is used in some rituals - Twiggy,
* Dec 24, 2000
* Added restriction against "backstab" - Saffra April 16, 2001
*
* Made it into an inheritable, filed into /std/room/ for common use throughout
* the Disc on April 2002 - Siel
*/
#include <armoury.h>
#define TP this_player()
#define SHAD "/std/shadows/misc/davidshad"
inherit "/std/room/basic_room";
object keeper;
void create() {
do_setup++;
::create();
do_setup--;
set_light(90);
/* Dry them up a bit */
add_property("warmth", 3);
add_property( "los", "closed" );
/* Special property for things to check when attempting to complete. */
add_property("calm room", 1);
if(!do_setup) {
this_object()->setup();
this_object()->reset();
}
} /* create() */
int trap_action( string str ) {
string st1;
if( sscanf( str,"%s %s",str,st1 ) );
switch(str) {
/* these are in alphabetical order for ease of reference */
case "ambush":
case "attack":
case "backstab":
case "behead":
case "bury":
case "cast":
case "circle":
case "conflagrate":
case "crush":
case "decompose":
case "drag":
case "eat":
case "ensumpf":
case "fade":
case "filch":
case "fire":
case "fuel":
case "guard":
case "hedgehog":
case "hide":
case "hurl":
case "iai":
case "inhume":
case "inpale":
case "invoke":
case "kill":
case "mock":
case "order":
case "tempt":
case "palm":
case "perform":
case "plant":
case "pyroscipate":
case "scathe":
case "scribe":
case "scry":
case "shroud":
case "slip":
case "snatch":
case "sneak":
case "steal":
case "recharge":
case "rifle":
case "throw":
case "twist":
case "use":
case "ventisepelate":
case "zap":
/* Here go some violent souls */
case "skick":
case "sburn":
case "slap":
case "spunch":
case "berserk":
tell_object( this_player(), "You feel too peaceful to do that.\n");
return 1;
default:
return 0;
}
} /* trap_action */
void event_exit(object ob, string message, object to);
void init() {
this_player()->remove_hide_invis( "hiding" );
clone_object( SHAD )->setup_shadow(TP);
this_player()->command_override( (: trap_action :) );
this_player()->add_command( "dream", this_object(), "" );
this_player()->add_command( "rest", this_object(), "" );
::init();
} /* init() */
/**
* This is the object that is the keeper of the safe room. This should "
* be an NPC.
* @param keeper The keeper NPC object.
*/
void set_keeper(object ob) { keeper = ob; }
void event_exit(object ob, string message, object to){
ob->dest_shadow();
}
void event_enter( object ob, string stringy, string stringy2 ) {
object thing;
if ( base_name( ob ) == "/d/guilds/priests/summoned/dust_devil" ) {
ob->do_leave();
}
if ( base_name( ob ) == "/d/am/chars/herrena" ) {
int *enums = ob->effects_matching( "fighting.combat" );
foreach( int i in enums ) ob->delete_effect( i );
}
foreach( thing in all_inventory(ob)) {
if( base_name( thing ) == "/d/sur/items/crystal_ball" )
thing->do_rub();
}
if ( living( ob ) )
call_out("make_calm", 1, ob );
call_out( "stop_sneaking", 1, ob );
} /* event_enter */
/* Rest function used by players in this room. aids healing but costs GP */
int do_rest( string str ) {
this_player()->adjust_hp( 4 );
this_player()->adjust_gp( -( 2 + random( 4 ) ) );
/* well nothing's free is it ? */
this_player()->adjust_social_points( -( 2 + random(8)));
tell_object( this_player() ,
"You rest on one of the pillows, and feel much "
"better for it.\n");
return 1;
} /* do_rest */
/* Dream function used by players. Aids healing but costs GP */
int do_dream( string str ) {
this_player()->adjust_hp( 4 );
this_player()->adjust_gp( -( 2 + random( 4 ) ) );
/* well nothing's free is it ? */
this_player()->adjust_social_points( -( 2 + random(8)));
tell_object( this_player(), ({
"You dream of a world where cabbages roam free.\n",
"You have a vision of penguin waiters serving giraffes in white leisure "
"suits.\n",
"You dream of imp-powered sheep leaping over fences.\n",
"You dream uneasily of creators with cuddly teddy-bears.\n",
"Visions of sugar-plums dance through your head.\n",
"You count lemons as you try to get to sleep.\n" }) [ random(4) ] );
return 1;
} /* do_dream */
/* Stops all fighting here .... */
void event_fight_in_progress( object ob1, object ob2 ) {
if ( keeper ) { tell_room ( this_object(),
keeper->the_short() + " hums a peaceful tune softly and calm fils the "
"room." ); }
ob2->stop_all_fight();
ob1->stop_all_fight();
} /* event_fight_in_progress */
void make_calm( object blue ) {
int *enums;
int wibble;
enums = blue->effects_matching("fighting.combat");
if ( sizeof( enums ) ) {
foreach( wibble in enums ) { blue->delete_effect( wibble ); }
keeper->do_command("smile "+ blue->query_name() );
tell_object( blue, "You feel a lot calmer.\n");
}
} /* end do_calm */
void stop_sneaking( object sneaker ) {
int *enums;
int wibble;
enums = sneaker->effects_matching( "covert.sneaking" );
if ( sizeof( enums ) ) {
foreach( wibble in enums ) { sneaker->delete_effect( wibble ); }
keeper->do_command("hug "+ sneaker->query_name() );
tell_object( sneaker, "You feel less sneaky.\n");
}
} /* end stop_sneaking */