]> git.pond.sub.org Git - empserver/blobdiff - src/lib/commands/news.c
Update copyright notice
[empserver] / src / lib / commands / news.c
index 697a2d2e556f8826b8f83d3cc573ce94aa5544ba..d6b6ba5a1843f96e00d1d8bd96b944555eb1341b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2016, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2017, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                Ken Stevens, Steve McClure, Markus Armbruster
  *
  *  Empire is free software: you can redistribute it and/or modify
 #include "optlist.h"
 
 static void preport(struct nwsstr *np);
+static int sectwon_cmp(const void *p, const void *q);
+
+struct sectwon {
+    natid ano, vno;
+    unsigned short num;
+};
 
 int
 news(void)
@@ -50,13 +56,10 @@ news(void)
     struct nwsstr nws;
     struct nstr_item nstr;
     int page_has_news[N_MAX_PAGE + 1];
-    short sectors_taken[MAXNOC][MAXNOC];
-    short sectors_delta;
-    short max_delta = -1;
-    short abs_delta;
-    short k;
-    int sectors_were_taken = 0;
+    unsigned short sectors_taken[MAXNOC][MAXNOC];
     natid i, j;
+    int k, n, diff;
+    struct sectwon *sectwon;
     char num[128];
     char *verb;
 
@@ -100,8 +103,8 @@ news(void)
                nws.nws_ntm = 1;
            if (opt_HIDDEN) {
                if (!player->god &&
-                   !(getcontact(getnatp(player->cnum), nws.nws_ano) &&
-                     getcontact(getnatp(player->cnum), nws.nws_vno)))
+                   !(in_contact(player->cnum, nws.nws_ano) &&
+                     in_contact(player->cnum, nws.nws_vno)))
                    continue;
            }
            page_has_news[rpt[nws.nws_vrb].r_newspage] = 1;
@@ -111,13 +114,10 @@ news(void)
                pr("\n\t ===  %s  ===\n", page_headings[page].name);
                heading = page;
            }
-           if (page == N_FRONT &&
-               (nws.nws_vrb == N_WON_SECT ||
-                nws.nws_vrb == N_AWON_SECT ||
-                nws.nws_vrb == N_PWON_SECT)) {
+           if (nws.nws_vrb == N_WON_SECT ||
+               nws.nws_vrb == N_AWON_SECT ||
+               nws.nws_vrb == N_PWON_SECT)
                sectors_taken[nws.nws_ano][nws.nws_vno] += nws.nws_ntm;
-               sectors_were_taken += nws.nws_ntm;
-           }
            preport(&nws);
        }
     }
@@ -127,45 +127,52 @@ news(void)
        return RET_OK;
     }
 
-    if (sectors_were_taken) {
-       for (i = 0; i < MAXNOC; ++i) {
-           for (j = 0; j < i; ++j) {
-               sectors_delta = sectors_taken[i][j] - sectors_taken[j][i];
-               if (max_delta < abs(sectors_delta))
-                   max_delta = abs(sectors_delta);
+    n = 0;
+    for (i = 0; i < MAXNOC; ++i) {
+       for (j = 0; j < i; ++j)
+           n += !!(sectors_taken[i][j] - sectors_taken[j][i]);
+    }
+    sectwon = malloc(sizeof(*sectwon) * n);
+
+    n = 0;
+    for (i = 0; i < MAXNOC; ++i) {
+       for (j = 0; j < i; ++j) {
+           diff = sectors_taken[i][j] - sectors_taken[j][i];
+           if (diff > 0) {
+               sectwon[n].ano = i;
+               sectwon[n].vno = j;
+               sectwon[n].num = diff;
+               n++;
+           } else if (diff < 0) {
+               sectwon[n].ano = j;
+               sectwon[n].vno = i;
+               sectwon[n].num = -diff;
+               n++;
            }
        }
+    }
+
+    qsort(sectwon, n, sizeof(*sectwon), sectwon_cmp);
+
+    if (n) {
        pr("\n\t ===  The Bottom Line   ==\n");
-       for (k = max_delta; k > 0; --k) {
-           for (i = 0; i < MAXNOC; ++i) {
-               for (j = 0; j < i; ++j) {
-                   sectors_delta = sectors_taken[i][j] -
-                       sectors_taken[j][i];
-                   abs_delta = abs(sectors_delta);
-                   if (abs_delta != k)
-                       continue;
-                   if (abs_delta == 1)
-                       verb = "stole";
-                   else if (abs_delta < 4)
-                       verb = "took";
-                   else if (abs_delta < 8)
-                       verb = "captured";
-                   else
-                       verb = "seized";
-                   if (sectors_delta > 0) {
-                       numstr(num, abs_delta);
-                       pr("%s %s %s sector%s from %s\n", cname(i), verb,
-                          num, splur(sectors_delta), cname(j));
-                   } else if (sectors_delta < 0) {
-                       numstr(num, abs_delta);
-                       pr("%s %s %s sector%s from %s\n", cname(j), verb,
-                          num, splur(-sectors_delta), cname(i));
-                   }
-               }
-           }
+       for (k = 0; k < n; k++) {
+           if (sectwon[k].num == 1)
+               verb = "stole";
+           else if (sectwon[k].num < 4)
+               verb = "took";
+           else if (sectwon[k].num < 8)
+               verb = "captured";
+           else
+               verb = "seized";
+           numstr(num, sectwon[k].num);
+           pr("%s %s %s sector%s from %s\n",
+              cname(sectwon[k].ano), verb, num, splur(sectwon[k].num),
+              cname(sectwon[k].vno));
        }
     }
 
+    free(sectwon);
     return RET_OK;
 }
 
@@ -212,3 +219,18 @@ preport(struct nwsstr *np)
     np->nws_ntm = 0;
     return;
 }
+
+static int
+sectwon_cmp(const void *p, const void *q)
+{
+    const struct sectwon *a = p, *b = q;
+    int cmp;
+
+    cmp = b->num - a->num;
+    if (cmp)
+       return cmp;
+    cmp = b->ano - a->ano;
+    if (cmp)
+       return cmp;
+    return b->vno - a->vno;
+}