/**
 * A generalised watch object. Taken from a watch I found in /obj/misc
 * and made into an inheritable object.
 * @author Ceres
 */
#include <time.h>
inherit OBJECT_OBJ;
#define HOURS ({"twelve", "one", "two", "three", "four", "five", "six", \
                "seven", "eight", "nine", "ten", "eleven" })
int show_date;
/** @ignore yes */
void create() {
    do_setup++;
    ::create();
    do_setup--;
    if( !do_setup )
        TO->setup();
    add_extra_look(TO);
} /* create() */
/** @ignore yes */
string extra_look( object thing ) {
    string mess;
    int minute, hour, *arr;
    minute = TIME_H->query_minute( time() ) % 60;
    hour = TIME_H->query_hour( time() );
    if( minute > 32 )
        hour = hour + 1;
    hour = hour % 12;
    mess = "It is ";
    switch(minute) {
      case 53..57:
        mess += "five to " + HOURS[hour]; break;
      case 48..52:
        mess += "ten to " + HOURS[hour]; break;
      case 43..47:
        mess += "quarter to " + HOURS[hour]; break;
      case 38..42:
        mess += "twenty to " + HOURS[hour]; break;
      case 33..37:
        mess += "twenty-five to " + HOURS[hour]; break;
      case 28..32:
        mess += "half past " + HOURS[hour]; break;
      case 23..27:
        mess += "twenty-five past " + HOURS[hour]; break;
      case 18..22:
        mess += "twenty past " + HOURS[hour]; break;
      case 13..17:
        mess += "a quarter past " + HOURS[hour]; break;
      case 8..12:
        mess += "ten past " + HOURS[hour]; break;
      case 3..7:
        mess += "five past " + HOURS[hour]; break;
      default:
        mess += HOURS[hour] + " o'clock";
    }
    if( show_date ) {
        arr = TIME_H->query_time_array( time() );
        mess += " on "+TIME_H->query_day_of_week(arr[TIME_DAY_OF_WEEK])+
                " the "+ordinal(arr[TIME_DAY_OF_MONTH])+" of "+
                TIME_H->query_month(arr[TIME_MONTH]);
    }
    return mess + ".\n";
} /* extra_look() */
/**
 * This method sets the clock to show the date as well as the time.
 */
void set_show_date() { show_date = 1; }
/**
 * This method sets up chimes for this clock.
 * @param num 1 = every hour, 2 = every half hour, 4 = every quarter hour
 * @param mess the message to be displayed when the clock chimes
 */
void set_chimes( int num, string mess ) {
    CHIME_H->register_for_chimes( TO, num, mess );
} /* set_chimes() */
/**
 * This function is called by the chime handler.
 * Overload this if you wish to have your own chime code.
 * @param mess the message set with set_chimes.
 * @param type the type of chime (quarter/half/hour)
 * @see set_chimes
 */
void do_chime( string mess, int type ) {
    say( mess );
} /* do_chime() */