char nat_userid[32]; /* userid of last user, may be empty */
coord nat_xcap, nat_ycap; /* cap location in abs coords */
coord nat_xorg, nat_yorg; /* origin location in abs coords */
- signed char nat_dayno; /* day of the year mod 128 */
signed char nat_update; /* Want an update or not. */
unsigned short nat_tgms; /* # of telegrams to be announced */
unsigned short nat_ann; /* # of annos pending */
char *argp[128]; /* arguments, ASCII, valid if command */
char *condarg; /* conditional, ASCII, valid if command */
char *comtail[128]; /* start of args in combuf[] */
- time_t lasttime; /* when timeleft was last debited */
- int timeleft;
+ time_t lasttime; /* when nat_timeused was last updated */
int btused;
int god;
int owner;
extern void init_player_commands(void);
extern void log_last_commands(void);
extern int gamedown(void);
-extern void daychange(time_t);
-extern int gettimeleft(time_t, int);
+extern void update_timeused_login(time_t now);
+extern void update_timeused(time_t now);
+extern void enforce_minimum_session_time(void);
/* more under Commands */
/* empmod.c */
/* init_nats.c */
EF_BAD, NSC_DEITY | NSC_EXTRA},
{"yorg", fldoff(nat_yorg), NSC_YCOORD, 0, NULL,
EF_BAD, NSC_DEITY | NSC_EXTRA},
- {"dayno", fldoff(nat_dayno), NSC_CHAR, 0, NULL, EF_BAD, 0},
{"update", fldoff(nat_update), NSC_CHAR, 0, NULL, EF_BAD, 0},
{"tgms", fldoff(nat_tgms), NSC_USHORT, 0, NULL, EF_BAD, 0},
{"ann", fldoff(nat_ann), NSC_USHORT, 0, NULL, EF_BAD, 0},
return 1;
}
+static int
+seconds_since_midnight(time_t time)
+{
+ struct tm *tm = localtime(&time);
+ time_t midnight;
+
+ tm->tm_hour = 0;
+ tm->tm_min = 0;
+ tm->tm_sec = 0;
+ tm->tm_isdst = -1;
+ midnight = mktime(tm);
+
+ return(time - midnight);
+}
+
void
-daychange(time_t now)
+update_timeused_login(time_t now)
{
- struct natstr *natp;
- struct tm *tm;
+ struct natstr *natp = getnatp(player->cnum);
+ time_t midnight_secs = seconds_since_midnight(player->lasttime);
- natp = getnatp(player->cnum);
- tm = localtime(&now);
- if ((tm->tm_yday % 128) != natp->nat_dayno) {
- natp->nat_dayno = tm->tm_yday % 128;
+ if (now - natp->nat_last_logout > midnight_secs) {
natp->nat_timeused = 0;
+ putnat(natp);
}
+ player->lasttime = now;
}
-int
-gettimeleft(time_t now, int mpd)
+void
+update_timeused(time_t now)
{
- struct tm *tm;
- int nsecleft;
- struct natstr *natp;
- int n;
-
- tm = localtime(&now);
- natp = getnatp(player->cnum);
- nsecleft = mpd * 60 - natp->nat_timeused;
- n = 60 * 60 * 24 - (tm->tm_sec + tm->tm_min * 60 + tm->tm_hour * 3600);
- if (n < nsecleft)
- nsecleft = n;
- return nsecleft;
+ struct natstr *natp = getnatp(player->cnum);
+ time_t midnight_secs = seconds_since_midnight(now);
+ time_t dt = now - player->lasttime;
+
+ if (dt > midnight_secs)
+ natp->nat_timeused = midnight_secs;
+ else
+ natp->nat_timeused += dt;
+ player->lasttime = now;
+ putnat(natp);
+}
+
+void
+enforce_minimum_session_time(void)
+{
+ struct natstr *natp = getnatp(player->cnum);
+
+ time_t dt = natp->nat_last_logout - natp->nat_last_login;
+ if (dt > seconds_since_midnight(natp->nat_last_logout))
+ dt = seconds_since_midnight(natp->nat_last_logout);
+ if (dt < 15)
+ natp->nat_timeused += 15 - dt;
+ putnat(natp);
}
player_main(struct player *p)
{
struct natstr *natp;
- int secs;
char buf[128];
p->state = PS_PLAYING;
player = p;
- time(&player->lasttime);
time(&player->curup);
+ update_timeused_login(player->curup);
show_motd();
if (init_nats() < 0) {
pr("Server confused, try again later\n");
if (natp->nat_stat != STAT_GOD)
return;
}
- daychange(player->curup);
- if ((player->timeleft = gettimeleft(player->curup, m_m_p_d)) <= 0) {
+ if (natp->nat_stat == STAT_ACTIVE &&
+ natp->nat_timeused > m_m_p_d * 60) {
pr("Time exceeded today\n");
return;
}
}
/* #*# I put the following line in to prevent server crash -KHS */
natp = getnatp(player->cnum);
- /*
- * randomly round up to the nearest minute,
- * charging at least 15 seconds.
- */
time(&natp->nat_last_logout);
- secs = MAX(natp->nat_last_logout - player->lasttime, 15);
- natp->nat_timeused += secs;
putnat(natp);
+ update_timeused(natp->nat_last_logout);
+ enforce_minimum_session_time();
pr("Bye-bye\n");
journal_logout();
}
pr("You are no longer broke!\n");
time(&player->curup);
- second = player->curup - player->lasttime;
- if (second > 0) {
- player->timeleft -= second;
- if (player->timeleft <= 0) {
- /*
- * countdown timer "player->timeleft" has expired.
- * either day change, or hours restriction
- */
- daychange(player->curup);
- if (!gamehours(player->curup)) {
- pr("Empire hours restriction in force\n");
- if (natp->nat_stat != STAT_GOD) {
- putnat(natp);
- return 0;
- }
- }
- player->timeleft = gettimeleft(player->curup, m_m_p_d);
- }
- player->lasttime += second;
- natp->nat_timeused += second;
- }
+ update_timeused(player->curup);
if (natp->nat_stat == STAT_ACTIVE &&
natp->nat_timeused > m_m_p_d * 60) {
pr("Max minutes per day limit exceeded.\n");
natp->nat_yorg = 0;
}
- natp->nat_dayno = 0;
natp->nat_timeused = 0;
natp->nat_update = 0;
return lp;
}
diff --git a/src/lib/player/player.c b/src/lib/player/player.c
-index 513382b..4b97be7 100644
+index f81e2f0..a9a1f74 100644
--- a/src/lib/player/player.c
+++ b/src/lib/player/player.c
@@ -40,6 +40,7 @@
#include "file.h"
#include "journal.h"
#include "misc.h"
-@@ -65,8 +66,8 @@ player_main(struct player *p)
+@@ -64,7 +65,7 @@ player_main(struct player *p)
p->state = PS_PLAYING;
player = p;
-- time(&player->lasttime);
- time(&player->curup);
-+ empire_time(&player->lasttime);
+ empire_time(&player->curup);
+ update_timeused_login(player->curup);
show_motd();
if (init_nats() < 0) {
- pr("Server confused, try again later\n");
-@@ -100,7 +101,7 @@ player_main(struct player *p)
+@@ -98,7 +99,7 @@ player_main(struct player *p)
strcpy(natp->nat_hostname, player->hostname);
strcpy(natp->nat_hostaddr, player->hostaddr);
putnat(natp);
journal_login();
if (natp->nat_flags & NF_INFORM && natp->nat_tgms > 0) {
-@@ -123,7 +124,7 @@ player_main(struct player *p)
- * randomly round up to the nearest minute,
- * charging at least 15 seconds.
- */
+@@ -117,7 +118,7 @@ player_main(struct player *p)
+ }
+ /* #*# I put the following line in to prevent server crash -KHS */
+ natp = getnatp(player->cnum);
- time(&natp->nat_last_logout);
+ empire_time(&natp->nat_last_logout);
- secs = MAX(natp->nat_last_logout - player->lasttime, 15);
- natp->nat_timeused += secs;
putnat(natp);
-@@ -182,7 +183,7 @@ status(void)
+ update_timeused(natp->nat_last_logout);
+ enforce_minimum_session_time();
+@@ -176,7 +177,7 @@ status(void)
if (!(old_nstat & MONEY) && (player->nstat & MONEY))
pr("You are no longer broke!\n");
- time(&player->curup);
+ empire_time(&player->curup);
- second = player->curup - player->lasttime;
- if (second > 0) {
- player->timeleft -= second;
+ update_timeused(player->curup);
+ if (natp->nat_stat == STAT_ACTIVE &&
+ natp->nat_timeused > m_m_p_d * 60) {
diff --git a/src/lib/player/recvclient.c b/src/lib/player/recvclient.c
index ab4ef69..8934189 100644
--- a/src/lib/player/recvclient.c