Mercurial > hg > early-roguelike
comparison arogue5/daemon.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 | f2951c4e28d9 |
children | 56e748983fa8 |
comparison
equal
deleted
inserted
replaced
113:aa582a02eb5d | 114:a5433ba4cabf |
---|---|
85 | 85 |
86 /* | 86 /* |
87 * start_daemon: | 87 * start_daemon: |
88 * Start a daemon, takes a function. | 88 * Start a daemon, takes a function. |
89 */ | 89 */ |
90 start_daemon(func, arg, type) | 90 start_daemon(int (*func)(), void *arg, int type) |
91 reg int arg, type, (*func)(); | |
92 { | 91 { |
93 reg struct delayed_action *dev; | 92 reg struct delayed_action *dev; |
94 | 93 |
95 dev = d_slot(); | 94 dev = d_slot(); |
96 if (dev != NULL) { | 95 if (dev != NULL) { |
120 if (i >= MAXDAEMONS) return; /* if not found, forget it */ | 119 if (i >= MAXDAEMONS) return; /* if not found, forget it */ |
121 /* | 120 /* |
122 * Take it out of the list | 121 * Take it out of the list |
123 */ | 122 */ |
124 dev->d_type = EMPTY; | 123 dev->d_type = EMPTY; |
125 dev->d_arg = 0; | 124 dev->d_arg = NULL; |
126 dev->d_func = NULL; | 125 dev->d_func = NULL; |
127 dev->d_time = 0; | 126 dev->d_time = 0; |
128 demoncnt -= 1; /* update count */ | 127 demoncnt -= 1; /* update count */ |
129 } | 128 } |
130 | 129 |
153 | 152 |
154 /* | 153 /* |
155 * fuse: | 154 * fuse: |
156 * Start a fuse to go off in a certain number of turns | 155 * Start a fuse to go off in a certain number of turns |
157 */ | 156 */ |
158 fuse(func, arg, time, type) | 157 fuse(int (*func)(), void *arg, int time, int type) |
159 reg int (*func)(), arg, time, type; | |
160 { | 158 { |
161 reg struct delayed_action *wire; | 159 reg struct delayed_action *wire; |
162 | 160 |
163 wire = f_slot(); | 161 wire = f_slot(); |
164 if (wire != NULL) { | 162 if (wire != NULL) { |
197 | 195 |
198 if ((wire = find_slot(func)) == NULL) | 196 if ((wire = find_slot(func)) == NULL) |
199 return; | 197 return; |
200 wire->d_type = EMPTY; | 198 wire->d_type = EMPTY; |
201 wire->d_func = NULL; | 199 wire->d_func = NULL; |
202 wire->d_arg = 0; | 200 wire->d_arg = NULL; |
203 wire->d_time = 0; | 201 wire->d_time = 0; |
204 fusecnt -= 1; | 202 fusecnt -= 1; |
205 } | 203 } |
206 | 204 |
207 | 205 |