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

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