/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
* Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 2002 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992 Frank Tore Johansen
*
* Deliantra is free software: you can redistribute it and/or modify it under
* the terms of the Affero GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the Affero GNU General Public License
* and the GNU General Public License along with this program. If not, see
* .
*
* The authors can be reached via e-mail to
*/
#include
#include
#include
#include
#include
/*
* Gloabal variables:
*/
tick_t server_tick;
static const char *season_name[5] = {
"New Year",
"Growth",
"Harvest",
"Decay",
"the Blizzard",
};
static const char *weekdays[DAYS_PER_WEEK] = {
"the Moon",
"the Bull",
"the Deception",
"Thunder",
"Freedom",
"the Great Gods",
"the Sun"
};
static const char *month_name[MONTHS_PER_YEAR] = {
"Winter", /* 0 */
"the Ice Dragon",
"the Frost Giant",
"Valriel",
"Lythander",
"the Harvest",
"Gaea",
"Futility",
"the Dragon",
"the Sun",
"the Great Infernus",
"Ruggilli",
"the Dark Shades",
"the Devourers",
"Sorig",
"the Ancient Darkness",
"Gorokh"
};
void
get_tod (timeofday_t *tod)
{
unsigned int todtick = (unsigned int)(runtime * (1. / RUNTIME_PER_HOUR));
tod->year = todtick / HOURS_PER_YEAR + EPOCH;
tod->month = todtick / HOURS_PER_MONTH % MONTHS_PER_YEAR;
tod->day = todtick % HOURS_PER_MONTH / DAYS_PER_MONTH;
tod->hour = todtick % HOURS_PER_DAY;
tod->minute = (int)((runtime - todtick * RUNTIME_PER_HOUR) * (60. / RUNTIME_PER_HOUR));
tod->dayofweek = tod->day % DAYS_PER_WEEK;
tod->weekofmonth = tod->day / WEEKS_PER_MONTH;
tod->season = min (4, tod->month / 4);
}
char *
format_tod (char *buf, int len, timeofday_t *tod)
{
int day = tod->day + 1;
const char *suf;
if (day == 1 || ((day % 10) == 1 && day > 20))
suf = "st";
else if (day == 2 || ((day % 10) == 2 && day > 20))
suf = "nd";
else if (day == 3 || ((day % 10) == 3 && day > 20))
suf = "rd";
else
suf = "th";
snprintf (buf, len,
"It is %d minute%s past %d o'clock %s, on the Day of %s,\n"
"the %d%s Day of the Month of %s, Year %d.\n"
"It is the Season of %s.",
tod->minute ? tod->minute : 60,
tod->minute ? "s" : "",
(tod->hour + 13) % 14 + 1,
(tod->hour >= 14 ? "pm" : "am"),
weekdays[tod->dayofweek],
day, suf, month_name[tod->month], tod->year + 1,
season_name[tod->season]);
return buf;
}
static const char *
get_current_tod_str ()
{
timeofday_t tod;
get_tod (&tod);
static char todbuf[512];
format_tod (todbuf, sizeof (todbuf), &tod);
return todbuf;
}
void
print_tod (object *op)
{
new_draw_info (NDI_UNIQUE, 0, op, get_current_tod_str ());
}