#include <string.h>
#include <editline/readline.h>
#include <time.h>
+#include <inttypes.h>
#include "advent.h"
#include "dungeon.h"
* see the history.adoc file in the source distribution for discussion.
*/
-#define VRSION 27 /* bump on save format change */
+#define VRSION 28 /* bump on save format change */
/*
* If you change the first three members, the resume function may not properly
* when you do that.
*/
struct save_t {
- long savetime;
- long mode; /* not used, must be present for version detection */
- long version;
+ int64_t savetime;
+ int32_t mode; /* not used, must be present for version detection */
+ int32_t version;
struct game_t game;
};
struct save_t save;
#define IGNORE(r) do{if (r){}}while(0)
-int savefile(FILE *fp, long version)
+int savefile(FILE *fp, int32_t version)
/* Save game to file. No input or output from user. */
{
save.savetime = time(NULL);
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;
+ /* Check for RNG overflow. Truncate */
+ if (valgame->lcg_x >= LCG_M) {
+ valgame->lcg_x %= LCG_M;
}
- /* Check for RNG overflow. Truncate */
- if (valgame->lcg_x >= game.lcg_m) {
- valgame->lcg_x %= game.lcg_m;
+ /* Check for RNG underflow. Transpose */
+ if (valgame->lcg_x < LCG_M) {
+ valgame->lcg_x = LCG_M + (valgame->lcg_x % LCG_M);
}
/* 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->oldlc2 < -1 || valgame->oldlc2 > NLOCATIONS) {
+ valgame->loc < 0 || valgame->loc > NLOCATIONS ||
+ valgame->newloc < 0 || valgame->newloc > NLOCATIONS ||
+ valgame->oldloc < 0 || valgame->oldloc > NLOCATIONS ||
+ valgame->oldlc2 < 0 || valgame->oldlc2 > NLOCATIONS) {
return false;
}
/* Bounds check for location arrays */
return true;
}
-/* end */
\ No newline at end of file
+/* end */