Removed old copy-paste error
[open-adventure.git] / saveresume.c
index e4d9959aeaa59e460f99bbc11fc30fcbedfd2426..799e7af0b90225016ef03bb49150793cb439c529 100644 (file)
@@ -134,18 +134,27 @@ bool is_valid(struct game_t valgame)
      *  valid: no states are outside minimal or maximal value
      */
 
-    /*  Bounds check for locations
-     */
-    if ( valgame.chloc < -1  || valgame.chloc > NLOCATIONS  ||
-         valgame.chloc < -1  || valgame.chloc > NLOCATIONS  ||
-         valgame.loc < -1    || valgame.loc > NLOCATIONS    ||
+    /* Prevent division by zero */
+    if (valgame.abbnum == 0) {
+        return false;
+    }
+
+    /* Prevent RNG substitution. Why we are saving PRNG parameters? */
+
+    if (valgame.lcg_a != game.lcg_a || valgame.lcg_c != game.lcg_c || valgame.lcg_m != game.lcg_m) {
+        return false;
+    }
+
+    /*  Bounds check for locations */
+    if ( valgame.chloc  < -1 || valgame.chloc  > NLOCATIONS ||
+         valgame.chloc2 < -1 || valgame.chloc2 > NLOCATIONS ||
+         valgame.loc    < -1 || valgame.loc    > NLOCATIONS ||
          valgame.newloc < -1 || valgame.newloc > NLOCATIONS ||
          valgame.oldloc < -1 || valgame.oldloc > NLOCATIONS ||
-         valgame.oldloc < -1 || valgame.oldloc > NLOCATIONS) {
+         valgame.oldlc2 < -1 || valgame.oldlc2 > NLOCATIONS) {
         return false;
     }
-    /*  Bounds check for location arrays
-     */
+    /*  Bounds check for location arrays */
     for (int i = 0; i <= NDWARVES; i++) {
         if (valgame.dloc[i]  < -1 || valgame.dloc[i]  > NLOCATIONS  ||
             valgame.odloc[i] < -1 || valgame.odloc[i] > NLOCATIONS) {
@@ -162,7 +171,7 @@ bool is_valid(struct game_t valgame)
 
     /*  Bounds check for dwarves */
     if (valgame.dtotal < 0 || valgame.dtotal > NDWARVES ||
-        valgame.dkill < 0 || valgame.dkill > NDWARVES) {
+        valgame.dkill < 0  || valgame.dkill  > NDWARVES) {
         return false;
     }
 
@@ -185,7 +194,7 @@ bool is_valid(struct game_t valgame)
     }
 
     /* Check that properties of objects aren't beyond expected */
-    for (int obj = 0; obj <= NOBJECTS; obj++) {
+    for (obj_t obj = 0; obj <= NOBJECTS; obj++) {
         if (valgame.prop[obj] < STATE_NOTFOUND || valgame.prop[obj] > 1) {
             switch (obj) {
             case RUG:
@@ -210,9 +219,14 @@ bool is_valid(struct game_t valgame)
         }
     }
 
-    /* Check that we have objects at locations */
+    /* Check that values in linked lists for objects in locations are inside bounds */
     for (loc_t loc = LOC_NOWHERE; loc <= NLOCATIONS; loc++) {
-        if (valgame.atloc[loc] < NO_OBJECT || valgame.atloc[loc] > NLOCATIONS) {
+        if (valgame.atloc[loc] < NO_OBJECT || valgame.atloc[loc] > NOBJECTS * 2) {
+            return false;
+        }
+    }
+    for (obj_t obj = 0; obj <= NOBJECTS * 2; obj++ ) {
+        if (valgame.link[obj] < NO_OBJECT || valgame.link[obj] > NOBJECTS * 2) {
             return false;
         }
     }