--- deliantra/server/common/time.C 2008/04/21 23:35:24 1.18
+++ deliantra/server/common/time.C 2009/10/12 14:00:57 1.21
@@ -5,18 +5,19 @@
* Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992,2007 Frank Tore Johansen
*
- * Deliantra is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * 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 GNU General Public License
- * along with this program. If not, see .
+ * 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
*/
@@ -73,11 +74,11 @@
};
void
-get_tod (timeofday_t * tod)
+get_tod (timeofday_t *tod)
{
unsigned int todtick = (unsigned int)(runtime * (1. / RUNTIME_PER_HOUR));
- tod->year = todtick / HOURS_PER_YEAR;
+ 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;
@@ -85,19 +86,16 @@
tod->dayofweek = tod->day % DAYS_PER_WEEK;
tod->weekofmonth = tod->day / WEEKS_PER_MONTH;
- tod->season = min (4, tod->month / 3);
+ tod->season = min (4, tod->month / 4);
}
-void
-print_tod (object *op)
+char *
+format_tod (char *buf, int len, timeofday_t *tod)
{
- timeofday_t tod;
- get_tod (&tod);
-
- char todmsg [1024];
+ int day = tod->day + 1;
- 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))
@@ -107,21 +105,39 @@
else
suf = "th";
- snprintf (todmsg, sizeof (todmsg),
+ 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 + 1,
- (tod.minute + 1 < 2) ? "" : "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]);
-
- new_draw_info (NDI_UNIQUE, 0, op, todmsg);
+ 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;
+}
+
+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 ());
}