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

Annotation of early-roguelike/urogue/scrolls.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:     scrolls.c - Functions for dealing with scrolls
                      3:
                      4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
                      5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
                      6:     All rights reserved.
                      7:
                      8:     Based on "Advanced Rogue"
                      9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
                     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 <stdlib.h>
                     20: #include <string.h>
                     21: #include <ctype.h>
                     22: #include "rogue.h"
                     23:
                     24: /*
                     25:     read_scroll - read a scroll (or effect a scroll-like spell)
                     26:         reader:  who does it
                     27:         which:   which S_SCROLL (-1 means ask from pack)
                     28:         flags:   ISBLESSED, ISCURSED
                     29: */
                     30:
                     31: void
                     32: read_scroll(struct thing *reader, int which, int flags)
                     33: {
                     34:     struct object   *obj;
                     35:     struct linked_list  *item, *nitem;
                     36:     int i, j, charm_power;
                     37:     char    ch, nch;
                     38:     int     blessed = flags & ISBLESSED;
                     39:     int     cursed = flags & ISCURSED;
                     40:     int     is_scroll = (which < 0 ? TRUE : FALSE);
                     41:     char    buf[2 * LINELEN];
                     42:
                     43:     if (reader != &player)
                     44:     {
                     45:         monread(reader, which, flags);
                     46:         return;
                     47:     }
                     48:
                     49:     if (is_scroll)      /* A regular scroll */
                     50:     {
                     51:         if ((item = get_item("read", SCROLL)) == NULL)
                     52:             return;
                     53:
                     54:         obj = OBJPTR(item);
                     55:
                     56:         if (obj->o_type != SCROLL)
                     57:         {
                     58:             msg("It says 'Made in Yugoslavia'!");
                     59:             return;
                     60:         }
                     61:
                     62:         if (on(player, ISBLIND))
                     63:         {
                     64:             msg("You can't see to read anything.");
                     65:             return;
                     66:         }
                     67:
                     68:         /* Calculate its effect */
                     69:
                     70:         cursed = obj->o_flags & ISCURSED;
                     71:         blessed = obj->o_flags & ISBLESSED;
                     72:         flags = obj->o_flags;
                     73:         which = obj->o_which;
                     74:
                     75:         /* remove it from the pack */
                     76:
                     77:         rem_pack(obj);
                     78:         discard(item);
                     79:         updpack();
                     80:     }
                     81:
                     82:     switch (which)
                     83:     {
                     84:         case S_CONFUSE:  /* Touch causes monster confusion.  */
                     85:             if (cursed)
                     86:                 quaff(reader, P_CLEAR, ISCURSED);
                     87:             else
                     88:             {
                     89:                 msg("Your hands begin to glow red.");
                     90:                 turn_on(player, CANHUH);
                     91:                 /* if blessed... */
                     92:             }
                     93:             break;
                     94:
                     95:         case  S_CURING:   /* A cure disease spell */
                     96:             if (on(player, HASINFEST) || on(player, HASDISEASE))
                     97:             {
                     98:                 if (!cursed && on(player, HASDISEASE))
                     99:                 {
                    100:                     extinguish_fuse(FUSE_CURE_DISEASE);
                    101:                     cure_disease(NULL);
                    102:                 }
                    103:
                    104:                 if (on(player, HASINFEST))
                    105:                 {
                    106:                     msg("You begin to feel yourself improving again.");
                    107:                     turn_off(player, HASINFEST);
                    108:                     infest_dam = 0;
                    109:                 }
                    110:
                    111:                 if (is_scroll)
                    112:                     know_items[TYP_SCROLL][S_CURING] = TRUE;
                    113:             }
                    114:             else
                    115:                 nothing_message(flags);
                    116:             break;
                    117:
                    118:         case S_LIGHT:
                    119:             if (blue_light(flags) && is_scroll)
                    120:                 know_items[TYP_SCROLL][S_LIGHT] = TRUE;
                    121:             break;
                    122:
                    123:         case S_HOLD:
                    124:             if (cursed)
                    125:             {
                    126:                 /*
                    127:                  * This scroll aggravates all the monsters on the
                    128:                  * current level and sets them running towards the
                    129:                  * hero
                    130:                  */
                    131:                 aggravate();
                    132:                 hearmsg("You hear a high pitched humming noise.");
                    133:             }
                    134:             else if (blessed)   /* Hold all monsters on level */
                    135:             {
                    136:                 if (mlist == NULL)
                    137:                     nothing_message(flags);
                    138:                 else
                    139:                 {
                    140:                     struct linked_list  *mon;
                    141:                     struct thing    *th;
                    142:
                    143:                     for (mon = mlist; mon != NULL; mon = next(mon))
                    144:                     {
                    145:                         th = THINGPTR(mon);
                    146:                         turn_off(*th, ISRUN);
                    147:                         turn_on(*th, ISHELD);
                    148:                     }
                    149:                     msg("A sudden peace comes over the dungeon.");
                    150:                 }
                    151:             }
                    152:             else
                    153:             {
                    154:                 /*
                    155:                  * Hold monster scroll.  Stop all monsters within two
                    156:                  * spaces from chasing after the hero.
                    157:                  */
                    158:                 int x, y;
                    159:                 struct linked_list  *mon;
                    160:                 int gotone = FALSE;
                    161:
                    162:                 for (x = hero.x - 2; x <= hero.x + 2; x++)
                    163:                 {
                    164:                     for (y = hero.y - 2; y <= hero.y + 2; y++)
                    165:                     {
                    166:                         if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x)))
                    167:                         {
                    168:                             if ((mon = find_mons(y, x)) != NULL)
                    169:                             {
                    170:                                 struct thing    *th;
                    171:
                    172:                                 gotone = TRUE;
                    173:                                 th = THINGPTR(mon);
                    174:                                 turn_off(*th, ISRUN);
                    175:                                 turn_on(*th, ISHELD);
                    176:                             }
                    177:                         }
                    178:                     }
                    179:                 }
                    180:
                    181:                 if (gotone)
                    182:                     msg("A sudden peace surrounds you.");
                    183:                 else
                    184:                     nothing_message(flags);
                    185:             }
                    186:             break;
                    187:
                    188:         case S_SLEEP:
                    189:
                    190:             /* if cursed, you fall asleep */
                    191:
                    192:             if (cursed)
                    193:             {
                    194:                 if (is_wearing(R_ALERT))
                    195:                     msg("You feel drowsy for a moment.");
                    196:                 else
                    197:                 {
                    198:                     msg("You fall asleep.");
                    199:                     no_command += 4 + rnd(SLEEPTIME);
                    200:                 }
                    201:             }
                    202:             else
                    203:             {
                    204:                 /*
                    205:                  * sleep monster scroll.  puts all monsters within 2
                    206:                  * spaces asleep
                    207:                  */
                    208:                 int x, y;
                    209:                 struct linked_list  *mon;
                    210:                 int gotone = FALSE;
                    211:
                    212:                 for (x = hero.x - 2; x <= hero.x + 2; x++)
                    213:                 {
                    214:                     for (y = hero.y - 2; y <= hero.y + 2; y++)
                    215:                     {
                    216:                         if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x)))
                    217:                         {
                    218:                             if ((mon = find_mons(y, x)) != NULL)
                    219:                             {
                    220:                                 struct thing    *th;
                    221:                                 th = THINGPTR(mon);
                    222:
                    223:                                 if (on(*th, ISUNDEAD))
                    224:                                     continue;
                    225:
                    226:                                 gotone = TRUE;
                    227:                                 th->t_no_move += SLEEPTIME;
                    228:                             }
                    229:                         }
                    230:                     }
                    231:                 }
                    232:
                    233:                 if (gotone)
                    234:                     msg("The monster(s) around you seem to have fallen asleep.");
                    235:                 else
                    236:                     nothing_message(flags);
                    237:             }
                    238:             break;
                    239:
                    240:         case S_CREATE:
                    241:         {
                    242:             /*
                    243:              * Create a monster. First look in a circle around
                    244:              * him, next try his room otherwise give up
                    245:              */
                    246:
                    247:             struct thing    *tp;
                    248:             struct linked_list  *ip;
                    249:
                    250:             if (blessed)
                    251:                 summon_monster((short) 0, NOFAMILIAR, MESSAGE);
                    252:             else if (cursed)
                    253:             {
                    254:                 i = rnd(4) + 3;
                    255:                 for (j = 0; j < i; j++)
                    256:                 {
                    257:                     if ((ip = creat_mons(&player, (short) 0, MESSAGE)) != NULL)
                    258:                     {
                    259:                         tp = THINGPTR(ip);
                    260:                         turn_off(*tp, ISFRIENDLY);
                    261:                     }
                    262:                 }
                    263:             }
                    264:             else if ((ip = creat_mons(&player, (short) 0, MESSAGE)) != NULL)
                    265:             {
                    266:                 tp = THINGPTR(ip);
                    267:                 turn_off(*tp, ISFRIENDLY);
                    268:             }
                    269:         }
                    270:         break;
                    271:
                    272:         case S_IDENTIFY:
                    273:             if (cursed)
                    274:                 msg("You identify this scroll as an identify scroll");
                    275:             else if (blessed)   /* identify everything in the pack */
                    276:             {
                    277:                 msg("You feel more Knowledgeable!");
                    278:                 idenpack();
                    279:             }
                    280:             else
                    281:             {
                    282:                 /* Identify, let the rogue figure something out  */
                    283:
                    284:                 if (is_scroll && know_items[TYP_SCROLL][S_IDENTIFY] != TRUE)
                    285:                 {
                    286:                     msg("This scroll is an identify scroll.");
                    287:                     know_items[TYP_SCROLL][S_IDENTIFY] = TRUE;
                    288:                 }
                    289:                 whatis(NULL);
                    290:             }
                    291:             break;
                    292:
                    293:         case S_MAP:
                    294:
                    295:             /* Scroll of magic mapping. */
                    296:
                    297:             if (cursed)
                    298:             {
                    299:                 msg("Your mind goes blank for a moment.");
                    300:                 wclear(cw);
                    301:                 light(&hero);
                    302:                 status(TRUE);
                    303:                 break;
                    304:             }
                    305:
                    306:             if (is_scroll && know_items[TYP_SCROLL][S_MAP] != TRUE)
                    307:             {
                    308:                 msg("Oh! This scroll has a map on it!!");
                    309:                 know_items[TYP_SCROLL][S_MAP] = TRUE;
                    310:             }
                    311:
                    312:             if (blessed)
                    313:                 turn_on(player, BLESSMAP);
                    314:
                    315:             overwrite(stdscr, hw);
                    316:
                    317:             /* Take all the things we want to keep hidden out of the window */
                    318:
                    319:             for (i = 0; i < LINES; i++)
                    320:                 for (j = 0; j < COLS; j++)
                    321:                 {
                    322:                     switch (nch = ch = CCHAR(mvwinch(hw, i, j)))
                    323:                     {
                    324:                         case SECRETDOOR:
                    325:                             nch = DOOR;
                    326:                             mvaddch(i, j, nch);
                    327:                             break;
                    328:
                    329:                         case '-':
                    330:                         case '|':
                    331:                         case DOOR:
                    332:                         case PASSAGE:
                    333:                         case ' ':
                    334:                         case STAIRS:
                    335:                             if (mvwinch(mw, i, j) != ' ')
                    336:                             {
                    337:                                 struct thing    *it;
                    338:                                 struct linked_list  *lit;
                    339:
                    340:                                 lit = find_mons(i, j);
                    341:
                    342:                                if (lit) {
                    343:                                    it = THINGPTR(lit);
                    344:
                    345:                                    if (it && it->t_oldch == ' ')
                    346:                                        it->t_oldch = nch;
                    347:                                }
                    348:                             }
                    349:                             break;
                    350:
                    351:                         default:
                    352:                             if (!blessed || !isatrap(ch))
                    353:                                 nch = ' ';
                    354:                             else
                    355:                             {
                    356:                                 struct trap *tp;
                    357:                                 struct room *rp;
                    358:
                    359:                                 tp = trap_at(i, j);
                    360:                                 rp = roomin(hero);
                    361:
                    362:                                 if (tp->tr_type == FIRETRAP && rp != NULL)
                    363:                                 {
                    364:                                     rp->r_flags &= ~ISDARK;
                    365:                                     light(&hero);
                    366:                                 }
                    367:
                    368:                                 tp->tr_flags |= ISFOUND;
                    369:                             }
                    370:                     }
                    371:                     if (nch != ch)
                    372:                         waddch(hw, nch);
                    373:                 }
                    374:
                    375:             /* Copy in what he has discovered */
                    376:             overlay(cw, hw);
                    377:
                    378:             /* And set up for display */
                    379:             overwrite(hw, cw);
                    380:
                    381:             break;
                    382:
                    383:         case S_GFIND:
                    384:             /* Scroll of gold detection */
                    385:
                    386:             if (cursed)
                    387:             {
                    388:                 int n = roll(3, 6);
                    389:                 int k;
                    390:                 struct room *rp;
                    391:                 coord   pos;
                    392:
                    393:                 msg("You begin to feel greedy and you sense gold.");
                    394:                 wclear(hw);
                    395:
                    396:                 for (k = 1; k < n; k++)
                    397:                 {
                    398:                     rp = &rooms[rnd_room()];
                    399:                     rnd_pos(rp, &pos);
                    400:                     mvwaddch(hw, pos.y, pos.x, GOLD);
                    401:                 }
                    402:                 overlay(hw, cw);
                    403:
                    404:                 break;
                    405:             }
                    406:
                    407:             if (blessed)
                    408:                 turn_on(player, BLESSGOLD);
                    409:
                    410:             if (gsense() && is_scroll)
                    411:                 know_items[TYP_SCROLL][S_GFIND] = TRUE;
                    412:
                    413:             break;
                    414:
                    415:         case S_SELFTELEP:
                    416:
                    417:             /* Scroll of teleportation: Make him disappear and reappear */
                    418:
                    419:             if (cursed)
                    420:             {
                    421:                 level += 5 + rnd(5);
                    422:                 new_level(NORMLEV,0);
                    423:                 mpos = 0;
                    424:                 msg("You are banished to the lower regions.");
                    425:             }
                    426:             else if (blessed)
                    427:             {
                    428:                 level -= rnd(3) + 1;
                    429:
                    430:                 if (level < 1)
                    431:                     level = 1;
                    432:
                    433:                 mpos = 0;
                    434:                 new_level(NORMLEV,0); /* change levels */
                    435:                 status(TRUE);
                    436:                 msg("You are whisked away to another region.");
                    437:             }
                    438:             else
                    439:             {
                    440:                 teleport();
                    441:
                    442:                 if (is_scroll)
                    443:                     know_items[TYP_SCROLL][S_SELFTELEP] = TRUE;
                    444:             }
                    445:
                    446:             if (off(player, ISCLEAR))
                    447:             {
                    448:                 if (on(player, ISHUH))
                    449:                     lengthen_fuse(FUSE_UNCONFUSE, rnd(4) + 4);
                    450:                 else
                    451:                 {
                    452:                     light_fuse(FUSE_UNCONFUSE, 0, rnd(4) + 4, AFTER);
                    453:                     turn_on(player, ISHUH);
                    454:                 }
                    455:             }
                    456:             else
                    457:                 msg("You feel dizzy for a moment, but it quickly passes.");
                    458:
                    459:             break;
                    460:
                    461:         case S_SCARE:
                    462:
                    463:             /*
                    464:              * A blessed scroll of scare monster automatically transports
                    465:              * itself to the hero's feet
                    466:              *
                    467:              */
                    468:
                    469:             if (blessed)
                    470:             {
                    471:                 ch = CCHAR( mvwinch(stdscr, hero.y, hero.x) );
                    472:
                    473:                 if (ch != FLOOR && ch != PASSAGE)
                    474:                 {
                    475:                     msg("Your feet tickle for a moment");
                    476:                     return;
                    477:                 }
                    478:
                    479:                 item = spec_item(SCROLL, S_SCARE, 0, 0);
                    480:
                    481:                 obj = OBJPTR(item);
                    482:                 obj->o_flags = ISCURSED;
                    483:                 obj->o_pos = hero;
                    484:                 add_obj(item, hero.y, hero.x);
                    485:                 msg("A wave of terror sweeps throughout the room");
                    486:             }
                    487:             else
                    488:             {
                    489:                 /*
                    490:                  * A monster will refuse to step on a scare monster
                    491:                  * scroll if it is dropped.  Thus reading it is a
                    492:                  * mistake and produces laughter at the poor rogue's
                    493:                  * boo boo.
                    494:                  */
                    495:
                    496:                 msg("You hear maniacal laughter in the distance.");
                    497:
                    498:                 if (cursed) /* If cursed, monsters get mad */
                    499:                     aggravate();
                    500:             }
                    501:             break;
                    502:
                    503:         case S_REMOVECURSE:
                    504:             if (cursed)     /* curse a player's possession */
                    505:             {
                    506:                 for (nitem = pack; nitem != NULL; nitem = next(nitem))
                    507:                 {
                    508:                     obj = OBJPTR(nitem);
                    509:
                    510:                     if (rnd(5) == 0)
                    511:                         if (obj->o_flags & ISBLESSED)
                    512:                             obj->o_flags &= ~ISBLESSED;
                    513:                         else
                    514:                             obj->o_flags |= ISCURSED;
                    515:                 }
                    516:                 msg("The smell of fire and brimstone comes from your pack.");
                    517:             }
                    518:             else if (blessed)
                    519:             {
                    520:                 for (nitem = pack; nitem != NULL; nitem = next(nitem))
                    521:                     (OBJPTR(nitem))->o_flags &= ~ISCURSED;
                    522:
                    523:                 msg("Your pack glistens brightly.");
                    524:             }
                    525:             else
                    526:             {
                    527:                 if ((nitem = get_item("remove the curse on", 0)) != NULL)
                    528:                 {
                    529:                     obj = OBJPTR(nitem);
                    530:                     msg("Removed the curse from %s.", inv_name(obj, LOWERCASE));
                    531:                     obj->o_flags &= ~ISCURSED;
                    532:
                    533:                     if (is_scroll)
                    534:                         know_items[TYP_SCROLL][S_REMOVECURSE] = TRUE;
                    535:                 }
                    536:             }
                    537:             break;
                    538:
                    539:         case S_PETRIFY:
                    540:             switch(CCHAR(mvinch(hero.y, hero.x)))
                    541:             {
                    542:                 case TRAPDOOR:
                    543:                 case DARTTRAP:
                    544:                 case TELTRAP:
                    545:                 case ARROWTRAP:
                    546:                 case SLEEPTRAP:
                    547:                 case BEARTRAP:
                    548:                 case FIRETRAP:
                    549:                 {
                    550:                     int n;
                    551:
                    552:                     /* Find the right trap */
                    553:                     for (n = 0; n < ntraps && !ce(traps[n].tr_pos, hero); n++)
                    554:                         ;
                    555:
                    556:                     ntraps--;
                    557:
                    558:                     if (!ce(traps[n].tr_pos, hero))
                    559:                         msg("What a strange trap!");
                    560:                     else
                    561:                     {
                    562:                         while (n < ntraps)
                    563:                         {
                    564:                             traps[n] = traps[n + 1];
                    565:                             n++;
                    566:                         }
                    567:                     }
                    568:
                    569:                     msg("The dungeon begins to rumble and shake!");
                    570:                     addch(WALL);
                    571:
                    572:                     if (on(player, CANINWALL))
                    573:                     {
                    574:                         extinguish_fuse(FUSE_UNPHASE);
                    575:                         turn_off(player, CANINWALL);
                    576:                         msg("Your dizzy feeling leaves you.");
                    577:                     }
                    578:
                    579:                     turn_on(player, ISINWALL);
                    580:                 }
                    581:                 break;
                    582:
                    583:                 case DOOR:
                    584:                 case SECRETDOOR:
                    585:                 {
                    586:                     struct room *rp = roomin(hero);
                    587:                     short   n;
                    588:
                    589:                     /* Find the right door */
                    590:
                    591:                     for (n=0; n<rp->r_nexits && !ce(rp->r_exit[n], hero); n++)
                    592:                         /* do nothing */ ;
                    593:
                    594:                     rp->r_nexits--;
                    595:
                    596:                     if (!ce(rp->r_exit[n], hero))
                    597:                         msg("What a strange door!");
                    598:                     else
                    599:                     {
                    600:                         while (n < rp->r_nexits)
                    601:                         {
                    602:                             rp->r_exit[n] = rp->r_exit[n + 1];
                    603:                             n++;
                    604:                         }
                    605:                     }
                    606:                     /* No break - fall through */
                    607:                 }
                    608:                 case FLOOR:
                    609:                 case PASSAGE:
                    610:                     msg("The dungeon begins to rumble and shake!");
                    611:                     addch(WALL);
                    612:
                    613:                     if (on(player, CANINWALL))
                    614:                     {
                    615:                         extinguish_fuse(FUSE_UNPHASE);
                    616:                         turn_off(player, CANINWALL);
                    617:                         msg("Your dizzy feeling leaves you.");
                    618:                     }
                    619:
                    620:                     turn_on(player, ISINWALL);
                    621:                     break;
                    622:
                    623:                 default:
                    624:                     nothing_message(flags);
                    625:                     break;
                    626:             }
                    627:             break;
                    628:
                    629:         case  S_GENOCIDE:
                    630:             msg("You have been granted the boon of genocide!--More--");
                    631:
                    632:             wait_for(' ');
                    633:             msg("");
                    634:
                    635:             genocide(flags);
                    636:
                    637:             if (is_scroll)
                    638:                 know_items[TYP_SCROLL][S_GENOCIDE] = TRUE;
                    639:
                    640:             break;
                    641:
                    642:         case S_PROTECT:
                    643:             if (is_scroll && know_items[TYP_SCROLL][S_PROTECT] == FALSE)
                    644:             {
                    645:                 msg("You can protect something from rusting or theft.");
                    646:                 know_items[TYP_SCROLL][S_PROTECT] = TRUE;
                    647:             }
                    648:
                    649:             if ((item = get_item("protect", 0)) != NULL)
                    650:             {
                    651:                 struct object   *lb = OBJPTR(item);
                    652:
                    653:                 if (cursed)
                    654:                 {
                    655:                     lb->o_flags &= ~ISPROT;
                    656:                     mpos = 0;
                    657:                     msg("Unprotected %s.", inv_name(lb, LOWERCASE));
                    658:                 }
                    659:                 else
                    660:                 {
                    661:                     lb->o_flags |= ISPROT;
                    662:                     mpos = 0;
                    663:                     msg("Protected %s.", inv_name(lb, LOWERCASE));
                    664:                 }
                    665:             }
                    666:             break;
                    667:
                    668:         case S_MAKEITEMEM:
                    669:             if (!is_scroll || rnd(luck))
                    670:                 feel_message();
                    671:             else
                    672:             {
                    673:                 char itemtype;
                    674:
                    675:                 if (is_scroll)
                    676:                     know_items[TYP_SCROLL][S_MAKEITEMEM] = TRUE;
                    677:
                    678:                 msg("You have been endowed with the power of creation.");
                    679:
                    680:                 if (blessed)
                    681:                     itemtype = '\0';
                    682:                 else
                    683:                     switch (rnd(6))
                    684:                     {
                    685:                         case 0: itemtype = RING;    break;
                    686:                         case 1: itemtype = POTION;  break;
                    687:                         case 2: itemtype = SCROLL;  break;
                    688:                         case 3: itemtype = ARMOR;   break;
                    689:                         case 4: itemtype = WEAPON;  break;
                    690:                         case 5: itemtype = STICK;   break;
                    691:                     }
                    692:
                    693:                 flags |= SCR_MAGIC;
                    694:                 buy_it(itemtype, flags);
                    695:             }
                    696:             break;
                    697:
                    698:         case S_ENCHANT:
                    699:         {
                    700:             struct linked_list  *ll;
                    701:             struct object   *lb;
                    702:             int howmuch, flg=0;
                    703:
                    704:             if (is_scroll && know_items[TYP_SCROLL][S_ENCHANT] == FALSE)
                    705:             {
                    706:                 msg("You are granted the power of enchantment.");
                    707:                 msg("You may enchant anything(weapon,ring,armor,scroll,potion)");
                    708:                 know_items[TYP_SCROLL][S_ENCHANT] = TRUE;
                    709:             }
                    710:
                    711:             if ((ll = get_item("enchant", 0)) != NULL)
                    712:             {
                    713:                 lb = OBJPTR(ll);
                    714:                 lb->o_flags &= ~ISCURSED;
                    715:
                    716:                 if (blessed)
                    717:                     howmuch = 2;
                    718:                 else if (cursed)
                    719:                     howmuch = -1;
                    720:                 else
                    721:                 {
                    722:                     howmuch = 1;
                    723:                     flg |= ISBLESSED;
                    724:                 }
                    725:
                    726:                 switch (lb->o_type)
                    727:                 {
                    728:                     case RING:
                    729:                         lb->o_ac += howmuch;
                    730:
                    731:                         if (lb->o_ac > 5 && rnd(5) == 0)
                    732:                         {
                    733:                             msg("Your ring explodes in a cloud of smoke.");
                    734:                             lb->o_flags &= ~ISCURSED;
                    735:                             dropcheck(lb);
                    736:
                    737:                             switch (lb->o_which)
                    738:                             {
                    739:                                 case R_ADDSTR:
                    740:                                     chg_str(-2, TRUE, FALSE);
                    741:                                     break;
                    742:                                 case R_ADDHIT:
                    743:                                     chg_dext(-2, TRUE, FALSE);
                    744:                                     break;
                    745:                                 case R_ADDINTEL:
                    746:                                     pstats.s_intel -= 2;
                    747:                                     max_stats.s_intel -= 2;
                    748:                                     break;
                    749:                                 case R_ADDWISDOM:
                    750:                                     pstats.s_wisdom -= 2;
                    751:                                     max_stats.s_wisdom -= 2;
                    752:                                     break;
                    753:                             }
                    754:
                    755:                             del_pack(ll);
                    756:                             lb = NULL;
                    757:                         }
                    758:                         else if (is_r_on(lb))
                    759:                             switch (lb->o_which)
                    760:                             {
                    761:                                 case R_ADDSTR:
                    762:                                     pstats.s_str += howmuch;
                    763:                                     break;
                    764:                                 case R_ADDHIT:
                    765:                                     pstats.s_dext += howmuch;
                    766:                                     break;
                    767:                                 case R_ADDINTEL:
                    768:                                     pstats.s_intel += howmuch;
                    769:                                     break;
                    770:                                 case R_ADDWISDOM:
                    771:                                     pstats.s_wisdom += howmuch;
                    772:                                     break;
                    773:                                 case R_CARRYING:
                    774:                                     updpack();
                    775:                                     break;
                    776:                             }
                    777:
                    778:                         break;
                    779:
                    780:                     case ARMOR:
                    781:                         lb->o_ac -= howmuch;
                    782:
                    783:                         if (armors[lb->o_which].a_class - lb->o_ac > 5 && rnd(5) == 0)
                    784:                         {
                    785:                             msg("Your %s explodes in a cloud of dust.",
                    786:                                 inv_name(lb, LOWERCASE));
                    787:
                    788:                             lb->o_flags &= ~ISCURSED;
                    789:
                    790:                             if (lb == cur_armor)
                    791:                                 pstats.s_hpt /= 2;
                    792:
                    793:                             dropcheck(lb);
                    794:                             del_pack(ll);
                    795:                             lb = NULL;
                    796:                         }
                    797:                         break;
                    798:
                    799:                     case STICK:
                    800:                         if (wizard || howmuch != 1 && rnd(5) == 0)
                    801:                             lb->o_flags |= flg;
                    802:
                    803:                         lb->o_charges += howmuch + 10;
                    804:
                    805:                         if (lb->o_charges < 0)
                    806:                             lb->o_charges = 0;
                    807:
                    808:                         if (lb->o_charges > 50 && rnd(5) == 0)
                    809:                         {
                    810:                             msg("Your %s explodes into splinters.",
                    811:                                 inv_name(lb, LOWERCASE));
                    812:
                    813:                             lb->o_flags &= ~ISCURSED;
                    814:                             dropcheck(lb);
                    815:                             del_pack(ll);
                    816:                             lb = NULL;
                    817:                         }
                    818:                         break;
                    819:
                    820:                     case WEAPON:
                    821:                         if (rnd(100) < 50)
                    822:                             lb->o_hplus += howmuch;
                    823:                         else
                    824:                             lb->o_dplus += howmuch;
                    825:
                    826:                         if (lb->o_hplus + lb->o_dplus > 10 && rnd(5) == 0)
                    827:                         {
                    828:                             msg("Your %s explodes in a cloud of shrapnel",
                    829:                                 inv_name(lb, LOWERCASE));
                    830:
                    831:                             lb->o_flags &= ~ISCURSED;
                    832:
                    833:                             if (lb == cur_weapon)
                    834:                                 chg_dext(-2, FALSE, TRUE);
                    835:
                    836:                             dropcheck(lb);
                    837:                             del_pack(ll);
                    838:                             lb = NULL;
                    839:
                    840:                         }
                    841:                         break;
                    842:
                    843:                     case POTION:
                    844:                     case SCROLL:
                    845:                     default:
                    846:                         lb->o_flags |= flg;
                    847:                         break;
                    848:                 }
                    849:
                    850:                 mpos = 0;
                    851:
                    852:                 if (lb != NULL)
                    853:                     msg("Enchanted %s.", inv_name(lb, LOWERCASE));
                    854:             }
                    855:         }
                    856:         break;
                    857:
                    858:         case S_NOTHING:
                    859:             nothing_message(flags);
                    860:             break;
                    861:
                    862:         case S_SILVER:
                    863:         {
                    864:             struct object   *lb;
                    865:
                    866:             if (is_scroll && know_items[TYP_SCROLL][S_SILVER] == FALSE)
                    867:             {
                    868:                 msg("You are granted the power of magic hitting.");
                    869:                 know_items[TYP_SCROLL][S_SILVER] = TRUE;
                    870:             }
                    871:
                    872:             if ((item = get_item("annoint", WEAPON)) != NULL)
                    873:             {
                    874:                 lb = OBJPTR(item);
                    875:
                    876:                 if (blessed && !(lb->o_flags & ISSILVER))
                    877:                 {
                    878:                     lb->o_hplus += rnd(3) + 1;
                    879:                     lb->o_flags |= ISSILVER;
                    880:                     lb->o_flags |= ISMETAL;
                    881:                     msg("Your weapon has turned to silver!");
                    882:                 }
                    883:                 else if (cursed && (lb->o_flags & ISSILVER))
                    884:                 {
                    885:                     lb->o_hplus -= (rnd(3) + 1);
                    886:                     lb->o_flags &= ~ISSILVER;
                    887:                     msg("Your silver weapon has turned to steel.");
                    888:                 }
                    889:                 else if (lb->o_flags & ISSILVER)
                    890:                 {
                    891:                     msg("Your silver weapon glitters briefly.");
                    892:                     lb->o_hplus += rnd(2);
                    893:                 }
                    894:                 else
                    895:                 {
                    896:                     lb->o_hplus += rnd(3);
                    897:                     lb->o_flags |= ISSILVER;
                    898:                     lb->o_flags |= ISMETAL;
                    899:                     msg("Your weapon has turned to silver.");
                    900:                 }
                    901:             }
                    902:         }
                    903:         break;
                    904:         case S_OWNERSHIP:
                    905:         {
                    906:             struct linked_list  *ll;
                    907:             struct object   *lb;
                    908:
                    909:             if (is_scroll && know_items[TYP_SCROLL][S_OWNERSHIP] == FALSE)
                    910:             {
                    911:                 msg("You are granted the power of ownership.");
                    912:                 know_items[TYP_SCROLL][S_OWNERSHIP] = TRUE;
                    913:             }
                    914:
                    915:             if ((ll = get_item("claim", 0)) != NULL)
                    916:             {
                    917:                 lb = OBJPTR(ll);
                    918:
                    919:                 if (cursed && lb->o_flags & (ISOWNED | CANRETURN))
                    920:                 {
                    921:                     lb->o_flags &= ~(ISOWNED | CANRETURN);
                    922:                     msg("The gods seem to have forgotten you.");
                    923:                 }
                    924:                 else if (cursed && !(lb->o_flags & ISLOST))
                    925:                 {
                    926:                     lb->o_flags |= ISLOST;
                    927:                     msg("The gods look the other way.");
                    928:                 }
                    929:                 else if (blessed && lb->o_flags & ISLOST)
                    930:                 {
                    931:                     lb->o_flags |= CANRETURN;
                    932:                     msg("The gods seem to have remembered you.");
                    933:                 }
                    934:                 else if (blessed && !(lb->o_flags & ISOWNED))
                    935:                 {
                    936:                     lb->o_flags |= (ISOWNED | CANRETURN);
                    937:                     msg("The gods smile upon you.");
                    938:                 }
                    939:                 else if (blessed | cursed)
                    940:                 {
                    941:                     nothing_message(flags);
                    942:                 }
                    943:                 else
                    944:                 {
                    945:                     lb->o_flags |= CANRETURN;
                    946:                     msg("The gods look upon you.");
                    947:                 }
                    948:             }
                    949:         }
                    950:         break;
                    951:
                    952:         case S_FOODDET:
                    953:
                    954:             /* Scroll of food detection */
                    955:
                    956:             if (cursed)
                    957:             {
                    958:                 int n = roll(3, 6);
                    959:                 int k;
                    960:                 struct room *rp;
                    961:                 coord   pos;
                    962:
                    963:                 msg("You begin to feel hungry and you smell food.");
                    964:                 wclear(hw);
                    965:
                    966:                 for (k = 1; k < n; k++)
                    967:                 {
                    968:                     rp = &rooms[rnd_room()];
                    969:                     rnd_pos(rp, &pos);
                    970:                     mvwaddch(hw, pos.y, pos.x, FOOD);
                    971:                 }
                    972:
                    973:                 overlay(hw, cw);
                    974:
                    975:                 if (is_scroll)
                    976:                     know_items[TYP_SCROLL][S_FOODDET] = TRUE;
                    977:
                    978:                 break;
                    979:             }
                    980:
                    981:             if (blessed)
                    982:                 turn_on(player, BLESSFOOD);
                    983:
                    984:             if (off(player, ISUNSMELL) && lvl_obj != NULL)
                    985:             {
                    986:                 struct linked_list  *itm;
                    987:                 struct object   *cur;
                    988:                 struct thing    *th;
                    989:                 int fcount = 0;
                    990:                 int  same_room = FALSE;
                    991:                 struct room *rp = roomin(hero);
                    992:
                    993:                 wclear(hw);
                    994:
                    995:                 for (itm = lvl_obj; itm != NULL; itm = next(itm))
                    996:                 {
                    997:                     cur = OBJPTR(itm);
                    998:
                    999:                     if (cur->o_type == FOOD)
                   1000:                     {
                   1001:                         fcount += cur->o_count;
                   1002:                         mvwaddch(hw, cur->o_pos.y, cur->o_pos.x, FOOD);
                   1003:
                   1004:                         if (roomin(cur->o_pos) == rp)
                   1005:                             same_room = TRUE;
                   1006:                     }
                   1007:                 }
                   1008:
                   1009:                 for (itm = mlist; itm != NULL; itm = next(itm))
                   1010:                 {
                   1011:                     struct linked_list  *pitem;
                   1012:
                   1013:                     th = THINGPTR(itm);
                   1014:
                   1015:                     for (pitem = th->t_pack; pitem != NULL; pitem = next(pitem))
                   1016:                     {
                   1017:                         cur = OBJPTR(pitem);
                   1018:
                   1019:                         if (cur->o_type == FOOD)
                   1020:                         {
                   1021:                             fcount += cur->o_count;
                   1022:                             mvwaddch(hw, th->t_pos.y, th->t_pos.x, FOOD);
                   1023:
                   1024:                             if (roomin(th->t_pos) == rp)
                   1025:                                 same_room = TRUE;
                   1026:                         }
                   1027:                     }
                   1028:                 }
                   1029:
                   1030:                 if (fcount)
                   1031:                 {
                   1032:                     if (is_scroll)
                   1033:                         know_items[TYP_SCROLL][S_FOODDET] = TRUE;
                   1034:
                   1035:                     if (same_room)
                   1036:                         msg("FOOOOD!!");
                   1037:                     else
                   1038:                         msg("You begin to feel hungry and you smell food.");
                   1039:
                   1040:                     overlay(hw, cw);
                   1041:                     break;
                   1042:                 }
                   1043:             }
                   1044:
                   1045:             if (off(player, ISUNSMELL))
                   1046:                 msg("You can't smell anything.");
                   1047:             else
                   1048:                 nothing_message(flags);
                   1049:
                   1050:             break;
                   1051:
                   1052:         case S_ELECTRIFY:
                   1053:             if (on(player, ISELECTRIC))
                   1054:             {
                   1055:                 msg("Your violet glow brightens for an instant.");
                   1056:                 lengthen_fuse(FUSE_UNELECTRIFY, 4 + rnd(8));
                   1057:             }
                   1058:             else
                   1059:             {
                   1060:                 msg("Your body begins to glow violet and shoot sparks.");
                   1061:                 turn_on(player, ISELECTRIC);
                   1062:                 light_fuse(FUSE_UNELECTRIFY,0,(blessed?3:1)*WANDERTIME, AFTER);
                   1063:                 light(&hero);
                   1064:             }
                   1065:
                   1066:             if (is_scroll)
                   1067:                 know_items[TYP_SCROLL][S_ELECTRIFY] = TRUE;
                   1068:
                   1069:             break;
                   1070:
                   1071:         case S_CHARM:
                   1072:
                   1073:             /*
                   1074:              * Beauty, brains and experience make a person charming.
                   1075:              * Unique monsters can never be charmed.
                   1076:              */
                   1077:
                   1078:             charm_power = pstats.s_charisma / 2 + pstats.s_lvl / 3 + max(0, pstats.s_intel - 15);
                   1079:
                   1080:             if (cursed)
                   1081:             {
                   1082:                 msg("You hear harsh, dissonant twanging throughout the dungeon.");
                   1083:                 aggravate();
                   1084:             }
                   1085:             else if (blessed)  /* Charm entire level */
                   1086:             {
                   1087:                 struct linked_list  *mon;
                   1088:
                   1089:                 msg("You hear ringingly meliflous music all around you.");
                   1090:
                   1091:                 for (mon = mlist; mon != NULL; mon = next(mon))
                   1092:                 {
                   1093:                     struct thing    *th = THINGPTR(mon);
                   1094:
                   1095:                     if (th->t_stats.s_intel < charm_power && off(*th, ISUNIQUE))
                   1096:                     {
                   1097:                         turn_on(*th, ISCHARMED);
                   1098:                         chase_it(&th->t_pos, &player);
                   1099:                     }
                   1100:                 }
                   1101:             }
                   1102:             else        /* Charm all monsters within two spaces of the hero */
                   1103:             {
                   1104:                 int x, y;
                   1105:                 struct linked_list  *mon;
                   1106:
                   1107:                 msg("You hear soft, lyrical music all around you.");
                   1108:
                   1109:                 for (x = hero.x - 2; x <= hero.x + 2; x++)
                   1110:                     for (y = hero.y - 2; y <= hero.y + 2; y++)
                   1111:                         if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x)))
                   1112:                         {
                   1113:                             if ((mon = find_mons(y, x)) != NULL)
                   1114:                             {
                   1115:                                 struct thing    *th;
                   1116:
                   1117:                                 th = THINGPTR(mon);
                   1118:
                   1119:                                 if (th->t_stats.s_intel < charm_power && off(*th, ISUNIQUE))
                   1120:                                 {
                   1121:                                     turn_on(*th, ISCHARMED);
                   1122:                                     chase_it(&th->t_pos, &player);
                   1123:                                 }
                   1124:                             }
                   1125:                         }
                   1126:             }
                   1127:             break;
                   1128:
                   1129:         case S_SUMMON:
                   1130:         {
                   1131:             struct linked_list  *llp;
                   1132:             struct thing    *tp;
                   1133:             int mon_type;
                   1134:
                   1135:             if (on(player, HASSUMMONED))
                   1136:             {
                   1137:                 nothing_message(flags);
                   1138:                 break;
                   1139:             }
                   1140:
                   1141:             if (cursed)
                   1142:             {
                   1143:                 creat_mons(&player, (short) 0, MESSAGE);
                   1144:                 break;
                   1145:             }
                   1146:
                   1147:             if (blessed)    /* Summon a possibly very high monster */
                   1148:             {
                   1149:                 int nsides = max(2, max(pstats.s_lvl, 12) - luck);
                   1150:
                   1151:                 mon_type = roll(nsides, rnd(pstats.s_charisma + 15) + 8);
                   1152:                 mon_type = min(mon_type, nummonst);
                   1153:             }
                   1154:             else
                   1155:                 mon_type = 0;
                   1156:
                   1157:            llp = summon_monster((short) mon_type, NOFAMILIAR, NOMESSAGE);
                   1158:
                   1159:             if (llp)
                   1160:             {
                   1161:                 tp = THINGPTR(llp);
                   1162:                 turn_on(*tp, WASSUMMONED);
                   1163:                 turn_on(player, HASSUMMONED);
                   1164:                 msg("You have summoned a %s.", monsters[tp->t_index].m_name);
                   1165:                 light_fuse(FUSE_UNSUMMON, llp, WANDERTIME + rnd(pstats.s_lvl), AFTER);
                   1166:             }
                   1167:         }
                   1168:         break;
                   1169:
                   1170:         case S_REFLECT:
                   1171:             if (on(player, CANREFLECT))
                   1172:             {
                   1173:                 msg("The sparkling around you brightens momentarily.");
                   1174:                 lengthen_fuse(FUSE_UNGAZE, 5 + rnd(10));
                   1175:             }
                   1176:             else
                   1177:             {
                   1178:                 msg("Shiny particles sparkle all around you.");
                   1179:                 turn_on(player, CANREFLECT);
                   1180:                 light_fuse(FUSE_UNGAZE, 0, (blessed ? 3 : 1) * WANDERTIME, AFTER);
                   1181:             }
                   1182:             break;
                   1183:
                   1184:         case S_SUMFAMILIAR:
                   1185:         {
                   1186:             int type = 0;
                   1187:
                   1188:             if (on(player, HASFAMILIAR))
                   1189:             {
                   1190:                 msg("But you already have a familiar - somewhere...");
                   1191:                 return;
                   1192:             }
                   1193:
                   1194:             if (wizard)
                   1195:                 type = get_monster_number("be your familiar");
                   1196:             else if (blessed)  /* Summon a possibly very high monster */
                   1197:             {
                   1198:                 int nsides = max(2, max(pstats.s_lvl, 12) - luck);
                   1199:
                   1200:                 type = roll(nsides, rnd(pstats.s_charisma + 15) + 8);
                   1201:                 type = min(type, nummonst);
                   1202:             }
                   1203:             else if (cursed)    /* Summon a bat, maggot, eye, etc */
                   1204:             {
                   1205:                 type = rnd(20) + 1;
                   1206:
                   1207:                 if (summon_monster(type, FAMILIAR, MESSAGE))
                   1208:                     turn_on(player, HASFAMILIAR);
                   1209:             }
                   1210:         }
                   1211:         break;
                   1212:
                   1213:         case S_FEAR:
                   1214:
                   1215:             /* if cursed, you get frightened */
                   1216:
                   1217:             if (cursed)
                   1218:             {
                   1219:                 if (off(player, SUPERHERO) && (player.t_ctype != C_PALADIN) && !save(VS_DEATH))
                   1220:                     msg("A momentary wave of panic sweeps over you.");
                   1221:                 else
                   1222:                 {
                   1223:                     msg("Panicstricken, you fall into a coma.");
                   1224:                     no_command += roll(2, SLEEPTIME);
                   1225:                 }
                   1226:             }
                   1227:             else
                   1228:             {
                   1229:                 /*
                   1230:                  * terrify monster scroll.  frightens all monsters
                   1231:                  * within 2 spaces
                   1232:                  */
                   1233:                 int x, y;
                   1234:                 struct linked_list  *mon;
                   1235:                 int  gotone = FALSE;
                   1236:
                   1237:                 for (x = hero.x - 2; x <= hero.x + 2; x++)
                   1238:                 {
                   1239:                     for (y = hero.y - 2; y <= hero.y + 2; y++)
                   1240:                     {
                   1241:                         if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x)))
                   1242:                         {
                   1243:                             if ((mon = find_mons(y, x)) != NULL)
                   1244:                             {
                   1245:                                 struct thing    *th;
                   1246:
                   1247:                                 th = THINGPTR(mon);
                   1248:
                   1249:                                 if (on(*th, ISUNDEAD) || on(*th, ISUNIQUE))
                   1250:                                     continue;
                   1251:
                   1252:                                 gotone = TRUE;
                   1253:                                 turn_on(*th, ISFLEE);
                   1254:                                 th->t_chasee = &player;
                   1255:                                 th->t_ischasing = FALSE;
                   1256:                                 th->t_horde = NULL;
                   1257:                             }
                   1258:                         }
                   1259:                     }
                   1260:                 }
                   1261:
                   1262:                 if (gotone)
                   1263:                     seemsg("The monster(s) around you recoil in horror.");
                   1264:                 else
                   1265:                     nothing_message(flags);
                   1266:             }
                   1267:             break;
                   1268:
                   1269:         case  S_MSHIELD:  /* deal with blessed/cursed later */
                   1270:             if (on(player, HASMSHIELD))
                   1271:             {
                   1272:                 seemsg("The fog around you thickens.");
                   1273:                 lengthen_fuse(FUSE_UNMSHIELD, (blessed ? 3 : 1) * HEROTIME);
                   1274:             }
                   1275:             else
                   1276:             {
                   1277:                 seemsg("A fog forms around you.");
                   1278:                 turn_on(player, HASMSHIELD);
                   1279:                 light_fuse(FUSE_UNMSHIELD, 0, (blessed ? 3 : 1) * HEROTIME, AFTER);
                   1280:             }
                   1281:
                   1282:             if (is_scroll)
                   1283:                 know_items[TYP_SCROLL][S_MSHIELD] = TRUE;
                   1284:
                   1285:             break;
                   1286:
                   1287:         default:
                   1288:             msg("What a puzzling scroll!");
                   1289:             return;
                   1290:     }
                   1291:
                   1292:     look(TRUE);     /* put the result of the scroll on the screen */
                   1293:     status(FALSE);
                   1294:
                   1295:     if (is_scroll)
                   1296:     {
                   1297:         if (know_items[TYP_SCROLL][which] && guess_items[TYP_SCROLL][which])
                   1298:         {
                   1299:             ur_free(guess_items[TYP_SCROLL][which]);
                   1300:             guess_items[TYP_SCROLL][which] = NULL;
                   1301:         }
                   1302:         else if (askme && !know_items[TYP_SCROLL][which] && guess_items[TYP_SCROLL][which] == NULL)
                   1303:         {
                   1304:             msg("What do you want to call it? ");
                   1305:
                   1306:             if (get_string(buf, cw) == NORM)
                   1307:             {
                   1308:                 guess_items[TYP_SCROLL][which] = new_alloc(strlen(buf) + 1);
                   1309:                 strcpy(guess_items[TYP_SCROLL][which], buf);
                   1310:             }
                   1311:         }
                   1312:     }
                   1313: }
                   1314:
                   1315: /*
                   1316:     creat_mons()
                   1317:         creates the specified monster -- any if 0
                   1318: */
                   1319:
                   1320: struct linked_list  *
                   1321: creat_mons(struct thing *person, int monster, int message)
                   1322: {
                   1323:     coord   mp;
                   1324:
                   1325:     /* Search for an open place */
                   1326:
                   1327:     debug("Creator @(%d, %d) ", person->t_pos.y, person->t_pos.x);
                   1328:
                   1329:     if ((place_mons(person->t_pos.y, person->t_pos.x, &mp)) != FALSE)
                   1330:     {
                   1331:         struct linked_list *nitem;
                   1332:
                   1333:         nitem = new_item(sizeof(struct thing));
                   1334:         new_monster(nitem, monster == 0 ? randmonster(NOWANDER, NOGRAB)
                   1335:                 : monster, &mp, MAXSTATS);
                   1336:         chase_it(&mp, &player);
                   1337:
                   1338:         /* If the monster is on a trap, trap it */
                   1339:
                   1340:         if (isatrap(mvinch(mp.y, mp.x)))
                   1341:         {
                   1342:             debug("Monster trapped during creat_mons.");
                   1343:             be_trapped(THINGPTR(nitem), mp);
                   1344:         }
                   1345:
                   1346:         light(&hero);
                   1347:         return(nitem);
                   1348:     }
                   1349:
                   1350:     if (message)
                   1351:         hearmsg("You hear a faint cry of anguish in the distance.");
                   1352:
                   1353:     return(NULL);
                   1354: }
                   1355:
                   1356: /*
                   1357:     place_mons()
                   1358:         finds a place to put the monster
                   1359: */
                   1360:
                   1361: int
                   1362: place_mons(int y, int x, coord *pos)
                   1363: {
                   1364:     int distance, xx, yy, appears;
                   1365:
                   1366:     for (distance = 1; distance <= 10; distance++)
                   1367:     {
                   1368:         appears = 0;
                   1369:
                   1370:         for (yy = y - distance; yy <= y + distance; yy++)
                   1371:             for (xx = x - distance; xx <= x + distance; xx++)
                   1372:             {
                   1373:                 /* Don't put a monster in top of the creator or player */
                   1374:
                   1375:                 if (xx < 0 || yy < 0)
                   1376:                     continue;
                   1377:
                   1378:                 if (yy == y && xx == x)
                   1379:                     continue;
                   1380:
                   1381:                 if (yy == hero.y && xx == hero.x)
                   1382:                     continue;
                   1383:
                   1384:                 /* Or anything else nasty */
                   1385:
                   1386:                 if (step_ok(yy, xx, NOMONST, FALSE))
                   1387:                 {
                   1388:                     if (rnd(max(1, (10 * distance - ++appears))) == 0)
                   1389:                     {
                   1390:                         pos->y = yy;
                   1391:                         pos->x = xx;
                   1392:                         debug("Make monster dist %d appear %d @(%d, %d) ",
                   1393:                               distance, appears, pos->y, pos->x);
                   1394:                         return(TRUE);
                   1395:                     }
                   1396:                 }
                   1397:             }
                   1398:     }
                   1399:     return(FALSE);
                   1400: }
                   1401:
                   1402: /*
                   1403:     is_t_on()
                   1404:         This subroutine determines if an object that is a ring is being
                   1405:         worn by the hero  by Bruce Dautrich 4/3/84
                   1406:  */
                   1407:
                   1408: int
                   1409: is_r_on(struct object *obj)
                   1410: {
                   1411:     if (obj == cur_ring[LEFT_1] || obj == cur_ring[LEFT_2] ||
                   1412:         obj == cur_ring[LEFT_3] || obj == cur_ring[LEFT_4] ||
                   1413:         obj == cur_ring[LEFT_5] ||
                   1414:         obj == cur_ring[RIGHT_1] || obj == cur_ring[RIGHT_2] ||
                   1415:         obj == cur_ring[RIGHT_3] || obj == cur_ring[RIGHT_4] ||
                   1416:         obj == cur_ring[RIGHT_5])
                   1417:     {
                   1418:         return(TRUE);
                   1419:     }
                   1420:
                   1421:     return(FALSE);
                   1422: }
                   1423:
                   1424: /*
                   1425:     monread()
                   1426:         monster gets the effect
                   1427: */
                   1428:
                   1429: void
                   1430: monread(struct thing *reader, int which, int flags)
                   1431: {
                   1432:     struct stats    *curp = &(reader->t_stats);
                   1433:     struct stats    *maxp = &(reader->maxstats);
                   1434:     int blessed = flags & ISBLESSED;
                   1435:     int cursed = flags & ISCURSED;
                   1436:
                   1437:     switch (which)
                   1438:     {
                   1439:         case S_SELFTELEP:
                   1440:             /* If monster was suffocating, stop it */
                   1441:             if (on(*reader, DIDSUFFOCATE))
                   1442:             {
                   1443:                 turn_off(*reader, DIDSUFFOCATE);
                   1444:                 extinguish_fuse(FUSE_SUFFOCATE);
                   1445:             }
                   1446:
                   1447:             /* If monster held us, stop it */
                   1448:
                   1449:             if (on(*reader, DIDHOLD) && (hold_count == 0))
                   1450:                 turn_off(player, ISHELD);
                   1451:
                   1452:             turn_off(*reader, DIDHOLD);
                   1453:
                   1454:             if (cursed)
                   1455:                 reader->t_no_move++;
                   1456:             else
                   1457:             {
                   1458:                 int rm;
                   1459:
                   1460:                 if (blessed)    /* Give him his hit points */
                   1461:                     curp->s_hpt = maxp->s_hpt;
                   1462:
                   1463:                 /* Erase the monster from the old position */
                   1464:
                   1465:                 if (isalpha(mvwinch(cw, reader->t_pos.y, reader->t_pos.x)))
                   1466:                     mvwaddch(cw, reader->t_pos.y, reader->t_pos.x, reader->t_oldch);
                   1467:
                   1468:                 mvwaddch(mw, reader->t_pos.y, reader->t_pos.x, ' ');
                   1469:
                   1470:                 /* Get a new position */
                   1471:
                   1472:                 do
                   1473:                 {
                   1474:                     rm = rnd_room();
                   1475:                     rnd_pos(&rooms[rm], &reader->t_pos);
                   1476:                 }
                   1477:                 while (winat(reader->t_pos.y, reader->t_pos.x) != FLOOR);
                   1478:
                   1479:                 /* Put it there */
                   1480:
                   1481:                 mvwaddch(mw, reader->t_pos.y, reader->t_pos.x, reader->t_type);
                   1482:                 reader->t_oldch = CCHAR( mvwinch(cw, reader->t_pos.y, reader->t_pos.x) );
                   1483:             }
                   1484:             break;
                   1485:
                   1486:         default:
                   1487:             debug("'%s' is a strange scroll for a monster to read!",
                   1488:                   r_magic[which].mi_name);
                   1489:             break;
                   1490:     }
                   1491: }

CVSweb