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

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

1.1     ! rubenllo    1: /*
        !             2:  * Functions for dealing with weapons
        !             3:  *
        !             4:  * @(#)weapons.c       9.0     (rdk)    7/17/84
        !             5:  *
        !             6:  * Super-Rogue
        !             7:  * Copyright (C) 1984 Robert D. Kindelberger
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * Based on "Rogue: Exploring the Dungeons of Doom"
        !            11:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            12:  * All rights reserved.
        !            13:  *
        !            14:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            15:  */
        !            16:
        !            17: #include <string.h>
        !            18: #include <ctype.h>
        !            19: #include "rogue.h"
        !            20: #include "rogue.ext"
        !            21:
        !            22: /*
        !            23:  * missile:
        !            24:  *     Fire a missile in a given direction
        !            25:  */
        !            26: void
        !            27: missile(int ydelta, int xdelta)
        !            28: {
        !            29:        reg struct object *obj, *nowwield;
        !            30:        reg struct linked_list *item, *nitem;
        !            31:
        !            32:        /*
        !            33:         * Get which thing we are hurling
        !            34:         */
        !            35:        nowwield = cur_weapon;          /* must save current weap */
        !            36:        if ((item = get_item("throw", WEAPON)) == NULL)
        !            37:                return;
        !            38:        obj = OBJPTR(item);
        !            39:        if (!dropcheck(obj) || is_current(obj))
        !            40:                return;
        !            41:        if (obj == nowwield || obj->o_type != WEAPON) {
        !            42:                reg int c;
        !            43:
        !            44:                msg("Do you want to throw that %s? (y or n)",obj->o_typname);
        !            45:                do {
        !            46:                        c = readchar();
        !            47:                        if (isupper(c))
        !            48:                                c = tolower(c);
        !            49:                        if (c == ESCAPE || c == 'n') {
        !            50:                                msg("");
        !            51:                                cur_weapon = nowwield;
        !            52:                                after = FALSE;          /* ooops, a mistake */
        !            53:                                return;
        !            54:                        }
        !            55:                } while (c != 'y');     /* keep looking for good ans */
        !            56:        }
        !            57:        /*
        !            58:         * Get rid of the thing.  If it is a non-multiple item object, or
        !            59:         * if it is the last thing, just drop it.  Otherwise, create a new
        !            60:         * item with a count of one.
        !            61:         */
        !            62:        if (obj->o_count < 2) {
        !            63:                detach(pack, item);
        !            64:        }
        !            65:        else {
        !            66:                obj->o_count--;
        !            67:                obj->o_vol = itemvol(obj);
        !            68:                nitem = new_item(sizeof *obj);
        !            69:                obj = OBJPTR(nitem);
        !            70:                *obj = *(OBJPTR(item));
        !            71:                obj->o_count = 1;
        !            72:                obj->o_vol = itemvol(obj);
        !            73:                item = nitem;
        !            74:        }
        !            75:        updpack();                                              /* new pack weight */
        !            76:        do_motion(obj, ydelta, xdelta);
        !            77:        if (!isalpha(mvwinch(mw, obj->o_pos.y, obj->o_pos.x))
        !            78:          || !hit_monster(&obj->o_pos, obj))
        !            79:                fall(item, TRUE);
        !            80:        mvwaddch(cw, hero.y, hero.x, PLAYER);
        !            81: }
        !            82:
        !            83: /*
        !            84:  * do the actual motion on the screen done by an object traveling
        !            85:  * across the room
        !            86:  */
        !            87: void
        !            88: do_motion(struct object *obj, int ydelta, int xdelta)
        !            89: {
        !            90:        reg int ch, y, x;
        !            91:
        !            92:        obj->o_pos = hero;
        !            93:        while (1) {
        !            94:                y = obj->o_pos.y;
        !            95:                x = obj->o_pos.x;
        !            96:                if (!ce(obj->o_pos, hero) && cansee(unc(obj->o_pos)) &&
        !            97:                  mvwinch(cw, y, x) != ' ')
        !            98:                        mvwaddch(cw, y, x, show(y, x));
        !            99:                /*
        !           100:                 * Get the new position
        !           101:                 */
        !           102:                obj->o_pos.y += ydelta;
        !           103:                obj->o_pos.x += xdelta;
        !           104:                y = obj->o_pos.y;
        !           105:                x = obj->o_pos.x;
        !           106:                ch = winat(y, x);
        !           107:                if (step_ok(ch) && ch != DOOR) {
        !           108:                        if (cansee(unc(obj->o_pos)) && mvwinch(cw, y, x) != ' ') {
        !           109:                                mvwaddch(cw, y, x, obj->o_type);
        !           110:                                draw(cw);
        !           111:                        }
        !           112:                        continue;
        !           113:                }
        !           114:                break;
        !           115:        }
        !           116: }
        !           117:
        !           118: /*
        !           119:  * fall:
        !           120:  *     Drop an item someplace around here.
        !           121:  */
        !           122:
        !           123: void
        !           124: fall(struct linked_list *item, bool pr)
        !           125: {
        !           126:        reg struct object *obj;
        !           127:        reg struct room *rp;
        !           128:        static struct coord fpos;
        !           129:
        !           130:        obj = OBJPTR(item);
        !           131:        if (fallpos(&obj->o_pos, &fpos, TRUE)) {
        !           132:                mvaddch(fpos.y, fpos.x, obj->o_type);
        !           133:                obj->o_pos = fpos;
        !           134:                rp = player.t_room;
        !           135:                if (rp != NULL && !rf_on(rp,ISDARK)) {
        !           136:                        light(&hero);
        !           137:                        mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           138:                }
        !           139:                attach(lvl_obj, item);
        !           140:                return;
        !           141:        }
        !           142:
        !           143:        if (pr)
        !           144:         if (obj->o_type == WEAPON) /* BUGFIX: Identification trick */
        !           145:             msg("Your %s vanishes as it hits the ground.", w_magic[obj->o_which].mi_name);
        !           146:         else
        !           147:             msg("%s vanishes as it hits the ground.", inv_name(obj,TRUE));
        !           148:
        !           149:        discard(item);
        !           150: }
        !           151:
        !           152: /*
        !           153:  * init_weapon:
        !           154:  *     Set up the initial goodies for a weapon
        !           155:  */
        !           156:
        !           157: void
        !           158: init_weapon(struct object *weap, int type)
        !           159: {
        !           160:        reg struct init_weps *iwp;
        !           161:
        !           162:        weap->o_type = WEAPON;
        !           163:        weap->o_which = type;
        !           164:        iwp = &weaps[type];
        !           165:        strcpy(weap->o_damage,iwp->w_dam);
        !           166:        strcpy(weap->o_hurldmg,iwp->w_hrl);
        !           167:        weap->o_launch = iwp->w_launch;
        !           168:        weap->o_flags = iwp->w_flags;
        !           169:        weap->o_weight = iwp->w_wght;
        !           170:        weap->o_typname = things[TYP_WEAPON].mi_name;
        !           171:        if (o_on(weap,ISMANY))
        !           172:                weap->o_count = rnd(8) + 8;
        !           173:        else
        !           174:                weap->o_count = 1;
        !           175:        weap->o_group = newgrp();
        !           176:        weap->o_vol = itemvol(weap);
        !           177: }
        !           178:
        !           179: /*
        !           180:  * hit_monster:
        !           181:  *     Does the missile hit the monster
        !           182:  */
        !           183: bool
        !           184: hit_monster(struct coord *mp, struct object *obj)
        !           185: {
        !           186:        return fight(mp, obj, TRUE);
        !           187: }
        !           188:
        !           189: /*
        !           190:  * num:
        !           191:  *     Figure out the plus number for armor/weapons
        !           192:  */
        !           193: char *
        !           194: num(int n1, int n2)
        !           195: {
        !           196:        static char numbuf[LINLEN];
        !           197:
        !           198:        if (n1 == 0 && n2 == 0)
        !           199:                return "+0";
        !           200:        if (n2 == 0)
        !           201:                sprintf(numbuf, "%s%d", n1 < 0 ? "" : "+", n1);
        !           202:        else
        !           203:                sprintf(numbuf,"%s%d,%s%d",n1<0 ? "":"+",n1,n2<0 ? "":"+",n2);
        !           204:        return numbuf;
        !           205: }
        !           206:
        !           207: /*
        !           208:  * wield:
        !           209:  *     Pull out a certain weapon
        !           210:  */
        !           211: void
        !           212: wield(void)
        !           213: {
        !           214:        reg struct linked_list *item;
        !           215:        reg struct object *obj, *oweapon;
        !           216:
        !           217:        oweapon = cur_weapon;
        !           218:        if (!dropcheck(cur_weapon)) {
        !           219:                cur_weapon = oweapon;
        !           220:                return;
        !           221:        }
        !           222:        cur_weapon = oweapon;
        !           223:        if ((item = get_item("wield", WEAPON)) == NULL)
        !           224:                return;
        !           225:        obj = OBJPTR(item);
        !           226:        if (is_current(obj)) {
        !           227:                after = FALSE;
        !           228:                return;
        !           229:        }
        !           230:        msg("Wielding %s", inv_name(obj, TRUE));
        !           231:        cur_weapon = obj;
        !           232: }
        !           233:
        !           234: /*
        !           235:  * fallpos:
        !           236:  *     Pick a random position around the give (y, x) coordinates
        !           237:  */
        !           238: bool
        !           239: fallpos(struct coord *pos, struct coord *newpos, bool passages)
        !           240: {
        !           241:        reg int y, x, ch;
        !           242:
        !           243:        for (y = pos->y - 1; y <= pos->y + 1; y++) {
        !           244:                for (x = pos->x - 1; x <= pos->x + 1; x++) {
        !           245:                        /*
        !           246:                         * check to make certain the spot is empty, if it is,
        !           247:                         * put the object there, set it in the level list
        !           248:                         * and re-draw the room if he can see it
        !           249:                         */
        !           250:                        if (y == hero.y && x == hero.x)
        !           251:                                continue;
        !           252:                        ch = winat(y, x);
        !           253:                        if (ch == FLOOR || (passages && ch == PASSAGE)) {
        !           254:                                newpos->y = y;
        !           255:                                newpos->x = x;
        !           256:                                return TRUE;
        !           257:                        }
        !           258:                }
        !           259:        }
        !           260:        return FALSE;
        !           261: }

CVSweb