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

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

1.1     ! rubenllo    1: /*
        !             2:     things.c - functions for dealing with things like potions and scrolls
        !             3:
        !             4:     XRogue: Expeditions into the Dungeons of Doom
        !             5:     Copyright (C) 1991 Robert Pietkivitch
        !             6:     All rights reserved.
        !             7:
        !             8:     Based on "Advanced Rogue"
        !             9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
        !            10:     All rights reserved.
        !            11:
        !            12:     Based on "Rogue: Exploring the Dungeons of Doom"
        !            13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            14:     All rights reserved.
        !            15:
        !            16:     See the file LICENSE.TXT for full copyright and licensing information.
        !            17: */
        !            18:
        !            19: #include <curses.h>
        !            20: #include <ctype.h>
        !            21: #include <string.h>
        !            22: #include "rogue.h"
        !            23:
        !            24: int pick_one(struct magic_item *magic, int nitems);
        !            25: char *blesscurse(int flags);
        !            26: char *p_kind(struct object *obj);
        !            27: int extras(void);
        !            28:
        !            29: /*
        !            30:  * print out the number of charges on a stick
        !            31:  */
        !            32:
        !            33: char *
        !            34: charge_str(struct object *obj)
        !            35: {
        !            36:     static char buf[20];
        !            37:
        !            38:     if (!(obj->o_flags & ISKNOW))
        !            39:         buf[0] = '\0';
        !            40:     else if (terse)
        !            41:         sprintf(buf, " [%d]", obj->o_charges);
        !            42:     else
        !            43:         sprintf(buf, " [%d charges]", obj->o_charges);
        !            44:     return buf;
        !            45: }
        !            46:
        !            47: /*
        !            48:  * inv_name:
        !            49:  *      return the name of something as it would appear in an
        !            50:  *      inventory.
        !            51:  */
        !            52:
        !            53: char *
        !            54: inv_name(struct object *obj, bool drop)
        !            55: {
        !            56:     register char *pb;
        !            57:
        !            58:     pb = prbuf;
        !            59:     pb[0] = '\0';
        !            60:     switch(obj->o_type) {
        !            61:         case SCROLL:
        !            62:             if (obj->o_count == 1)
        !            63:                  sprintf(pb, "A %sscroll ", blesscurse(obj->o_flags));
        !            64:             else
        !            65:                  sprintf(pb, "%d %sscrolls ",
        !            66:                         obj->o_count, blesscurse(obj->o_flags));
        !            67:             pb = &pb[strlen(pb)];
        !            68:             if (s_know[obj->o_which] || (obj->o_flags & ISPOST))
        !            69:                 sprintf(pb, "of %s", s_magic[obj->o_which].mi_name);
        !            70:             else if (s_guess[obj->o_which])
        !            71:                 sprintf(pb, "named %s", s_guess[obj->o_which]);
        !            72:             else
        !            73:                 sprintf(pb, "titled '%s'", s_names[obj->o_which]);
        !            74:         when POTION:
        !            75:             if (obj->o_count == 1)
        !            76:                  sprintf(pb, "A %spotion ", blesscurse(obj->o_flags));
        !            77:             else
        !            78:                  sprintf(pb, "%d %spotions ",
        !            79:                         obj->o_count, blesscurse(obj->o_flags));
        !            80:             pb = &pb[strlen(pb)];
        !            81:             if (p_know[obj->o_which])
        !            82:                 sprintf(pb, "of %s (%s)", p_magic[obj->o_which].mi_name,
        !            83:                     p_kind(obj));
        !            84:             else if (obj->o_flags & ISPOST)
        !            85:                 sprintf(pb, "of %s", p_magic[obj->o_which].mi_name);
        !            86:             else if (p_guess[obj->o_which])
        !            87:                 sprintf(pb, "named %s (%s)", p_guess[obj->o_which],
        !            88:                     p_colors[obj->o_which]);
        !            89:             else {
        !            90:                 pb = prbuf;
        !            91:                 if (obj->o_count == 1)
        !            92:                     sprintf(pb, "A%s %s potion",
        !            93:                             vowelstr(p_colors[obj->o_which]),
        !            94:                             p_colors[obj->o_which]);
        !            95:                 else
        !            96:                     sprintf(pb, "%d %s potions",
        !            97:                             obj->o_count, p_colors[obj->o_which]);
        !            98:             }
        !            99:         when FOOD:
        !           100:             if (obj->o_count == 1)
        !           101:                 sprintf(pb, "A%s %s", vowelstr(foods[obj->o_which].mi_name),
        !           102:                         foods[obj->o_which].mi_name);
        !           103:             else
        !           104:                 sprintf(pb, "%d %ss", obj->o_count,foods[obj->o_which].mi_name);
        !           105:         when WEAPON:
        !           106:             if (obj->o_count > 1)
        !           107:                 sprintf(pb, "%d ", obj->o_count);
        !           108:             else
        !           109:                 strcpy(pb, "A ");
        !           110:             pb = &pb[strlen(pb)];
        !           111:             if (obj->o_flags & ISKNOW) {
        !           112:                 strcat(pb, num(obj->o_hplus, obj->o_dplus));
        !           113:                 strcat (pb, " ");
        !           114:             }
        !           115:             strcat(pb, weaps[obj->o_which].w_name);
        !           116:             if (obj->o_count > 1)
        !           117:                 strcat(pb, "s");
        !           118:             if (obj == cur_weapon)
        !           119:                 strcat(pb, " (weapon in hand)");
        !           120:             if (obj->o_flags & ISPOISON)
        !           121:                 strcat(pb, " {Poisoned}");
        !           122:         when ARMOR:
        !           123:             if (obj->o_flags & ISKNOW) {
        !           124:                 strcat(pb, num(armors[obj->o_which].a_class - obj->o_ac, 0));
        !           125:                 strcat(pb, " ");
        !           126:             }
        !           127:             strcat(pb, armors[obj->o_which].a_name);
        !           128:             if (obj == cur_armor)
        !           129:                 strcat(pb, " (being worn)");
        !           130:         when STICK:
        !           131:             sprintf(pb, "A %s%s ",
        !           132:                 blesscurse(obj->o_flags), ws_type[obj->o_which]);
        !           133:             pb = &pb[strlen(pb)];
        !           134:             if (ws_know[obj->o_which] || obj->o_flags & ISKNOW)
        !           135:                 sprintf(pb, "of %s%s (%s)", ws_magic[obj->o_which].mi_name,
        !           136:                     charge_str(obj), ws_made[obj->o_which]);
        !           137:             else if (obj->o_flags & ISPOST)
        !           138:                 sprintf(pb, "of %s", ws_magic[obj->o_which].mi_name);
        !           139:             else if (ws_guess[obj->o_which])
        !           140:                 sprintf(pb, "named %s (%s)", ws_guess[obj->o_which],
        !           141:                     ws_made[obj->o_which]);
        !           142:             else {
        !           143:                 pb = prbuf;
        !           144:                 sprintf(pb, "A %s %s", ws_made[obj->o_which],
        !           145:                     ws_type[obj->o_which]);
        !           146:             }
        !           147:             if (obj == cur_weapon)
        !           148:                 strcat(prbuf, " (weapon in hand)");
        !           149:         when RING:
        !           150:             if (r_know[obj->o_which] || obj->o_flags & ISKNOW)
        !           151:                 sprintf(pb, "A%s ring of %s (%s)", ring_num(obj),
        !           152:                     r_magic[obj->o_which].mi_name, r_stones[obj->o_which]);
        !           153:             else if (obj->o_flags & ISPOST)
        !           154:                 sprintf(pb, "A ring of %s", r_magic[obj->o_which].mi_name);
        !           155:             else if (r_guess[obj->o_which])
        !           156:                 sprintf(pb, "A ring named %s (%s)",
        !           157:                     r_guess[obj->o_which], r_stones[obj->o_which]);
        !           158:             else
        !           159:                 sprintf(pb, "A%s %s ring", vowelstr(r_stones[obj->o_which]),
        !           160:                     r_stones[obj->o_which]);
        !           161:             if     (obj == cur_ring[LEFT_1] || obj == cur_ring[LEFT_2]  ||
        !           162:                     obj == cur_ring[LEFT_3] || obj == cur_ring[LEFT_4])
        !           163:             strcat(pb, " (on left hand)");
        !           164:             if     (obj == cur_ring[RIGHT_1] || obj == cur_ring[RIGHT_2]  ||
        !           165:                     obj == cur_ring[RIGHT_3] || obj == cur_ring[RIGHT_4])
        !           166:             strcat(pb, " (on right hand)");
        !           167:         when RELIC:
        !           168:             if (obj->o_flags & ISKNOW)
        !           169:                 switch(obj->o_which) {
        !           170:                 case QUILL_NAGROM:
        !           171:                     sprintf(pb, "%s%s", rel_magic[obj->o_which].mi_name,
        !           172:                             charge_str(obj));
        !           173:                 otherwise:
        !           174:                     strcpy(pb, rel_magic[obj->o_which].mi_name);
        !           175:             }
        !           176:             else switch(obj->o_which) {
        !           177:                 case MUSTY_DAGGER:
        !           178:                     strcpy(pb, "Two very fine daggers marked MDDE");
        !           179:                 when EMORI_CLOAK:
        !           180:                     strcpy(pb, "A silk cloak");
        !           181:                 when HEIL_ANKH:
        !           182:                     strcpy(pb, "A golden ankh");
        !           183:                 when MING_STAFF:
        !           184:                     strcpy(pb, "A finely carved staff");
        !           185:                 when ORCUS_WAND:
        !           186:                     strcpy(pb, "A sparkling ivory wand");
        !           187:                 when ASMO_ROD:
        !           188:                     strcpy(pb, "A glistening ebony rod");
        !           189:                 when YENDOR_AMULET:
        !           190:                     strcpy(pb, "A silver amulet");
        !           191:                 when STONEBONES_AMULET:
        !           192:                     strcpy(pb, "A stone amulet");
        !           193:                 when BRIAN_MANDOLIN:
        !           194:                     strcpy(pb, "A gleaming mandolin");
        !           195:                 when HRUGGEK_MSTAR:
        !           196:                     strcpy(pb, "A silvery morning star");
        !           197:                 when AXE_AKLAD:
        !           198:                     strcpy(pb, "A jewel encrusted axe");
        !           199:                 when QUILL_NAGROM:
        !           200:                     strcpy(pb, "A bright white feather");
        !           201:                 when GERYON_HORN:
        !           202:                     strcpy(pb, "A jet black horn");
        !           203:                 when YEENOGHU_FLAIL:
        !           204:                     strcpy(pb, "A shimmering flail");
        !           205:                 when SURTUR_RING:
        !           206:                     strcpy(pb, "A fiery red ring");
        !           207:                 when ALTERAN_CARD:
        !           208:                     strcpy(pb, "A rectangular piece of wood");
        !           209:                 otherwise:
        !           210:                     strcpy(pb, "A wholly magical item");
        !           211:             }
        !           212:
        !           213:             /* Take care of wielding and wearing */
        !           214:             switch (obj->o_which) {
        !           215:                 case EMORI_CLOAK:
        !           216:                     if (cur_armor == NULL && cur_misc[WEAR_CLOAK] == NULL)
        !           217:                         strcat(pb, " (being worn)");
        !           218:                     if (obj->o_charges)
        !           219:                         strcat(pb, " [charged]");
        !           220:                     else
        !           221:                         strcat(pb, " [discharged]");
        !           222:                 when HEIL_ANKH:
        !           223:                     if (cur_relic[HEIL_ANKH]) strcat(pb, " (in palm)");
        !           224:                 when EYE_VECNA:
        !           225:                     if (cur_relic[EYE_VECNA]) strcat(pb, " (in forehead)");
        !           226:                 when STONEBONES_AMULET:
        !           227:                     if (cur_relic[STONEBONES_AMULET])
        !           228:                         strcat(pb, " (in chest)");
        !           229:                 when YENDOR_AMULET:
        !           230:                     if (cur_relic[YENDOR_AMULET])
        !           231:                         strcat(pb, " (in chest)");
        !           232:                 when MUSTY_DAGGER:
        !           233:                 case HRUGGEK_MSTAR:
        !           234:                 case AXE_AKLAD:
        !           235:                 case YEENOGHU_FLAIL:
        !           236:                 case MING_STAFF:
        !           237:                 case ASMO_ROD:
        !           238:                 case ORCUS_WAND:
        !           239:                     if (cur_weapon == obj) strcat(pb, " (weapon in hand)");
        !           240:                 when SURTUR_RING:
        !           241:                     if (cur_relic[SURTUR_RING])
        !           242:                         strcat(pb, " (in nose)");
        !           243:             }
        !           244:         when MM:
        !           245:             if (m_know[obj->o_which])
        !           246:             {
        !           247:                 misc_name(pb,obj);
        !           248:             }
        !           249:             else {
        !           250:                 switch (obj->o_which) {
        !           251:                     case MM_JUG:
        !           252:                     case MM_BEAKER:
        !           253:                     case MM_KEOGHTOM:
        !           254:                         strcpy(pb, "A crystalline jar");
        !           255:                     when MM_BOOK:
        !           256:                     case MM_SKILLS:
        !           257:                         strcpy(pb, "A dusty book");
        !           258:                     when MM_ELF_BOOTS:
        !           259:                     case MM_DANCE:
        !           260:                         strcpy(pb, "A pair of old boots");
        !           261:                     when MM_BRACERS:
        !           262:                         strcpy(pb, "A set of bracers");
        !           263:                     when MM_OPEN:
        !           264:                     case MM_HUNGER:
        !           265:                         strcpy(pb, "A mysterious chime");
        !           266:                     when MM_DISP:
        !           267:                     case MM_R_POWERLESS:
        !           268:                     case MM_PROTECT:
        !           269:                         strcpy(pb, "A dark looking cloak");
        !           270:                     when MM_DRUMS:
        !           271:                         strcpy(pb, "A drum set");
        !           272:                     when MM_DISAPPEAR:
        !           273:                     case MM_CHOKE:
        !           274:                         strcpy(pb, "A small pouch of dust");
        !           275:                     when MM_G_DEXTERITY:
        !           276:                     case MM_G_OGRE:
        !           277:                     case MM_FUMBLE:
        !           278:                         strcpy(pb, "A set of gauntlets");
        !           279:                     when MM_ADAPTION:
        !           280:                     case MM_JEWEL:
        !           281:                     case MM_STRANGLE:
        !           282:                         strcpy(pb, "A little necklace");
        !           283:             when MM_CRYSTAL:
        !           284:             strcpy(pb, "An unusual looking rock");
        !           285:                     otherwise:
        !           286:                         strcpy(pb, "A magical item");
        !           287:                 }
        !           288:                 if (m_guess[obj->o_which]) {
        !           289:                     strcat(pb, " named: ");
        !           290:                     strcat(pb, m_guess[obj->o_which]);
        !           291:                 }
        !           292:             }
        !           293:             if (obj == cur_misc[WEAR_BOOTS]     ||
        !           294:                 obj == cur_misc[WEAR_BRACERS]   ||
        !           295:                 obj == cur_misc[WEAR_CLOAK]     ||
        !           296:                 obj == cur_misc[WEAR_GAUNTLET]  ||
        !           297:                 obj == cur_misc[WEAR_NECKLACE]  ||
        !           298:                 obj == cur_misc[WEAR_JEWEL])
        !           299:                     strcat(pb, " (being worn)");
        !           300:         when GOLD:
        !           301:                 sprintf(pb, "%d Pieces of Gold", obj->o_count);
        !           302:         otherwise:
        !           303:             debug("Picked up something funny");
        !           304:             sprintf(pb, "Something totally bizarre %s", unctrl(obj->o_type));
        !           305:         wait_for(' ');
        !           306:     }
        !           307:
        !           308:     /* Is it marked? */
        !           309:     if (obj->o_mark[0]) {
        !           310:         pb = &pb[strlen(pb)];
        !           311:         sprintf(pb, " <%s>", obj->o_mark);
        !           312:     }
        !           313:
        !           314:     if (obj->o_flags & ISPROT)
        !           315:         strcat(pb, " [protected]");
        !           316:     if (drop && isupper(prbuf[0]))
        !           317:         prbuf[0] = tolower(prbuf[0]);
        !           318:     else if (!drop && islower(*prbuf))
        !           319:         *prbuf = toupper(*prbuf);
        !           320:     if (!drop)
        !           321:         strcat(pb, ".");
        !           322:     /*
        !           323:      * Truncate if long. Use cols-4 to offset the "pack letter" of a normal
        !           324:      * inventory listing.
        !           325:      */
        !           326:     prbuf[cols-4] = '\0';
        !           327:     return prbuf;
        !           328: }
        !           329:
        !           330: /*
        !           331:  * weap_name:
        !           332:  *      Return the name of a weapon.
        !           333:  */
        !           334:
        !           335: char *
        !           336: weap_name(struct object *obj)
        !           337: {
        !           338:     switch (obj->o_type) {
        !           339:         case WEAPON:
        !           340:             return(weaps[obj->o_which].w_name);
        !           341:         when MISSILE:
        !           342:             return(ws_magic[obj->o_which].mi_name);
        !           343:         when RELIC:
        !           344:             switch (obj->o_which) {
        !           345:                 case MUSTY_DAGGER:
        !           346:                     return("daggers");
        !           347:                 when YEENOGHU_FLAIL:
        !           348:                     return("flail");
        !           349:                 when AXE_AKLAD:
        !           350:                     return("axe");
        !           351:                 when HRUGGEK_MSTAR:
        !           352:                     return("morning star");
        !           353:                 when MING_STAFF:
        !           354:                     return("staff");
        !           355:                 when ORCUS_WAND:
        !           356:                     return("wand");
        !           357:                 when ASMO_ROD:
        !           358:                     return("rod");
        !           359:             }
        !           360:     }
        !           361:     return("weapon");
        !           362: }
        !           363:
        !           364: /*
        !           365:  * drop:
        !           366:  *      put something down
        !           367:  */
        !           368:
        !           369: bool
        !           370: drop(struct linked_list *item)
        !           371: {
        !           372:     register char ch = 0;
        !           373:     register struct linked_list *obj, *nobj;
        !           374:     register struct object *op;
        !           375:
        !           376:     if (item == NULL) {
        !           377:         /* We charge 2 movement times to drop something */
        !           378:         if (player.t_action == C_DROP && player.t_using != NULL) {
        !           379:             obj = player.t_using;
        !           380:             player.t_using = NULL;
        !           381:             player.t_action = A_NIL;
        !           382:         }
        !           383:
        !           384:         /* t_action == C_DROP always when called from command() */
        !           385:         else {
        !           386:             if ((obj = get_item(pack, "drop", ALL, FALSE, FALSE)) == NULL) {
        !           387:                 player.t_action = A_NIL;
        !           388:                 player.t_using = NULL;
        !           389:                 return(FALSE);
        !           390:             }
        !           391:             if (player.t_action == C_DROP) {
        !           392:                 player.t_using = obj;
        !           393:                 player.t_no_move = 2 * movement(&player);
        !           394:                 return(FALSE);  /* We'll come back after we've waited */
        !           395:             }
        !           396:         }
        !           397:
        !           398:         switch(ch = mvwinch(stdscr, hero.y, hero.x)) {
        !           399:         case PASSAGE:
        !           400:         case SCROLL:
        !           401:         case POTION:
        !           402:         case WEAPON:
        !           403:         case FLOOR:
        !           404:         case STICK:
        !           405:         case ARMOR:
        !           406:         case POOL:
        !           407:         case RELIC:
        !           408:         case GOLD:
        !           409:         case FOOD:
        !           410:         case RING:
        !           411:         case MM:
        !           412:             break;
        !           413:         default:
        !           414:             msg("You can't leave it here");
        !           415:             return(FALSE);
        !           416:         }
        !           417:     }
        !           418:     else {
        !           419:         obj = item;
        !           420:     }
        !           421:     op = OBJPTR(obj);
        !           422:     if (!dropcheck(op))
        !           423:         return(FALSE);
        !           424:
        !           425:     /*
        !           426:      * If it is a scare monster scroll, curse it
        !           427:      */
        !           428:     if (op->o_type == SCROLL && op->o_which == S_SCARE) {
        !           429:         if (op->o_flags & ISBLESSED)
        !           430:             op->o_flags &= ~ISBLESSED;
        !           431:         else op->o_flags |= ISCURSED;
        !           432:     }
        !           433:
        !           434:     /*
        !           435:      * Take it out of the pack
        !           436:      */
        !           437:     if (op->o_count >= 2 && op->o_group == 0)
        !           438:     {
        !           439:         nobj = new_item(sizeof *op);
        !           440:         op->o_count--;
        !           441:         op = OBJPTR(nobj);
        !           442:         *op = *(OBJPTR(obj));
        !           443:         op->o_count = 1;
        !           444:         obj = nobj;
        !           445:     }
        !           446:     else {
        !           447:         detach(pack, obj);
        !           448:         inpack--;
        !           449:     }
        !           450:     if(ch == POOL) {
        !           451:         msg("Gloop... Your %s sinks out of sight. ",inv_name(op,TRUE));
        !           452:         o_discard(obj);
        !           453:     }
        !           454:     else if (levtype == POSTLEV) {
        !           455:         op->o_pos = hero;       /* same place as hero */
        !           456:         fall(obj,FALSE);
        !           457:         if (item == NULL)       /* if item wasn't sold */
        !           458:             msg("Thanks for your donation to the Fiend's flea market.");
        !           459:     }
        !           460:     else {
        !           461:         /*
        !           462:          * Link it into the level object list
        !           463:          */
        !           464:         attach(lvl_obj, obj);
        !           465:         mvaddch(hero.y, hero.x, op->o_type);
        !           466:         op->o_pos = hero;
        !           467:         msg("Dropped %s", inv_name(op, TRUE));
        !           468:     }
        !           469:     updpack(FALSE, &player);
        !           470:     return (TRUE);
        !           471: }
        !           472:
        !           473: /*
        !           474:  * do special checks for dropping or unweilding|unwearing|unringing
        !           475:  */
        !           476:
        !           477: bool
        !           478: dropcheck(struct object *op)
        !           479: {
        !           480:     int save_max;
        !           481:
        !           482:     if (op == NULL)
        !           483:         return TRUE;
        !           484:     if (levtype == POSTLEV) {
        !           485:         if ((op->o_flags & ISCURSED) && (op->o_flags & ISKNOW)) {
        !           486:             msg("The trader does not accept shoddy merchandise.");
        !           487:             return(FALSE);
        !           488:         }
        !           489:     }
        !           490:
        !           491:     /* Player will not drop a relic */
        !           492:     if (op->o_type == RELIC) {
        !           493:         /*
        !           494:          * There is a 1% cumulative chance per relic that trying to get
        !           495:          * rid of it will cause the relic to turn on the player.
        !           496:          */
        !           497:         if (rnd(150) < cur_relic[op->o_which]++) {
        !           498:             msg("The artifact turns on you! ");
        !           499:             msg("It crushes your mind!!!  --More--");
        !           500:             pstats.s_hpt = -1;
        !           501:             wait_for (' ');
        !           502:             death(D_RELIC);
        !           503:         }
        !           504:         else {
        !           505:             if (terse) msg("You can't release it.");
        !           506:             else msg("You cannot bring yourself to release it.");
        !           507:             return FALSE;
        !           508:         }
        !           509:     }
        !           510:
        !           511:     /* If we aren't wearing it, we can drop it */
        !           512:     if (!is_current(op)) return TRUE;
        !           513:
        !           514:     /* At this point, we know we are wearing the item */
        !           515:     if (op->o_flags & ISCURSED) {
        !           516:         msg("You can't.  It appears to be cursed.");
        !           517:         return FALSE;
        !           518:     }
        !           519:     if (op->o_type == RING && cur_misc[WEAR_GAUNTLET] != NULL) {
        !           520:         msg ("You have to remove your gauntlets first!");
        !           521:         return FALSE;
        !           522:     }
        !           523:     cur_null(op);       /* set current to NULL */
        !           524:     if (op->o_type == RING) {
        !           525:         switch (op->o_which) {
        !           526:         case R_ADDSTR:    save_max = max_stats.s_str;
        !           527:                           chg_str(-op->o_ac);
        !           528:                           max_stats.s_str = save_max;
        !           529:         when R_ADDHIT:    pstats.s_dext -= op->o_ac;
        !           530:         when R_ADDINTEL:  pstats.s_intel -= op->o_ac;
        !           531:         when R_ADDWISDOM: pstats.s_wisdom -= op->o_ac;
        !           532:         when R_SEEINVIS:  if (!ISWEARING(R_SEEINVIS) &&
        !           533:                               find_slot(unsee) == 0) {
        !           534:                                 turn_off(player, CANSEE);
        !           535:                                 msg("The tingling feeling leaves your eyes. ");
        !           536:                           }
        !           537:                           light(&hero);
        !           538:                           mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           539:         when R_WARMTH:    if (!ISWEARING(R_WARMTH) && !find_slot(nocold))
        !           540:                                 turn_off(player, NOCOLD);
        !           541:         when R_FIRE:      if (!ISWEARING(R_FIRE)        &&
        !           542:                               !cur_relic[SURTUR_RING]   &&
        !           543:                               !find_slot(nofire))
        !           544:                                 turn_off(player, NOFIRE);
        !           545:         when R_LIGHT: {
        !           546:                           if(roomin(&hero) != NULL) {
        !           547:                                 light(&hero);
        !           548:                                 mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           549:                           }
        !           550:                       }
        !           551:         when R_SEARCH:    kill_daemon(ring_search);
        !           552:         when R_TELEPORT:  kill_daemon(ring_teleport);
        !           553:         }
        !           554:     }
        !           555:     else if (op->o_type == MM) {
        !           556:         switch (op->o_which) {
        !           557:             case MM_ADAPTION:
        !           558:                 turn_off(player, NOGAS);
        !           559:                 turn_off(player, NOACID);
        !           560:
        !           561:             when MM_STRANGLE:
        !           562:                 msg("You can breathe again.....whew!");
        !           563:                 kill_daemon(strangle);
        !           564:
        !           565:             when MM_DANCE:
        !           566:                 turn_off(player, ISDANCE);
        !           567:                 msg ("Your feet take a break.....whew!");
        !           568:
        !           569:             when MM_FUMBLE:
        !           570:                 kill_daemon(fumble);
        !           571:
        !           572:             when MM_G_OGRE:
        !           573:             case MM_G_DEXTERITY:
        !           574:                 save_max = max_stats.s_str;
        !           575:                 chg_str(-op->o_ac);
        !           576:                 max_stats.s_str = save_max;
        !           577:         }
        !           578:     }
        !           579:     return TRUE;
        !           580: }
        !           581:
        !           582: /*
        !           583:  * return a new thing
        !           584:  */
        !           585:
        !           586: struct linked_list *
        !           587: new_thing(int thing_type, bool allow_curse)
        !           588: {
        !           589:     register struct linked_list *item;
        !           590:     register struct object *cur;
        !           591:     register int j;
        !           592:     register int blesschance, cursechance;
        !           593:
        !           594:     item = new_item(sizeof *cur);
        !           595:     cur = OBJPTR(item);
        !           596:     cur->o_hplus = cur->o_dplus = 0;
        !           597:     strcpy(cur->o_damage,"0d0");
        !           598:     strcpy(cur->o_hurldmg,"0d0");
        !           599:     cur->o_ac = 0;
        !           600:     cur->o_count = 1;
        !           601:     cur->o_group = 0;
        !           602:     cur->contents = NULL;
        !           603:     cur->o_flags = 0;
        !           604:     cur->o_weight = 0;
        !           605:     cur->o_mark[0] = '\0';
        !           606:     /*
        !           607:      * Decide what kind of object it will be
        !           608:      * If we haven't had food for a while, let it be food.
        !           609:      */
        !           610:     blesschance = rnd(100);
        !           611:     if (allow_curse) cursechance = rnd(100);
        !           612:     else cursechance = 100;     /* No chance of curse */
        !           613:
        !           614:     /* Get the type of item (pick one if 'any' is specified) */
        !           615:     if (thing_type == ALL) j = pick_one(things, NUMTHINGS);
        !           616:     else j = thing_type;
        !           617:
        !           618:     /*
        !           619:      * make sure he gets his vitamins
        !           620:      */
        !           621:     if (thing_type == ALL && no_food > 4)
        !           622:         j = 2;
        !           623:     /*
        !           624:      * limit the number of foods on a level because it sometimes
        !           625:      * gets out of hand in the "deep" levels where there is a
        !           626:      * treasure room on most every level with lots of food in it
        !           627:      */
        !           628:     while (thing_type == ALL && levtype != POSTLEV && foods_this_level > 1 &&
        !           629:            j == 2)
        !           630:         j = pick_one(things, NUMTHINGS);        /* not too many.... */
        !           631:     switch (j)
        !           632:     {
        !           633:         case TYP_POTION:
        !           634:             cur->o_type = POTION;
        !           635:             do {
        !           636:                 cur->o_which = pick_one(p_magic, MAXPOTIONS);
        !           637:             } while (!allow_curse && p_magic[cur->o_which].mi_curse == 100);
        !           638:             cur->o_weight = things[TYP_POTION].mi_wght;
        !           639:             if (cursechance < p_magic[cur->o_which].mi_curse)
        !           640:                 cur->o_flags |= ISCURSED;
        !           641:             else if (blesschance < p_magic[cur->o_which].mi_bless)
        !           642:                 cur->o_flags |= ISBLESSED;
        !           643:
        !           644:             /* If we made a gain ability potion, see what kind it is */
        !           645:             if (cur->o_which == P_ABIL) cur->o_kind = rnd(NUMABILITIES);
        !           646:
        !           647:         when TYP_SCROLL:
        !           648:             cur->o_type = SCROLL;
        !           649:             do {
        !           650:                 cur->o_which = pick_one(s_magic, MAXSCROLLS);
        !           651:             } while (!allow_curse && s_magic[cur->o_which].mi_curse == 100);
        !           652:             cur->o_weight = things[TYP_SCROLL].mi_wght;
        !           653:             if (cursechance < s_magic[cur->o_which].mi_curse)
        !           654:                 cur->o_flags |= ISCURSED;
        !           655:             else if (blesschance < s_magic[cur->o_which].mi_bless)
        !           656:                 cur->o_flags |= ISBLESSED;
        !           657:         when TYP_FOOD:
        !           658:             no_food = 0;
        !           659:             cur->o_type = FOOD;
        !           660:             cur->o_weight = things[TYP_FOOD].mi_wght;
        !           661:             cur->o_count += extras();
        !           662:             foods_this_level += cur->o_count;
        !           663:             cur->o_which = pick_one(foods, MAXFOODS);
        !           664:         when TYP_WEAPON:
        !           665:             cur->o_type = WEAPON;
        !           666:             cur->o_which = rnd(MAXWEAPONS);
        !           667:             init_weapon(cur, cur->o_which);
        !           668:             if (cursechance < 20)
        !           669:             {
        !           670:
        !           671:                 cur->o_flags |= ISCURSED;
        !           672:                 cur->o_hplus -= rnd(3) + 1;
        !           673:                 cur->o_dplus -= rnd(3) + 1;
        !           674:             }
        !           675:             else if (blesschance < 50) {
        !           676:
        !           677:                 cur->o_hplus += rnd(5) + 1;
        !           678:                 cur->o_dplus += rnd(5) + 1;
        !           679:             }
        !           680:         when TYP_ARMOR:
        !           681:             cur->o_type = ARMOR;
        !           682:             for (j = 0; j < MAXARMORS; j++)
        !           683:                 if (blesschance < armors[j].a_prob)
        !           684:                     break;
        !           685:             if (j == MAXARMORS)
        !           686:             {
        !           687:                 debug("Picked a bad armor %d", blesschance);
        !           688:         wait_for(' ');
        !           689:                 j = 0;
        !           690:             }
        !           691:             cur->o_which = j;
        !           692:             cur->o_ac = armors[j].a_class;
        !           693:             cur->o_weight = armors[j].a_wght;
        !           694:             if (cursechance < 20)
        !           695:             {
        !           696:                 cur->o_flags |= ISCURSED;
        !           697:                 cur->o_ac += rnd(4)+1;
        !           698:             }
        !           699:             else if (blesschance < 40)
        !           700:                 cur->o_ac -= rnd(3)+1;
        !           701:         when TYP_RING:
        !           702:             cur->o_type = RING;
        !           703:             do {
        !           704:                 cur->o_which = pick_one(r_magic, MAXRINGS);
        !           705:             } while (!allow_curse && r_magic[cur->o_which].mi_curse == 100);
        !           706:             cur->o_weight = things[TYP_RING].mi_wght;
        !           707:             if (cursechance < r_magic[cur->o_which].mi_curse)
        !           708:                 cur->o_flags |= ISCURSED;
        !           709:             switch (cur->o_which)
        !           710:             {
        !           711:                 case R_ADDSTR:
        !           712:                 case R_ADDWISDOM:
        !           713:                 case R_ADDINTEL:
        !           714:                 case R_PROTECT:
        !           715:                 case R_ADDHIT:
        !           716:                 case R_ADDDAM:
        !           717:                     cur->o_ac = rnd(2) + 1;
        !           718:                     if (cur->o_flags & ISCURSED)
        !           719:                         cur->o_ac = -cur->o_ac;
        !           720:                     if (blesschance < r_magic[cur->o_which].mi_bless)
        !           721:                         cur->o_ac+=rnd(vlevel/10)+1;
        !           722:                 when R_DIGEST:
        !           723:                     if (cur->o_flags & ISCURSED)
        !           724:                         cur->o_ac = -1;
        !           725:                     else if (blesschance < r_magic[cur->o_which].mi_bless)
        !           726:                         cur->o_ac = 2;
        !           727:                     else cur->o_ac = 1;
        !           728:             }
        !           729:         when TYP_STICK:
        !           730:             cur->o_type = STICK;
        !           731:             do {
        !           732:                 cur->o_which = pick_one(ws_magic, MAXSTICKS);
        !           733:             } while (!allow_curse && ws_magic[cur->o_which].mi_curse == 100);
        !           734:             fix_stick(cur);
        !           735:             if (cursechance < ws_magic[cur->o_which].mi_curse)
        !           736:                 cur->o_flags |= ISCURSED;
        !           737:             else if (blesschance < ws_magic[cur->o_which].mi_bless)
        !           738:                 cur->o_flags |= ISBLESSED;
        !           739:         when TYP_MM:
        !           740:             cur->o_type = MM;
        !           741:             do {
        !           742:                 cur->o_which = pick_one(m_magic, MAXMM);
        !           743:             } while (!allow_curse && m_magic[cur->o_which].mi_curse == 100);
        !           744:             cur->o_weight = things[TYP_MM].mi_wght;
        !           745:             if (cursechance < m_magic[cur->o_which].mi_curse)
        !           746:                 cur->o_flags |= ISCURSED;
        !           747:             else if (blesschance < m_magic[cur->o_which].mi_bless)
        !           748:                 cur->o_flags |= ISBLESSED;
        !           749:             switch (cur->o_which) {
        !           750:                 case MM_JUG:
        !           751:                     switch(rnd(11)) {
        !           752:                         case 0: cur->o_ac = P_PHASE;
        !           753:                         when 1: cur->o_ac = P_CLEAR;
        !           754:                         when 2: cur->o_ac = P_SEEINVIS;
        !           755:                         when 3: cur->o_ac = P_HEALING;
        !           756:                         when 4: cur->o_ac = P_MFIND;
        !           757:                         when 5: cur->o_ac = P_TFIND;
        !           758:                         when 6: cur->o_ac = P_HASTE;
        !           759:                         when 7: cur->o_ac = P_RESTORE;
        !           760:                         when 8: cur->o_ac = P_FLY;
        !           761:                         when 9: cur->o_ac = P_SKILL;
        !           762:                         when 10:cur->o_ac = P_FFIND;
        !           763:                     }
        !           764:                 when MM_HUNGER:
        !           765:                 case MM_CHOKE:
        !           766:                     cur->o_ac = (2 + rnd(2)) * 3;
        !           767:                 when MM_OPEN:
        !           768:                 case MM_DRUMS:
        !           769:                 case MM_DISAPPEAR:
        !           770:                 case MM_KEOGHTOM:
        !           771:                     cur->o_ac = (5 + rnd(6)) * 3;
        !           772:                 when MM_BRACERS:
        !           773:                     if (cur->o_flags & ISCURSED)
        !           774:                         cur->o_ac = -(rnd(5)+1);
        !           775:                     else
        !           776:                         cur->o_ac = rnd(5)+1;
        !           777:                 when MM_PROTECT:
        !           778:                     if (cur->o_flags & ISCURSED)
        !           779:                         cur->o_ac = -(rnd(5)+1);
        !           780:                     else
        !           781:                         cur->o_ac = rnd(5)+1;
        !           782:                 when MM_DISP:
        !           783:                     cur->o_ac = 3;
        !           784:                 when MM_SKILLS: /*  set it to a character class */
        !           785:                     cur->o_ac = rnd(NUM_CHARTYPES-1);
        !           786:         when MM_CRYSTAL:
        !           787:             cur->o_ac = 1;   /* Use it just once */
        !           788:                 otherwise:
        !           789:                     cur->o_ac = 0;
        !           790:             }
        !           791:         otherwise:
        !           792:             debug("Picked a bad kind of object");
        !           793:             wait_for(' ');
        !           794:     }
        !           795:     return item;
        !           796: }
        !           797:
        !           798: /*
        !           799:  * provide a new item tailored to specification
        !           800:  */
        !           801:
        !           802: struct linked_list *
        !           803: spec_item(int type, int which, int hit, int damage)
        !           804: {
        !           805:     register struct linked_list *item;
        !           806:     register struct object *obj;
        !           807:
        !           808:     item = new_item(sizeof *obj);
        !           809:     obj = OBJPTR(item);
        !           810:     obj->o_count = 1;
        !           811:     obj->o_group = 0;
        !           812:     obj->contents = NULL;
        !           813:     obj->o_type = type;
        !           814:     obj->o_which = which;
        !           815:     strcpy(obj->o_damage,"0d0");
        !           816:     strcpy(obj->o_hurldmg,"0d0");
        !           817:     obj->o_hplus = 0;
        !           818:     obj->o_dplus = 0;
        !           819:     obj->o_flags = 0;
        !           820:     obj->o_mark[0] = '\0';
        !           821:     obj->o_launch = 0;
        !           822:     obj->o_weight = 0;
        !           823:
        !           824:     /* Handle special characteristics */
        !           825:     switch (type) {
        !           826:         case WEAPON:
        !           827:             init_weapon(obj, which);
        !           828:             obj->o_hplus = hit;
        !           829:             obj->o_dplus = damage;
        !           830:             obj->o_ac = 10;
        !           831:
        !           832:             if (hit < 0 || damage < 0) obj->o_flags |= ISCURSED;
        !           833:
        !           834:         when ARMOR:
        !           835:             obj->o_ac = armors[which].a_class - hit;
        !           836:             if (hit < 0) obj->o_flags |= ISCURSED;
        !           837:
        !           838:         when RING:
        !           839:             obj->o_ac = hit;
        !           840:             switch (obj->o_which) {
        !           841:                 case R_ADDSTR:
        !           842:                 case R_ADDWISDOM:
        !           843:                 case R_ADDINTEL:
        !           844:                 case R_PROTECT:
        !           845:                 case R_ADDHIT:
        !           846:                 case R_ADDDAM:
        !           847:                 case R_DIGEST:
        !           848:                     if (hit < 0) obj->o_flags |= ISCURSED;
        !           849:             }
        !           850:
        !           851:         when STICK:
        !           852:             fix_stick(obj);
        !           853:             obj->o_charges = hit;
        !           854:
        !           855:         when GOLD:
        !           856:             obj->o_type = GOLD;
        !           857:             obj->o_count = GOLDCALC;
        !           858:             obj->o_ac = 11;
        !           859:
        !           860:         when MM:
        !           861:             obj->o_type = MM;
        !           862:             obj->o_ac = hit;
        !           863:
        !           864:         when RELIC:
        !           865:             /* Handle weight here since these are all created uniquely */
        !           866:             obj->o_weight = things[TYP_RELIC].mi_wght;
        !           867:             if (obj->o_which == EMORI_CLOAK)
        !           868:                 obj->o_charges = 1;
        !           869:
        !           870:     }
        !           871:     return(item);
        !           872: }
        !           873:
        !           874: /*
        !           875:  * pick an item out of a list of nitems possible magic items
        !           876:  */
        !           877:
        !           878: int
        !           879: pick_one(struct magic_item *magic, int nitems)
        !           880: {
        !           881:     register struct magic_item *end;
        !           882:     register int i;
        !           883:     register struct magic_item *start;
        !           884:
        !           885:     start = magic;
        !           886:     for (end = &magic[nitems], i = rnd(1000); magic < end; magic++)
        !           887:         if (i < magic->mi_prob)
        !           888:             break;
        !           889:     if (magic == end)
        !           890:     {
        !           891:         if (wizard)
        !           892:         {
        !           893:             msg("bad pick_one: %d from %d items", i, nitems);
        !           894:             for (magic = start; magic < end; magic++)
        !           895:                 msg("%s: %d%%", magic->mi_name, magic->mi_prob);
        !           896:         }
        !           897:         magic = start;
        !           898:     }
        !           899:     return magic - start;
        !           900: }
        !           901:
        !           902:
        !           903: /* blesscurse returns whether, according to the flag, the object is
        !           904:  * blessed, cursed, or neither
        !           905:  */
        !           906:
        !           907: char *
        !           908: blesscurse(int flags)
        !           909: {
        !           910:     if (flags & ISKNOW)  {
        !           911:         if (flags & ISCURSED) return("cursed ");
        !           912:         if (flags & ISBLESSED) return("blessed ");
        !           913:         return("normal ");
        !           914:     }
        !           915:     return("");
        !           916: }
        !           917:
        !           918: /*
        !           919:  * p_kind returns the type of potion for some types of identified potions;
        !           920:  * otherwise, it returns the color.
        !           921:  * We assume that obj points to a potion.
        !           922:  */
        !           923:
        !           924: char *
        !           925: p_kind(struct object *obj)
        !           926: {
        !           927:     if (obj->o_which == P_ABIL) return(abilities[obj->o_kind].w_string);
        !           928:     else return(p_colors[obj->o_which]);
        !           929: }
        !           930:
        !           931: /*
        !           932:  * extras:
        !           933:  *      Return the number of extra items to be created
        !           934:  */
        !           935:
        !           936: int
        !           937: extras(void)
        !           938: {
        !           939:         reg int i;
        !           940:
        !           941:         i = rnd(100);
        !           942:         if (i < 3)              /* 3% for 2 more */
        !           943:             return (2);
        !           944:         else if (i < 6)         /* 6% for 1 more */
        !           945:             return (1);
        !           946:         else                    /* otherwise no more */
        !           947:             return (0);
        !           948: }
        !           949:

CVSweb