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

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

CVSweb