/* -*- LPC -*- */ /* * $Locker: $ * $Id: curtains.c,v 1.6 2001/06/01 21:18:40 ceres Exp $ * * */ /** * This is a furniture item for making all kinds of furniture. */ #include <move_failures.h> #include <position.h> inherit "/std/room/furniture/basic"; private nosave object _window; private string _window_id; private string _window_old_long; void create() { do_setup++; ::create(); add_alias( "furniture" ); add_plural( "furniture" ); set_opaque(); if ( !query_property( "shop type" ) ) { add_property( "shop type", "furniture" ); } set_allowed_room_verbs((["hanging" : "hangs" ])); do_setup--; if ( !do_setup ) { this_object()->setup(); } } void init() { if(!_window_id) { this_player()->add_command("hang", this_object(), "<direct:object> [on|at] <indirect:object:here>"); } this_player()->add_command("open", this_object(), "<direct:object>"); this_player()->add_command("close", this_object(), "<direct:object>"); } int do_open() { if(!_window) _window = environment(this_object())->query_door_control(_window_id); if(!_window_id || !_window) { this_player()->add_failed_mess(this_object(), "$D aren't hanging at a window.\n"); return 0; } if(_window->query_transparent()) { this_player()->add_failed_mess(this_object(), "$D are already open.\n"); return 0; } _window->set_transparent(); this_player()->add_succeeded_mess(this_object(), "$N $V $D.\n", ({})); return 1; } int do_close() { if(!_window) _window = environment(this_object())->query_door_control(_window_id); if(!_window_id || !_window) { this_player()->add_failed_mess(this_object(), "$D aren't hanging at a window.\n"); return 0; } if(!_window->query_transparent()) { this_player()->add_failed_mess(this_object(), "$D are already closed.\n"); return 0; } _window->reset_transparent(); this_player()->add_succeeded_mess(this_object(), "$N $V $D.\n", ({})); return 1; } int do_hang(mixed *in_dir, string direct, string indirect, mixed *args) { if(member_array("window", in_dir[0]->parse_command_id_list()) == -1) { this_player()->add_failed_mess(this_object(), "You can only $V $D at windows.\n", ({ })); return 0; } if(this_object()->move(environment(this_player())) != MOVE_OK) { this_player()->add_failed_mess(this_object(), "You seem to be unable to $V $D " "at $I.\n", ({ in_dir[0] })); return 0; } this_object()->add_property("current room hidden", 1); _window_id = in_dir[0]->query_my_id(); _window_old_long = in_dir[0]->query_long(); in_dir[0]->set_long(in_dir[0]->query_long()+"It has " + this_object()->query_short() + " hanging round it.\n"); event(environment(), "save", this_object()); this_player()->add_succeeded_mess(this_object(), "$N $V $D at $I.\n", ({ in_dir[0] })); return 1; } /** @ignore yes * Reset the windows desc and opacity when the curtains are removed. */ void removed() { this_object()->remove_property("current room hidden"); if(!_window) _window = environment(this_object())->query_door_control(_window_id); _window->set_long(_window_old_long); _window->set_transparent(); _window_id = 0; } /** * This method will return true if the item is an item of furniture. * @return always returns true */ int query_furniture() { return 1; } /** @ignore yes */ mixed query_static_auto_load() { if ( base_name(this_object()) + ".c" == __FILE__ ) return int_query_static_auto_load() + ([ "window" : _window_id, "window_old_long" : _window_old_long ]); return ([ "window" : _window_id, "window_old_long" : _window_old_long ]); } /** * @ignore yes */ void init_static_arg( mapping map ) { if ( !mapp( map ) ) { return; } ::init_static_arg(map); if ( !undefinedp( map[ "window" ] ) ) _window_id = map["window"]; if(!undefinedp(map["window_old_long"])) _window_old_long = map["window_old_long"]; }