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