Mercurial > hg > early-roguelike
comparison srogue/daemon.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
| author | elwin |
|---|---|
| date | Thu, 25 Nov 2010 12:21:41 +0000 |
| parents | |
| children | f2951c4e28d9 |
comparison
equal
deleted
inserted
replaced
| 35:05018c63a721 | 36:2128c7dc8a40 |
|---|---|
| 1 /* | |
| 2 * Contains functions for dealing with things that | |
| 3 * happen in the future. | |
| 4 * | |
| 5 * @(#)daemon.c 9.0 (rdk) 7/17/84 | |
| 6 * | |
| 7 * Super-Rogue | |
| 8 * Copyright (C) 1984 Robert D. Kindelberger | |
| 9 * All rights reserved. | |
| 10 * | |
| 11 * Based on "Rogue: Exploring the Dungeons of Doom" | |
| 12 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 13 * All rights reserved. | |
| 14 * | |
| 15 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 16 */ | |
| 17 | |
| 18 #include "rogue.h" | |
| 19 #include "rogue.ext" | |
| 20 | |
| 21 #define EMPTY 0 | |
| 22 #define DAEMON -1 | |
| 23 | |
| 24 #define _X_ { 0, 0, 0, 0 } | |
| 25 | |
| 26 struct delayed_action d_list[MAXDAEMONS] = { | |
| 27 _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, | |
| 28 _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, | |
| 29 }; | |
| 30 | |
| 31 | |
| 32 /* | |
| 33 * d_insert: | |
| 34 * Insert a function in the daemon list. | |
| 35 */ | |
| 36 struct delayed_action * | |
| 37 d_insert(func, arg, type, time) | |
| 38 int arg, type, time, (*func)(); | |
| 39 { | |
| 40 reg struct delayed_action *dev; | |
| 41 | |
| 42 if (demoncnt < MAXDAEMONS) { | |
| 43 dev = &d_list[demoncnt]; | |
| 44 dev->d_type = type; | |
| 45 dev->d_time = time; | |
| 46 dev->d_func = func; | |
| 47 dev->d_arg = arg; | |
| 48 demoncnt += 1; | |
| 49 return dev; | |
| 50 } | |
| 51 return NULL; | |
| 52 } | |
| 53 | |
| 54 d_delete(wire) | |
| 55 struct delayed_action *wire; | |
| 56 { | |
| 57 reg struct delayed_action *d1, *d2; | |
| 58 | |
| 59 for (d1 = d_list; d1 < &d_list[demoncnt]; d1++) { | |
| 60 if (wire == d1) { | |
| 61 for (d2 = d1 + 1; d2 < &d_list[demoncnt]; d2++) | |
| 62 *d1++ = *d2; | |
| 63 demoncnt -= 1; | |
| 64 d1 = &d_list[demoncnt]; | |
| 65 d1->d_type = EMPTY; | |
| 66 d1->d_func = EMPTY; | |
| 67 return; | |
| 68 } | |
| 69 } | |
| 70 } | |
| 71 /* | |
| 72 * find_slot: | |
| 73 * Find a particular slot in the table | |
| 74 */ | |
| 75 struct delayed_action * | |
| 76 find_slot(func) | |
| 77 int (*func)(); | |
| 78 { | |
| 79 reg struct delayed_action *dev; | |
| 80 | |
| 81 for (dev = d_list; dev < &d_list[demoncnt]; dev++) | |
| 82 if (dev->d_type != EMPTY && func == dev->d_func) | |
| 83 return dev; | |
| 84 return NULL; | |
| 85 } | |
| 86 | |
| 87 /* | |
| 88 * daemon: | |
| 89 * Start a daemon, takes a function. | |
| 90 */ | |
| 91 daemon(func, arg, type) | |
| 92 int arg, type, (*func)(); | |
| 93 { | |
| 94 d_insert(func, arg, type, DAEMON); | |
| 95 } | |
| 96 | |
| 97 /* | |
| 98 * do_daemons: | |
| 99 * Run all the daemons that are active with the current | |
| 100 * flag, passing the argument to the function. | |
| 101 */ | |
| 102 do_daemons(flag) | |
| 103 int flag; | |
| 104 { | |
| 105 reg struct delayed_action *dev; | |
| 106 | |
| 107 for (dev = d_list; dev < &d_list[demoncnt]; dev++) | |
| 108 if (dev->d_type == flag && dev->d_time == DAEMON) | |
| 109 (*dev->d_func)(dev->d_arg); | |
| 110 } | |
| 111 | |
| 112 /* | |
| 113 * fuse: | |
| 114 * Start a fuse to go off in a certain number of turns | |
| 115 */ | |
| 116 fuse(func, arg, time) | |
| 117 int (*func)(), arg, time; | |
| 118 { | |
| 119 d_insert(func, arg, AFTER, time); | |
| 120 } | |
| 121 | |
| 122 /* | |
| 123 * lengthen: | |
| 124 * Increase the time until a fuse goes off | |
| 125 */ | |
| 126 lengthen(func, xtime) | |
| 127 int (*func)(), xtime; | |
| 128 { | |
| 129 reg struct delayed_action *wire; | |
| 130 | |
| 131 for (wire = d_list; wire < &d_list[demoncnt]; wire++) | |
| 132 if (wire->d_type != EMPTY && func == wire->d_func) | |
| 133 wire->d_time += xtime; | |
| 134 } | |
| 135 | |
| 136 /* | |
| 137 * extinguish: | |
| 138 * Put out a fuse. Find all such fuses and kill them. | |
| 139 */ | |
| 140 extinguish(func) | |
| 141 int (*func)(); | |
| 142 { | |
| 143 reg struct delayed_action *dev; | |
| 144 | |
| 145 for (dev = d_list; dev < &d_list[demoncnt]; dev++) | |
| 146 if (dev->d_type != EMPTY && func == dev->d_func) | |
| 147 d_delete(dev); | |
| 148 } | |
| 149 | |
| 150 /* | |
| 151 * do_fuses: | |
| 152 * Decrement counters and start needed fuses | |
| 153 */ | |
| 154 do_fuses() | |
| 155 { | |
| 156 reg struct delayed_action *dev; | |
| 157 | |
| 158 for (dev = d_list; dev < &d_list[demoncnt]; dev++) { | |
| 159 if (dev->d_type == AFTER && dev->d_time > DAEMON) { | |
| 160 if (--dev->d_time == 0) { | |
| 161 (*dev->d_func)(dev->d_arg); | |
| 162 d_delete(dev); | |
| 163 } | |
| 164 } | |
| 165 } | |
| 166 } | |
| 167 | |
| 168 | |
| 169 /* | |
| 170 * activity: | |
| 171 * Show wizard number of demaons and memory blocks used | |
| 172 */ | |
| 173 activity() | |
| 174 { | |
| 175 msg("Daemons = %d : Memory Items = %d : Memory Used = %d", | |
| 176 demoncnt,total,sbrk(0)); | |
| 177 } |
