Annotation of early-roguelike/rogue5/daemon.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * Contains functions for dealing with things that happen in the
3: * future.
4: *
5: * @(#)daemon.c 4.7 (Berkeley) 02/05/99
6: *
7: * Rogue: Exploring the Dungeons of Doom
8: * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
9: * All rights reserved.
10: *
11: * See the file LICENSE.TXT for full copyright and licensing information.
12: */
13:
14: #include <curses.h>
15: #include "rogue.h"
16:
17: #define DAEMON -1
18:
19: /*
20: * d_slot:
21: * Find an empty slot in the daemon/fuse list
22: */
23: struct delayed_action *
24: d_slot(void)
25: {
26: struct delayed_action *dev;
27:
28: for (dev = d_list; dev <= &d_list[MAXDAEMONS-1]; dev++)
29: if (dev->d_type == EMPTY)
30: return dev;
31: #ifdef MASTER
32: debug("Ran out of fuse slots");
33: #endif
34: return NULL;
35: }
36:
37: /*
38: * find_slot:
39: * Find a particular slot in the table
40: */
41: struct delayed_action *
42: find_slot(void (*func)())
43: {
44: struct delayed_action *dev;
45:
46: for (dev = d_list; dev <= &d_list[MAXDAEMONS-1]; dev++)
47: if (dev->d_type != EMPTY && func == dev->d_func)
48: return dev;
49: return NULL;
50: }
51:
52: /*
53: * start_daemon:
54: * Start a daemon, takes a function.
55: */
56: void
57: start_daemon(void (*func)(), int arg, int type)
58: {
59: struct delayed_action *dev;
60:
61: dev = d_slot();
62: dev->d_type = type;
63: dev->d_func = func;
64: dev->d_arg = arg;
65: dev->d_time = DAEMON;
66: }
67:
68: /*
69: * kill_daemon:
70: * Remove a daemon from the list
71: */
72: void
73: kill_daemon(void (*func)())
74: {
75: struct delayed_action *dev;
76:
77: if ((dev = find_slot(func)) == NULL)
78: return;
79: /*
80: * Take it out of the list
81: */
82: dev->d_type = EMPTY;
83: }
84:
85: /*
86: * do_daemons:
87: * Run all the daemons that are active with the current flag,
88: * passing the argument to the function.
89: */
90: void
91: do_daemons(int flag)
92: {
93: struct delayed_action *dev;
94:
95: /*
96: * Loop through the devil list
97: */
98: for (dev = d_list; dev <= &d_list[MAXDAEMONS-1]; dev++)
99: /*
100: * Executing each one, giving it the proper arguments
101: */
102: if (dev->d_type == flag && dev->d_time == DAEMON)
103: (*dev->d_func)(dev->d_arg);
104: }
105:
106: /*
107: * fuse:
108: * Start a fuse to go off in a certain number of turns
109: */
110: void
111: fuse(void (*func)(), int arg, int time, int type)
112: {
113: struct delayed_action *wire;
114:
115: wire = d_slot();
116: wire->d_type = type;
117: wire->d_func = func;
118: wire->d_arg = arg;
119: wire->d_time = time;
120: }
121:
122: /*
123: * lengthen:
124: * Increase the time until a fuse goes off
125: */
126: void
127: lengthen(void (*func)(), int xtime)
128: {
129: struct delayed_action *wire;
130:
131: if ((wire = find_slot(func)) == NULL)
132: return;
133: wire->d_time += xtime;
134: }
135:
136: /*
137: * extinguish:
138: * Put out a fuse
139: */
140: void
141: extinguish(void (*func)())
142: {
143: struct delayed_action *wire;
144:
145: if ((wire = find_slot(func)) == NULL)
146: return;
147: wire->d_type = EMPTY;
148: }
149:
150: /*
151: * do_fuses:
152: * Decrement counters and start needed fuses
153: */
154: void
155: do_fuses(int flag)
156: {
157: struct delayed_action *wire;
158:
159: /*
160: * Step though the list
161: */
162: for (wire = d_list; wire <= &d_list[MAXDAEMONS-1]; wire++)
163: /*
164: * Decrementing counters and starting things we want. We also need
165: * to remove the fuse from the list once it has gone off.
166: */
167: if (flag == wire->d_type && wire->d_time > 0 && --wire->d_time == 0)
168: {
169: wire->d_type = EMPTY;
170: (*wire->d_func)(wire->d_arg);
171: }
172: }
CVSweb