Mercurial > hg > early-roguelike
comparison urogue/daemon.c @ 256:c495a4f288c6
Import UltraRogue from the Roguelike Restoration Project (r1490)
author | John "Elwin" Edwards |
---|---|
date | Tue, 31 Jan 2017 19:56:04 -0500 |
parents | |
children | d815c40c3753 |
comparison
equal
deleted
inserted
replaced
253:d9badb9c0179 | 256:c495a4f288c6 |
---|---|
1 /* | |
2 daemon.c - functions for dealing with things that happen in the future | |
3 | |
4 UltraRogue: The Ultimate Adventure in the Dungeons of Doom | |
5 Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong | |
6 All rights reserved. | |
7 | |
8 Based on "Advanced Rogue" | |
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka | |
10 All rights reserved. | |
11 | |
12 Based on "Rogue: Exploring the Dungeons of Doom" | |
13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
14 All rights reserved. | |
15 | |
16 See the file LICENSE.TXT for full copyright and licensing information. | |
17 */ | |
18 | |
19 /* | |
20 Needs to be rewritten again to work on a per creature basis. | |
21 Either each monster will have a list of effect, or each | |
22 fuse will take a creature pointer and multiple entries | |
23 for each fuse will be allowed. I tend to want to attach | |
24 the effects to the creature. | |
25 */ | |
26 | |
27 #include "rogue.h" | |
28 | |
29 int demoncnt; | |
30 | |
31 struct daemon daemons[DAEMON_MAX] = | |
32 { | |
33 { DAEMON_NULL, NULL }, | |
34 { DAEMON_DOCTOR, doctor }, | |
35 { DAEMON_ROLLWAND, rollwand }, | |
36 { DAEMON_STOMACH, stomach }, | |
37 { DAEMON_RUNNERS, runners } | |
38 }; | |
39 | |
40 struct fuse fuses[FUSE_MAX] = | |
41 { | |
42 { FUSE_NULL, NULL }, | |
43 { FUSE_SWANDER, swander }, | |
44 { FUSE_UNCONFUSE, unconfuse }, | |
45 { FUSE_UNSCENT, unscent }, | |
46 { FUSE_SCENT, scent }, | |
47 { FUSE_UNHEAR, unhear }, | |
48 { FUSE_HEAR, hear }, | |
49 { FUSE_UNSEE, unsee }, | |
50 { FUSE_UNSTINK, unstink }, | |
51 { FUSE_UNCLRHEAD, unclrhead }, | |
52 { FUSE_UNPHASE, unphase }, | |
53 { FUSE_SIGHT, sight }, | |
54 { FUSE_RES_STRENGTH, res_strength }, | |
55 { FUSE_NOHASTE, nohaste }, | |
56 { FUSE_NOSLOW, noslow }, | |
57 { FUSE_SUFFOCATE, suffocate }, | |
58 { FUSE_CURE_DISEASE, cure_disease }, | |
59 { FUSE_UNITCH, un_itch }, | |
60 { FUSE_APPEAR, appear }, | |
61 { FUSE_UNELECTRIFY, unelectrify }, | |
62 { FUSE_UNBHERO, unbhero }, | |
63 { FUSE_UNSHERO, unshero }, | |
64 { FUSE_UNXRAY, NULL }, | |
65 { FUSE_UNDISGUISE, undisguise }, | |
66 { FUSE_SHERO, shero }, | |
67 { FUSE_WGHTCHK, wghtchk }, | |
68 { FUSE_UNSUMMON, unsummon }, | |
69 { FUSE_UNGAZE, ungaze }, | |
70 { FUSE_UNCOLD, uncold }, | |
71 { FUSE_UNHOT, unhot }, | |
72 { FUSE_UNFLY, unfly }, | |
73 { FUSE_UNBREATHE, unbreathe }, | |
74 { FUSE_UNREGEN, unregen }, | |
75 { FUSE_UNSUPEREAT, unsupereat }, | |
76 { FUSE_UNSHIELD, unshield }, | |
77 { FUSE_UNMSHIELD, unmshield }, | |
78 { FUSE_UNTRUESEE, untruesee } | |
79 }; | |
80 | |
81 /* | |
82 d_slot() | |
83 Find an empty slot in the daemon/fuse list | |
84 */ | |
85 | |
86 struct delayed_action * | |
87 d_slot(void) | |
88 { | |
89 int i; | |
90 struct delayed_action *dev; | |
91 | |
92 for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++) | |
93 if (dev->d_type == EMPTY) | |
94 return(dev); | |
95 | |
96 return(NULL); | |
97 } | |
98 | |
99 | |
100 /* | |
101 find_slot() | |
102 Find a particular slot in the table | |
103 */ | |
104 | |
105 struct delayed_action * | |
106 find_slot(int type, int id) | |
107 { | |
108 int i; | |
109 struct delayed_action *dev; | |
110 | |
111 for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++) | |
112 if ( (dev->d_type == type) && (id == dev->d_id) ) | |
113 return(dev); | |
114 | |
115 return(NULL); | |
116 } | |
117 | |
118 | |
119 /* | |
120 daemon() | |
121 Start a daemon, takes a function. | |
122 */ | |
123 | |
124 void | |
125 start_daemon(int id, void *arg, int whendo) | |
126 { | |
127 struct delayed_action *dev; | |
128 | |
129 dev = d_slot(); | |
130 | |
131 if (dev != NULL) | |
132 { | |
133 dev->d_type = DAEMON; | |
134 dev->d_when = whendo; | |
135 dev->d_id = id; | |
136 dev->d_arg = arg; | |
137 dev->d_time = 1; | |
138 demoncnt += 1; /* update count */ | |
139 } | |
140 } | |
141 | |
142 | |
143 /* | |
144 kill_daemon() | |
145 Remove a daemon from the list | |
146 */ | |
147 | |
148 void | |
149 kill_daemon(int id) | |
150 { | |
151 struct delayed_action *dev; | |
152 | |
153 if ((dev = find_slot(DAEMON, id)) == NULL) | |
154 return; | |
155 | |
156 /* Take it out of the list */ | |
157 | |
158 dev->d_type = EMPTY; | |
159 demoncnt -= 1; /* update count */ | |
160 | |
161 return; | |
162 } | |
163 | |
164 | |
165 /* | |
166 do_daemons() | |
167 Run all the daemons that are active with the current flag, | |
168 passing the argument to the function. | |
169 */ | |
170 | |
171 void | |
172 do_daemons(int now) | |
173 { | |
174 struct delayed_action *dev; | |
175 | |
176 /* Loop through the devil list */ | |
177 | |
178 for (dev = d_list; dev < &d_list[MAXDAEMONS]; dev++) | |
179 /* Executing each one, giving it the proper arguments */ | |
180 if ( (dev->d_when == now) && (dev->d_type == DAEMON)) | |
181 { | |
182 if ((dev->d_id < 1) || (dev->d_id >= DAEMON_MAX)) | |
183 printf("Bad daemon id %d\n", dev->d_id); | |
184 else if (daemons[dev->d_id].func == NULL) | |
185 printf("No action for daemon %d!!!\n", dev->d_id); | |
186 else | |
187 { | |
188 daemon_arg arg; | |
189 | |
190 arg.varg = dev->d_arg; | |
191 daemons[dev->d_id].func(&arg); | |
192 } | |
193 } | |
194 | |
195 } | |
196 | |
197 | |
198 /* | |
199 fuse() | |
200 Start a fuse to go off in a certain number of turns | |
201 */ | |
202 | |
203 void | |
204 light_fuse(int id, void *arg, int time, int whendo) | |
205 { | |
206 struct delayed_action *wire; | |
207 | |
208 wire = d_slot(); | |
209 | |
210 if (wire != NULL) | |
211 { | |
212 wire->d_type = FUSE; | |
213 wire->d_when = whendo; | |
214 wire->d_id = id; | |
215 wire->d_arg = arg; | |
216 wire->d_time = time; | |
217 demoncnt += 1; /* update count */ | |
218 } | |
219 } | |
220 | |
221 | |
222 /* | |
223 lengthen() | |
224 Increase the time until a fuse goes off | |
225 */ | |
226 | |
227 void | |
228 lengthen_fuse(int id, int xtime) | |
229 { | |
230 struct delayed_action *wire; | |
231 | |
232 if ((wire = find_slot(FUSE,id)) == NULL) | |
233 return; | |
234 | |
235 wire->d_time += xtime; | |
236 | |
237 return; | |
238 } | |
239 | |
240 | |
241 /* | |
242 extinguish() | |
243 Put out a fuse | |
244 */ | |
245 | |
246 void | |
247 extinguish_fuse(int id) | |
248 { | |
249 struct delayed_action *wire; | |
250 | |
251 if ((wire = find_slot(FUSE,id)) == NULL) | |
252 return; | |
253 | |
254 wire->d_type = EMPTY; | |
255 demoncnt -= 1; | |
256 | |
257 return; | |
258 } | |
259 | |
260 | |
261 /* | |
262 do_fuses() | |
263 Decrement counters and start needed fuses | |
264 */ | |
265 | |
266 void | |
267 do_fuses(int now) | |
268 { | |
269 struct delayed_action *wire; | |
270 | |
271 /* Step though the list */ | |
272 | |
273 for (wire = d_list; wire < &d_list[MAXDAEMONS]; wire++) | |
274 { | |
275 /* | |
276 * Decrementing counters and starting things we want. We | |
277 * also need to remove the fuse from the list once it has | |
278 * gone off. | |
279 */ | |
280 | |
281 if( (wire->d_type == FUSE) && (wire->d_when == now) ) | |
282 { | |
283 if (--wire->d_time <= 0) | |
284 { | |
285 fuse_arg arg; | |
286 | |
287 arg.varg = wire->d_arg; | |
288 wire->d_type = EMPTY; | |
289 fuses[wire->d_id].func(&arg); | |
290 demoncnt -= 1; | |
291 } | |
292 } | |
293 | |
294 } | |
295 | |
296 return; | |
297 } | |
298 | |
299 | |
300 /* | |
301 activity() | |
302 Show wizard number of demaons and memory blocks used | |
303 */ | |
304 | |
305 void | |
306 activity(void) | |
307 { | |
308 msg("Daemons = %d : Memory Items = %d ", demoncnt, total); | |
309 return; | |
310 } | |
311 | |
312 /* | |
313 waste_time() | |
314 Do nothing but let other things happen | |
315 */ | |
316 | |
317 void | |
318 waste_time(void) | |
319 { | |
320 if (inwhgt) /* if from wghtchk then done */ | |
321 return; | |
322 | |
323 do_daemons(BEFORE); | |
324 do_fuses(BEFORE); | |
325 do_daemons(AFTER); | |
326 do_fuses(AFTER); | |
327 } |