comparison xrogue/daemon.c @ 133:e6179860cb76

Import XRogue 8.0 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 21 Apr 2015 08:55:20 -0400
parents
children cfa9d1609b78
comparison
equal deleted inserted replaced
124:d10fc4a065ac 133:e6179860cb76
1 /*
2 daemon.c - functions for dealing with things that happen in the future
3
4 XRogue: Expeditions into the Dungeons of Doom
5 Copyright (C) 1991 Robert Pietkivitch
6 All rights reserved.
7
8 Based on "Advanced Rogue"
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
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 #include <curses.h>
20 #include "rogue.h"
21
22 #define EMPTY 0
23 #define DAEMON -1
24
25 #define _X_ { EMPTY }
26
27 struct delayed_action {
28 int d_type;
29 int (*d_func)();
30 VOID *d_arg;
31 int d_time;
32 } ;
33 struct delayed_action d_list[MAXDAEMONS] = {
34 _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_
35 };
36 struct delayed_action f_list[MAXFUSES] = {
37 _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
38 _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_
39 };
40
41 int demoncnt = 0; /* number of active daemons */
42 int fusecnt = 0;
43
44
45 /*
46 * d_slot:
47 * Find an empty slot in the daemon list
48 */
49 struct delayed_action *
50 d_slot()
51 {
52 reg int i;
53 reg struct delayed_action *dev;
54
55 for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++)
56 if (dev->d_type == EMPTY)
57 return dev;
58 return NULL;
59 }
60
61 /*
62 * f_slot:
63 * Find an empty slot in the fuses list
64 */
65 struct delayed_action *
66 f_slot()
67 {
68 reg int i;
69 reg struct delayed_action *dev;
70
71 for (i = 0, dev = f_list; i < MAXFUSES; i++, dev++)
72 if (dev->d_type == EMPTY)
73 return dev;
74 return NULL;
75 }
76
77 /*
78 * find_slot:
79 * Find a particular slot in the table
80 */
81
82 struct delayed_action *
83 find_slot(func)
84 reg int (*func)();
85 {
86 reg int i;
87 reg struct delayed_action *dev;
88
89 for (i = 0, dev = f_list; i < MAXFUSES; i++, dev++)
90 if (dev->d_type != EMPTY && func == dev->d_func)
91 return dev;
92 return NULL;
93 }
94
95 /*
96 * daemon:
97 * Start a daemon, takes a function.
98 */
99
100 daemon(dfunc, arg, type)
101 reg VOID *arg;
102 reg int type, (*dfunc)();
103 {
104 reg struct delayed_action *dev;
105
106 dev = d_slot();
107 if (dev != NULL) {
108 dev->d_type = type;
109 dev->d_func = dfunc;
110 dev->d_arg = arg;
111 dev->d_time = DAEMON;
112 demoncnt += 1; /* update count */
113 }
114 }
115
116 /*
117 * kill_daemon:
118 * Remove a daemon from the list
119 */
120
121 kill_daemon(dfunc)
122 reg int (*dfunc)();
123 {
124 reg struct delayed_action *dev;
125 reg int i;
126
127 for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++) {
128 if (dev->d_type != EMPTY && dfunc == dev->d_func)
129 break;
130 }
131 if (i >= MAXDAEMONS) return; /* if not found, forget it */
132 /*
133 * Take it out of the list
134 */
135 dev->d_type = EMPTY;
136 dev->d_arg = NULL;
137 dev->d_func = NULL;
138 dev->d_time = 0;
139
140 demoncnt -= 1; /* update count */
141 }
142
143 /*
144 * do_daemons:
145 * Run all the daemons that are active with the current flag,
146 * passing the argument to the function.
147 */
148
149 do_daemons(flag)
150 reg int flag;
151 {
152 struct delayed_action *dev;
153 int i;
154
155 /*
156 * Loop through the devil list
157 */
158 for (i = 0; i < MAXDAEMONS; i++)
159 {
160 dev = &d_list[i];
161 /*
162 * Executing each one, giving it the proper arguments
163 */
164 if ((dev->d_type == flag) && (dev->d_time == DAEMON) && (dev->d_func != NULL))
165 (*dev->d_func)(dev->d_arg);
166 }
167 }
168
169 /*
170 * fuse:
171 * Start a fuse to go off in a certain number of turns
172 */
173
174 fuse(dfunc, arg, time, type)
175 VOID *arg;
176 reg int (*dfunc)(), time, type;
177 {
178 reg struct delayed_action *wire;
179
180 wire = f_slot();
181 if (wire != NULL) {
182 wire->d_type = type;
183 wire->d_func = dfunc;
184 wire->d_arg = arg;
185 wire->d_time = time;
186 fusecnt += 1; /* update count */
187 }
188 }
189
190 /*
191 * lengthen:
192 * Increase the time until a fuse goes off
193 */
194
195 lengthen(dfunc, xtime)
196 reg int (*dfunc)(), xtime;
197 {
198 reg struct delayed_action *wire;
199
200 if ((wire = find_slot(dfunc)) == NULL)
201 return;
202 wire->d_time += xtime;
203 }
204
205 /*
206 * extinguish:
207 * Put out a fuse
208 */
209
210 extinguish(dfunc)
211 reg int (*dfunc)();
212 {
213 reg struct delayed_action *wire;
214
215 if ((wire = find_slot(dfunc)) == NULL)
216 return;
217 wire->d_type = EMPTY;
218 wire->d_func = NULL;
219 wire->d_arg = NULL;
220 wire->d_time = 0;
221 fusecnt -= 1;
222 }
223
224 /*
225 * do_fuses:
226 * Decrement counters and start needed fuses
227 */
228
229 do_fuses(flag)
230 reg int flag;
231 {
232 struct delayed_action *wire;
233 int i;
234
235 /*
236 * Step though the list
237 */
238 for (i = 0; i < MAXFUSES; i++) {
239 wire = &f_list[i];
240 /*
241 * Decrementing counters and starting things we want. We also need
242 * to remove the fuse from the list once it has gone off.
243 */
244 if(flag == wire->d_type && wire->d_time > 0 &&
245 --wire->d_time == 0) {
246 wire->d_type = EMPTY;
247 if (wire->d_func != NULL)
248 (*wire->d_func)(wire->d_arg);
249 fusecnt -= 1;
250 }
251 }
252 }
253
254 /*
255 * activity:
256 * Show wizard number of demaons and memory blocks used
257 */
258
259 activity()
260 {
261 msg("Daemons = %d : Fuses = %d : Memory Items = %d : Memory Used = %d",
262 demoncnt,fusecnt,total,md_memused());
263 }
264