#include "advent.h"
#include "dungeon.h"
-#define VRSION 28 /* bump on save format change */
+/*
+ * Bump on save format change.
+ *
+ * Note: Verify that the tests run clean before bumping this, then rebuild the check
+ * files afterwards. Otherwise you will get a spurious failure due to the old version
+ * having been generated into a check file.
+ */
+#define VRSION 29
/*
* If you change the first three members, the resume function may not properly
* reject saves from older versions. Yes, this glues us to a hardware-
- * dependent length of long. Later members can change, but bump the version
+ * dependent length of int. Later members can change, but bump the version
* when you do that.
*/
struct save_t {
/* Prevent division by zero */
if (valgame.abbnum == 0) {
- return false;
+ return false; // LCOV_EXCL_LINE
}
/* Check for RNG overflow. Truncate */
if (valgame.lcg_x >= LCG_M) {
- valgame.lcg_x %= LCG_M;
+ valgame.lcg_x %= LCG_M; // LCOV_EXCL_LINE
}
/* Check for RNG underflow. Transpose */
valgame.newloc < 0 || valgame.newloc > NLOCATIONS ||
valgame.oldloc < 0 || valgame.oldloc > NLOCATIONS ||
valgame.oldlc2 < 0 || valgame.oldlc2 > NLOCATIONS) {
- return false;
+ return false; // LCOV_EXCL_LINE
}
/* 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;
+ return false; // LCOV_EXCL_LINE
}
}
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;
+ return false; // LCOV_EXCL_LINE
}
}
/* Bounds check for dwarves */
if (valgame.dtotal < 0 || valgame.dtotal > NDWARVES ||
valgame.dkill < 0 || valgame.dkill > NDWARVES) {
- return false;
+ return false; // LCOV_EXCL_LINE
}
/* Validate that we didn't die too many times in save */
if (valgame.numdie >= NDEATHS) {
- return false;
+ return false; // LCOV_EXCL_LINE
}
/* Recalculate tally, throw the towel if in disagreement */
- long temp_tally = 0;
+ int temp_tally = 0;
for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
if (objects[treasure].is_treasure) {
if (valgame.prop[treasure] == STATE_NOTFOUND) {
}
}
if (temp_tally != valgame.tally) {
- return false;
+ return false; // LCOV_EXCL_LINE
}
/* Check that properties of objects aren't beyond expected */
continue;
/* FALLTHRU */
default:
- return false;
+ return false; // LCOV_EXCL_LINE
}
}
}
/* 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] > NOBJECTS * 2) {
- return false;
+ return false; // LCOV_EXCL_LINE
}
}
for (obj_t obj = 0; obj <= NOBJECTS * 2; obj++ ) {
if (valgame.link[obj] < NO_OBJECT || valgame.link[obj] > NOBJECTS * 2) {
- return false;
+ return false; // LCOV_EXCL_LINE
}
}