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

Annotation of early-roguelike/arogue5/daemon.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * Contains functions for dealing with things that happen in the future.
        !             3:  *
        !             4:  * Advanced Rogue
        !             5:  * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Based on "Rogue: Exploring the Dungeons of Doom"
        !             9:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            10:  * All rights reserved.
        !            11:  *
        !            12:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            13:  */
        !            14:
        !            15: #include "curses.h"
        !            16: #include "rogue.h"
        !            17:
        !            18: #define EMPTY          0
        !            19: #define DAEMON         -1
        !            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: };
        !            26: struct delayed_action f_list[MAXFUSES] = {
        !            27:        _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
        !            28:        _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_
        !            29: };
        !            30: int demoncnt = 0;      /* number of active daemons */
        !            31: int fusecnt = 0;
        !            32:
        !            33:
        !            34: /*
        !            35:  * d_slot:
        !            36:  *     Find an empty slot in the daemon list
        !            37:  */
        !            38: struct delayed_action *
        !            39: d_slot(void)
        !            40: {
        !            41:        reg int i;
        !            42:        reg struct delayed_action *dev;
        !            43:
        !            44:        for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++)
        !            45:                if (dev->d_type == EMPTY)
        !            46:                        return dev;
        !            47:        return NULL;
        !            48: }
        !            49:
        !            50: /*
        !            51:  * f_slot:
        !            52:  *     Find an empty slot in the fuses list
        !            53:  */
        !            54: struct delayed_action *
        !            55: f_slot(void)
        !            56: {
        !            57:        reg int i;
        !            58:        reg struct delayed_action *dev;
        !            59:
        !            60:        for (i = 0, dev = f_list; i < MAXFUSES; i++, dev++)
        !            61:                if (dev->d_type == EMPTY)
        !            62:                        return dev;
        !            63:        return NULL;
        !            64: }
        !            65:
        !            66:
        !            67:
        !            68: /*
        !            69:  * find_slot:
        !            70:  *     Find a particular slot in the table
        !            71:  */
        !            72: struct delayed_action *
        !            73: find_slot(void (*func)())
        !            74: {
        !            75:        reg int i;
        !            76:        reg struct delayed_action *dev;
        !            77:
        !            78:        for (i = 0, dev = f_list; i < MAXFUSES; i++, dev++)
        !            79:                if (dev->d_type != EMPTY && func == dev->d_func)
        !            80:                        return dev;
        !            81:        return NULL;
        !            82: }
        !            83:
        !            84:
        !            85: /*
        !            86:  * start_daemon:
        !            87:  *     Start a daemon, takes a function.
        !            88:  */
        !            89: void
        !            90: start_daemon(void (*func)(), void *arg, int type)
        !            91: {
        !            92:        reg struct delayed_action *dev;
        !            93:
        !            94:        dev = d_slot();
        !            95:        if (dev != NULL) {
        !            96:                dev->d_type = type;
        !            97:                dev->d_func = func;
        !            98:                dev->d_arg = arg;
        !            99:                dev->d_time = DAEMON;
        !           100:                demoncnt += 1;                  /* update count */
        !           101:        }
        !           102: }
        !           103:
        !           104:
        !           105: /*
        !           106:  * kill_daemon:
        !           107:  *     Remove a daemon from the list
        !           108:  */
        !           109: void
        !           110: kill_daemon(void (*func)())
        !           111: {
        !           112:        reg struct delayed_action *dev;
        !           113:        reg int i;
        !           114:
        !           115:        for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++) {
        !           116:                if (dev->d_type != EMPTY && func == dev->d_func)
        !           117:                        break;
        !           118:        }
        !           119:        if (i >= MAXDAEMONS) return; /* if not found, forget it */
        !           120:        /*
        !           121:         * Take it out of the list
        !           122:         */
        !           123:        dev->d_type = EMPTY;
        !           124:        dev->d_arg = NULL;
        !           125:        dev->d_func = NULL;
        !           126:        dev->d_time = 0;
        !           127:        demoncnt -= 1;                  /* update count */
        !           128: }
        !           129:
        !           130:
        !           131: /*
        !           132:  * do_daemons:
        !           133:  *     Run all the daemons that are active with the current flag,
        !           134:  *     passing the argument to the function.
        !           135:  */
        !           136: void
        !           137: do_daemons(int flag)
        !           138: {
        !           139:        reg struct delayed_action *dev;
        !           140:
        !           141:        /*
        !           142:         * Loop through the devil list
        !           143:         */
        !           144:        for (dev = d_list; dev <= &d_list[MAXDAEMONS-1]; dev++)
        !           145:        /*
        !           146:         * Executing each one, giving it the proper arguments
        !           147:         */
        !           148:                if (dev->d_func != NULL && dev->d_type == flag && dev->d_time == DAEMON)
        !           149:                        (*dev->d_func)(dev->d_arg);
        !           150: }
        !           151:
        !           152:
        !           153: /*
        !           154:  * fuse:
        !           155:  *     Start a fuse to go off in a certain number of turns
        !           156:  */
        !           157: void
        !           158: fuse(void (*func)(), void *arg, int time, int type)
        !           159: {
        !           160:        reg struct delayed_action *wire;
        !           161:
        !           162:        wire = f_slot();
        !           163:        if (wire != NULL) {
        !           164:                wire->d_type = type;
        !           165:                wire->d_func = func;
        !           166:                wire->d_arg = arg;
        !           167:                wire->d_time = time;
        !           168:                fusecnt += 1;                   /* update count */
        !           169:        }
        !           170: }
        !           171:
        !           172:
        !           173: /*
        !           174:  * lengthen:
        !           175:  *     Increase the time until a fuse goes off
        !           176:  */
        !           177: void
        !           178: lengthen(void (*func)(), int xtime)
        !           179: {
        !           180:        reg struct delayed_action *wire;
        !           181:
        !           182:        if ((wire = find_slot(func)) == NULL)
        !           183:                return;
        !           184:        wire->d_time += xtime;
        !           185: }
        !           186:
        !           187:
        !           188: /*
        !           189:  * extinguish:
        !           190:  *     Put out a fuse
        !           191:  */
        !           192: void
        !           193: extinguish(void (*func)())
        !           194: {
        !           195:        reg struct delayed_action *wire;
        !           196:
        !           197:        if ((wire = find_slot(func)) == NULL)
        !           198:                return;
        !           199:        wire->d_type = EMPTY;
        !           200:        wire->d_func = NULL;
        !           201:        wire->d_arg = NULL;
        !           202:        wire->d_time = 0;
        !           203:        fusecnt -= 1;
        !           204: }
        !           205:
        !           206:
        !           207: /*
        !           208:  * do_fuses:
        !           209:  *     Decrement counters and start needed fuses
        !           210:  */
        !           211: void
        !           212: do_fuses(int flag)
        !           213: {
        !           214:        reg struct delayed_action *wire;
        !           215:
        !           216:        /*
        !           217:         * Step though the list
        !           218:         */
        !           219:        for (wire = f_list; wire <= &f_list[MAXFUSES-1]; wire++) {
        !           220:        /*
        !           221:         * Decrementing counters and starting things we want.  We also need
        !           222:         * to remove the fuse from the list once it has gone off.
        !           223:         */
        !           224:            if(flag == wire->d_type && wire->d_time > 0 &&
        !           225:              --wire->d_time == 0) {
        !           226:                wire->d_type = EMPTY;
        !           227:                if (wire->d_func != NULL)
        !           228:                    (*wire->d_func)(wire->d_arg);
        !           229:                fusecnt -= 1;
        !           230:            }
        !           231:        }
        !           232: }
        !           233:
        !           234: /*
        !           235:  * activity:
        !           236:  *     Show wizard number of demaons and memory blocks used
        !           237:  */
        !           238: void
        !           239: activity(void)
        !           240: {
        !           241:        sprintf(outstring,"Daemons = %d : Fuses = %d : Memory Items = %d : Memory Used = %ld",
        !           242:            demoncnt,fusecnt,total,md_memused());
        !           243:        msg(outstring);
        !           244: }

CVSweb