projects
/
open-adventure.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Type constants to prevent overflow
[open-adventure.git]
/
saveresume.c
diff --git
a/saveresume.c
b/saveresume.c
index cc000d8acf2ffbd8d291e6c70b321313246de612..8bd4418f9e51ac8e2ca0f2ef41b4b4b7cf4e5f00 100644
(file)
--- a/
saveresume.c
+++ b/
saveresume.c
@@
-2,6
+2,7
@@
#include <string.h>
#include <editline/readline.h>
#include <time.h>
#include <string.h>
#include <editline/readline.h>
#include <time.h>
+#include <inttypes.h>
#include "advent.h"
#include "dungeon.h"
#include "advent.h"
#include "dungeon.h"
@@
-11,7
+12,7
@@
* see the history.adoc file in the source distribution for discussion.
*/
* see the history.adoc file in the source distribution for discussion.
*/
-#define VRSION 2
7
/* bump on save format change */
+#define VRSION 2
8
/* bump on save format change */
/*
* If you change the first three members, the resume function may not properly
/*
* If you change the first three members, the resume function may not properly
@@
-20,16
+21,16
@@
* when you do that.
*/
struct save_t {
* 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)
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);
/* Save game to file. No input or output from user. */
{
save.savetime = time(NULL);
@@
-139,15
+140,14
@@
bool is_valid(struct game_t* valgame)
return false;
}
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. Truncat
e */
- if (valgame->lcg_x
>= game.lcg_m
) {
- valgame->lcg_x
%= game.lcg_m
;
+ /* Check for RNG
underflow. Transpos
e */
+ if (valgame->lcg_x
< LCG_M
) {
+ valgame->lcg_x
= LCG_M + (valgame->lcg_x % LCG_M)
;
}
/* Bounds check for locations */
}
/* Bounds check for locations */
@@
-241,4
+241,4
@@
bool is_valid(struct game_t* valgame)
return true;
}
return true;
}
-/* end */
\ No newline at end of file
+/* end */