Annotation of early-roguelike/xrogue/daemon.c, Revision 1.1.1.1
1.1 rubenllo 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 d_list[MAXDAEMONS] = {
28: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_
29: };
30: struct delayed_action f_list[MAXFUSES] = {
31: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
32: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_
33: };
34:
35: int demoncnt = 0; /* number of active daemons */
36: int fusecnt = 0;
37:
38:
39: /*
40: * d_slot:
41: * Find an empty slot in the daemon list
42: */
43: struct delayed_action *
44: d_slot(void)
45: {
46: reg int i;
47: reg struct delayed_action *dev;
48:
49: for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++)
50: if (dev->d_type == EMPTY)
51: return dev;
52: return NULL;
53: }
54:
55: /*
56: * f_slot:
57: * Find an empty slot in the fuses list
58: */
59: struct delayed_action *
60: f_slot(void)
61: {
62: reg int i;
63: reg struct delayed_action *dev;
64:
65: for (i = 0, dev = f_list; i < MAXFUSES; i++, dev++)
66: if (dev->d_type == EMPTY)
67: return dev;
68: return NULL;
69: }
70:
71: /*
72: * find_slot:
73: * Find a particular slot in the table
74: */
75:
76: struct delayed_action *
77: find_slot(void (*func)())
78: {
79: reg int i;
80: reg struct delayed_action *dev;
81:
82: for (i = 0, dev = f_list; i < MAXFUSES; i++, dev++)
83: if (dev->d_type != EMPTY && func == dev->d_func)
84: return dev;
85: return NULL;
86: }
87:
88: /*
89: * start_daemon:
90: * Start a daemon, takes a function.
91: */
92:
93: void
94: start_daemon(void (*dfunc)(), void *arg, int type)
95: {
96: reg struct delayed_action *dev;
97:
98: dev = d_slot();
99: if (dev != NULL) {
100: dev->d_type = type;
101: dev->d_func = dfunc;
102: dev->d_arg.vp = arg;
103: dev->d_time = DAEMON;
104: demoncnt += 1; /* update count */
105: }
106: }
107:
108: /*
109: * kill_daemon:
110: * Remove a daemon from the list
111: */
112:
113: void
114: kill_daemon(void (*dfunc)())
115: {
116: reg struct delayed_action *dev;
117: reg int i;
118:
119: for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++) {
120: if (dev->d_type != EMPTY && dfunc == dev->d_func)
121: break;
122: }
123: if (i >= MAXDAEMONS) return; /* if not found, forget it */
124: /*
125: * Take it out of the list
126: */
127: dev->d_type = EMPTY;
128: dev->d_arg.vp = NULL;
129: dev->d_func = NULL;
130: dev->d_time = 0;
131:
132: demoncnt -= 1; /* update count */
133: }
134:
135: /*
136: * do_daemons:
137: * Run all the daemons that are active with the current flag,
138: * passing the argument to the function.
139: */
140:
141: void
142: do_daemons(int flag)
143: {
144: struct delayed_action *dev;
145: int i;
146:
147: /*
148: * Loop through the devil list
149: */
150: for (i = 0; i < MAXDAEMONS; i++)
151: {
152: dev = &d_list[i];
153: /*
154: * Executing each one, giving it the proper arguments
155: */
156: if ((dev->d_type == flag) && (dev->d_time == DAEMON) && (dev->d_func != NULL))
157: (*dev->d_func)(dev->d_arg.vp);
158: }
159: }
160:
161: /*
162: * fuse:
163: * Start a fuse to go off in a certain number of turns
164: */
165:
166: void
167: fuse(void (*dfunc)(), void *arg, int time, int 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 = dfunc;
175: if (dfunc == changeclass || dfunc == res_strength)
176: wire->d_arg.i = *(int *) arg;
177: else
178: wire->d_arg.vp = arg;
179: wire->d_time = time;
180: fusecnt += 1; /* update count */
181: }
182: }
183:
184: /*
185: * lengthen:
186: * Increase the time until a fuse goes off
187: */
188:
189: void
190: lengthen(void (*dfunc)(), int xtime)
191: {
192: reg struct delayed_action *wire;
193:
194: if ((wire = find_slot(dfunc)) == NULL)
195: return;
196: wire->d_time += xtime;
197: }
198:
199: /*
200: * extinguish:
201: * Put out a fuse
202: */
203:
204: void
205: extinguish(void (*dfunc)())
206: {
207: reg struct delayed_action *wire;
208:
209: if ((wire = find_slot(dfunc)) == NULL)
210: return;
211: wire->d_type = EMPTY;
212: wire->d_func = NULL;
213: wire->d_arg.vp = NULL;
214: wire->d_time = 0;
215: fusecnt -= 1;
216: }
217:
218: /*
219: * do_fuses:
220: * Decrement counters and start needed fuses
221: */
222:
223: void
224: do_fuses(int flag)
225: {
226: struct delayed_action *wire;
227: int i;
228:
229: /*
230: * Step though the list
231: */
232: for (i = 0; i < MAXFUSES; i++) {
233: wire = &f_list[i];
234: /*
235: * Decrementing counters and starting things we want. We also need
236: * to remove the fuse from the list once it has gone off.
237: */
238: if(flag == wire->d_type && wire->d_time > 0 &&
239: --wire->d_time == 0) {
240: wire->d_type = EMPTY;
241: if (*wire->d_func == changeclass || *wire->d_func == res_strength)
242: (*wire->d_func)(wire->d_arg.i);
243: else if (wire->d_func != NULL)
244: (*wire->d_func)(wire->d_arg.vp);
245: fusecnt -= 1;
246: }
247: }
248: }
249:
250: /*
251: * activity:
252: * Show wizard number of demaons and memory blocks used
253: */
254:
255: void
256: activity(void)
257: {
258: msg("Daemons = %d : Fuses = %d : Memory Items = %d : Memory Used = %d",
259: demoncnt,fusecnt,total,md_memused());
260: }
261:
CVSweb