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.
This commit is contained in:
John "Elwin" Edwards 2014-03-28 10:57:03 -07:00
parent dff96acf36
commit 7b0ec1230e
3 changed files with 9 additions and 10 deletions

View file

@ -1420,7 +1420,8 @@ rs_write_daemons(FILE *savef, struct delayed_action *d_list, int count)
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 @@ rs_read_daemons(int inf, struct delayed_action *d_list, int count)
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 @@ rs_read_daemons(int inf, struct delayed_action *d_list, int count)
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;
}
}