#include <position.h> /* Current time for broom flight is 12 seconds */ #define TIME_LIMIT 15 #define BROOMSTICK "/d/guilds/witches/items/broomstick" inherit "/std/room/basic_room"; string *people; void setup() { set_light( 70 ); set_short( "above discworld" ); set_long( "You are high above the Disc, flying through the air.\n" ); add_property( "determinate", "" ); people = ({ }); } int query_flying( string who ) { if( member_array( who, people ) > -1 ) return 1; else return 0; } void down_they_go( object witch ) { object *obs, broom; if( !witch ) return; /* Damn, they're still here. Put them down somewhere. */ if( environment( witch ) == this_object() ) { obs = match_objects_for_existence( "witches broomstick", witch ); if( sizeof( obs ) ) broom = obs[0]; else broom = load_object( BROOMSTICK ); broom->land( witch, broom->random_dest( witch ) ); } people -= ({ witch->query_name() }); } void init() { /* Sometimes the call_out in the broom gets lost. This * shouldn't be needed too often, but still... */ people += ({ this_player()->query_name() }); call_out( (: down_they_go :), TIME_LIMIT, this_player() ); ::init(); } mixed query_default_position() { return ({ "flying through the air" }); } void event_exit(object ob, string message, object to) { tell_object( ob, "You plummet towards the ground.\n" ); tell_room( this_object(), ob->the_short() +" plummets towards the ground.\n", ob ); STANDING_CMD->position( ob, 1 ); }