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

Annotation of early-roguelike/rogue3/weapons.c, Revision 1.1

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

CVSweb