diff --git a/src/lib/commands/xdump.c b/src/lib/commands/xdump.c index 5e4d9fc8..f92b4b3a 100644 --- a/src/lib/commands/xdump.c +++ b/src/lib/commands/xdump.c @@ -207,9 +207,7 @@ xdvisible(int type, void *p) case EF_LOST: return gp->own != 0 && (gp->own == player->cnum || player->god); case EF_NATION: - if (!player->god) - return gp->own == player->cnum; - /* fall through */ + return gp->own == player->cnum; case EF_COUNTRY: return ((struct natstr *)p)->nat_stat != STAT_UNUSED; case EF_NEWS: diff --git a/src/lib/global/nsc.c b/src/lib/global/nsc.c index eaf108f8..f9499e87 100644 --- a/src/lib/global/nsc.c +++ b/src/lib/global/nsc.c @@ -494,6 +494,11 @@ struct castr trade_ca[] = { }; struct castr nat_ca[] = { + /* + * Keep selectors cnum, stat and cname at the beginning. + * ef_init_srv() makes their copies in cou_ca[] accessible for + * mortals. + */ {NSC_NATID, 0, 0, fldoff(natstr, nat_cnum), "cnum", EF_NATION}, {NSC_SITYPE(nat_status), 0, 0, fldoff(natstr, nat_stat), "stat", EF_NATION_STATUS}, @@ -535,13 +540,8 @@ struct castr nat_ca[] = { {NSC_NOTYPE, 0, 0, 0, NULL, EF_BAD} }; -struct castr cou_ca[] = { - {NSC_NATID, NSC_CONST, 0, fldoff(natstr, nat_cnum), "cnum", EF_NATION}, - {NSC_SITYPE(nat_status), NSC_CONST, 0, fldoff(natstr, nat_stat), "stat", - EF_NATION_STATUS}, - {NSC_STRINGY, NSC_CONST, 20, fldoff(natstr, nat_cnam), "cname", EF_BAD}, - {NSC_NOTYPE, 0, 0, 0, NULL, EF_BAD} -}; +struct castr cou_ca[sizeof(nat_ca) / sizeof(*nat_ca)]; +/* initialized in ef_init_srv() */ struct castr realm_ca[] = { /* uid is encoded in cnum, realm */ diff --git a/src/lib/subs/fileinit.c b/src/lib/subs/fileinit.c index f2cf49d5..97373138 100644 --- a/src/lib/subs/fileinit.c +++ b/src/lib/subs/fileinit.c @@ -77,6 +77,13 @@ ef_init_srv(void) empfile[fileinit[i].ef_type].postread = fileinit[i].postread; empfile[fileinit[i].ef_type].prewrite = fileinit[i].prewrite; } + + for (i = 0; nat_ca[i].ca_name; i++) { + cou_ca[i] = nat_ca[i]; + cou_ca[i].ca_flags |= NSC_CONST | (i < 3 ? 0 : NSC_DEITY); + } + cou_ca[i] = nat_ca[i]; + ef_open_srv(); if (ef_verify() < 0) exit(EXIT_FAILURE);