relations: Move relations state from struct natstr to relatstr

Relations state is relatively bulky: it's a big chunk of struct
natstr, and adds 200 bytes per country to xdump nat.

Relations change rarely.  Rewriting it to disk on every nation update
and retransmitting it in every xdump nat is wasteful.

To avoid this waste, move relations state to its own struct relatstr.

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>
This commit is contained in:
Markus Armbruster 2016-10-31 18:05:07 +01:00
parent de24545963
commit 92693cba65
20 changed files with 223 additions and 155 deletions

View file

@ -68,7 +68,7 @@ natstate(struct natstr *np)
enum relations
relations_with(natid us, natid them)
{
return us == them ? ALLIED : getnatp(us)->nat_relate[them];
return us == them ? ALLIED : getrelatp(us)->rel_relate[them];
}
char *
@ -133,11 +133,13 @@ void
nat_reset(natid cnum, char *name, char *rep, enum nat_status stat)
{
struct natstr nat;
struct relatstr relat;
struct realmstr newrealm;
char buf[1024];
int i;
ef_blank(EF_NATION, cnum, &nat);
ef_blank(EF_RELAT, cnum, &relat);
nat.nat_stat = stat;
strncpy(nat.nat_cnam, name, sizeof(nat.nat_cnam) - 1);
strncpy(nat.nat_pnam, rep, sizeof(nat.nat_pnam) - 1);
@ -154,8 +156,9 @@ nat_reset(natid cnum, char *name, char *rep, enum nat_status stat)
nat.nat_level[NAT_TLEV] = start_technology;
nat.nat_level[NAT_ELEV] = start_education;
for (i = 0; i < MAXNOC; i++)
nat.nat_relate[i] = NEUTRAL;
relat.rel_relate[i] = NEUTRAL;
nat.nat_flags =
NF_FLASH | NF_BEEP | NF_COASTWATCH | NF_SONAR | NF_TECHLISTS;
putnat(&nat);
putrelat(&relat);
}

View file

@ -636,8 +636,6 @@ struct castr cou_ca[] = {
EF_BAD, 0, CA_DUMP},
{"happiness", fldoff(nat_level[NAT_HLEV]), NSC_FLOAT, 0, NULL,
EF_BAD, 0, CA_DUMP},
{"relations", fldoff(nat_relate), NSC_UCHAR, MAXNOC, NULL,
EF_NATION_RELATIONS, NSC_HIDDEN, CA_DUMP_NONE},
{NULL, 0, NSC_NOTYPE, 0, NULL, EF_BAD, 0, CA_DUMP}
#undef CURSTR
};
@ -650,6 +648,8 @@ struct castr relat_ca[] = {
{"uid", fldoff(rel_uid), NSC_INT, 0, NULL, EF_RELAT, 0, CA_DUMP},
{"timestamp", fldoff(rel_timestamp), NSC_TIME, 0, NULL,
EF_BAD, 0, CA_DUMP_NONE},
{"relations", fldoff(rel_relate), NSC_UCHAR, MAXNOC, NULL,
EF_NATION_RELATIONS, NSC_HIDDEN, CA_DUMP},
{NULL, 0, NSC_NOTYPE, 0, NULL, EF_BAD, 0, CA_DUMP}
#undef CURSTR
};

View file

@ -79,6 +79,7 @@ nstr_eval(struct valstr *val, natid cnum, void *ptr, enum nsc_type want)
int idx, hidden;
coord c;
struct natstr *natp;
struct relatstr *relp;
if (CANT_HAPPEN(want != NSC_NOTYPE && !NSC_IS_PROMOTED(want)))
want = nstr_promote(want);
@ -178,13 +179,13 @@ nstr_eval(struct valstr *val, natid cnum, void *ptr, enum nsc_type want)
if (hidden) {
if (CANT_HAPPEN(hidden && valtype != NSC_LONG))
break; /* not implemented */
natp = ptr;
if (CANT_HAPPEN(natp->ef_type != EF_NATION))
relp = ptr;
if (CANT_HAPPEN(relp->ef_type != EF_RELAT))
break; /* only defined for nation selectors */
if (!opt_HIDDEN || cnum == NATID_BAD
|| getnatp(cnum)->nat_stat == STAT_GOD)
break;
if (!in_contact(cnum, idx) || !in_contact(natp->nat_cnum, idx))
if (!in_contact(cnum, idx) || !in_contact(relp->rel_uid, idx))
val->val_as.lng = -1;
}
break;

View file

@ -43,6 +43,7 @@
void
setrel(natid us, natid them, enum relations rel)
{
struct relatstr *relp = getrelatp(us);
struct natstr *mynp = getnatp(us);
enum relations oldrel;
char *whichway;
@ -54,7 +55,7 @@ setrel(natid us, natid them, enum relations rel)
rel = AT_WAR;
if (CANT_HAPPEN(rel > ALLIED))
rel = ALLIED;
if (CANT_HAPPEN(!mynp))
if (CANT_HAPPEN(!relp || !mynp))
return;
if (us == them)
return;
@ -92,8 +93,8 @@ setrel(natid us, natid them, enum relations rel)
"Country %s has %s their relations with you to \"%s\"!\n",
prnat(mynp), whichway, relations_string(rel));
mynp->nat_relate[them] = rel;
putnat(mynp);
relp->rel_relate[them] = rel;
putrelat(relp);
if (!player->god) {
if (oldrel == ALLIED)