empserver/src/lib/common/nat.c
Markus Armbruster eaa678c903 reject: Move reject state from struct natstr to rejectstr
Reject state is relatively bulky: it's a big chunk of struct natstr,
and adds almost 200 bytes per country to xdump nat.

Reject state changes rarely.  Rewriting it to disk on every nation
update and retransmitting it in every xdump nat is wasteful.

To avoid this waste, move reject state to its own struct rejectstr.

This is of course an xdump compatibility break.  We're not maintaining
xdump compatibility in this release.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
2017-08-06 20:09:21 +02:00

174 lines
4.2 KiB
C

/*
* Empire - A multi-player, client/server Internet based war game.
* Copyright (C) 1986-2016, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire 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.
*
* 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 <http://www.gnu.org/licenses/>.
*
* ---
*
* See files README, COPYING and CREDITS in the root of the source
* tree for related information and legal notices. It is expected
* that future projects/authors will amend these files as needed.
*
* ---
*
* nat.c: Misc. accesses on the nation file
*
* Known contributors to this file:
* Dave Pare, 1989
* Ron Koenderink, 2005
* Markus Armbruster, 2006-2016
*/
#include <config.h>
#include <string.h>
#include "misc.h"
#include "nat.h"
#include "optlist.h"
#include "sect.h"
#include "tel.h"
char *relates[] = {
/* must follow nation relation defines in nat.h */
"At War", "Hostile", "Neutral", "Friendly", "Allied"
};
char *
cname(natid n)
{
struct natstr *np;
if (!(np = getnatp(n)))
return NULL;
return np->nat_cnam;
}
char *
relatename(struct natstr *np, natid other)
{
return relates[getrel(np, other)];
}
char *
natstate(struct natstr *np)
{
static char *stnam[] = {
/* must match nat_status */
"FREE", "VISITOR", "VISITOR", "SANCTUARY", "ACTIVE", "DEITY"
};
return stnam[np->nat_stat];
}
/* This returns the relations that np has with them */
int
getrel(struct natstr *np, natid them)
{
return np->nat_relate[them];
}
/*
* Return relations @us has with @them.
* Countries are considered allied to themselves.
*/
int
relations_with(natid us, natid them)
{
return us == them ? ALLIED : getrel(getnatp(us), them);
}
int
nat_accepts(struct natstr *np, natid them, enum rej_comm what)
{
return getnatp(them)->nat_stat == STAT_GOD
|| !(getrejectp(np->nat_cnum)->rej_rejects[them] & bit(what));
}
void
agecontact(struct natstr *np)
{
struct contactstr con;
int them;
getcontact(np->nat_cnum, &con);
for (them = 1; them < MAXNOC; ++them) {
if (them != np->nat_cnum && con.con_contact[them])
con.con_contact[them]--;
}
}
int
in_contact(natid us, natid them)
{
return getcontactp(us)->con_contact[them];
}
void
putrel(struct natstr *np, natid them, int relate)
{
np->nat_relate[them] = relate;
}
int
influx(struct natstr *np)
{
struct sctstr sect;
getsect(np->nat_xcap, np->nat_ycap, &sect);
if (sect.sct_own != np->nat_cnum ||
(sect.sct_type != SCT_CAPIT && sect.sct_type != SCT_MOUNT &&
sect.sct_type != SCT_SANCT) ||
(np->nat_flags & NF_SACKED))
return 1;
else
return 0;
}
/*
* Initialize @natp for country #@cnum in status @stat.
* @stat must be STAT_UNUSED, STAT_NEW, STAT_VIS or STAT_GOD.
* Also wipe realms and telegrams.
*/
struct natstr *
nat_reset(struct natstr *natp, natid cnum, char *name, char *rep,
enum nat_status stat)
{
struct realmstr newrealm;
char buf[1024];
int i;
ef_blank(EF_NATION, cnum, natp);
natp->nat_stat = stat;
strncpy(natp->nat_cnam, name, sizeof(natp->nat_cnam) - 1);
strncpy(natp->nat_pnam, rep, sizeof(natp->nat_pnam) - 1);
if (stat == STAT_GOD)
natp->nat_money = 123456789;
for (i = 0; i < MAXNOR; i++) {
ef_blank(EF_REALM, i + cnum * MAXNOR, &newrealm);
putrealm(&newrealm);
}
mailbox_create(mailbox(buf, cnum));
/* FIXME natp->nat_ann = #annos */
natp->nat_level[NAT_HLEV] = start_happiness;
natp->nat_level[NAT_RLEV] = start_research;
natp->nat_level[NAT_TLEV] = start_technology;
natp->nat_level[NAT_ELEV] = start_education;
for (i = 0; i < MAXNOC; i++)
natp->nat_relate[i] = NEUTRAL;
natp->nat_flags =
NF_FLASH | NF_BEEP | NF_COASTWATCH | NF_SONAR | NF_TECHLISTS;
return natp;
}