/**
* This handler deals with clocks which chime. It uses a single 15 minute
* callout to make all clocks on the mud which choose to chime chime the
* quarter, half or hours.
* @author Ceres
* @changed Rewrote parts and changed to work on Divided Sky, Sandoz 2002.
*/
#include <time.h>
#include <chime.h>
#define QUARTER (SECONDS_PER_MINUTE*MINUTES_PER_HOUR/CHIME_QUARTER_HOUR)
#define HALF (SECONDS_PER_MINUTE*MINUTES_PER_HOUR/CHIME_HALF_HOUR)
#define HOUR (SECONDS_PER_MINUTE*MINUTES_PER_HOUR/CHIME_HOUR)
class chime *quarter_list, *half_list, *hour_list;
int call_id;
private void check_chimes();
private void do_chime( class chime record, int type );
/** @ignore yes */
private void start_ticking() {
if( call_id ) {
remove_call_out( call_id );
call_id = 0;
}
if( sizeof(quarter_list) ) {
call_id = call_out( (: check_chimes :),
( 1 + QUARTER ) - time() % QUARTER );
return;
}
if( sizeof(half_list) ) {
call_id = call_out( (: check_chimes :),
( 1 + HALF ) - time() % HALF );
return;
}
if( sizeof(hour_list) ) {
call_id = call_out( (: check_chimes :),
( 1 + HOUR ) - time() % HOUR );
return;
}
} /* start_ticking() */
/** @ignore yes */
void create() {
quarter_list = ({ });
half_list = ({ });
hour_list = ({ });
start_ticking();
} /* create() */
/**
* Register a clock to do chimes. The num parameter specifes when to
* chime. If it is 1 then the clock chimes every hour, if it is
* 2 the clock chimes ever half hour, if it is 4 the
* clock chimes every quarter hour. Anything else and
* the clock never chimes. NB: if you set it to chime the quarter hours
* it will only chime the quarter hours, it will not chime the hours
* or the half hours. You need to call this function three times to
* get your clock to chime the hour, half and quarter hours.
* Repeated calls to this function from the same object will only
* overwrite the previous messages assigned to the object.
* <p>
* The function "do_chime" will be called on the clock
* when the chime occurs. The message will be passed in as the first
* argument, the second will be the type of chime (CHIME_HOUR, CHIME_HALF_HOUR,
* CHIME_QUARTER_HOUR).
* @param ob the object being registered
* @param num when to chime
* @param mess the message to chime with, can be an array of messages as well
*/
int register_for_chimes( object ob, int num, mixed mess ) {
class chime record, *tmp;
int found;
switch( num ) {
case 1:
tmp = hour_list;
break;
case 2:
tmp = half_list;
break;
case 4:
tmp = quarter_list;
break;
default:
return 0;
}
foreach( record in tmp ) {
if( record->ob == ob ) {
found = 1;
break;
}
}
if( !found )
record = new( class chime );
record->ob = ob;
record->mess = mess;
if( !found ) {
switch( num ) {
case 1:
hour_list += ({ record });
break;
case 2:
half_list += ({ record });
break;
case 4:
quarter_list += ({ record });
break;
default:
return 0;
}
}
start_ticking();
return 1;
} /* register_for_chimes() */
/** @ignore yes */
private void check_chimes() {
class chime record;
call_out( (: start_ticking :), 4 );
quarter_list = filter( quarter_list, (: objectp( $1->ob ) :) );
half_list = filter( half_list, (: objectp( $1->ob ) :) );
hour_list = filter( hour_list, (: objectp( $1->ob ) :) );
if( time() % HOUR < 4 ) {
if( sizeof(hour_list) )
foreach( record in hour_list )
do_chime( record, CHIME_HOUR );
} else if( time() % HALF < 4 ) {
if( sizeof(half_list) )
foreach( record in half_list )
do_chime( record, CHIME_HALF_HOUR );
} else if( time() % QUARTER < 4 ) {
if( sizeof(quarter_list) )
foreach( record in quarter_list )
do_chime( record, CHIME_QUARTER_HOUR );
}
} /* check_chimes() */
/** @ignore yes */
private void do_chime( class chime record, int type ) {
if( !record || !record->ob )
return;
(record->ob)->do_chime( record->mess, type );
} /* do_chime() */
/** @ignore yes */
void init_dynamic_arg( mapping map ) {
if( !mapp(map) )
return;
if( map["quarter"] )
quarter_list = map["quarter"];
if( map["half"] )
half_list = map["half"];
if( map["hour"] )
hour_list = map["hour"];
start_ticking();
} /* init_dynamic_auto_load() */
/** @ignore yes */
mapping query_dynamic_auto_load() {
mapping map;
map = ([ ]);
if( sizeof(quarter_list) )
map["quarter"] = quarter_list;
if( sizeof(half_list) )
map["half"] = half_list;
if( sizeof(hour_list) )
map["hour"] = hour_list;
return map;
} /* query_dynamic_auto_load() */