/** * This handler contains all the stuff needed to handle and deal with * mud times. It contains functions to get names for all the months * from indexes and to return a nice string from an input array of * values. * <p> * Some of this code is from Deutha's original amtime() simul_efun and * some from the am_time_array() efun which Macchirton wrote, although the * latter has mostly been rewritten. * @author Pinkfish * @changed Dediscified, Sandoz, 2002. */ #include <time.h> int *query_time_array(int number); string query_hour_minute(int hour, int minute); string query_day_of_week(int day_of_week); string query_special_day(int month, int day_of_month); string query_month(int month); int query_hour(int time); int query_minute(int time); /** * This method takes an array generated from time_array() as an input * to create the return string. * @param arr the array to turn into a string * @param flag if the flag is set to 1, then the year will be returned as well, * if 2 then hours and minutes will be ignored, in addition to returning the year * @return the nice time string */ string query_time_from_array( int *arr, int flag ) { string special, ret; special = query_special_day( arr[TIME_MONTH], arr[TIME_DAY_OF_MONTH] ); if( flag != 2 ) ret = query_hour_minute( arr[TIME_HOUR], arr[TIME_MINUTE]) + ", "; else ret = ""; ret += ( special ? special : query_day_of_week(arr[TIME_DAY_OF_WEEK])+" "+ ordinal(arr[TIME_DAY_OF_MONTH])+" "+ query_month(arr[TIME_MONTH]) ); if( flag ) ret += ", "+arr[TIME_YEAR]+"AS"; return ret; } /* query_time_from_array() */ /** * This method returns the time for the input time number. * This function takes the same input as the efun ctime(). * You pass in the time number and it returns a string * detailing the in-mud time. * @param number the time number * @return a string containing the time */ varargs string query_time( int number, int flag ) { return query_time_from_array( query_time_array(number), flag ); } /* query_time() */ /** * This method returns the hour/minute as a string. It adds the am/pm * bits to the number. * @param hour the hour of the day * @param minute the minute of the hour * @return the hour/minute string */ string query_hour_minute(int hour, int minute) { int print_hour, half_day; half_day = HOURS_PER_DAY / 2; print_hour = hour % half_day; if( print_hour == 0 ) print_hour = 12; return sprintf("%d:%02d%s", print_hour, minute, ( hour >= half_day ? "PM" : "AM" ) ); } /* query_hour_minute() */ /** * This method returns the string of the day of the week. * @param day_of_week the day of the week */ string query_day_of_week( int day_of_week ) { switch( day_of_week ) { case TIME_FRIDAY : return "Friday"; case TIME_SATURDAY : return "Saturday"; case TIME_SUNDAY : return "Sunday"; case TIME_MONDAY : return "Monday"; case TIME_TUESDAY : return "Tuesday"; case TIME_WEDNESSDAY : return "Wednesday"; case TIME_THURSDAY : return "Thursday"; default : return "Error! Unknown day of week " + day_of_week; } } /* query_day_of_week() */ /** * This method returns the day of month as a string. * This uses both the month and the day of the month * to get the correct strings for special days. * @param month the month to print out * @param day_of_month the day in the specific month */ string query_special_day(int month, int day_of_month) { /* Handle special days */ // switch (month) { // case TIME_JANUARY : // switch (day_of_month) { // case 1 : return "Hogswatchday"; // } // break; // case TIME_JULY : // switch (day_of_month) { // case 16 : return "Small Gods Day"; // } // break; // case TIME_AUGUST : // switch (day_of_month) { // case 22 : return "Soul Cake Tuesday"; // } // break; // case TIME_OCTOBER : // switch (day_of_month) { // case 1 : return "Sektober Fools' Day"; // } // break; // } return 0; } /* query_day_of_month() */ /** * This method returns the month passed in as a string. * @param month the month to return * @return the month as a string */ string query_month( int month ) { switch( month ) { case TIME_JANUARY : return "January"; case TIME_FEBURARY : return "February"; case TIME_MARCH : return "March"; case TIME_APRIL : return "April"; case TIME_MAY : return "May"; case TIME_JUNE : return "June"; case TIME_JULY : return "July"; case TIME_AUGUST : return "August"; case TIME_SEPTEMBER : return "September"; case TIME_OCTOBER : return "October"; case TIME_NOVEMBER : return "November"; case TIME_DECEMBER : return "December"; default : return "Error! Month " + month + " is out of range."; } } /* query_month() */ /** * This is a simple way to get a helpful array of values * for the time in the mud. Useful in functions you want * to act differently for different days, months, etc. * It returns a five element array as described below. * The return values are similar to those used with * localtime(). * <p> * The input parameter to this function should be the return * result from a time() system call. * <dl> * <dt>1st element, a number for "year" : * <dt>2nd element, a number for "month" : * <dd> 1 = January * <dd> 2 = February * <dd> 3 = March * <dd> 4 = April * <dd> 5 = May * <dd> 6 = June * <dd> 7 = July (incl. Small gods day) * <dd> 8 = August (incl. Soul cake tuesday) * <dd> 9 = September * <dd>10 = October * <dd>11 = November * <dd>12 = December * <dt>3rd element, Day of month. * <dt>4th element. Day of week. * <dd>1 = Monday * <dd>2 = Tuesday * <dd>3 = Wednesday * <dd>4 = Thursday * <dd>5 = Friday * <dd>6 = Saturday * <dd>7 = Sunday * <dt>5th element, hour, from 0 to 23 (military time). * <dt>6th element, minute, * </dl> * ie: * <pre> ({ year, month, day_of_month, day_of_week, hour, minute }) </pre><p> * This provides the same information as mudtime() in a manner easier to code from. * * @param number the time you want to create the array for * @return returns the 5 element time array * @example * // Here's an example of part of the code for a * // room that looks different on Wednesdays. * * inherit ROOM_OBJ; * * #include <time.h> * * string query_the_long(); * * void setup(){ * ... * // Setup a function pointer for the long description. * // This is so it can change dynamically * set_long( (: query_the_long() :)); * ... * } /\* setup() *\/ * * // This method returns the dynamically changing long * // for the room. It says something different every * // Wednesday * string query_the_long() { * int *time_array; * * time_array = TIME_H->query_time_array(time()); * if( time_array[TIME_WEEK_DAY] == TIME_WEDNESSDAY ) * return "A festival is in full swing, in honour " * "of the Great Coder MacChirton here, " * "with much haggis and bagpipes.\n"; * * return "This town is rather boring, and the streets " * "are abandoned.\n"; * } /\* query_the_long() *\/ * @see efun::time() * @see efun::localtime() * @see amtime() * @see /include/time.h */ int *query_time_array( int number ) { int year, month, hour, minute, day_of_week, day_of_year, day_of_month; year = number / SECONDS_PER_YEAR + YEAR_OFFSET; number %= SECONDS_PER_YEAR; day_of_year = number / SECONDS_PER_DAY; day_of_month = day_of_year; /* Figure out what month we are in */ for( month = 0; month < DAYS_PER_YEAR / DAYS_PER_MONTH; month++ ) { if( day_of_month < DAYS_PER_MONTH ) break; day_of_month -= DAYS_PER_MONTH; } /* Need to increment the month by one to make it start from 1. */ month++; day_of_month++; /* * day % DAYS_PER_WEEK is not translated into * day of week as one would suspect. * when day % DAYS_PER_WEEK = 0, the day is friday. * The +4 is used to correct this, and the +1 is so that * the first day (monday) is 1, not 0 */ day_of_week = ( ( ( day_of_year + 4 ) % DAYS_PER_WEEK ) + 1 ); number = number / SECONDS_PER_MINUTE; hour = ( ( ( number) % MINUTES_PER_DAY) / MINUTES_PER_HOUR ); minute = number % MINUTES_PER_HOUR; return ({ year, month, day_of_month, day_of_week, hour, minute }); } /* query_time_array() */ /** * This method returns the hour of the day in the mud. * @param time time to convert ( as would be returned by time() ) * @return the hour of the day in mud in 24 hour clock * @see time * @see query_minute * @see query_time_array */ int query_hour( int time ) { return ( time % SECONDS_PER_DAY ) / (SECONDS_PER_MINUTE * MINUTES_PER_HOUR); } /* query_hour() */ /** * This method returns the minute of the day in the mud. * @param time time to convert ( as would be returned by time() ) * @return the minutes passed since midnight in the mud * @see time * @see query_hour * @see query_time_array */ int query_minute( int time ) { return ( time % SECONDS_PER_DAY ) / SECONDS_PER_MINUTE; } /* query_minute() */ /** * This method returns the year in the mud. * @param time time to convert ( as would be returned by time() ) * @return the year * @see time * @see query_hour * @see query_time_array */ int query_year( int time ) { return time / SECONDS_PER_YEAR + YEAR_OFFSET; } /* query_year() */