Mercurial > hg > early-roguelike
diff arogue5/state.c @ 114:a5433ba4cabf
arogue5: fix some daemon-related pointer/int casting.
Daemons and fuses take a single argument, nominally an int but either
ignored or unsafely cast to a pointer. Its type has now been changed
to void*.
The save/restore code no longer tries to store this argument in the
savefile. For doctor(), this is not a problem, because player is the
only argument it is ever given as a daemon. However, alchemy() will
fail to do anything when passed NULL. Fixing this would be complicated
but possible.
Summary: the code is slightly safer, but alchemy jugs are guaranteed to
stop working after save and restore, instead of just extremely likely.
author | John "Elwin" Edwards |
---|---|
date | Fri, 28 Mar 2014 10:57:03 -0700 |
parents | 5f51f7d9805f |
children | 1cf517d5d2a8 |
line wrap: on
line diff
--- a/arogue5/state.c Thu Mar 27 11:09:30 2014 -0700 +++ b/arogue5/state.c Fri Mar 28 10:57:03 2014 -0700 @@ -1420,7 +1420,8 @@ rs_write_int(savef, d_list[i].d_type); rs_write_int(savef, func); - rs_write_int(savef, d_list[i].d_arg); + /* d_arg is a pointer and can't actually be saved and restored. */ + rs_write_int(savef, 0); rs_write_int(savef, d_list[i].d_time); } @@ -1517,7 +1518,8 @@ break; } - rs_read_int(inf, &d_list[i].d_arg); + rs_read_int(inf, &dummy); + d_list[i].d_arg = NULL; if (func == 2) d_list[i].d_arg = &player; rs_read_int(inf, &d_list[i].d_time); @@ -1525,7 +1527,6 @@ if (d_list[i].d_func == NULL) { d_list[i].d_time = 0; - d_list[i].d_arg = 0; d_list[i].d_type = 0; } }