/**
* This is the standard inheritable for a player-owned house outside room,
* like for gardens and things.
* <p>
* All you need to do is inherit this file and call a couple of setup
* functions and off you go.
* <p>
* In addition you will need to have a lord register the house with the
* housing command if you wish the house to be available for sale or rent
* using the normal processes.
*
* @example
* inherit "/std/room/player_housing_outside";
*
* void setup() {
* set_light(100);
* set_theft_handler(HOSPITAL);
* set_save_file("/save/player_housing/am/short/flat1_garden");
*
* set_short("front room");
* set_base_desc("a small garden" );
* add_surface( "floor", "grass" );
* add_surface( "north wall", "red brick" );
* add_surface( "south wall", "red brick" );
* add_surface( "east wall", "red brick" );
* add_surface( "west wall", "red brick" );
* add_exit("south", PATH+"flat1", "door");
* }
*
* @author Belle, Gototh, Ceres, Pinkfish
*/
#include <dirs.h>
#include <housing.h>
#include <login_handler.h>
#include <player.h>
inherit "/std/room/outside";
inherit "/std/room/inherit/player_housing";
/** @ignore yes */
void create() {
add_help_file("player_housing");
do_setup++;
outside::create();
player_housing::create();
do_setup--;
if ( !do_setup ) {
this_object()->setup();
this_object()->reset();
}
seteuid("Room");
add_property("no burial", 1);
}
/** @ignore yes
* Internal function to update the dynamic long description of the room.
*/
string query_long() {
return player_housing::query_long();
}
/**
* This method returns the current owner of the house.
*/
string query_owner() {
return HOUSING->query_owner(base_name(this_object()));
} /* query_owner() */
/** @ignore yes
* Just makes sure room exits are relative inside houses and that doors
* are closed.
*/
int add_exit(string direc, mixed dest, string type) {
int tmp;
tmp = ::add_exit(direc, dest, type);
setup_exit(direc, 0);
return tmp;
}
/** @ignore yes
* Stops positioned objects from showing. If it has a CURRENT_ROOM_VERB
* property it's obviously a placed object and shouldn't been seen.
*/
string process_non_living(object *int_non_livings, int start) {
object *not_positioned;
not_positioned = player_housing::my_process_non_living(int_non_livings);
return ::process_non_living(not_positioned, start);
} /* process_non_living() */
/** @ignore yes */
void init() {
player_housing::init();
outside::init();
}
/** @ignore yes */
void event_exit(object ob, string message, object to) {
outside::event_exit(ob, message, to);
player_housing::event_exit(ob, message, to);
}
/** @ignore yes
* Cleanup could screw us up so we stay loaded.
*/
int query_keep_room_loaded() { return 1; }
/** @ignore yes */
void dest_me() {
player_housing::dest_me();
outside::dest_me();
}
/**
* @ignore yes
* Calls appropriate test_remove() functions and does PK checks for removal
* of items from this house.
*/
int test_remove(object thing, int flag, mixed dest) {
object thief;
mixed *stuff;
if(!outside::test_remove(thing, flag, dest))
return 0;
thief = this_player();
if(!thief)
return player_housing::test_remove(thing, flag, dest);
if(thief->query_caster())
thief = find_player(thief->query_caster());
else if(thief->query_owner())
thief = thief->query_owner();
stuff = thing->query_property("dropped");
// Do PK checks for taking this rooms inventory away.
if(thief &&
test_save(thing) &&
!test_occupier(thief->query_name()) &&
(!stuff || stuff[0] != thief->query_name())) {
log_file("HOUSING_THEFT", "%s: %s stole %s from %s in %s\n",
ctime( time() )[4..18], (string)thief->query_short(),
thing->query_short(),
(string)query_owner(), file_name());
event(this_object(), "theft", thief, this_object(), ({ thing }));
}
return player_housing::test_remove(thing, flag, dest);
}
/**
* @ignore yes
* Makes sure furniture is saved when its put in this room.
*/
int test_add( object ob, int flag) {
int retval;
retval = outside::test_add(ob, flag);
if(retval)
retval = player_housing::test_add(ob, flag);
return retval;
} /* test_add() */