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

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

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

CVSweb