]> git.pond.sub.org Git - empserver/commitdiff
(nsc_type): New member NSC_HIDDEN.
authorMarkus Armbruster <armbru@pond.sub.org>
Thu, 18 May 2006 19:02:04 +0000 (19:02 +0000)
committerMarkus Armbruster <armbru@pond.sub.org>
Thu, 18 May 2006 19:02:04 +0000 (19:02 +0000)
(meta_type): Add its entry.
(setnum, nstr_promote, nstr_exec_val): Deal with it.  nstr_exec_val()
implements opt_HIDDEN by mapping unknown values to -1.
(natstr, nat_ca): Use it for member nat_relate.  This also halves its
size.  Fixes very minor leak: before, player could see relations to
all countries, regardless of contact.
(nation_relations): Add entry for -1.

include/nat.h
include/nsc.h
src/lib/common/xundump.c
src/lib/global/nsc.c
src/lib/global/symbol.c
src/lib/subs/nstr.c

index 0d0dc19285c5f2d5fb1ffcd0c88644900a252ba3..e9b5c61d01ea7eb035b35ed26287d37cfff71ed8 100644 (file)
@@ -114,7 +114,7 @@ struct natstr {
     time_t nat_newstim;                /* date news last read */
     time_t nat_annotim;                /* date annos last read */
     float nat_level[4];                /* technology, etc */
-    short nat_relate[MAXNOC];
+    unsigned char nat_relate[MAXNOC];
     unsigned char nat_contact[MAXNOC];
     unsigned char nat_rejects[MAXNOC];
     signed char nat_priorities[PRI_MAX+1]; /* budget priority */
index 7cf466a7c872e65c9740127310f811b06e55b32c..76f0f1eef12a09169011fe603fdb3a5bd21abc43 100644 (file)
@@ -57,6 +57,8 @@ typedef enum {
     NSC_INT,                   /* int */
     NSC_XCOORD,                        /* coord that needs x conversion */
     NSC_YCOORD,                        /* coord that needs y conversion */
+    NSC_HIDDEN,                        /* unsigned char in struct natstr that
+                                  may need hiding */
     NSC_TIME,                  /* time_t */
     NSC_FLOAT,                 /* float */
     NSC_STRINGY,               /* char[], zero-terminated string */
index 6cbed5642c7c992bb3b18f78adb5fe59b43f5dbf..f748609fe138147d979a9547447d8e8a47bb0f6e 100644 (file)
@@ -447,6 +447,7 @@ setnum(int fldno, double dbl)
        ((signed char *)memb_ptr)[idx] = (signed char)dbl;
        break;
     case NSC_UCHAR:
+    case NSC_HIDDEN:
        old = ((unsigned char *)memb_ptr)[idx];
        ((unsigned char *)memb_ptr)[idx] = (unsigned char)dbl;
        break;
index f53cff35c9ea3cf54cbb7031e8037d91547a96c4..ee730314225d4a2dd20c50213e47932f5c8949aa 100644 (file)
@@ -527,7 +527,7 @@ struct castr nat_ca[] = {
      EF_BAD},
     {NSC_FLOAT, 0, 0, fldoff(natstr, nat_level[NAT_HLEV]), "happiness",
      EF_BAD},
-    {NSC_SHORT, 0, MAXNOC, fldoff(natstr, nat_relate), "relations",
+    {NSC_HIDDEN, 0, MAXNOC, fldoff(natstr, nat_relate), "relations",
      EF_NATION_RELATIONS},
     /* should show mortals whether there's contact (obvious from relations?) */
     {NSC_UCHAR, NSC_DEITY, MAXNOC, fldoff(natstr, nat_contact), "contacts",
index a150c8bf826df472b4bbffd505c68df60735fc67..eb98278658c659959160a455d1a722a325280115 100644 (file)
@@ -94,6 +94,7 @@ struct symbol meta_type[]  = {
     {NSC_INT, "d"},
     {NSC_XCOORD, "d"},
     {NSC_YCOORD, "d"},
+    {NSC_HIDDEN, "d"},
     {NSC_TIME, "d"},
     {NSC_FLOAT, "g"},
     {NSC_STRINGY,"c"},
@@ -124,6 +125,7 @@ struct symbol nation_flags[] = {
 };
 
 struct symbol nation_relations[] = {
+    {-1, "unknown"},
     {AT_WAR, "at-war"},
     {SITZKRIEG, "sitzkrieg"},
     {MOBILIZATION, "mobilization"},
index 656398eb0d4c396f80b937b9621e4f598ff3c097..463a2534b62ef03707cb694b1b32112603a8b457 100644 (file)
@@ -40,6 +40,7 @@
 #include "file.h"
 #include "match.h"
 #include "nsc.h"
+#include "optlist.h"
 #include "prototypes.h"
 
 static char *nstr_parse_val(char *, struct valstr *);
@@ -500,6 +501,7 @@ nstr_promote(int valtype)
     case NSC_INT:
     case NSC_XCOORD:
     case NSC_YCOORD:
+    case NSC_HIDDEN:
     case NSC_TIME:
        valtype = NSC_LONG;
        break;
@@ -562,9 +564,10 @@ nstr_coerce_val(struct valstr *val, nsc_type to, char *str)
     }
 
     if (val->val_cat == NSC_VAL) {
-       /* coord literals don't occur, conversion not implemented */
+       /* unimplemented conversions; don't currently occur here */
        CANT_HAPPEN(val->val_type == NSC_XCOORD
-                   || val->val_type == NSC_YCOORD);
+                   || val->val_type == NSC_YCOORD
+                   || val->val_type == NSC_HIDDEN);
        val->val_type = to;
     }
 
@@ -587,6 +590,7 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
     char *memb_ptr;
     nsc_type valtype;
     int idx;
+    struct natstr *natp;
 
     switch (val->val_cat) {
     default:
@@ -625,6 +629,16 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
        case NSC_YCOORD:
            val->val_as.lng = yrel(getnatp(cnum), ((short *)memb_ptr)[idx]);
            break;
+       case NSC_HIDDEN:
+           val->val_as.lng = -1;
+           if (CANT_HAPPEN(((struct natstr *)ptr)->ef_type != EF_NATION))
+               break;
+           natp = getnatp(cnum);
+           if (!opt_HIDDEN
+               || natp->nat_stat == STAT_GOD
+               || (getcontact(natp, idx) && getcontact(ptr, idx)))
+               val->val_as.lng = ((unsigned char *)memb_ptr)[idx];
+           break;
        case NSC_FLOAT:
            val->val_as.dbl = ((float *)memb_ptr)[idx];
            valtype = NSC_DOUBLE;