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

Annotation of early-roguelike/rogue5/weapons.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * Functions for dealing with problems brought about by weapons
                      3:  *
                      4:  * @(#)weapons.c       4.34 (Berkeley) 02/05/99
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980-1983, 1985, 1999 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 <string.h>
                     15: #include <ctype.h>
                     16: #include "rogue.h"
                     17:
                     18: #define NO_WEAPON -1
                     19:
                     20: static const struct init_weaps {
                     21:     char *iw_dam;      /* Damage when wielded */
                     22:     char *iw_hrl;      /* Damage when thrown */
                     23:     int iw_launch;     /* Launching weapon */
                     24:     int iw_flags;      /* Miscellaneous flags */
                     25: } init_dam[MAXWEAPONS] = {
                     26:     { "2x4",   "1x3",  NO_WEAPON,      0,              },      /* Mace */
                     27:     { "3x4",   "1x2",  NO_WEAPON,      0,              },      /* Long sword */
                     28:     { "1x1",   "1x1",  NO_WEAPON,      0,              },      /* Bow */
                     29:     { "1x1",   "2x3",  BOW,            ISMANY|ISMISL,  },      /* Arrow */
                     30:     { "1x6",   "1x4",  NO_WEAPON,      ISMISL|ISMISL,  },      /* Dagger */
                     31:     { "4x4",   "1x2",  NO_WEAPON,      0,              },      /* 2h sword */
                     32:     { "1x1",   "1x3",  NO_WEAPON,      ISMANY|ISMISL,  },      /* Dart */
                     33:     { "1x2",   "2x4",  NO_WEAPON,      ISMANY|ISMISL,  },      /* Shuriken */
                     34:     { "2x3",   "1x6",  NO_WEAPON,      ISMISL,         },      /* Spear */
                     35: };
                     36:
                     37: /*
                     38:  * missile:
                     39:  *     Fire a missile in a given direction
                     40:  */
                     41:
                     42: void
                     43: missile(int ydelta, int xdelta)
                     44: {
                     45:     THING *obj;
                     46:
                     47:     /*
                     48:      * Get which thing we are hurling
                     49:      */
                     50:     if ((obj = get_item("throw", WEAPON)) == NULL)
                     51:        return;
                     52:     if (!dropcheck(obj) || is_current(obj))
                     53:        return;
                     54:     obj = leave_pack(obj, TRUE, FALSE);
                     55:     do_motion(obj, ydelta, xdelta);
                     56:     /*
                     57:      * AHA! Here it has hit something.  If it is a wall or a door,
                     58:      * or if it misses (combat) the monster, put it on the floor
                     59:      */
                     60:     if (moat(obj->o_pos.y, obj->o_pos.x) == NULL ||
                     61:        !hit_monster(unc(obj->o_pos), obj))
                     62:            fall(obj, TRUE);
                     63: }
                     64:
                     65: /*
                     66:  * do_motion:
                     67:  *     Do the actual motion on the screen done by an object traveling
                     68:  *     across the room
                     69:  */
                     70:
                     71: void
                     72: do_motion(THING *obj, int ydelta, int xdelta)
                     73: {
                     74:     int ch;
                     75:
                     76:     /*
                     77:      * Come fly with us ...
                     78:      */
                     79:     obj->o_pos = hero;
                     80:     for (;;)
                     81:     {
                     82:        /*
                     83:         * Erase the old one
                     84:         */
                     85:        if (!ce(obj->o_pos, hero) && cansee(unc(obj->o_pos)) && !terse)
                     86:        {
                     87:            ch = chat(obj->o_pos.y, obj->o_pos.x);
                     88:            if (ch == FLOOR && !show_floor())
                     89:                ch = ' ';
                     90:            mvaddch(obj->o_pos.y, obj->o_pos.x, ch);
                     91:        }
                     92:        /*
                     93:         * Get the new position
                     94:         */
                     95:        obj->o_pos.y += ydelta;
                     96:        obj->o_pos.x += xdelta;
                     97:        if (step_ok(ch = winat(obj->o_pos.y, obj->o_pos.x)) && ch != DOOR)
                     98:        {
                     99:            /*
                    100:             * It hasn't hit anything yet, so display it
                    101:             * If it alright.
                    102:             */
                    103:            if (cansee(unc(obj->o_pos)) && !terse)
                    104:            {
                    105:                mvaddch(obj->o_pos.y, obj->o_pos.x, obj->o_type);
                    106:                refresh();
                    107:            }
                    108:            continue;
                    109:        }
                    110:        break;
                    111:     }
                    112: }
                    113:
                    114: /*
                    115:  * fall:
                    116:  *     Drop an item someplace around here.
                    117:  */
                    118:
                    119: void
                    120: fall(THING *obj, int pr)
                    121: {
                    122:     PLACE *pp;
                    123:     coord fpos;
                    124:
                    125:     if (fallpos(&obj->o_pos, &fpos))
                    126:     {
                    127:        pp = INDEX(fpos.y, fpos.x);
                    128:        pp->p_ch = obj->o_type;
                    129:        obj->o_pos = fpos;
                    130:        if (cansee(fpos.y, fpos.x))
                    131:        {
                    132:            if (pp->p_monst != NULL)
                    133:                pp->p_monst->t_oldch = obj->o_type;
                    134:            else
                    135:                mvaddch(fpos.y, fpos.x, obj->o_type);
                    136:        }
                    137:        attach(lvl_obj, obj);
                    138:        return;
                    139:     }
                    140:     if (pr)
                    141:     {
                    142:        if (has_hit)
                    143:        {
                    144:            endmsg();
                    145:            has_hit = FALSE;
                    146:        }
                    147:        msg("the %s vanishes as it hits the ground",
                    148:            weap_info[obj->o_which].oi_name);
                    149:     }
                    150:     discard(obj);
                    151: }
                    152:
                    153: /*
                    154:  * init_weapon:
                    155:  *     Set up the initial goodies for a weapon
                    156:  */
                    157:
                    158: void
                    159: init_weapon(THING *weap, int which)
                    160: {
                    161:     const struct init_weaps *iwp;
                    162:
                    163:     weap->o_type = WEAPON;
                    164:     weap->o_which = which;
                    165:     iwp = &init_dam[which];
                    166:     strncpy(weap->o_damage, iwp->iw_dam, sizeof(weap->o_damage));
                    167:     strncpy(weap->o_hurldmg,iwp->iw_hrl, sizeof(weap->o_hurldmg));
                    168:     weap->o_launch = iwp->iw_launch;
                    169:     weap->o_flags = iwp->iw_flags;
                    170:     weap->o_hplus = 0;
                    171:     weap->o_dplus = 0;
                    172:     if (which == DAGGER)
                    173:     {
                    174:        weap->o_count = rnd(4) + 2;
                    175:        weap->o_group = group++;
                    176:     }
                    177:     else if (weap->o_flags & ISMANY)
                    178:     {
                    179:        weap->o_count = rnd(8) + 8;
                    180:        weap->o_group = group++;
                    181:     }
                    182:     else
                    183:     {
                    184:        weap->o_count = 1;
                    185:        weap->o_group = 0;
                    186:     }
                    187: }
                    188:
                    189: /*
                    190:  * hit_monster:
                    191:  *     Does the missile hit the monster?
                    192:  */
                    193: int
                    194: hit_monster(int y, int x, const THING *obj)
                    195: {
                    196:     coord mp;
                    197:
                    198:     mp.y = y;
                    199:     mp.x = x;
                    200:     return fight(&mp, obj, TRUE);
                    201: }
                    202:
                    203: /*
                    204:  * num:
                    205:  *     Figure out the plus number for armor/weapons
                    206:  */
                    207: const char *
                    208: num(int n1, int n2, int type)
                    209: {
                    210:     static char numbuf[10];
                    211:
                    212:     sprintf(numbuf, n1 < 0 ? "%d" : "+%d", n1);
                    213:     if (type == WEAPON)
                    214:        sprintf(&numbuf[strlen(numbuf)], n2 < 0 ? ",%d" : ",+%d", n2);
                    215:     return numbuf;
                    216: }
                    217:
                    218: /*
                    219:  * wield:
                    220:  *     Pull out a certain weapon
                    221:  */
                    222:
                    223: void
                    224: wield(void)
                    225: {
                    226:     THING *obj, *oweapon;
                    227:     char *sp;
                    228:
                    229:     oweapon = cur_weapon;
                    230:     if (!dropcheck(cur_weapon))
                    231:     {
                    232:        cur_weapon = oweapon;
                    233:        return;
                    234:     }
                    235:     cur_weapon = oweapon;
                    236:     if ((obj = get_item("wield", WEAPON)) == NULL)
                    237:     {
                    238: bad:
                    239:        after = FALSE;
                    240:        return;
                    241:     }
                    242:
                    243:     if (obj->o_type == ARMOR)
                    244:     {
                    245:        msg("you can't wield armor");
                    246:        goto bad;
                    247:     }
                    248:     if (is_current(obj))
                    249:         goto bad;
                    250:
                    251:     sp = inv_name(obj, TRUE);
                    252:     cur_weapon = obj;
                    253:     if (!terse)
                    254:        addmsg("you are now ");
                    255:     msg("wielding %s (%c)", sp, obj->o_packch);
                    256: }
                    257:
                    258: /*
                    259:  * fallpos:
                    260:  *     Pick a random position around the give (y, x) coordinates
                    261:  */
                    262: int
                    263: fallpos(const coord *pos, coord *newpos)
                    264: {
                    265:     int y, x, cnt, ch;
                    266:
                    267:     cnt = 0;
                    268:     for (y = pos->y - 1; y <= pos->y + 1; y++)
                    269:        for (x = pos->x - 1; x <= pos->x + 1; x++)
                    270:        {
                    271:            /*
                    272:             * check to make certain the spot is empty, if it is,
                    273:             * put the object there, set it in the level list
                    274:             * and re-draw the room if he can see it
                    275:             */
                    276:            if (y == hero.y && x == hero.x)
                    277:                continue;
                    278:            if (((ch = chat(y, x)) == FLOOR || ch == PASSAGE)
                    279:                                        && rnd(++cnt) == 0)
                    280:            {
                    281:                newpos->y = y;
                    282:                newpos->x = x;
                    283:            }
                    284:        }
                    285:     return (cnt != 0);
                    286: }

CVSweb