news: De-duplicate the loop over news items

Duplicated to detect empty pages in Empire 2.  Easy enough to fold
into the other loop, so do that.

While there, oops on invalid struct nwsstr member nws_ntm.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2016-06-27 07:12:06 +02:00
parent 729eaa7934
commit d63b8aa5f0

View file

@ -27,7 +27,7 @@
* news.c: Show current Empire news * news.c: Show current Empire news
* *
* Known contributors to this file: * Known contributors to this file:
* Markus Armbruster, 2006-2012 * Markus Armbruster, 2006-2016
*/ */
#include <config.h> #include <config.h>
@ -44,13 +44,12 @@ news(void)
{ {
struct natstr *natp; struct natstr *natp;
time_t now; time_t now;
int page; int heading, page;
time_t then; time_t then;
time_t delta; time_t delta;
struct nwsstr nws; struct nwsstr nws;
struct nstr_item nstr; struct nstr_item nstr;
int page_has_news[N_MAX_PAGE + 1]; int page_has_news[N_MAX_PAGE + 1];
int there_is_news = 0;
short sectors_taken[MAXNOC][MAXNOC]; short sectors_taken[MAXNOC][MAXNOC];
short sectors_delta; short sectors_delta;
short max_delta = -1; short max_delta = -1;
@ -63,7 +62,6 @@ news(void)
if (!snxtitem(&nstr, EF_NEWS, "*", NULL)) if (!snxtitem(&nstr, EF_NEWS, "*", NULL))
return RET_SYN; return RET_SYN;
memset(page_has_news, 0, sizeof(page_has_news));
memset(sectors_taken, 0, sizeof(sectors_taken)); memset(sectors_taken, 0, sizeof(sectors_taken));
(void)time(&now); (void)time(&now);
natp = getnatp(player->cnum); natp = getnatp(player->cnum);
@ -84,33 +82,21 @@ news(void)
natp->nat_newstim = now; natp->nat_newstim = now;
head(); head();
pr("\nThe details of Empire news since %s", ctime(&then)); pr("\nThe details of Empire news since %s", ctime(&then));
while (nxtitem(&nstr, &nws)) {
if (!nws.nws_vrb || CANT_HAPPEN(nws.nws_vrb > N_MAX_VERB)) heading = 0;
continue; memset(page_has_news, 0, sizeof(page_has_news));
if (nws.nws_when < then) page_has_news[0] = 1;
continue;
if (opt_HIDDEN) { for (page = 0; page <= N_MAX_PAGE; page++) {
if (!player->god &&
!(getcontact(getnatp(player->cnum), nws.nws_ano) &&
getcontact(getnatp(player->cnum), nws.nws_vno)))
continue;
}
++page_has_news[rpt[(int)nws.nws_vrb].r_newspage];
++there_is_news;
}
for (page = 1; page <= N_MAX_PAGE; page++) {
if (!page_has_news[page]) if (!page_has_news[page])
continue; continue;
pr("\n\t === %s ===\n", page_headings[page].name);
snxtitem_rewind(&nstr); snxtitem_rewind(&nstr);
while (nxtitem(&nstr, &nws)) { while (nxtitem(&nstr, &nws)) {
if (CANT_HAPPEN(nws.nws_vrb > N_MAX_VERB)) if (CANT_HAPPEN(nws.nws_vrb > N_MAX_VERB))
continue; continue;
if (rpt[(int)nws.nws_vrb].r_newspage != page)
continue;
if (nws.nws_when < then) if (nws.nws_when < then)
continue; continue;
if (nws.nws_ntm == 0) if (CANT_HAPPEN(nws.nws_ntm <= 0))
nws.nws_ntm = 1; nws.nws_ntm = 1;
if (opt_HIDDEN) { if (opt_HIDDEN) {
if (!player->god && if (!player->god &&
@ -118,6 +104,13 @@ news(void)
getcontact(getnatp(player->cnum), nws.nws_vno))) getcontact(getnatp(player->cnum), nws.nws_vno)))
continue; continue;
} }
page_has_news[rpt[nws.nws_vrb].r_newspage] = 1;
if (rpt[nws.nws_vrb].r_newspage != page)
continue;
if (heading != page) {
pr("\n\t === %s ===\n", page_headings[page].name);
heading = page;
}
if (page == N_FRONT && if (page == N_FRONT &&
(nws.nws_vrb == N_WON_SECT || (nws.nws_vrb == N_WON_SECT ||
nws.nws_vrb == N_AWON_SECT || nws.nws_vrb == N_AWON_SECT ||
@ -128,6 +121,12 @@ news(void)
preport(&nws); preport(&nws);
} }
} }
if (!heading) {
pr("\nNo news at the moment...\n");
return RET_OK;
}
if (sectors_were_taken) { if (sectors_were_taken) {
for (i = 0; i < MAXNOC; ++i) { for (i = 0; i < MAXNOC; ++i) {
for (j = 0; j < i; ++j) { for (j = 0; j < i; ++j) {
@ -166,9 +165,8 @@ news(void)
} }
} }
} }
if (!there_is_news)
pr("\nNo news at the moment...\n"); return RET_OK;
return 0;
} }
static void static void