Validate dwarves and tally
[open-adventure.git] / saveresume.c
index 889794596ae2325e8500e909e7765f9f567b0a32..724ca001b2c61dd3110fe26686c99e6eea05e832 100644 (file)
@@ -144,6 +144,45 @@ bool is_valid(struct game_t valgame)
          valgame.oldloc < -1 || valgame.oldloc > NLOCATIONS) {
         return false;
     }
+    /*  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) {
+            return false;
+        }
+    }
+
+    for (int i = 0; i <= NOBJECTS; i++) {
+        if (valgame.place[i] < -1 || valgame.place[i] > NLOCATIONS  ||
+            valgame.fixed[i] < -1 || valgame.fixed[i] > NLOCATIONS) {
+            return false;
+        }
+    }
+
+    /*  Bounds check for dwarves */
+    if (valgame.dtotal < 0 || valgame.dtotal > NDWARVES ||
+        valgame.dkill < 0 || valgame.dkill > NDWARVVES) {
+        return false;
+    }
+
+    /*  Validate that we didn't die too many times in save */
+    if (valgame.numdie >= NDEATHS) {
+        return false;
+    }
+
+    /* Recalculate tally, throw the towel if in disagreement */
+    long temp_tally = 0;
+    for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
+        if (objects[treasure].is_treasure) {
+            if (valgame.prop[treasure] == STATE_NOTFOUND) {
+                ++temp_tally;
+            }
+        }
+    }
+    if (temp_tally != valgame.tally) {
+        return false;
+    }
 
     return true;
 }