/*************************************************************************** Time Zone Code (c) by Ryan Jennings (Markanth) email: r-jenn@shaw.ca (markanth@dlmud.com) **************************************************************************/ #include <sys/types.h> #include <stdio.h> #include <time.h> #include "merc.h" #define MAX_TZONE 25 struct tzone_type { const char *name; /* Name of the time zone */ const char *zone; /* Cities or Zones in zone crossing */ int gmt_offset; /* Difference in hours from Greenwich Mean Time */ int dst_offset; /* Day Light Savings Time offset, Not used but left it in anyway */ }; const struct tzone_type tzone_table[MAX_TZONE] = { {"GMT-12", "Eniwetok", -12, 0}, {"GMT-11", "Samoa", -11, 0}, {"GMT-10", "Hawaii", -10, 0}, {"GMT-9", "Alaska", -9, 0}, {"GMT-8", "PST, Pacific US", -8, -7}, {"GMT-7", "MST, Mountain US", -7, -6}, {"GMT-6", "CST, Central US", -6, -5}, {"GMT-5", "EST, Eastern US", -5, -4}, {"GMT-4", "Atlantic, Canada", -4, 0}, {"GMT-3", "Brazilia, Buenos Aries", -3, 0}, {"GMT-2", "Mid-Atlantic", -2, 0}, {"GMT-1", "Cape Verdes", -1, 0}, {"GMT", "Greenwich Mean Time, Greenwich", 0, 0}, {"GMT+1", "Berlin, Rome", 1, 0}, {"GMT+2", "Israel, Cairo", 2, 0}, {"GMT+3", "Moscow, Kuwait", 3, 0}, {"GMT+4", "Abu Dhabi, Muscat", 4, 0}, {"GMT+5", "Islamabad, Karachi", 5, 0}, {"GMT+6", "Almaty, Dhaka", 6, 0}, {"GMT+7", "Bangkok, Jakarta", 7, 0}, {"GMT+8", "Hong Kong, Beijing", 8, 0}, {"GMT+9", "Tokyo, Osaka", 9, 0}, {"GMT+10", "Sydney, Melbourne, Guam", 10, 0}, {"GMT+11", "Magadan, Soloman Is.", 11, 0}, {"GMT+12", "Fiji, Wellington, Auckland", 12, 0}, }; int tzone_lookup(const char *arg) { int i; for(i = 0; i < MAX_TZONE; i++) { if(!str_cmp(arg, tzone_table[i].name)) return i; } for(i = 0; i < MAX_TZONE; i++) { if(is_name(arg, tzone_table[i].zone)) return i; } return -1; } /* Some examples: str_time(current_time, ch->pcdata->timezone, "%I:%M:%S"); str_time(-1, -1, NULL); */ char *str_time(time_t timet, int tz, const char *format) { static char buf_new[5][100]; static int i; char *result; // rotate buffers i++; i %= 5; result = buf_new[i]; if (timet <= 0) { timet = current_time; } if(tz > -1 && tz < MAX_TZONE) { timet += timezone; /* timezone external variable in time.h holds the difference in seconds to GMT. */ timet += (60 * 60 * tzone_table[tz].gmt_offset); /* Add the offset hours */ } strftime(result, 100, format != NULL ? format : "%a %b %d %I:%M:%S %p %Y", localtime(&timet)); return result; } void do_timezone(CHAR_DATA *ch, char *argument) { int i; char buf[MAX_STRING_LENGTH]; if(IS_NPC(ch)) return; if(argument[0] == '\0') { sprintf(buf, "%-6s %-30s (%s)\n\r", "Name", "City/Zone Crosses", "Time"); send_to_char(buf, ch); send_to_char("-------------------------------------------------------------------------\n\r", ch); for(i = 0; i < MAX_TZONE; i++) { sprintf(buf, "%-6s %-30s (%s)\n\r", tzone_table[i].name, tzone_table[i].zone, str_time(current_time, i, NULL)); send_to_char(buf, ch); } send_to_char("-------------------------------------------------------------------------\n\r", ch); return; } i = tzone_lookup(argument); if(i == -1) { send_to_char("That time zone does not exists.\n\r", ch); return; } ch->pcdata->timezone = i; sprintf(buf, "Your time zone is now %s %s (%s)\n\r", tzone_table[i].name, tzone_table[i].zone, str_time(current_time, i, NULL)); send_to_char(buf, ch); }