Annotation of researchv10no/games/rogue/weapons.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Functions for dealing with problems brought about by weapons
                      3:  *
                      4:  * @(#)weapons.c       3.17 (Berkeley) 6/15/81
                      5:  */
                      6: 
                      7: #include <curses.h>
                      8: #include <ctype.h>
                      9: #include "rogue.h"
                     10: 
                     11: #define NONE 100
                     12: 
                     13: char *w_names[MAXWEAPONS] = {
                     14:     "mace",
                     15:     "long sword",
                     16:     "short bow",
                     17:     "arrow",
                     18:     "dagger",
                     19:     "rock",
                     20:     "two handed sword",
                     21:     "sling",
                     22:     "dart",
                     23:     "crossbow",
                     24:     "crossbow bolt",
                     25:     "spear",
                     26: };
                     27: 
                     28: static struct init_weps {
                     29:     char *iw_dam;
                     30:     char *iw_hrl;
                     31:     char iw_launch;
                     32:     int iw_flags;
                     33: } init_dam[MAXWEAPONS] = {
                     34:     "2d4", "1d3", NONE, 0,             /* Mace */
                     35:     "1d10", "1d2", NONE,0,             /* Long sword */
                     36:     "1d1", "1d1", NONE,        0,              /* Bow */
                     37:     "1d1", "1d6", BOW, ISMANY|ISMISL,  /* Arrow */
                     38:     "1d6", "1d4", NONE,        ISMISL,         /* Dagger */
                     39:     "1d2", "1d4", SLING,ISMANY|ISMISL, /* Rock */
                     40:     "3d6", "1d2", NONE,        0,              /* 2h sword */
                     41:     "0d0", "0d0", NONE, 0,             /* Sling */
                     42:     "1d1", "1d3", NONE,        ISMANY|ISMISL,  /* Dart */
                     43:     "1d1", "1d1", NONE, 0,             /* Crossbow */
                     44:     "1d2", "1d10", CROSSBOW, ISMANY|ISMISL,/* Crossbow bolt */
                     45:     "1d8", "1d6", NONE, ISMISL,                /* Spear */
                     46: };
                     47: 
                     48: /*
                     49:  * missile:
                     50:  *     Fire a missile in a given direction
                     51:  */
                     52: 
                     53: missile(ydelta, xdelta)
                     54: int ydelta, xdelta;
                     55: {
                     56:     register struct object *obj;
                     57:     register struct linked_list *item, *nitem;
                     58: 
                     59:     /*
                     60:      * Get which thing we are hurling
                     61:      */
                     62:     if ((item = get_item("throw", WEAPON)) == NULL)
                     63:        return;
                     64:     obj = (struct object *) ldata(item);
                     65:     if (!dropcheck(obj) || is_current(obj))
                     66:        return;
                     67:     /*
                     68:      * Get rid of the thing.  If it is a non-multiple item object, or
                     69:      * if it is the last thing, just drop it.  Otherwise, create a new
                     70:      * item with a count of one.
                     71:      */
                     72:     if (obj->o_count < 2)
                     73:     {
                     74:        detach(pack, item);
                     75:        inpack--;
                     76:     }
                     77:     else
                     78:     {
                     79:        obj->o_count--;
                     80:        if (obj->o_group == 0)
                     81:            inpack--;
                     82:        nitem = (struct linked_list *) new_item(sizeof *obj);
                     83:        obj = (struct object *) ldata(nitem);
                     84:        *obj = *((struct object *) ldata(item));
                     85:        obj->o_count = 1;
                     86:        item = nitem;
                     87:     }
                     88:     do_motion(obj, ydelta, xdelta);
                     89:     /*
                     90:      * AHA! Here it has hit something.  If it is a wall or a door,
                     91:      * or if it misses (combat) the mosnter, put it on the floor
                     92:      */
                     93:     if (!isupper(mvwinch(mw, obj->o_pos.y, obj->o_pos.x))
                     94:        || !hit_monster(unc(obj->o_pos), obj))
                     95:            fall(item, TRUE);
                     96:     mvwaddch(cw, hero.y, hero.x, PLAYER);
                     97: }
                     98: 
                     99: /*
                    100:  * do the actual motion on the screen done by an object traveling
                    101:  * across the room
                    102:  */
                    103: do_motion(obj, ydelta, xdelta)
                    104: register struct object *obj;
                    105: register int ydelta, xdelta;
                    106: {
                    107:     /*
                    108:      * Come fly with us ...
                    109:      */
                    110:     obj->o_pos = hero;
                    111:     for (;;)
                    112:     {
                    113:        register int ch;
                    114: 
                    115:        /*
                    116:         * Erase the old one
                    117:         */
                    118:        if (!ce(obj->o_pos, hero) && cansee(unc(obj->o_pos)) &&
                    119:            mvwinch(cw, obj->o_pos.y, obj->o_pos.x) != ' ')
                    120:                    mvwaddch(cw, obj->o_pos.y, obj->o_pos.x,
                    121:                            show(obj->o_pos.y, obj->o_pos.x));
                    122:        /*
                    123:         * Get the new position
                    124:         */
                    125:        obj->o_pos.y += ydelta;
                    126:        obj->o_pos.x += xdelta;
                    127:        if (step_ok(ch = winat(obj->o_pos.y, obj->o_pos.x)) && ch != DOOR)
                    128:        {
                    129:            /*
                    130:             * It hasn't hit anything yet, so display it
                    131:             * If it alright.
                    132:             */
                    133:            if (cansee(unc(obj->o_pos)) &&
                    134:                mvwinch(cw, obj->o_pos.y, obj->o_pos.x) != ' ')
                    135:            {
                    136:                mvwaddch(cw, obj->o_pos.y, obj->o_pos.x, obj->o_type);
                    137:                draw(cw);
                    138:            }
                    139:            continue;
                    140:        }
                    141:        break;
                    142:     }
                    143: }
                    144: 
                    145: /*
                    146:  * fall:
                    147:  *     Drop an item someplace around here.
                    148:  */
                    149: 
                    150: fall(item, pr)
                    151: register struct linked_list *item;
                    152: bool pr;
                    153: {
                    154:     register struct object *obj;
                    155:     register struct room *rp;
                    156:     static coord fpos;
                    157: 
                    158:     obj = (struct object *) ldata(item);
                    159:     if (fallpos(&obj->o_pos, &fpos, TRUE))
                    160:     {
                    161:        mvaddch(fpos.y, fpos.x, obj->o_type);
                    162:        obj->o_pos = fpos;
                    163:        if ((rp = roomin(&hero)) != NULL && !(rp->r_flags & ISDARK))
                    164:        {
                    165:            light(&hero);
                    166:            mvwaddch(cw, hero.y, hero.x, PLAYER);
                    167:        }
                    168:        attach(lvl_obj, item);
                    169:        return;
                    170:     }
                    171:     if (pr)
                    172:        msg("Your %s vanishes as it hits the ground.", w_names[obj->o_which]);
                    173:     discard(item);
                    174: }
                    175: 
                    176: /*
                    177:  * init_weapon:
                    178:  *     Set up the initial goodies for a weapon
                    179:  */
                    180: 
                    181: init_weapon(weap, type)
                    182: register struct object *weap;
                    183: char type;
                    184: {
                    185:     register struct init_weps *iwp;
                    186: 
                    187:     iwp = &init_dam[type];
                    188:     weap->o_damage = iwp->iw_dam;
                    189:     weap->o_hurldmg = iwp->iw_hrl;
                    190:     weap->o_launch = iwp->iw_launch;
                    191:     weap->o_flags = iwp->iw_flags;
                    192:     if (weap->o_flags & ISMANY)
                    193:     {
                    194:        weap->o_count = rnd(8) + 8;
                    195:        weap->o_group = newgrp();
                    196:     }
                    197:     else
                    198:        weap->o_count = 1;
                    199: }
                    200: 
                    201: /*
                    202:  * Does the missile hit the monster
                    203:  */
                    204: 
                    205: hit_monster(y, x, obj)
                    206: register int y, x;
                    207: struct object *obj;
                    208: {
                    209:     static coord mp;
                    210: 
                    211:     mp.y = y;
                    212:     mp.x = x;
                    213:     return fight(&mp, winat(y, x), obj, TRUE);
                    214: }
                    215: 
                    216: /*
                    217:  * num:
                    218:  *     Figure out the plus number for armor/weapons
                    219:  */
                    220: 
                    221: char *
                    222: num(n1, n2)
                    223: register int n1, n2;
                    224: {
                    225:     static char numbuf[80];
                    226: 
                    227:     if (n1 == 0 && n2 == 0)
                    228:        return "+0";
                    229:     if (n2 == 0)
                    230:        return sprintf(numbuf, "%s%d", n1 < 0 ? "" : "+", n1);
                    231:     return sprintf(numbuf, "%s%d,%s%d",
                    232:                                n1 < 0 ? "" : "+", n1, n2 < 0 ? "" : "+", n2);
                    233: }
                    234: 
                    235: /*
                    236:  * wield:
                    237:  *     Pull out a certain weapon
                    238:  */
                    239: 
                    240: wield()
                    241: {
                    242:     register struct linked_list *item;
                    243:     register struct object *obj, *oweapon;
                    244: 
                    245:     oweapon = cur_weapon;
                    246:     if (!dropcheck(cur_weapon))
                    247:     {
                    248:        cur_weapon = oweapon;
                    249:        return;
                    250:     }
                    251:     cur_weapon = oweapon;
                    252:     if ((item = get_item("wield", WEAPON)) == NULL)
                    253:     {
                    254: bad:
                    255:        after = FALSE;
                    256:        return;
                    257:     }
                    258: 
                    259:     obj = (struct object *) ldata(item);
                    260:     if (obj->o_type == ARMOR)
                    261:     {
                    262:        msg("You can't wield armor");
                    263:        goto bad;
                    264:     }
                    265:     if (is_current(obj))
                    266:         goto bad;
                    267: 
                    268:     if (terse)
                    269:        addmsg("W");
                    270:     else
                    271:        addmsg("You are now w");
                    272:     msg("ielding %s", inv_name(obj, TRUE));
                    273:     cur_weapon = obj;
                    274: }
                    275: 
                    276: /*
                    277:  * pick a random position around the give (y, x) coordinates
                    278:  */
                    279: fallpos(pos, newpos, passages)
                    280: register coord *pos, *newpos;
                    281: register bool passages;
                    282: {
                    283:     register int y, x, cnt, ch;
                    284: 
                    285:     cnt = 0;
                    286:     for (y = pos->y - 1; y <= pos->y + 1; y++)
                    287:        for (x = pos->x - 1; x <= pos->x + 1; x++)
                    288:        {
                    289:            /*
                    290:             * check to make certain the spot is empty, if it is,
                    291:             * put the object there, set it in the level list
                    292:             * and re-draw the room if he can see it
                    293:             */
                    294:            if (y == hero.y && x == hero.x)
                    295:                continue;
                    296:            if (((ch = winat(y, x)) == FLOOR || (passages && ch == PASSAGE))
                    297:                                        && rnd(++cnt) == 0)
                    298:            {
                    299:                newpos->y = y;
                    300:                newpos->x = x;
                    301:            }
                    302:        }
                    303:     return (cnt != 0);
                    304: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.