Mercurial > hg > early-roguelike
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srogue/daemon.c Thu Nov 25 12:21:41 2010 +0000 @@ -0,0 +1,177 @@ +/* + * Contains functions for dealing with things that + * happen in the future. + * + * @(#)daemon.c 9.0 (rdk) 7/17/84 + * + * Super-Rogue + * Copyright (C) 1984 Robert D. Kindelberger + * All rights reserved. + * + * Based on "Rogue: Exploring the Dungeons of Doom" + * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include "rogue.h" +#include "rogue.ext" + +#define EMPTY 0 +#define DAEMON -1 + +#define _X_ { 0, 0, 0, 0 } + +struct delayed_action d_list[MAXDAEMONS] = { + _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, + _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, +}; + + +/* + * d_insert: + * Insert a function in the daemon list. + */ +struct delayed_action * +d_insert(func, arg, type, time) +int arg, type, time, (*func)(); +{ + reg struct delayed_action *dev; + + if (demoncnt < MAXDAEMONS) { + dev = &d_list[demoncnt]; + dev->d_type = type; + dev->d_time = time; + dev->d_func = func; + dev->d_arg = arg; + demoncnt += 1; + return dev; + } + return NULL; +} + +d_delete(wire) +struct delayed_action *wire; +{ + reg struct delayed_action *d1, *d2; + + for (d1 = d_list; d1 < &d_list[demoncnt]; d1++) { + if (wire == d1) { + for (d2 = d1 + 1; d2 < &d_list[demoncnt]; d2++) + *d1++ = *d2; + demoncnt -= 1; + d1 = &d_list[demoncnt]; + d1->d_type = EMPTY; + d1->d_func = EMPTY; + return; + } + } +} +/* + * find_slot: + * Find a particular slot in the table + */ +struct delayed_action * +find_slot(func) +int (*func)(); +{ + reg struct delayed_action *dev; + + for (dev = d_list; dev < &d_list[demoncnt]; dev++) + if (dev->d_type != EMPTY && func == dev->d_func) + return dev; + return NULL; +} + +/* + * daemon: + * Start a daemon, takes a function. + */ +daemon(func, arg, type) +int arg, type, (*func)(); +{ + d_insert(func, arg, type, DAEMON); +} + +/* + * do_daemons: + * Run all the daemons that are active with the current + * flag, passing the argument to the function. + */ +do_daemons(flag) +int flag; +{ + reg struct delayed_action *dev; + + for (dev = d_list; dev < &d_list[demoncnt]; dev++) + if (dev->d_type == flag && dev->d_time == DAEMON) + (*dev->d_func)(dev->d_arg); +} + +/* + * fuse: + * Start a fuse to go off in a certain number of turns + */ +fuse(func, arg, time) +int (*func)(), arg, time; +{ + d_insert(func, arg, AFTER, time); +} + +/* + * lengthen: + * Increase the time until a fuse goes off + */ +lengthen(func, xtime) +int (*func)(), xtime; +{ + reg struct delayed_action *wire; + + for (wire = d_list; wire < &d_list[demoncnt]; wire++) + if (wire->d_type != EMPTY && func == wire->d_func) + wire->d_time += xtime; +} + +/* + * extinguish: + * Put out a fuse. Find all such fuses and kill them. + */ +extinguish(func) +int (*func)(); +{ + reg struct delayed_action *dev; + + for (dev = d_list; dev < &d_list[demoncnt]; dev++) + if (dev->d_type != EMPTY && func == dev->d_func) + d_delete(dev); +} + +/* + * do_fuses: + * Decrement counters and start needed fuses + */ +do_fuses() +{ + reg struct delayed_action *dev; + + for (dev = d_list; dev < &d_list[demoncnt]; dev++) { + if (dev->d_type == AFTER && dev->d_time > DAEMON) { + if (--dev->d_time == 0) { + (*dev->d_func)(dev->d_arg); + d_delete(dev); + } + } + } +} + + +/* + * activity: + * Show wizard number of demaons and memory blocks used + */ +activity() +{ + msg("Daemons = %d : Memory Items = %d : Memory Used = %d", + demoncnt,total,sbrk(0)); +}