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

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

1.1       rubenllo    1: /*
                      2:  * Functions for dealing with problems brought about by weapons
                      3:  *
                      4:  * Advanced Rogue
                      5:  * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
                      6:  * All rights reserved.
                      7:  *
                      8:  * Based on "Rogue: Exploring the Dungeons of Doom"
                      9:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     10:  * All rights reserved.
                     11:  *
                     12:  * See the file LICENSE.TXT for full copyright and licensing information.
                     13:  */
                     14:
                     15: #include "curses.h"
                     16: #include <ctype.h>
                     17: #include <string.h>
                     18: #include "rogue.h"
                     19:
                     20:
                     21:
                     22: /*
                     23:  * do the actual motion on the screen done by an object traveling
                     24:  * across the room
                     25:  */
                     26: void
                     27: do_motion(struct object *obj, int ydelta, int xdelta, struct thing *tp)
                     28: {
                     29:
                     30:        /*
                     31:        * Come fly with us ...
                     32:        */
                     33:        obj->o_pos = tp->t_pos;
                     34:        for (; ;) {
                     35:                register int ch;
                     36:                /*
                     37:                * Erase the old one
                     38:                */
                     39:                if (!ce(obj->o_pos, tp->t_pos) &&
                     40:                    cansee(unc(obj->o_pos)) &&
                     41:                    mvwinch(cw, obj->o_pos.y, obj->o_pos.x) != ' ') {
                     42:                        mvwaddch(cw, obj->o_pos.y, obj->o_pos.x, show(obj->o_pos.y, obj->o_pos.x));
                     43:                }
                     44:                /*
                     45:                * Get the new position
                     46:                */
                     47:                obj->o_pos.y += ydelta;
                     48:                obj->o_pos.x += xdelta;
                     49:                if (shoot_ok(ch = winat(obj->o_pos.y, obj->o_pos.x)) && ch != DOOR && !ce(obj->o_pos, hero)) {
                     50:                        /*
                     51:                        * It hasn't hit anything yet, so display it
                     52:                        * If it alright.
                     53:                        */
                     54:                        if (cansee(unc(obj->o_pos)) &&
                     55:                            mvwinch(cw, obj->o_pos.y, obj->o_pos.x) != ' ') {
                     56:                                mvwaddch(cw, obj->o_pos.y, obj->o_pos.x, obj->o_type);
                     57:                                draw(cw);
                     58:                        }
                     59:                        continue;
                     60:                }
                     61:                break;
                     62:        }
                     63: }
                     64:
                     65: 
                     66: /*
                     67:  * fall:
                     68:  *     Drop an item someplace around here.
                     69:  */
                     70:
                     71: void
                     72: fall(struct linked_list *item, bool pr)
                     73: {
                     74:        register struct object *obj;
                     75:        register struct room *rp;
                     76:        register int i;
                     77:        coord *fpos = NULL;
                     78:
                     79:        obj = OBJPTR(item);
                     80:        /*
                     81:         * try to drop the item, look up to 3 squares away for now
                     82:         */
                     83:        for (i=1; i<4; i++) {
                     84:            if ((fpos = fallpos(&obj->o_pos, FALSE, i)) != NULL)
                     85:                break;
                     86:        }
                     87:
                     88:        if (fpos != NULL) {
                     89:                mvaddch(fpos->y, fpos->x, obj->o_type);
                     90:                obj->o_pos = *fpos;
                     91:                if ((rp = roomin(&hero)) != NULL &&
                     92:                    lit_room(rp)) {
                     93:                        light(&hero);
                     94:                        mvwaddch(cw, hero.y, hero.x, PLAYER);
                     95:                }
                     96:                attach(lvl_obj, item);
                     97:                return;
                     98:        }
                     99:
                    100:
                    101:        if (pr) {
                    102:             if (obj->o_type == WEAPON) /* BUGFIX: Identification trick */
                    103:                 msg("The %s vanishes as it hits the ground.",
                    104:                     weaps[obj->o_which].w_name);
                    105:             else
                    106:                 msg("%s vanishes as it hits the ground.", inv_name(obj,TRUE));
                    107:        }
                    108:        o_discard(item);
                    109: }
                    110:
                    111: 
                    112: /*
                    113:  * Does the missile hit the monster
                    114:  */
                    115:
                    116: bool
                    117: hit_monster(int y, int x, struct object *obj, struct thing *tp)
                    118: {
                    119:        static coord mp;
                    120:
                    121:        mp.y = y;
                    122:        mp.x = x;
                    123:        if (tp == &player) {
                    124:                /* Make sure there is a monster where it landed */
                    125:                if (!isalpha(mvwinch(mw, y, x))) {
                    126:                        return(FALSE);
                    127:                }
                    128:                return(fight(&mp, obj, TRUE));
                    129:        } else {
                    130:                if (!ce(mp, hero)) {
                    131:                        return(FALSE);
                    132:                }
                    133:                return(attack(tp, obj, TRUE));
                    134:        }
                    135: }
                    136: 
                    137: /*
                    138:  * init_weapon:
                    139:  *     Set up the initial goodies for a weapon
                    140:  */
                    141:
                    142: void
                    143: init_weapon(struct object *weap, char type)
                    144: {
                    145:        register struct init_weps *iwp;
                    146:
                    147:        iwp = &weaps[type];
                    148:        strcpy(weap->o_damage,iwp->w_dam);
                    149:        strcpy(weap->o_hurldmg,iwp->w_hrl);
                    150:        weap->o_launch = iwp->w_launch;
                    151:        weap->o_flags = iwp->w_flags;
                    152:        weap->o_weight = iwp->w_wght;
                    153:        if (weap->o_flags & ISMANY) {
                    154:                weap->o_count = rnd(8) + 8;
                    155:                weap->o_group = newgrp();
                    156:        } else {
                    157:                weap->o_count = 1;
                    158:        }
                    159: }
                    160: 
                    161: /*
                    162:  * missile:
                    163:  *     Fire a missile in a given direction
                    164:  */
                    165:
                    166: void
                    167: missile(int ydelta, int xdelta, struct linked_list *item, struct thing *tp)
                    168: {
                    169:        register struct object *obj;
                    170:        register struct linked_list *nitem;
                    171:        char ch;
                    172:
                    173:        /*
                    174:        * Get which thing we are hurling
                    175:        */
                    176:        if (item == NULL) {
                    177:                return;
                    178:        }
                    179:        obj = OBJPTR(item);
                    180:
                    181: #if 0  /* Do we really want to make this check */
                    182:        if (is_current(obj)) {          /* Are we holding it? */
                    183:            msg(terse ? "Holding it." : "You are already holding it.");
                    184:            return;
                    185:        }
                    186: #endif
                    187:
                    188:        if (!dropcheck(obj)) return;    /* Can we get rid of it? */
                    189:
                    190:        if(!(obj->o_flags & ISMISL)) {
                    191:            for(;;) {
                    192:                msg(terse ? "Really throw? (y or n): "
                    193:                          : "Do you really want to throw %s? (y or n): ",
                    194:                                inv_name(obj, TRUE));
                    195:                mpos = 0;
                    196:                ch = readchar();
                    197:                if (ch == 'n' || ch == ESCAPE) {
                    198:                    after = FALSE;
                    199:                    return;
                    200:                }
                    201:                if (ch == 'y')
                    202:                    break;
                    203:            }
                    204:        }
                    205:        /*
                    206:         * Get rid of the thing. If it is a non-multiple item object, or
                    207:         * if it is the last thing, just drop it. Otherwise, create a new
                    208:         * item with a count of one.
                    209:         */
                    210:        if (obj->o_count < 2) {
                    211:                detach(tp->t_pack, item);
                    212:                if (tp->t_pack == pack) {
                    213:                        inpack--;
                    214:                }
                    215:        }
                    216:        else {
                    217:                obj->o_count--;
                    218:                nitem = (struct linked_list *) new_item(sizeof *obj);
                    219:                obj = OBJPTR(nitem);
                    220:                *obj = *(OBJPTR(item));
                    221:                obj->o_count = 1;
                    222:                item = nitem;
                    223:        }
                    224:        updpack (FALSE);
                    225:        do_motion(obj, ydelta, xdelta, tp);
                    226:        /*
                    227:        * AHA! Here it has hit something. If it is a wall or a door,
                    228:        * or if it misses (combat) the monster, put it on the floor
                    229:        */
                    230:        if (!hit_monster(unc(obj->o_pos), obj, tp)) {
                    231:                fall(item, TRUE);
                    232:        }
                    233:        mvwaddch(cw, hero.y, hero.x, PLAYER);
                    234: }
                    235: 
                    236: /*
                    237:  * num:
                    238:  *     Figure out the plus number for armor/weapons
                    239:  */
                    240:
                    241: char *
                    242: num(int n1, int n2)
                    243: {
                    244:        static char numbuf[LINELEN];
                    245:
                    246:        if (n1 == 0 && n2 == 0) {
                    247:                return "+0";
                    248:        }
                    249:        if (n2 == 0) {
                    250:                sprintf(numbuf, "%s%d", n1 < 0 ? "" : "+", n1);
                    251:        } else {
                    252:                sprintf(numbuf, "%s%d, %s%d", n1 < 0 ? "" : "+", n1, n2 < 0 ? "" : "+", n2);
                    253:        }
                    254:        return(numbuf);
                    255: }
                    256: 
                    257: /*
                    258:  * wield:
                    259:  *     Pull out a certain weapon
                    260:  */
                    261:
                    262: void
                    263: wield(void)
                    264: {
                    265:        register struct linked_list *item;
                    266:        register struct object *obj, *oweapon;
                    267:
                    268:        if ((oweapon = cur_weapon) != NULL) {
                    269:            if (!dropcheck(cur_weapon)) {
                    270:                    cur_weapon = oweapon;
                    271:                    return;
                    272:            }
                    273:            if (terse)
                    274:                addmsg("Was ");
                    275:            else
                    276:                addmsg("You were ");
                    277:            msg("wielding %s", inv_name(oweapon, TRUE));
                    278:        }
                    279:        if ((item = get_item(pack, "wield", WIELDABLE)) == NULL) {
                    280:                after = FALSE;
                    281:                return;
                    282:        }
                    283:        obj = OBJPTR(item);
                    284:        if (is_current(obj)) {
                    285:                msg("Item in use.");
                    286:                after = FALSE;
                    287:                return;
                    288:        }
                    289:        if (player.t_ctype != C_FIGHTER &&
                    290:            obj->o_type == WEAPON       &&
                    291:           (obj->o_which == TWOSWORD || obj->o_which == BASWORD)) {
                    292:                msg("Only fighters can wield a %s", weaps[obj->o_which].w_name);
                    293:                return;
                    294:        }
                    295:        if (terse) {
                    296:                addmsg("W");
                    297:        } else {
                    298:                addmsg("You are now w");
                    299:        }
                    300:        msg("ielding %s", inv_name(obj, TRUE));
                    301:        cur_weapon = obj;
                    302: }
                    303:

CVSweb