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

Annotation of early-roguelike/rogue3/monsters.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * File with various monster functions in it
                      3:  *
                      4:  * @(#)monsters.c      3.18 (Berkeley) 6/15/81
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                      8:  * All rights reserved.
                      9:  *
                     10:  * See the file LICENSE.TXT for full copyright and licensing information.
                     11:  */
                     12:
                     13: #include "curses.h"
                     14: #include "rogue.h"
                     15: #include <string.h>
                     16: #include <ctype.h>
                     17:
                     18: /*
                     19:  * List of monsters in rough order of vorpalness
                     20:  */
                     21: char lvl_mons[27] =  "KJBSHEAOZGLCRQNYTWFIXUMVDP";
                     22: char wand_mons[27] = "KJBSH AOZG CRQ Y W IXU V  ";
                     23:
                     24: /*
                     25:  * randmonster:
                     26:  *     Pick a monster to show up.  The lower the level,
                     27:  *     the meaner the monster.
                     28:  */
                     29:
                     30: int
                     31: randmonster(int wander)
                     32: {
                     33:     int d;
                     34:     char *mons;
                     35:
                     36:     mons = wander ? wand_mons : lvl_mons;
                     37:     do
                     38:     {
                     39:        d = level + (rnd(10) - 5);
                     40:        if (d < 1)
                     41:            d = rnd(5) + 1;
                     42:        if (d > 26)
                     43:            d = rnd(5) + 22;
                     44:     } while (mons[--d] == ' ');
                     45:     return mons[d];
                     46: }
                     47:
                     48: /*
                     49:  * new_monster:
                     50:  *     Pick a new monster and add it to the list
                     51:  */
                     52:
                     53: void
                     54: new_monster(struct linked_list *item, int type, coord *cp)
                     55: {
                     56:     struct thing *tp;
                     57:     struct monster *mp;
                     58:
                     59:     attach(mlist, item);
                     60:     tp = (struct thing *) ldata(item);
                     61:     tp->t_type = type;
                     62:     tp->t_pos = *cp;
                     63:     tp->t_oldch = mvwinch(cw, cp->y, cp->x);
                     64:     mvwaddch(mw, cp->y, cp->x, tp->t_type);
                     65:     mp = &monsters[tp->t_type-'A'];
                     66:     tp->t_stats.s_hpt = roll(mp->m_stats.s_lvl, 8);
                     67:     tp->t_stats.s_lvl = mp->m_stats.s_lvl;
                     68:     tp->t_stats.s_arm = mp->m_stats.s_arm;
                     69:     strcpy(tp->t_stats.s_dmg,mp->m_stats.s_dmg);
                     70:     tp->t_stats.s_exp = mp->m_stats.s_exp;
                     71:     tp->t_stats.s_str.st_str = 10;
                     72:     tp->t_flags = mp->m_flags;
                     73:     tp->t_turn = TRUE;
                     74:     tp->t_pack = NULL;
                     75:     if (ISWEARING(R_AGGR))
                     76:        runto(cp, &hero);
                     77:     if (type == 'M')
                     78:     {
                     79:        int mch = 0;
                     80:
                     81:        if (tp->t_pack != NULL)
                     82:            mch = ((struct object *) ldata(tp->t_pack))->o_type;
                     83:        else
                     84:            switch (rnd(level > 25 ? 9 : 8))
                     85:            {
                     86:                case 0: mch = GOLD;
                     87:                when 1: mch = POTION;
                     88:                when 2: mch = SCROLL;
                     89:                when 3: mch = STAIRS;
                     90:                when 4: mch = WEAPON;
                     91:                when 5: mch = ARMOR;
                     92:                when 6: mch = RING;
                     93:                when 7: mch = STICK;
                     94:                when 8: mch = AMULET;
                     95:            }
                     96:        tp->t_disguise = mch;
                     97:     }
                     98: }
                     99:
                    100: /*
                    101:  * wanderer:
                    102:  *     A wandering monster has awakened and is headed for the player
                    103:  */
                    104:
                    105: void
                    106: wanderer()
                    107: {
                    108:     int i, ch;
                    109:     struct room *rp, *hr = roomin(&hero);
                    110:     struct linked_list *item;
                    111:     struct thing *tp;
                    112:     coord cp;
                    113:
                    114:     item = new_item(sizeof *tp);
                    115:     do
                    116:     {
                    117:        i = rnd_room();
                    118:        if ((rp = &rooms[i]) == hr)
                    119:            continue;
                    120:        rnd_pos(rp, &cp);
                    121:        if ((ch = mvwinch(stdscr, cp.y, cp.x)) == ERR)
                    122:        {
                    123:            debug("Routine wanderer: mvwinch failed to %d,%d", cp.y, cp.x);
                    124:            if (wizard)
                    125:                wait_for(cw,'\n');
                    126:            return;
                    127:        }
                    128:     } until(hr != rp && step_ok(ch));
                    129:     new_monster(item, randmonster(TRUE), &cp);
                    130:     tp = (struct thing *) ldata(item);
                    131:     tp->t_flags |= ISRUN;
                    132:     tp->t_pos = cp;
                    133:     tp->t_dest = &hero;
                    134:     if (wizard)
                    135:        msg("Started a wandering %s", monsters[tp->t_type-'A'].m_name);
                    136: }
                    137:
                    138: /*
                    139:  * what to do when the hero steps next to a monster
                    140:  */
                    141: struct linked_list *
                    142: wake_monster(int y, int x)
                    143: {
                    144:     struct thing *tp;
                    145:     struct linked_list *it;
                    146:     struct room *rp;
                    147:     int ch;
                    148:
                    149:     if ((it = find_mons(y, x)) == NULL)
                    150:     {
                    151:        fatal("Can't find monster in wake");
                    152:        return NULL;
                    153:     }
                    154:
                    155:     tp = (struct thing *) ldata(it);
                    156:     ch = tp->t_type;
                    157:     /*
                    158:      * Every time he sees mean monster, it might start chasing him
                    159:      */
                    160:     if (rnd(100) > 33 && on(*tp, ISMEAN) && off(*tp, ISHELD)
                    161:        && !ISWEARING(R_STEALTH))
                    162:     {
                    163:        tp->t_dest = &hero;
                    164:        tp->t_flags |= ISRUN;
                    165:     }
                    166:     if (ch == 'U' && off(player, ISBLIND))
                    167:     {
                    168:         rp = roomin(&hero);
                    169:        if ((rp != NULL && !(rp->r_flags&ISDARK))
                    170:            || DISTANCE(y, x, hero.y, hero.x) < 3)
                    171:        {
                    172:            if (off(*tp, ISFOUND) && !save(VS_MAGIC))
                    173:            {
                    174:                msg("The umber hulk's gaze has confused you.");
                    175:                if (on(player, ISHUH))
                    176:                    lengthen(unconfuse, rnd(20)+HUHDURATION);
                    177:                else
                    178:                    fuse(unconfuse, 0, rnd(20)+HUHDURATION, AFTER);
                    179:                player.t_flags |= ISHUH;
                    180:            }
                    181:            tp->t_flags |= ISFOUND;
                    182:        }
                    183:     }
                    184:     /*
                    185:      * Hide invisible monsters
                    186:      */
                    187:     if (on(*tp, ISINVIS) && off(player, CANSEE))
                    188:        ch = mvwinch(stdscr, y, x);
                    189:     /*
                    190:      * Let greedy ones guard gold
                    191:      */
                    192:     if (on(*tp, ISGREED) && off(*tp, ISRUN))
                    193:     {
                    194:         rp = roomin(&hero);
                    195:
                    196:        if (rp != NULL && rp->r_goldval)
                    197:        {
                    198:            tp->t_dest = &rp->r_gold;
                    199:            tp->t_flags |= ISRUN;
                    200:        }
                    201:     }
                    202:
                    203:     return it;
                    204: }
                    205:
                    206: void
                    207: genocide()
                    208: {
                    209:     struct linked_list *ip;
                    210:     struct thing *mp;
                    211:     int c;
                    212:     int i;
                    213:     struct linked_list *nip;
                    214:
                    215:     addmsg("Which monster");
                    216:     if (!terse)
                    217:        addmsg(" do you wish to wipe out");
                    218:     msg("? ");
                    219:     while (!isalpha(c = readchar(cw)))
                    220:        if (c == ESCAPE)
                    221:            return;
                    222:        else
                    223:        {
                    224:            mpos = 0;
                    225:            msg("Please specify a letter between 'A' and 'Z'");
                    226:        }
                    227:     if (islower(c))
                    228:        c = toupper(c);
                    229:     for (ip = mlist; ip; ip = nip)
                    230:     {
                    231:        mp = (struct thing *) ldata(ip);
                    232:        nip = next(ip);
                    233:        if (mp->t_type == c)
                    234:            remove_monster(&mp->t_pos, ip);
                    235:     }
                    236:     for (i = 0; i < 26; i++)
                    237:        if (lvl_mons[i] == c)
                    238:        {
                    239:            lvl_mons[i] = ' ';
                    240:            wand_mons[i] = ' ';
                    241:            break;
                    242:        }
                    243: }

CVSweb