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 }