[BACK]Return to daemon.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / rogue4

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

CVSweb