/* -*- LPC -*- */ /* * $Locker: $ * $Id: twilight.c,v 1.2 2000/04/11 19:58:57 drakkos Exp $ * * */ /* * $Locker: $ * $Id: twilight.c,v 1.2 2000/04/11 19:58:57 drakkos Exp $ * * $Log: twilight.c,v $ * Revision 1.2 2000/04/11 19:58:57 drakkos * Fixed an ugly typo. * * Revision 1.1 1998/11/01 12:02:03 terano * Initial revision * * Revision 1.1 1998/01/15 01:37:46 ceres * Initial revision * */ /* * $Locker: $ * $Id: twilight.c,v 1.2 2000/04/11 19:58:57 drakkos Exp $ * * $Log: twilight.c,v $ * Revision 1.2 2000/04/11 19:58:57 drakkos * Fixed an ugly typo. * * Revision 1.1 1998/11/01 12:02:03 terano * Initial revision * * Revision 1.1 1998/01/15 01:37:46 ceres * Initial revision * */ /* * $Locker: $ * $Id: twilight.c,v 1.2 2000/04/11 19:58:57 drakkos Exp $ * * $Log: twilight.c,v $ * Revision 1.2 2000/04/11 19:58:57 drakkos * Fixed an ugly typo. * * Revision 1.1 1998/11/01 12:02:03 terano * Initial revision * * Revision 1.1 1998/01/15 01:37:46 ceres * Initial revision * */ /* * $Locker: $ * $Id: twilight.c,v 1.2 2000/04/11 19:58:57 drakkos Exp $ * * $Log: twilight.c,v $ * Revision 1.2 2000/04/11 19:58:57 drakkos * Fixed an ugly typo. * * Revision 1.1 1998/11/01 12:02:03 terano * Initial revision * * Revision 1.1 1998/01/15 01:37:46 ceres * Initial revision * */ // This (hopefully) will cause the long of the room to work (correctly and // constantly), along with appropriate add_items. // // Functions: // int add_day_item( mixed shorts, mixed desc, mixed no_plural ) // These items are visible only by day. // int add_night_item( same as above ) // These items are visible only by night. // void set_day_long( string long ) // The long of the room during day. // void set_night_long( string long ) // The long of the room during the night, and when the player has light // to see by. // void room_day_chat( mixed *chats ), room_night_chat( mixed *chats ) // The chat that pops up during the day and night, respectively. // Either use these or use room_chat( mixed *chats ), BUT NOT BOTH! // IE: No room_day_chat( chats ) and room_chat( chats ). Bad stuff // happens. (Well, not bad, but just not what you want.) // int query_time() // Returns last_updated. 0 = NIGHT, 1 = DAY. // // Functions to define in your room: (Optional) // void changing_to_day( int just_cloned ) {...} // void changing_to_night( int just_cloned ) {...} // These functions are called whenever day turns to night or night turns // to day. Just_cloned is an integer which is always either 0 or 1. // The only time that it's 1 is when the room is just cloned. This helps // avoid silly messages: IE: If you have a room that has an NPC which is // to be in the room only during the day, you don't want a "The NPC // leaves the room." message if the room is cloned during the night and // the changing_to_night() function is called. Unfortunately, it takes // a second or two for this function to be called after the room is // created. // // This function is handled by /std/outside.c and others... // add_item( string|string* item, string|string* desc, int noplural ) // Works as normal. These items will appear day or night. // set_dark_mess( string long ) // The long of the room if it's too dark. // set_bright_mess( string long ) // The long of the room if it's too bright. #include <twilight.h> #include <climate.h> int last_updated; mixed roomitems; string *roomlong; mixed roomchats; object shadowed_obj; void set_current_long(); string return_long( mixed desc ); void do_change(); void change( int time_now ); void create() { seteuid( (string)"/secure/master"->creator_file( file_name( this_object() ) ) ); } void destruct_shadow( object thing ) { if( thing == this_object() ) destruct( thing ); else thing->destruct_shadow( thing ); } void setup_shadow( object this_room ) { shadow( this_room, 1 ); shadowed_obj = this_room; if( WEATHER_HANDLER->query_day() ) { call_out( "changing_to_day", 0, 1 ); last_updated = DAY; } else { call_out( "changing_to_night", 0, 1 ); last_updated = NIGHT; } roomitems = ({ ({ }), ({ }) }); roomlong = allocate( 2 ); roomlong = ({ 0, 0 }); roomchats = allocate( 2 ); // Tell the WEATHER_HANDLER that this room wants to be notified. WEATHER_HANDLER->weather_notify( this_room, NOTIFY_DAY ); } // This is a possibly temporary thing to periodically look at the time. void event_weather(int whats_changed) { if (WEATHER_HANDLER->query_day()) { if (last_updated == NIGHT) change( DAY ); } else if (last_updated == DAY) change( NIGHT ); shadowed_obj->event_weather( whats_changed ); } void change( int time_now ) { int i; /* Time to update the room. */ last_updated = time_now; set_current_long(); /* Turn on/off items */ /* Changed by Presto 12/20/97 */ for ( i = 0; i < sizeof( roomitems[ last_updated ] ); i += 2 ) { shadowed_obj->modify_item( roomitems[ last_updated ][ i ], roomitems[ last_updated ][ i + 1 ] ); } for ( i = 0; i < sizeof( roomitems[ 1 - last_updated ] ); i += 2 ) { if ( member_array( roomitems[ 1 - last_updated ][ i ], roomitems[ last_updated ] ) == -1 ) { shadowed_obj->modify_item( roomitems[ 1 - last_updated ][ i ], "You can't see that now.\n" ); } } /* New room chats */ /* Changed by Presto 12/20/97 */ shadowed_obj->stop_room_chats(); if( sizeof(roomchats[last_updated]) ) shadowed_obj->room_chat( roomchats[last_updated] ); /* Tell the room that the time has changed. */ if( last_updated == DAY ) shadowed_obj->changing_to_day( 0 ); else shadowed_obj->changing_to_night( 0 ); } void set_day_long( string str ) { roomlong[DAY] = str; set_current_long(); } void set_night_long( string str ) { roomlong[NIGHT] = str; set_current_long(); } void set_current_long() { if (roomlong[last_updated] != 0 && roomlong[last_updated] != "") shadowed_obj->set_long( roomlong[last_updated] ); } varargs int add_day_item( mixed shorts, mixed desc, mixed no_plural ) { string the_item; if( pointerp( shorts ) ) the_item = shorts[0]; else the_item = shorts; roomitems[DAY] += ({ the_item, return_long( desc ) }); if( last_updated == DAY ) return this_object()->add_item( shorts, desc, no_plural ); return 1; } varargs int add_night_item( mixed shorts, mixed desc, mixed no_plural ) { string the_item; if( pointerp( shorts ) ) the_item = shorts[0]; else the_item = shorts; roomitems[NIGHT] += ({ the_item, return_long( desc ) }); if( last_updated == NIGHT ) return shadowed_obj->add_item( shorts, desc, no_plural ); return 1; } void room_day_chat( mixed *args ) { roomchats[DAY] = args; if( last_updated == DAY ) shadowed_obj->room_chat( args ); } void room_night_chat( mixed *args ) { roomchats[NIGHT] = args; if( last_updated == NIGHT ) shadowed_obj->room_chat( args ); } /* Returns the long part of the description. */ string return_long( mixed desc ) { int ma; if( !pointerp( desc ) ) return (string)desc; ma = member_array( "long", desc ); if( ma < 0 ) return "Error: No long found."; return (string)desc[ma+1]; } int query_time() { return last_updated; } mixed query_roomitems() { return roomitems; } string *query_roomlong() { return roomlong; } mixed query_roomchats() { return roomchats; }