Mercurial > hg > early-roguelike
comparison arogue7/daemon.c @ 238:e1cd27c5464f
arogue7, xrogue: improve the handling of the arguments to fuses.
fuse() now expects a pointer as the argument to a fuse function. If
this is one of the functions that takes int, fuse() follows the pointer
and stores that value in the f_list slot, in the integer field of the
argument union. When the fuse goes off, do_fuses() recognizes the
function and passes it the integer field instead of the pointer.
This has the disadvantage of hard-coding the functions that require int
in daemon.c, but since the int is copied into f_list, it no longer has
to be in static or global memory, which simplifies several files.
author | John "Elwin" Edwards |
---|---|
date | Fri, 11 Mar 2016 17:40:00 -0500 |
parents | b67b99f6c92b |
children |
comparison
equal
deleted
inserted
replaced
237:2236ef808bcb | 238:e1cd27c5464f |
---|---|
93 /* | 93 /* |
94 * start_daemon: | 94 * start_daemon: |
95 * Start a daemon, takes a function. | 95 * Start a daemon, takes a function. |
96 */ | 96 */ |
97 void | 97 void |
98 start_daemon(void (*func)(), int arg, int type) | 98 start_daemon(void (*func)(), void *arg, int type) |
99 { | 99 { |
100 reg struct delayed_action *dev; | 100 reg struct delayed_action *dev; |
101 | 101 |
102 dev = d_slot(); | 102 dev = d_slot(); |
103 if (dev != NULL) { | 103 if (dev != NULL) { |
104 dev->d_type = type; | 104 dev->d_type = type; |
105 dev->d_func = func; | 105 dev->d_func = func; |
106 dev->d_.arg = arg; | 106 dev->d_.varg = arg; |
107 dev->d_time = DAEMON; | 107 dev->d_time = DAEMON; |
108 demoncnt += 1; /* update count */ | 108 demoncnt += 1; /* update count */ |
109 } | 109 } |
110 } | 110 } |
111 | 111 |
152 for (dev = d_list; dev <= &d_list[MAXDAEMONS-1]; dev++) | 152 for (dev = d_list; dev <= &d_list[MAXDAEMONS-1]; dev++) |
153 /* | 153 /* |
154 * Executing each one, giving it the proper arguments | 154 * Executing each one, giving it the proper arguments |
155 */ | 155 */ |
156 if (dev->d_type == flag && dev->d_time == DAEMON) | 156 if (dev->d_type == flag && dev->d_time == DAEMON) |
157 (*dev->d_func)(dev->d_.arg); | 157 (*dev->d_func)(dev->d_.varg); |
158 } | 158 } |
159 | 159 |
160 | 160 |
161 /* | 161 /* |
162 * fuse: | 162 * fuse: |
163 * Start a fuse to go off in a certain number of turns | 163 * Start a fuse to go off in a certain number of turns |
164 */ | 164 */ |
165 void | 165 void |
166 fuse(void (*func)(), int arg, int time, int type) | 166 fuse(void (*func)(), void *arg, int time, int type) |
167 { | 167 { |
168 reg struct delayed_action *wire; | 168 reg struct delayed_action *wire; |
169 | 169 |
170 wire = f_slot(); | 170 wire = f_slot(); |
171 if (wire != NULL) { | 171 if (wire != NULL) { |
172 wire->d_type = type; | 172 wire->d_type = type; |
173 wire->d_func = func; | 173 wire->d_func = func; |
174 wire->d_.arg = arg; | 174 if (func == changeclass || func == res_strength) |
175 wire->d_.arg = *(int *) arg; | |
176 else | |
177 wire->d_.varg = arg; | |
175 wire->d_time = time; | 178 wire->d_time = time; |
176 fusecnt += 1; /* update count */ | 179 fusecnt += 1; /* update count */ |
177 } | 180 } |
178 } | 181 } |
179 | 182 |
230 * to remove the fuse from the list once it has gone off. | 233 * to remove the fuse from the list once it has gone off. |
231 */ | 234 */ |
232 if(flag == wire->d_type && wire->d_time > 0 && | 235 if(flag == wire->d_type && wire->d_time > 0 && |
233 --wire->d_time == 0) { | 236 --wire->d_time == 0) { |
234 wire->d_type = EMPTY; | 237 wire->d_type = EMPTY; |
235 if (wire->d_func != NULL) | 238 if (wire->d_func == changeclass || wire->d_func == res_strength) |
236 (*wire->d_func)(wire->d_.arg); | 239 (*wire->d_func)(wire->d_.arg); |
240 else if (wire->d_func != NULL) | |
241 (*wire->d_func)(wire->d_.varg); | |
237 fusecnt -= 1; | 242 fusecnt -= 1; |
238 } | 243 } |
239 } | 244 } |
240 } | 245 } |
241 | 246 |