]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/nreport.c
Update copyright notice
[empserver] / src / lib / subs / nreport.c
index 716e81f47540e3d8622e32953b484135a5ed452c..7a869d25c7f31ab99078991a52bca7e07b697610 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2013, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                Ken Stevens, Steve McClure, Markus Armbruster
  *
  *  Empire is free software: you can redistribute it and/or modify
  *     Dave Pare, 1994
  *     Steve McClure, 1997
  *     Ron Koenderink, 2005
- *     Markus Armbruster, 2004-2011
+ *     Markus Armbruster, 2004-2016
  */
 
 #include <config.h>
 
-#include "file.h"
+#include "chance.h"
 #include "nat.h"
 #include "news.h"
 #include "optlist.h"
 #include "prototypes.h"
 
-#define SLOTS  5
+#define SLOTS 8
 
 struct newscache {
     struct nwsstr news;
@@ -49,10 +49,10 @@ struct newscache {
 };
 
 static struct newscache cache[MAXNOC][SLOTS];
+static unsigned char cache_oldest[MAXNOC];
 static int news_tail;
 
-static struct newscache *
-ncache(int actor, int event, int victim, int times);
+static struct newscache *ncache(int, int, int, int);
 
 void
 nreport(natid actor, int event, natid victim, int times)
@@ -105,7 +105,7 @@ delete_old_news(void)
        if (news.nws_vrb == 0 || news.nws_when >= expiry_time)
            break;
     }
-    /* news id 0..I-1 have expired */
+    /* news ID 0..I-1 have expired */
     CANT_HAPPEN(i > news_tail);
     /* no items to delete if I is equal zero */
     if (i == 0)
@@ -157,35 +157,31 @@ ncache(int actor, int event, int victim, int times)
 {
     struct newscache *np;
     int i;
-    int oldslot;
-    time_t oldtime, dur;
+    unsigned oldslot;
+    time_t dur;
     time_t now = time(NULL);
 
-    oldslot = -1;
-    oldtime = 0x7fffffff;
     for (i = 0; i < SLOTS; i++) {
        np = &cache[actor][i];
-       if (np->news.nws_when < oldtime) {
-           oldslot = i;
-           oldtime = np->news.nws_when;
-       }
        if (np->news.nws_vrb == 0)
            continue;
        dur = now - np->news.nws_when;
        if (dur > minutes(5))
            continue;
-       if (np->news.nws_vrb == event && np->news.nws_vno == victim &&
-           np->news.nws_ntm + times <= 127) {
-           np->news.nws_ntm += times;
+       if (np->news.nws_vrb == event && np->news.nws_vno == victim) {
+           np->news.nws_ntm = LIMIT_TO(np->news.nws_ntm + times,
+                                       0, 65535);
            np->news.nws_duration = dur;
            return np;
        }
     }
-    if (CANT_HAPPEN(oldslot < 0))
-       oldslot = 0;
     if (CANT_HAPPEN(!strstr(rpt[event].r_newstory[0], "%s") && victim != 0))
        victim = 0;
+    oldslot = cache_oldest[actor];
+    if (CANT_HAPPEN(oldslot >= SLOTS))
+       oldslot = 0;
     np = &cache[actor][oldslot];
+    cache_oldest[actor] = (oldslot + 1) % SLOTS;
     ef_blank(EF_NEWS, news_tail, &np->news);
     np->news.nws_ano = actor;
     np->news.nws_vrb = event;