* valid: no states are outside minimal or maximal value
*/
- /* Bounds check for locations
- */
+ /* 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.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) {
}
/* 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:
}
}
- /* 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] > NOBJECTS * 2 + 1) {
+ 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;
}
}