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

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

1.1     ! rubenllo    1: /*
        !             2:  * Contains functions for dealing with things like
        !             3:  * potions and scrolls
        !             4:  *
        !             5:  * @(#)things.c        3.37 (Berkeley) 6/15/81
        !             6:  *
        !             7:  * Rogue: Exploring the Dungeons of Doom
        !             8:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !             9:  * All rights reserved.
        !            10:  *
        !            11:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            12:  */
        !            13:
        !            14: #include "curses.h"
        !            15: #include <ctype.h>
        !            16: #include <string.h>
        !            17: #include "rogue.h"
        !            18:
        !            19: /*
        !            20:  * inv_name:
        !            21:  *     return the name of something as it would appear in an
        !            22:  *     inventory.
        !            23:  */
        !            24: char *
        !            25: inv_name(struct object *obj, int drop)
        !            26: {
        !            27:     char *pb;
        !            28:
        !            29:     switch(obj->o_type)
        !            30:     {
        !            31:        case SCROLL:
        !            32:            if (obj->o_count == 1)
        !            33:                strcpy(prbuf, "A scroll ");
        !            34:            else
        !            35:                sprintf(prbuf, "%d scrolls ", obj->o_count);
        !            36:            pb = &prbuf[strlen(prbuf)];
        !            37:            if (s_know[obj->o_which])
        !            38:                sprintf(pb, "of %s", s_magic[obj->o_which].mi_name);
        !            39:            else if (s_guess[obj->o_which])
        !            40:                sprintf(pb, "called %s", s_guess[obj->o_which]);
        !            41:            else
        !            42:                sprintf(pb, "titled '%s'", s_names[obj->o_which]);
        !            43:         when POTION:
        !            44:            if (obj->o_count == 1)
        !            45:                strcpy(prbuf, "A potion ");
        !            46:            else
        !            47:                sprintf(prbuf, "%d potions ", obj->o_count);
        !            48:            pb = &prbuf[strlen(prbuf)];
        !            49:            if (p_know[obj->o_which])
        !            50:                sprintf(pb, "of %s(%s)", p_magic[obj->o_which].mi_name,
        !            51:                    p_colors[obj->o_which]);
        !            52:            else if (p_guess[obj->o_which])
        !            53:                sprintf(pb, "called %s(%s)", p_guess[obj->o_which],
        !            54:                    p_colors[obj->o_which]);
        !            55:            else if (obj->o_count == 1)
        !            56:                sprintf(prbuf, "A%s %s potion",
        !            57:                    vowelstr(p_colors[obj->o_which]),
        !            58:                    p_colors[obj->o_which]);
        !            59:            else
        !            60:                sprintf(prbuf, "%d %s potions", obj->o_count,
        !            61:                    p_colors[obj->o_which]);
        !            62:        when FOOD:
        !            63:            if (obj->o_which == 1)
        !            64:                if (obj->o_count == 1)
        !            65:                    sprintf(prbuf, "A%s %.76s", vowelstr(fruit), fruit);
        !            66:                else
        !            67:                    sprintf(prbuf, "%d %.66ss", obj->o_count, fruit);
        !            68:            else
        !            69:                if (obj->o_count == 1)
        !            70:                    strcpy(prbuf, "Some food");
        !            71:                else
        !            72:                    sprintf(prbuf, "%d rations of food", obj->o_count);
        !            73:        when WEAPON:
        !            74:            if (obj->o_count > 1)
        !            75:                sprintf(prbuf, "%d ", obj->o_count);
        !            76:            else
        !            77:                strcpy(prbuf, "A ");
        !            78:            pb = &prbuf[strlen(prbuf)];
        !            79:            if (obj->o_flags & ISKNOW)
        !            80:                sprintf(pb, "%s %s", num(obj->o_hplus, obj->o_dplus),
        !            81:                    w_names[obj->o_which]);
        !            82:            else
        !            83:                sprintf(pb, "%s", w_names[obj->o_which]);
        !            84:            if (obj->o_count > 1)
        !            85:                strcat(prbuf, "s");
        !            86:        when ARMOR:
        !            87:            if (obj->o_flags & ISKNOW)
        !            88:                sprintf(prbuf, "%s %s",
        !            89:                    num(a_class[obj->o_which] - obj->o_ac, 0),
        !            90:                    a_names[obj->o_which]);
        !            91:            else
        !            92:                sprintf(prbuf, "%s", a_names[obj->o_which]);
        !            93:        when AMULET:
        !            94:            strcpy(prbuf, "The Amulet of Yendor");
        !            95:        when STICK:
        !            96:            sprintf(prbuf, "A %s ", ws_type[obj->o_which]);
        !            97:            pb = &prbuf[strlen(prbuf)];
        !            98:            if (ws_know[obj->o_which])
        !            99:                sprintf(pb, "of %s%s(%s)", ws_magic[obj->o_which].mi_name,
        !           100:                    charge_str(obj), ws_made[obj->o_which]);
        !           101:            else if (ws_guess[obj->o_which])
        !           102:                sprintf(pb, "called %s(%s)", ws_guess[obj->o_which],
        !           103:                    ws_made[obj->o_which]);
        !           104:            else
        !           105:                sprintf(&prbuf[2], "%s %s", ws_made[obj->o_which],
        !           106:                    ws_type[obj->o_which]);
        !           107:         when RING:
        !           108:            if (r_know[obj->o_which])
        !           109:                sprintf(prbuf, "A%s ring of %s(%s)", ring_num(obj),
        !           110:                    r_magic[obj->o_which].mi_name, r_stones[obj->o_which]);
        !           111:            else if (r_guess[obj->o_which])
        !           112:                sprintf(prbuf, "A ring called %s(%s)",
        !           113:                    r_guess[obj->o_which], r_stones[obj->o_which]);
        !           114:            else
        !           115:                sprintf(prbuf, "A%s %s ring", vowelstr(r_stones[obj->o_which]),
        !           116:                    r_stones[obj->o_which]);
        !           117:        otherwise:
        !           118:            debug("Picked up something funny");
        !           119:            sprintf(prbuf, "Something bizarre %s", unctrl(obj->o_type));
        !           120:     }
        !           121:     if (obj == cur_armor)
        !           122:        strcat(prbuf, " (being worn)");
        !           123:     if (obj == cur_weapon)
        !           124:        strcat(prbuf, " (weapon in hand)");
        !           125:     if (obj == cur_ring[LEFT])
        !           126:        strcat(prbuf, " (on left hand)");
        !           127:     else if (obj == cur_ring[RIGHT])
        !           128:        strcat(prbuf, " (on right hand)");
        !           129:     if (drop && isupper(prbuf[0]))
        !           130:        prbuf[0] = tolower(prbuf[0]);
        !           131:     else if (!drop && islower(*prbuf))
        !           132:        *prbuf = toupper(*prbuf);
        !           133:     if (!drop)
        !           134:        strcat(prbuf, ".");
        !           135:     return prbuf;
        !           136: }
        !           137:
        !           138: /*
        !           139:  * money:
        !           140:  *     Add to characters purse
        !           141:  */
        !           142: void
        !           143: money()
        !           144: {
        !           145:     struct room *rp;
        !           146:
        !           147:     for (rp = rooms; rp <= &rooms[MAXROOMS-1]; rp++)
        !           148:        if (ce(hero, rp->r_gold))
        !           149:        {
        !           150:            if (notify)
        !           151:            {
        !           152:                if (!terse)
        !           153:                    addmsg("You found ");
        !           154:                msg("%d gold pieces.", rp->r_goldval);
        !           155:            }
        !           156:            purse += rp->r_goldval;
        !           157:            rp->r_goldval = 0;
        !           158:            cmov(rp->r_gold);
        !           159:            addch(FLOOR);
        !           160:            return;
        !           161:        }
        !           162:     msg("That gold must have been counterfeit");
        !           163: }
        !           164:
        !           165: /*
        !           166:  * drop:
        !           167:  *     put something down
        !           168:  */
        !           169: void
        !           170: drop()
        !           171: {
        !           172:     int ch;
        !           173:     struct linked_list *obj, *nobj;
        !           174:     struct object *op;
        !           175:
        !           176:     ch = mvwinch(stdscr, hero.y, hero.x);
        !           177:     if (ch != FLOOR && ch != PASSAGE)
        !           178:     {
        !           179:        msg("There is something there already");
        !           180:        return;
        !           181:     }
        !           182:     if ((obj = get_item("drop", 0)) == NULL)
        !           183:        return;
        !           184:     op = (struct object *) ldata(obj);
        !           185:     if (!dropcheck(op))
        !           186:        return;
        !           187:     /*
        !           188:      * Take it out of the pack
        !           189:      */
        !           190:     if (op->o_count >= 2 && op->o_type != WEAPON)
        !           191:     {
        !           192:        nobj = new_item(sizeof *op);
        !           193:        op->o_count--;
        !           194:        op = (struct object *) ldata(nobj);
        !           195:        *op = *((struct object *) ldata(obj));
        !           196:        op->o_count = 1;
        !           197:        obj = nobj;
        !           198:        if (op->o_group != 0)
        !           199:                inpack++;
        !           200:     }
        !           201:     else
        !           202:        detach(pack, obj);
        !           203:     inpack--;
        !           204:     /*
        !           205:      * Link it into the level object list
        !           206:      */
        !           207:     attach(lvl_obj, obj);
        !           208:     mvaddch(hero.y, hero.x, op->o_type);
        !           209:     op->o_pos = hero;
        !           210:     msg("Dropped %s", inv_name(op, TRUE));
        !           211: }
        !           212:
        !           213: /*
        !           214:  * do special checks for dropping or unweilding|unwearing|unringing
        !           215:  */
        !           216: int
        !           217: dropcheck(struct object *op)
        !           218: {
        !           219:     str_t save_max;
        !           220:
        !           221:     if (op == NULL)
        !           222:        return TRUE;
        !           223:     if (op != cur_armor && op != cur_weapon
        !           224:        && op != cur_ring[LEFT] && op != cur_ring[RIGHT])
        !           225:            return TRUE;
        !           226:     if (op->o_flags & ISCURSED)
        !           227:     {
        !           228:        msg("You can't.  It appears to be cursed.");
        !           229:        return FALSE;
        !           230:     }
        !           231:     if (op == cur_weapon)
        !           232:        cur_weapon = NULL;
        !           233:     else if (op == cur_armor)
        !           234:     {
        !           235:        waste_time();
        !           236:        cur_armor = NULL;
        !           237:     }
        !           238:     else if (op == cur_ring[LEFT] || op == cur_ring[RIGHT])
        !           239:     {
        !           240:        switch (op->o_which)
        !           241:        {
        !           242:            case R_ADDSTR:
        !           243:                save_max = max_stats.s_str;
        !           244:                chg_str(-op->o_ac);
        !           245:                max_stats.s_str = save_max;
        !           246:                break;
        !           247:            case R_SEEINVIS:
        !           248:                player.t_flags &= ~CANSEE;
        !           249:                extinguish(unsee);
        !           250:                light(&hero);
        !           251:                mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           252:                break;
        !           253:        }
        !           254:        cur_ring[op == cur_ring[LEFT] ? LEFT : RIGHT] = NULL;
        !           255:     }
        !           256:     return TRUE;
        !           257: }
        !           258:
        !           259: /*
        !           260:  * return a new thing
        !           261:  */
        !           262: struct linked_list *
        !           263: new_thing()
        !           264: {
        !           265:     struct linked_list *item;
        !           266:     struct object *cur;
        !           267:     int j, k;
        !           268:
        !           269:     item = new_item(sizeof *cur);
        !           270:     cur = (struct object *) ldata(item);
        !           271:     cur->o_hplus = cur->o_dplus = 0;
        !           272:     strcpy(cur->o_damage,"0d0");
        !           273:     strcpy(cur->o_hurldmg,"0d0");
        !           274:     cur->o_ac = 11;
        !           275:     cur->o_count = 1;
        !           276:     cur->o_group = 0;
        !           277:     cur->o_flags = 0;
        !           278:     /*
        !           279:      * Decide what kind of object it will be
        !           280:      * If we haven't had food for a while, let it be food.
        !           281:      */
        !           282:     switch (no_food > 3 ? 2 : pick_one(things, NUMTHINGS))
        !           283:     {
        !           284:        case 0:
        !           285:            cur->o_type = POTION;
        !           286:            cur->o_which = pick_one(p_magic, MAXPOTIONS);
        !           287:        when 1:
        !           288:            cur->o_type = SCROLL;
        !           289:            cur->o_which = pick_one(s_magic, MAXSCROLLS);
        !           290:        when 2:
        !           291:            no_food = 0;
        !           292:            cur->o_type = FOOD;
        !           293:            if (rnd(100) > 10)
        !           294:                cur->o_which = 0;
        !           295:            else
        !           296:                cur->o_which = 1;
        !           297:        when 3:
        !           298:            cur->o_type = WEAPON;
        !           299:            cur->o_which = rnd(MAXWEAPONS);
        !           300:            init_weapon(cur, cur->o_which);
        !           301:            if ((k = rnd(100)) < 10)
        !           302:            {
        !           303:                cur->o_flags |= ISCURSED;
        !           304:                cur->o_hplus -= rnd(3)+1;
        !           305:            }
        !           306:            else if (k < 15)
        !           307:                cur->o_hplus += rnd(3)+1;
        !           308:        when 4:
        !           309:            cur->o_type = ARMOR;
        !           310:            for (j = 0, k = rnd(100); j < MAXARMORS; j++)
        !           311:                if (k < a_chances[j])
        !           312:                    break;
        !           313:            if (j == MAXARMORS)
        !           314:            {
        !           315:                debug("Picked a bad armor %d", k);
        !           316:                j = 0;
        !           317:            }
        !           318:            cur->o_which = j;
        !           319:            cur->o_ac = a_class[j];
        !           320:            if ((k = rnd(100)) < 20)
        !           321:            {
        !           322:                cur->o_flags |= ISCURSED;
        !           323:                cur->o_ac += rnd(3)+1;
        !           324:            }
        !           325:            else if (k < 28)
        !           326:                cur->o_ac -= rnd(3)+1;
        !           327:        when 5:
        !           328:            cur->o_type = RING;
        !           329:            cur->o_which = pick_one(r_magic, MAXRINGS);
        !           330:            switch (cur->o_which)
        !           331:            {
        !           332:                case R_ADDSTR:
        !           333:                case R_PROTECT:
        !           334:                case R_ADDHIT:
        !           335:                case R_ADDDAM:
        !           336:                    if ((cur->o_ac = rnd(3)) == 0)
        !           337:                    {
        !           338:                        cur->o_ac = -1;
        !           339:                        cur->o_flags |= ISCURSED;
        !           340:                    }
        !           341:                when R_AGGR:
        !           342:                case R_TELEPORT:
        !           343:                    cur->o_flags |= ISCURSED;
        !           344:            }
        !           345:        when 6:
        !           346:            cur->o_type = STICK;
        !           347:            cur->o_which = pick_one(ws_magic, MAXSTICKS);
        !           348:            fix_stick(cur);
        !           349:        otherwise:
        !           350:            debug("Picked a bad kind of object");
        !           351:            wait_for(stdscr, ' ');
        !           352:     }
        !           353:     return item;
        !           354: }
        !           355:
        !           356: /*
        !           357:  * pick an item out of a list of nitems possible magic items
        !           358:  */
        !           359: int
        !           360: pick_one(struct magic_item *magic, int nitems)
        !           361: {
        !           362:     struct magic_item *end;
        !           363:     int i;
        !           364:     struct magic_item *start;
        !           365:
        !           366:     start = magic;
        !           367:     for (end = &magic[nitems], i = rnd(100); magic < end; magic++)
        !           368:        if (i < magic->mi_prob)
        !           369:            break;
        !           370:     if (magic == end)
        !           371:     {
        !           372:        if (wizard)
        !           373:        {
        !           374:            msg("bad pick_one: %d from %d items", i, nitems);
        !           375:            for (magic = start; magic < end; magic++)
        !           376:                msg("%s: %d%%", magic->mi_name, magic->mi_prob);
        !           377:        }
        !           378:        magic = start;
        !           379:     }
        !           380:     return (int) (magic - start);
        !           381: }

CVSweb