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

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

1.1     ! rubenllo    1: /*
        !             2:     daemon.c - functions for dealing with things that happen in the future
        !             3:
        !             4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
        !             5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
        !             6:     All rights reserved.
        !             7:
        !             8:     Based on "Advanced Rogue"
        !             9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
        !            10:     All rights reserved.
        !            11:
        !            12:     Based on "Rogue: Exploring the Dungeons of Doom"
        !            13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            14:     All rights reserved.
        !            15:
        !            16:     See the file LICENSE.TXT for full copyright and licensing information.
        !            17: */
        !            18:
        !            19: /*
        !            20:         Needs to be rewritten again to work on a per creature basis.
        !            21:         Either each monster will have a list of effect, or each
        !            22:         fuse will take a creature pointer and multiple entries
        !            23:         for each fuse will be allowed. I tend to want to attach
        !            24:         the effects to the creature.
        !            25: */
        !            26:
        !            27: #include "rogue.h"
        !            28:
        !            29: int demoncnt;
        !            30:
        !            31: struct daemon daemons[DAEMON_MAX] =
        !            32: {
        !            33:     { DAEMON_NULL,       NULL         },
        !            34:     { DAEMON_DOCTOR,     doctor       },
        !            35:     { DAEMON_ROLLWAND,   rollwand     },
        !            36:     { DAEMON_STOMACH,    stomach      },
        !            37:     { DAEMON_RUNNERS,    runners      }
        !            38: };
        !            39:
        !            40: struct fuse fuses[FUSE_MAX] =
        !            41: {
        !            42:     { FUSE_NULL,         NULL         },
        !            43:     { FUSE_SWANDER,      swander      },
        !            44:     { FUSE_UNCONFUSE,    unconfuse    },
        !            45:     { FUSE_UNSCENT,      unscent      },
        !            46:     { FUSE_SCENT,        scent        },
        !            47:     { FUSE_UNHEAR,       unhear       },
        !            48:     { FUSE_HEAR,         hear         },
        !            49:     { FUSE_UNSEE,        unsee        },
        !            50:     { FUSE_UNSTINK,      unstink      },
        !            51:     { FUSE_UNCLRHEAD,    unclrhead    },
        !            52:     { FUSE_UNPHASE,      unphase      },
        !            53:     { FUSE_SIGHT,        sight        },
        !            54:     { FUSE_RES_STRENGTH, res_strength },
        !            55:     { FUSE_NOHASTE,      nohaste      },
        !            56:     { FUSE_NOSLOW,       noslow       },
        !            57:     { FUSE_SUFFOCATE,    suffocate    },
        !            58:     { FUSE_CURE_DISEASE, cure_disease },
        !            59:     { FUSE_UNITCH,       un_itch      },
        !            60:     { FUSE_APPEAR,       appear       },
        !            61:     { FUSE_UNELECTRIFY,  unelectrify  },
        !            62:     { FUSE_UNBHERO,      unbhero      },
        !            63:     { FUSE_UNSHERO,      unshero      },
        !            64:     { FUSE_UNXRAY,       NULL         },
        !            65:     { FUSE_UNDISGUISE,   undisguise   },
        !            66:     { FUSE_SHERO,        shero        },
        !            67:     { FUSE_WGHTCHK,      wghtchk      },
        !            68:     { FUSE_UNSUMMON,     unsummon     },
        !            69:     { FUSE_UNGAZE,       ungaze       },
        !            70:     { FUSE_UNCOLD,       uncold       },
        !            71:     { FUSE_UNHOT,        unhot        },
        !            72:     { FUSE_UNFLY,        unfly        },
        !            73:     { FUSE_UNBREATHE,    unbreathe    },
        !            74:     { FUSE_UNREGEN,      unregen      },
        !            75:     { FUSE_UNSUPEREAT,   unsupereat   },
        !            76:     { FUSE_UNSHIELD,     unshield     },
        !            77:     { FUSE_UNMSHIELD,    unmshield    },
        !            78:     { FUSE_UNTRUESEE,    untruesee    }
        !            79: };
        !            80:
        !            81: /*
        !            82:     d_slot()
        !            83:         Find an empty slot in the daemon/fuse list
        !            84: */
        !            85:
        !            86: struct delayed_action *
        !            87: d_slot(void)
        !            88: {
        !            89:     int i;
        !            90:     struct delayed_action *dev;
        !            91:
        !            92:     for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++)
        !            93:         if (dev->d_type == EMPTY)
        !            94:             return(dev);
        !            95:
        !            96:     return(NULL);
        !            97: }
        !            98:
        !            99:
        !           100: /*
        !           101:      find_slot()
        !           102:          Find a particular slot in the table
        !           103: */
        !           104:
        !           105: struct delayed_action *
        !           106: find_slot(int type, int id)
        !           107: {
        !           108:     int i;
        !           109:     struct delayed_action *dev;
        !           110:
        !           111:     for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++)
        !           112:         if ( (dev->d_type == type) && (id == dev->d_id) )
        !           113:             return(dev);
        !           114:
        !           115:     return(NULL);
        !           116: }
        !           117:
        !           118:
        !           119: /*
        !           120:     daemon()
        !           121:         Start a daemon, takes a function.
        !           122: */
        !           123:
        !           124: void
        !           125: start_daemon(int id, void *arg, int whendo)
        !           126: {
        !           127:     struct delayed_action *dev;
        !           128:
        !           129:     dev = d_slot();
        !           130:
        !           131:     if (dev != NULL)
        !           132:     {
        !           133:         dev->d_type = DAEMON;
        !           134:         dev->d_when = whendo;
        !           135:         dev->d_id = id;
        !           136:         dev->d_arg = arg;
        !           137:         dev->d_time = 1;
        !           138:         demoncnt += 1;  /* update count */
        !           139:     }
        !           140: }
        !           141:
        !           142:
        !           143: /*
        !           144:     kill_daemon()
        !           145:         Remove a daemon from the list
        !           146: */
        !           147:
        !           148: void
        !           149: kill_daemon(int id)
        !           150: {
        !           151:     struct delayed_action *dev;
        !           152:
        !           153:     if ((dev = find_slot(DAEMON, id)) == NULL)
        !           154:         return;
        !           155:
        !           156:     /* Take it out of the list */
        !           157:
        !           158:     dev->d_type = EMPTY;
        !           159:     demoncnt -= 1;      /* update count */
        !           160:
        !           161:     return;
        !           162: }
        !           163:
        !           164:
        !           165: /*
        !           166:     do_daemons()
        !           167:         Run all the daemons that are active with the current flag,
        !           168:         passing the argument to the function.
        !           169: */
        !           170:
        !           171: void
        !           172: do_daemons(int now)
        !           173: {
        !           174:     struct delayed_action *dev;
        !           175:
        !           176:     /* Loop through the devil list */
        !           177:
        !           178:     for (dev = d_list; dev < &d_list[MAXDAEMONS]; dev++)
        !           179:         /* Executing each one, giving it the proper arguments */
        !           180:         if ( (dev->d_when == now) && (dev->d_type == DAEMON))
        !           181:         {
        !           182:             if ((dev->d_id < 1) || (dev->d_id >= DAEMON_MAX))
        !           183:                 printf("Bad daemon id %d\n", dev->d_id);
        !           184:             else if (daemons[dev->d_id].func == NULL)
        !           185:                 printf("No action for daemon %d!!!\n", dev->d_id);
        !           186:             else
        !           187:             {
        !           188:                 daemon_arg arg;
        !           189:
        !           190:                 arg.varg = dev->d_arg;
        !           191:                 daemons[dev->d_id].func(&arg);
        !           192:             }
        !           193:         }
        !           194:
        !           195: }
        !           196:
        !           197:
        !           198: /*
        !           199:     fuse()
        !           200:         Start a fuse to go off in a certain number of turns
        !           201: */
        !           202:
        !           203: void
        !           204: light_fuse(int id, void *arg, int time, int whendo)
        !           205: {
        !           206:     struct delayed_action   *wire;
        !           207:
        !           208:     wire = d_slot();
        !           209:
        !           210:     if (wire != NULL)
        !           211:     {
        !           212:         wire->d_type = FUSE;
        !           213:         wire->d_when = whendo;
        !           214:         wire->d_id   = id;
        !           215:         wire->d_arg  = arg;
        !           216:         wire->d_time = time;
        !           217:         demoncnt += 1;  /* update count */
        !           218:     }
        !           219: }
        !           220:
        !           221:
        !           222: /*
        !           223:     lengthen()
        !           224:         Increase the time until a fuse goes off
        !           225: */
        !           226:
        !           227: void
        !           228: lengthen_fuse(int id, int xtime)
        !           229: {
        !           230:     struct delayed_action *wire;
        !           231:
        !           232:     if ((wire = find_slot(FUSE,id)) == NULL)
        !           233:         return;
        !           234:
        !           235:     wire->d_time += xtime;
        !           236:
        !           237:     return;
        !           238: }
        !           239:
        !           240:
        !           241: /*
        !           242:     extinguish()
        !           243:         Put out a fuse
        !           244: */
        !           245:
        !           246: void
        !           247: extinguish_fuse(int id)
        !           248: {
        !           249:     struct delayed_action   *wire;
        !           250:
        !           251:     if ((wire = find_slot(FUSE,id)) == NULL)
        !           252:         return;
        !           253:
        !           254:     wire->d_type = EMPTY;
        !           255:     demoncnt -= 1;
        !           256:
        !           257:     return;
        !           258: }
        !           259:
        !           260:
        !           261: /*
        !           262:     do_fuses()
        !           263:         Decrement counters and start needed fuses
        !           264: */
        !           265:
        !           266: void
        !           267: do_fuses(int now)
        !           268: {
        !           269:     struct delayed_action   *wire;
        !           270:
        !           271:     /* Step though the list */
        !           272:
        !           273:     for (wire = d_list; wire < &d_list[MAXDAEMONS]; wire++)
        !           274:     {
        !           275:         /*
        !           276:          * Decrementing counters and starting things we want.  We
        !           277:          * also need to remove the fuse from the list once it has
        !           278:          * gone off.
        !           279:          */
        !           280:
        !           281:         if( (wire->d_type == FUSE) && (wire->d_when == now) )
        !           282:         {
        !           283:             if (--wire->d_time <= 0)
        !           284:             {
        !           285:                 if (wire->d_id < 0 || wire->d_id >= FUSE_MAX)
        !           286:                     printf("Bad fuse id %d\n", wire->d_id);
        !           287:                 else if (fuses[wire->d_id].func == NULL)
        !           288:                     printf("No action for fuse %d!\n", wire->d_id);
        !           289:                 else
        !           290:                 {
        !           291:                     fuse_arg arg;
        !           292:
        !           293:                     arg.varg = wire->d_arg;
        !           294:                     fuses[wire->d_id].func(&arg);
        !           295:                 }
        !           296:                 wire->d_type = EMPTY;
        !           297:                 demoncnt -= 1;
        !           298:             }
        !           299:         }
        !           300:
        !           301:     }
        !           302:
        !           303:     return;
        !           304: }
        !           305:
        !           306:
        !           307: /*
        !           308:     activity()
        !           309:         Show wizard number of demaons and memory blocks used
        !           310: */
        !           311:
        !           312: void
        !           313: activity(void)
        !           314: {
        !           315:     msg("Daemons = %d : Memory Items = %d ", demoncnt, total);
        !           316:     return;
        !           317: }
        !           318:
        !           319: /*
        !           320:     waste_time()
        !           321:         Do nothing but let other things happen
        !           322: */
        !           323:
        !           324: void
        !           325: waste_time(void)
        !           326: {
        !           327:     if (inwhgt)     /* if from wghtchk then done */
        !           328:         return;
        !           329:
        !           330:     do_daemons(BEFORE);
        !           331:     do_fuses(BEFORE);
        !           332:     do_daemons(AFTER);
        !           333:     do_fuses(AFTER);
        !           334: }

CVSweb