comparison arogue7/daemon.c @ 125:adfa37e67084

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