Use fixed-lwength types to make the save format more portable
authorEric S. Raymond <esr@thyrsus.com>
Mon, 17 Apr 2023 11:24:51 +0000 (07:24 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Mon, 17 Apr 2023 11:24:51 +0000 (07:24 -0400)
advent.h
tests/resumefail2.chk

index fa87028c966fb7e38d799906dda50dae6b25d8b8..41c659f8e9ae72377e089c17409a54b5eb59f323 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -176,30 +176,32 @@ typedef enum {
     GO_DWARFWAKE,
 } phase_codes_t;
 
     GO_DWARFWAKE,
 } phase_codes_t;
 
-typedef int vocab_t;  // index into a vocabulary array */
-typedef int verb_t;   // index into an actions array */
-typedef int obj_t;    // index into the object array */
-typedef int loc_t;    // index into the locations array */
-typedef int turn_t;   // turn counter or threshold */
+/* Use fixed-lwength types to make the save format moore portable */
+typedef int32_t vocab_t;  // index into a vocabulary array */
+typedef int32_t verb_t;   // index into an actions array */
+typedef int32_t obj_t;    // index into the object array */
+typedef int32_t loc_t;    // index into the locations array */
+typedef int32_t turn_t;   // turn counter or threshold */
+typedef int32_t bool32_t; // turn counter or threshold */
 
 struct game_t {
     int32_t lcg_x;
 
 struct game_t {
     int32_t lcg_x;
-    int abbnum;                  // How often to print int descriptions
+    int32_t abbnum;              // How often to print int descriptions
     score_t bonus;               // What kind of finishing bonus we are getting
     loc_t chloc;                 // pirate chest location
     loc_t chloc2;                // pirate chest alternate location
     turn_t clock1;               // # turns from finding last treasure to close
     turn_t clock2;               // # turns from warning till blinding flash
     score_t bonus;               // What kind of finishing bonus we are getting
     loc_t chloc;                 // pirate chest location
     loc_t chloc2;                // pirate chest alternate location
     turn_t clock1;               // # turns from finding last treasure to close
     turn_t clock2;               // # turns from warning till blinding flash
-    bool clshnt;                 // has player read the clue in the endgame?
-    bool closed;                 // whether we're all the way closed
-    bool closng;                 // whether it's closing time yet
-    bool lmwarn;                 // has player been warned about lamp going dim?
-    bool novice;                 // asked for instructions at start-up?
-    bool panic;                  // has player found out he's trapped?
-    bool wzdark;                 // whether the loc he's leaving was dark
-    bool blooded;                // has player drunk of dragon's blood?
-    int conds;                   // min value for cond[loc] if loc has any hints
-    int detail;                  // level of detail in descriptions
+    bool32_t clshnt;             // has player read the clue in the endgame?
+    bool32_t closed;             // whether we're all the way closed
+    bool32_t closng;             // whether it's closing time yet
+    bool32_t lmwarn;             // has player been warned about lamp going dim?
+    bool32_t novice;             // asked for instructions at start-up?
+    bool32_t panic;              // has player found out he's trapped?
+    bool32_t wzdark;             // whether the loc he's leaving was dark
+    bool32_t blooded;            // has player drunk of dragon's blood?
+    int32_t conds;               // min value for cond[loc] if loc has any hints
+    int32_t detail;              // level of detail in descriptions
 
     /*  dflag controls the level of activation of dwarves:
      * 0       No dwarf stuff yet (wait until reaches Hall Of Mists)
 
     /*  dflag controls the level of activation of dwarves:
      * 0       No dwarf stuff yet (wait until reaches Hall Of Mists)
@@ -207,14 +209,14 @@ struct game_t {
      * 2       Met first dwarf, others start moving, no knives thrown yet
      * 3       A knife has been thrown (first set always misses)
      * 3+      Dwarves are mad (increases their accuracy) */
      * 2       Met first dwarf, others start moving, no knives thrown yet
      * 3       A knife has been thrown (first set always misses)
      * 3+      Dwarves are mad (increases their accuracy) */
-    int dflag;
+    int32_t dflag;
 
 
-    int dkill;                   // dwarves killed
-    int dtotal;                  // total dwarves (including pirate) in loc
-    int foobar;                  // progress in saying "FEE FIE FOE FOO".
-    int holdng;                  // number of objects being carried
-    int igo;                     // # uses of "go" instead of a direction
-    int iwest;                   // # times he's said "west" instead of "w"
+    int32_t dkill;               // dwarves killed
+    int32_t dtotal;              // total dwarves (including pirate) in loc
+    int32_t foobar;              // progress in saying "FEE FIE FOE FOO".
+    int32_t holdng;              // number of objects being carried
+    int32_t igo;                 // # uses of "go" instead of a direction
+    int32_t iwest;               // # times he's said "west" instead of "w"
     loc_t knfloc;                // knife location; LOC_NOWERE if none, -1 after caveat
     turn_t limit;                // lifetime of lamp
     loc_t loc;                   // where player is now
     loc_t knfloc;                // knife location; LOC_NOWERE if none, -1 after caveat
     turn_t limit;                // lifetime of lamp
     loc_t loc;                   // where player is now
@@ -223,33 +225,33 @@ struct game_t {
     loc_t oldloc;                // where player was
     loc_t oldlc2;                // where player was two moves ago
     obj_t oldobj;                // last object player handled
     loc_t oldloc;                // where player was
     loc_t oldlc2;                // where player was two moves ago
     obj_t oldobj;                // last object player handled
-    int saved;                   // point penalty for saves
-    int tally;                   // count of treasures gained
-    int thresh;                  // current threshold for endgame scoring tier
-    bool seenbigwords;           // have we red the graffiti in the Giant's Room? 
+    int32_t saved;               // point penalty for saves
+    int32_t tally;               // count of treasures gained
+    int32_t thresh;              // current threshold for endgame scoring tier
+    bool32_t seenbigwords;       // have we red the graffiti in the Giant's Room? 
     turn_t trnluz;               // # points lost so far due to turns used
     turn_t turns;                // counts commands given (ignores yes/no)
     char zzword[TOKLEN + 1];     // randomly generated magic word from bird
     struct {
     turn_t trnluz;               // # points lost so far due to turns used
     turn_t turns;                // counts commands given (ignores yes/no)
     char zzword[TOKLEN + 1];     // randomly generated magic word from bird
     struct {
-       int abbrev;              // has location been seen?
-       int atloc;               // head of object linked list per location
+       int32_t abbrev;          // has location been seen?
+       int32_t atloc;           // head of object linked list per location
     } locs[NLOCATIONS + 1];
     struct {
     } locs[NLOCATIONS + 1];
     struct {
-       int seen;                // true if dwarf has seen him
+       int32_t seen;            // true if dwarf has seen him
        loc_t loc;               // location of dwarves, initially hard-wired in
        loc_t oldloc;            // prior loc of each dwarf, initially garbage
     } dwarves[NDWARVES + 1];
     struct {
 #ifdef FOUNDBOOL
        loc_t loc;               // location of dwarves, initially hard-wired in
        loc_t oldloc;            // prior loc of each dwarf, initially garbage
     } dwarves[NDWARVES + 1];
     struct {
 #ifdef FOUNDBOOL
-       bool found;              // has the location of this object bween found?
+       bool32_t found;          // has the location of this object bween found?
 #endif
        loc_t fixed;             // fixed location of object (if not IS_FREE)
 #endif
        loc_t fixed;             // fixed location of object (if not IS_FREE)
-        int prop;                // object state */
+        int32_t prop;            // object state */
        loc_t place;             // location of object
     } objects[NOBJECTS + 1];
     struct { 
        loc_t place;             // location of object
     } objects[NOBJECTS + 1];
     struct { 
-       bool used;               // hints[i].used = true iff hint i has been used.
-       int lc;                 // hints[i].lc = show int at LOC with cond bit i
+       bool32_t used;           // hints[i].used = true iff hint i has been used.
+       int32_t lc;              // hints[i].lc = show int at LOC with cond bit i
     } hints[NHINTS];
     obj_t link[NOBJECTS * 2 + 1];// object-list links
 };
     } hints[NHINTS];
     obj_t link[NOBJECTS * 2 + 1];// object-list links
 };
@@ -292,7 +294,7 @@ typedef struct {
  * files afterwards.  Otherwise you will get a spurious failure due to the old version
  * having been generated into a check file.
  */
  * files afterwards.  Otherwise you will get a spurious failure due to the old version
  * having been generated into a check file.
  */
-#define SAVE_VERSION   30
+#define SAVE_VERSION   31
 
 /*
  * Goes at start of file so saves can be identified by file(1) and the like.
 
 /*
  * Goes at start of file so saves can be identified by file(1) and the like.
index 7493ad8232fdf9fe59eaa04b9cf65a7e2241a203..2aa9441e34b5ff340cdda953aa8d7f747e8ef363 100644 (file)
@@ -11,7 +11,7 @@ down a gully.
 Can't open file y, try again.
 
 I'm sorry, but that Adventure was begun using Version -133.-7 of the
 Can't open file y, try again.
 
 I'm sorry, but that Adventure was begun using Version -133.-7 of the
-save file format, and this program uses Version 3.0.  You must find an instance
+save file format, and this program uses Version 3.1.  You must find an instance
 using that other version in order to resume that Adventure.
 
 You're in front of building.
 using that other version in order to resume that Adventure.
 
 You're in front of building.