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

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

1.1       rubenllo    1: /*
                      2:     scrolls.c - Functions for dealing with 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 <stdlib.h>
                     20: #include <string.h>
                     21: #include <curses.h>
                     22: #include <ctype.h>
                     23: #include "rogue.h"
                     24:
                     25: /*
                     26:  * let the hero get rid of some type of monster
                     27:  */
                     28:
                     29: void
                     30: genocide(void)
                     31: {
                     32:     register struct linked_list *ip;
                     33:     register struct thing *mp;
                     34:     register struct linked_list *nip;
                     35:                              /* cannot genocide any uniques */
                     36:     register int num_monst = NUMMONST-NUMUNIQUE-NUMDINOS;
                     37:     register int which_monst;
                     38:
                     39:     which_monst = makemonster(FALSE, "wipe out");
                     40:     if (which_monst <= 0 || which_monst >= num_monst) {
                     41:         msg("");
                     42:         return;
                     43:     }
                     44:
                     45:     /* Remove this monster from the present level */
                     46:     for (ip = mlist; ip; ip = nip) {
                     47:         mp = THINGPTR(ip);
                     48:         nip = next(ip);
                     49:         if (mp->t_index == which_monst) {
                     50:             killed(ip, FALSE, FALSE, TRUE);
                     51:         }
                     52:     }
                     53:
                     54:     /* Remove from available monsters */
                     55:     monsters[which_monst].m_normal = FALSE;
                     56:     monsters[which_monst].m_wander = FALSE;
                     57:     mpos = 0;
                     58:     msg("You have wiped out the %s.", monsters[which_monst].m_name);
                     59: }
                     60:
                     61: void
                     62: read_scroll(int which, int flag, bool is_scroll)
                     63: {
                     64:     register struct object *obj = NULL, *nobj;
                     65:     register struct linked_list *item, *nitem;
                     66:     register int i,j;
                     67:     register unsigned char ch, nch;
                     68:     bool cursed, blessed;
                     69:
                     70:     blessed = FALSE;
                     71:     cursed = FALSE;
                     72:     item = NULL;
                     73:
                     74:     if (which < 0) {
                     75:         if (on(player, ISBLIND)) {
                     76:             msg("You can't see to read anything!");
                     77:             return;
                     78:         }
                     79:         if (on(player, ISINWALL)) {
                     80:             msg("You can't see the scroll while inside rock!");
                     81:             return;
                     82:         }
                     83:
                     84:         /* This is a scroll or book. */
                     85:         if (player.t_action != C_READ) {
                     86:             int units;
                     87:
                     88:             item = get_item(pack, "read", READABLE, FALSE, FALSE);
                     89:
                     90:             /*
                     91:              * Make certain that it is somethings that we want to read
                     92:              */
                     93:             if (item == NULL)
                     94:                 return;
                     95:
                     96:             /* How long does it take to read? */
                     97:             units = usage_time(item);
                     98:             if (units < 0) return;
                     99:
                    100:             player.t_using = item;      /* Remember what it is */
                    101:             player.t_no_move = units * movement(&player);
                    102:             if ((OBJPTR(item))->o_type == SCROLL) player.t_action = C_READ;
                    103:             else player.t_action = C_USE;
                    104:             return;
                    105:         }
                    106:
                    107:         /* We have waited our time, let's quaff the potion */
                    108:         item = player.t_using;
                    109:         player.t_using = NULL;
                    110:         player.t_action = A_NIL;
                    111:
                    112:         obj = OBJPTR(item);
                    113:         /* remove it from the pack */
                    114:         inpack--;
                    115:         detach(pack, item);
                    116:
                    117:         msg("As you read the scroll, it vanishes.");
                    118:         cursed = obj->o_flags & ISCURSED;
                    119:         blessed = obj->o_flags & ISBLESSED;
                    120:
                    121:         which = obj->o_which;
                    122:     }
                    123:     else {
                    124:         cursed = flag & ISCURSED;
                    125:         blessed = flag & ISBLESSED;
                    126:     }
                    127:
                    128:     switch (which) {
                    129:         case S_CONFUSE: /* Scroll of monster confusion. Give him that power. */
                    130:     {
                    131:         register char *str;
                    132:
                    133:         switch (rnd(5)) {
                    134:         case 0:
                    135:             str = "glow red";
                    136:         when 1:
                    137:             str = "vibrate";
                    138:         when 2:
                    139:             str = "glow blue";
                    140:         when 3:
                    141:             str = "radiate green";
                    142:         otherwise:
                    143:             str = "itch with a strange desire";
                    144:         }
                    145:             msg("Your hands begin to %s. ", str);
                    146:             turn_on(player, CANHUH);
                    147:     }
                    148:         when S_CURING:
                    149:             /*
                    150:              * A cure disease spell
                    151:              */
                    152:             if (on(player, HASINFEST) ||
                    153:                 on(player, HASDISEASE)||
                    154:                 on(player, DOROT)) {
                    155:                 if (on(player, HASDISEASE)) {
                    156:                     extinguish(cure_disease);
                    157:                     cure_disease();
                    158:                 }
                    159:                 if (on(player, HASINFEST)) {
                    160:                     msg(terse ? "You feel yourself improving."
                    161:                               : "You begin to feel yourself improving.");
                    162:                     turn_off(player, HASINFEST);
                    163:                     infest_dam = 0;
                    164:                 }
                    165:                 if (on(player, DOROT)) {
                    166:                     msg("You feel your skin returning to normal.");
                    167:                     turn_off(player, DOROT);
                    168:                 }
                    169:             }
                    170:             else {
                    171:                 /* msg(nothing); */
                    172:                 break;
                    173:             }
                    174:             if (is_scroll) s_know[S_CURING] = TRUE;
                    175:         when S_LIGHT:
                    176:             if (blue_light(blessed, cursed) && is_scroll)
                    177:                 s_know[S_LIGHT] = TRUE;
                    178:         when S_HOLD:
                    179:             if (cursed) {
                    180:                 /*
                    181:                  * This scroll aggravates all the monsters on the current
                    182:                  * level and sets them running towards the hero
                    183:                  */
                    184:                 msg("You hear a high-pitched humming noise.");
                    185:                 /* protect good charactors */
                    186:                 if (player.t_ctype == C_PALADIN ||
                    187:                     player.t_ctype == C_RANGER  || player.t_ctype == C_MONK) {
                    188:                         msg("A chill runs up your spine! ");
                    189:                         aggravate(TRUE, FALSE);
                    190:                 }
                    191:                 else {
                    192:                     aggravate(TRUE, TRUE);
                    193:                 }
                    194:             }
                    195:             else if (blessed) { /* Hold all monsters on level */
                    196:                 if (mlist == NULL) msg(nothing);
                    197:                 else {
                    198:                     register struct linked_list *mon;
                    199:                     register struct thing *th;
                    200:
                    201:                     for (mon = mlist; mon != NULL; mon = next(mon)) {
                    202:                         th = THINGPTR(mon);
                    203:                         turn_off(*th, ISRUN);
                    204:                         turn_on(*th, ISHELD);
                    205:                         turn_off(*th, ISCHARMED);
                    206:                     }
                    207:                     if (levtype == OUTSIDE)
                    208:                         msg("A sudden peace comes over the land.. ");
                    209:                     else
                    210:                         msg("A sudden peace comes over the dungeon.. ");
                    211:                 }
                    212:             }
                    213:             else {
                    214:                 /*
                    215:                  * Hold monster scroll.  Stop all monsters within two spaces
                    216:                  * from chasing after the hero.
                    217:                  */
                    218:                     register int x,y;
                    219:                     register struct linked_list *mon;
                    220:                     bool gotone=FALSE;
                    221:
                    222:                     for (x = hero.x-2; x <= hero.x+2; x++) {
                    223:                         for (y = hero.y-2; y <= hero.y+2; y++) {
                    224:                             if (y < 1 || x < 0 || y > lines - 3 || x > cols - 1)
                    225:                                 continue;
                    226:                             if (isalpha(mvwinch(mw, y, x))) {
                    227:                                 if ((mon = find_mons(y, x)) != NULL) {
                    228:                                     register struct thing *th;
                    229:
                    230:                                     gotone = TRUE;
                    231:                                     th = THINGPTR(mon);
                    232:                                     turn_off(*th, ISRUN);
                    233:                                     turn_on(*th, ISHELD);
                    234:                                     turn_off(*th, ISCHARMED);
                    235:                                 }
                    236:                             }
                    237:                         }
                    238:                     }
                    239:                     if (gotone) msg("A sudden peace surrounds you.");
                    240:                     else msg(nothing);
                    241:             }
                    242:         when S_SLEEP:
                    243:             /*
                    244:              * if cursed, you fall asleep
                    245:              */
                    246:             if (is_scroll) s_know[S_SLEEP] = TRUE;
                    247:             if (cursed) {
                    248:                 if (ISWEARING(R_ALERT))
                    249:                     msg("You feel drowsy for a moment.");
                    250:                 else {
                    251:                     msg("You fall asleep.");
                    252:                     player.t_no_move += movement(&player)*(4 + rnd(SLEEPTIME));
                    253:                     player.t_action = A_FREEZE;
                    254:                 }
                    255:             }
                    256:             else {
                    257:                 /*
                    258:                  * sleep monster scroll.
                    259:                  * puts all monsters within 2 spaces asleep
                    260:                  */
                    261:                     register int x,y;
                    262:                     register struct linked_list *mon;
                    263:                     bool gotone=FALSE;
                    264:
                    265:                     for (x = hero.x-2; x <= hero.x+2; x++) {
                    266:                         for (y = hero.y-2; y <= hero.y+2; y++) {
                    267:                             if (y < 1 || x < 0 || y > lines - 3 || x > cols - 1)
                    268:                                 continue;
                    269:                             if (isalpha(mvwinch(mw, y, x))) {
                    270:                                 if ((mon = find_mons(y, x)) != NULL) {
                    271:                                     register struct thing *th;
                    272:
                    273:                                     th = THINGPTR(mon);
                    274:                                     if (on(*th, ISUNDEAD))
                    275:                                         continue;
                    276:                                     th->t_no_move += movement(th)*(SLEEPTIME+4);
                    277:                                     th->t_action = A_FREEZE;
                    278:                                     gotone = TRUE;
                    279:                                 }
                    280:                             }
                    281:                         }
                    282:                     }
                    283:                     if (gotone)
                    284:                         msg("The monster(s) around you seem to have fallen asleep!");
                    285:                     else
                    286:                         msg(nothing);
                    287:             }
                    288:         when S_CREATE:
                    289:             /*
                    290:              * Create a monster
                    291:              * First look in a circle around him, next try his room
                    292:              * otherwise give up
                    293:              */
                    294:             creat_mons(&player, (short) 0, TRUE);
                    295:             light(&hero);
                    296:         when S_IDENT:
                    297:             /*
                    298:              * if its blessed then identify everything in the pack
                    299:              */
                    300:             if (blessed) {
                    301:                 msg("You feel more Knowledgeable!");
                    302:                 idenpack();
                    303:             }
                    304:             else {
                    305:                 /*
                    306:                  * Identify, let the rogue figure something out
                    307:                  */
                    308:                 if (is_scroll && s_know[S_IDENT] != TRUE) {
                    309:                     msg("This scroll is an identify scroll");
                    310:                 }
                    311:                 whatis((struct linked_list *)NULL);
                    312:             }
                    313:             if (is_scroll) s_know[S_IDENT] = TRUE;
                    314:         when S_MAP:
                    315:             /*
                    316:              * Scroll of magic mapping.
                    317:              */
                    318:             if (blessed) {
                    319:                 register int i;
                    320:
                    321:                 if (is_scroll && s_know[S_MAP] != TRUE)
                    322:                     s_know[S_MAP] = TRUE;
                    323:                   /* light rooms */
                    324:                 for (i=0; i<MAXROOMS; i++){
                    325:                     rooms[i].r_flags &= ~ISDARK;
                    326:                 }
                    327:
                    328:                 msg("This scroll has a very detailed map on it!  --More--");
                    329:                 wait_for(' ');
                    330:                 overwrite(stdscr, hw);
                    331:                 overlay(stdscr, cw);    /* wizard CTRL(F) */
                    332:                 overlay(mw, cw);        /* wizard CTRL(X) */
                    333:                 draw(cw);
                    334:                 goto map_jump;          /* skip over regular mapping routine */
                    335:             }
                    336:             rmmsg();
                    337:             overwrite(stdscr, hw);
                    338:             /*
                    339:              * Take all the things we want to keep hidden out of the window
                    340:              */
                    341:             for (i = 1; i < lines-2; i++)
                    342:                 for (j = 0; j < cols; j++)
                    343:                 {
                    344:                     switch (nch = ch = mvwinch(hw, i, j))
                    345:                     {
                    346:                         case SECRETDOOR:
                    347:                             nch = secretdoor (i, j);
                    348:                             break;
                    349:                         case HORZWALL:
                    350:                         case VERTWALL:
                    351:                         case DOOR:
                    352:                         case PASSAGE:
                    353:                         case ' ':
                    354:                         case STAIRS:
                    355:                             if (mvwinch(mw, i, j) != ' ')
                    356:                             {
                    357:                                 register struct thing *it;
                    358:
                    359:                                 it = THINGPTR(find_mons(i, j));
                    360:                                 if (it && it->t_oldch == ' ')
                    361:                                     it->t_oldch = nch;
                    362:                             }
                    363:                             break;
                    364:                         default:
                    365:                             nch = ' ';
                    366:                     }
                    367:                     if (nch != ch)
                    368:                         waddch(hw, nch);
                    369:                 }
                    370:             /*
                    371:              * Copy in what he has discovered
                    372:              */
                    373:             overlay(cw, hw);
                    374:             /*
                    375:              * And set up for display
                    376:              */
                    377:             overwrite(hw, cw);
                    378:             draw(cw);
                    379:             if (is_scroll && s_know[S_MAP] != TRUE) {
                    380:                 msg("Oh, now this scroll has a map on it.");
                    381:                 s_know[S_MAP] = TRUE;
                    382:             }
                    383:             map_jump:           /* blessed map jump from above */
                    384:         when S_GFIND:
                    385:             /*
                    386:              * Scroll of gold detection
                    387:              */
                    388:             {
                    389:                 int gtotal = 0;
                    390:
                    391:                 if (is_scroll) s_know[S_GFIND] = TRUE;
                    392:                 wclear(hw);
                    393:                 for (nitem = lvl_obj; nitem != NULL; nitem = next(nitem)) {
                    394:                     nobj = OBJPTR(nitem);
                    395:                     if (nobj->o_type == GOLD) {
                    396:                         gtotal += nobj->o_count;
                    397:                         mvwaddch(hw, nobj->o_pos.y, nobj->o_pos.x, GOLD);
                    398:                     }
                    399:                 }
                    400:                 for (nitem = mlist; nitem != NULL; nitem = next(nitem)) {
                    401:                     register struct linked_list *gitem;
                    402:                     register struct thing *th;
                    403:
                    404:                     th = THINGPTR(nitem);
                    405:                     if (on(*th, NODETECT)) continue;
                    406:                     for(gitem = th->t_pack; gitem != NULL; gitem = next(gitem)){
                    407:                         nobj = OBJPTR(gitem);
                    408:                         if (nobj->o_type == GOLD) {
                    409:                             gtotal += nobj->o_count;
                    410:                             mvwaddch(hw, th->t_pos.y, th->t_pos.x, GOLD);
                    411:                         }
                    412:                     }
                    413:                 }
                    414:                 if (gtotal) {
                    415:                     rmmsg();
                    416:                     overlay(hw,cw);
                    417:                     draw(cw);
                    418:                     msg("You begin to feel greedy.  You sense gold!");
                    419:                     break;
                    420:                 }
                    421:             }
                    422:             msg("You begin to feel a pull downward..");
                    423:         when S_TELEP:
                    424:             /*
                    425:              * Scroll of teleportation:
                    426:              * Make him disappear and reappear
                    427:              */
                    428:             if (cursed) {
                    429:                 int old_max = cur_max;
                    430:
                    431:                 turns = (vlevel * NLEVMONS) * LEVEL;
                    432:                 /* if (turns > 42000) turns = 42000; limit turns */
                    433:                 debug ("vlevel = %d  turns = %d", vlevel, turns);
                    434:
                    435:                 level = rnd(201)+80;   /* cursed teleport range */
                    436:
                    437:                 new_level(NORMLEV);
                    438:                 msg("You are banished to the lower regions! ");
                    439:
                    440:                 status(TRUE);
                    441:                 mpos = 0;
                    442:                 if (old_max == cur_max) { /* if he's been here make it harder */
                    443:                 /* protect good charactors */
                    444:                 if (player.t_ctype == C_PALADIN ||
                    445:                     player.t_ctype == C_RANGER  || player.t_ctype == C_MONK) {
                    446:                         aggravate(TRUE, FALSE);
                    447:                 }
                    448:                 else {
                    449:                     aggravate(TRUE, TRUE);
                    450:                 }
                    451:                 }
                    452:             }
                    453:             else if (blessed) {
                    454:                 int     old_level,
                    455:                         much = rnd(6) - 7;
                    456:
                    457:                 old_level = level;
                    458:                 if (much != 0) {
                    459:                     level += much;
                    460:                     if (level < 1)
                    461:                         level = 1;
                    462:                     mpos = 0;
                    463:                     cur_max = level;
                    464:                     turns += much*LEVEL;
                    465:                     if (turns < 0)
                    466:                         turns = 0;
                    467:                     new_level(NORMLEV);         /* change levels */
                    468:                     if (level == old_level)
                    469:                         status(TRUE);
                    470:                     msg("You are whisked away to another region!");
                    471:                 }
                    472:             }
                    473:             else {
                    474:                 teleport();
                    475:             }
                    476:             if (is_scroll) s_know[S_TELEP] = TRUE;
                    477:         when S_SCARE:
                    478:             /*
                    479:              * A monster will refuse to step on a scare monster scroll
                    480:              * if it is dropped.  Thus reading it is a mistake and produces
                    481:              * laughter at the poor rogue's boo boo.
                    482:              */
                    483:             msg("You hear maniacal laughter in the distance.");
                    484:         when S_REMOVE:
                    485:             if (cursed) { /* curse all player's possessions */
                    486:                 for (nitem = pack; nitem != NULL; nitem = next(nitem)) {
                    487:                     nobj = OBJPTR(nitem);
                    488:                     if (nobj->o_flags & ISBLESSED)
                    489:                         nobj->o_flags &= ~ISBLESSED;
                    490:                     else
                    491:                         nobj->o_flags |= ISCURSED;
                    492:                 }
                    493:                 msg("The smell of fire and brimstone fills the air!");
                    494:         /* return; leaks item, go through end of function */
                    495:             }
                    496:             else if (blessed) {
                    497:                 for (nitem = pack; nitem != NULL; nitem = next(nitem)) {
                    498:                     nobj = OBJPTR(nitem);
                    499:                     nobj->o_flags &= ~ISCURSED;
                    500:                 }
                    501:                 msg("Your pack glistens brightly!");
                    502:                 do_panic(0);         /* this startles them */
                    503:         /* return; leaks item, go through end of function */
                    504:             }
                    505:             else {
                    506:                 nitem = get_item(pack, "remove the curse on",ALL,FALSE,FALSE);
                    507:                 if (nitem != NULL) {
                    508:                     nobj = OBJPTR(nitem);
                    509:                     nobj->o_flags &= ~ISCURSED;
                    510:                     msg("Removed the curse from %s",inv_name(nobj,TRUE));
                    511:                 }
                    512:             }
                    513:             if (is_scroll) s_know[S_REMOVE] = TRUE;
                    514:         when S_PETRIFY:
                    515:             switch (mvinch(hero.y, hero.x)) {
                    516:                 case WORMHOLE:
                    517:                 case TRAPDOOR:
                    518:                 case DARTTRAP:
                    519:                 case TELTRAP:
                    520:                 case ARROWTRAP:
                    521:                 case SLEEPTRAP:
                    522:                 case BEARTRAP:
                    523:                     {
                    524:                         register int i;
                    525:
                    526:                         /* Find the right trap */
                    527:                         for (i=0; i<ntraps && !ce(traps[i].tr_pos, hero); i++);
                    528:                         ntraps--;
                    529:
                    530:                         if (!ce(traps[i].tr_pos, hero))
                    531:                             msg("What a strange trap!");
                    532:                         else {
                    533:                             while (i < ntraps) {
                    534:                                 traps[i] = traps[i + 1];
                    535:                                 i++;
                    536:                             }
                    537:                         }
                    538:                     }
                    539:                     goto pet_message;
                    540:                 case DOOR:
                    541:                 case SECRETDOOR:
                    542:                 case FLOOR:
                    543:                 case PASSAGE:
                    544: pet_message:        msg("The dungeon begins to rumble and shake!");
                    545:                     addch(WALL);
                    546:
                    547:                     /* If the player is phased, unphase him */
                    548:                     if (on(player, CANINWALL)) {
                    549:                         extinguish(unphase);
                    550:                         turn_off(player, CANINWALL);
                    551:                         msg("The dizzy feeling leaves you.");
                    552:                     }
                    553:
                    554:                     /* Mark the player as in a wall */
                    555:                     turn_on(player, ISINWALL);
                    556:                     break;
                    557:                 default:
                    558:                     msg(nothing);
                    559:             }
                    560:         when S_GENOCIDE:
                    561:             msg("You have been granted the boon of genocide!  --More--");
                    562:             wait_for(' ');
                    563:             msg("");
                    564:             genocide();
                    565:             if (is_scroll) s_know[S_GENOCIDE] = TRUE;
                    566:         when S_PROTECT: {
                    567:             struct linked_list *ll;
                    568:             struct object *lb;
                    569:             bool did_it = FALSE;
                    570:             msg("You are granted the power of protection.");
                    571:             if ((ll=get_item(pack,"protect",PROTECTABLE,FALSE,FALSE)) != NULL) {
                    572:                 lb = OBJPTR(ll);
                    573:                 mpos = 0;
                    574:                 if (cursed) {
                    575:                     switch(lb->o_type) {        /* ruin it completely */
                    576:                         case RING: if (lb->o_ac > 0) {
                    577:                                     if (is_current(lb)) {
                    578:                                         switch (lb->o_which) {
                    579:                                             case R_ADDWISDOM:
                    580:                                                 pstats.s_wisdom -= lb->o_ac;
                    581:                                             when R_ADDINTEL:
                    582:                                                 pstats.s_intel -= lb->o_ac;
                    583:                                             when R_ADDSTR:
                    584:                                                 pstats.s_str -= lb->o_ac;
                    585:                                             when R_ADDHIT:
                    586:                                                 pstats.s_dext -= lb->o_ac;
                    587:                                         }
                    588:                                     }
                    589:                                     did_it = TRUE;
                    590:                                         lb->o_ac = 0;
                    591:                                 }
                    592:                         when ARMOR: if (lb->o_ac > 10) {
                    593:                                         did_it = TRUE;
                    594:                                         lb->o_ac = 10;
                    595:                                     }
                    596:                         when STICK: if (lb->o_charges > 0) {
                    597:                                         did_it = TRUE;
                    598:                                         lb->o_charges = 0;
                    599:                                     }
                    600:                         when WEAPON:if (lb->o_hplus > 0) {
                    601:                                         did_it = TRUE;
                    602:                                         lb->o_hplus = 0;
                    603:                                     }
                    604:                                     if (lb->o_dplus > 0) {
                    605:                                         did_it = TRUE;
                    606:                                         lb->o_dplus = 0;
                    607:                                     }
                    608:                     }
                    609:                     if (lb->o_flags & ISPROT) {
                    610:                         did_it = TRUE;
                    611:                         lb->o_flags &= ~ISPROT;
                    612:                     }
                    613:                     if (lb->o_flags & ISBLESSED) {
                    614:                         did_it = TRUE;
                    615:                         lb->o_flags &= ~ISBLESSED;
                    616:                     }
                    617:                     if (did_it)
                    618:                         msg("Your %s glows red for a moment",inv_name(lb,TRUE));
                    619:                     else {
                    620:                         msg(nothing);
                    621:                         break;
                    622:                     }
                    623:                 }
                    624:                 else  {
                    625:                     lb->o_flags |= ISPROT;
                    626:                     msg("Protected %s.",inv_name(lb,TRUE));
                    627:                 }
                    628:             }
                    629:             if (is_scroll) s_know[S_PROTECT] = TRUE;
                    630:         }
                    631:         when S_MAKEIT:
                    632:             msg("You have been endowed with the power of creation!");
                    633:             if (is_scroll) s_know[S_MAKEIT] = TRUE;
                    634:             create_obj(TRUE, 0, 0);
                    635:         when S_ALLENCH: {
                    636:             struct linked_list *ll;
                    637:             struct object *lb;
                    638:             int howmuch, flags;
                    639:             if (is_scroll && s_know[S_ALLENCH] == FALSE) {
                    640:                 msg("You are granted the power of enchantment.");
                    641:                 msg("You may enchant anything (weapon, ring, armor, scroll, potion)");
                    642:             }
                    643:             if ((ll = get_item(pack, "enchant", ALL, FALSE, FALSE)) != NULL) {
                    644:                 lb = OBJPTR(ll);
                    645:                 lb->o_flags &= ~ISCURSED;
                    646:                 if (blessed) {
                    647:                     howmuch = 2;
                    648:                     flags = ISBLESSED;
                    649:                 }
                    650:                 else if (cursed) {
                    651:                     howmuch = -1;
                    652:                     flags = ISCURSED;
                    653:                 }
                    654:                 else {
                    655:                     howmuch = 1;
                    656:                     flags = ISBLESSED;
                    657:                 }
                    658:                 switch(lb->o_type) {
                    659:                     case RING:
                    660:                         if (lb->o_ac + howmuch > MAXENCHANT) {
                    661:                             msg("The enchantment doesn't seem to work!");
                    662:                             break;
                    663:                         }
                    664:                         lb->o_ac += howmuch;
                    665:                         if (lb==cur_ring[LEFT_1]  || lb==cur_ring[LEFT_2]  ||
                    666:                             lb==cur_ring[LEFT_3]  || lb==cur_ring[LEFT_4]  ||
                    667:                             lb==cur_ring[RIGHT_1] || lb==cur_ring[RIGHT_2] ||
                    668:                 lb==cur_ring[RIGHT_3] || lb==cur_ring[RIGHT_4]) {
                    669:                             switch (lb->o_which) {
                    670:                                 case R_ADDWISDOM: pstats.s_wisdom += howmuch;
                    671:                                 when R_ADDINTEL:  pstats.s_intel  += howmuch;
                    672:                                 when R_ADDSTR:    pstats.s_str    += howmuch;
                    673:                                 when R_ADDHIT:    pstats.s_dext   += howmuch;
                    674:                             }
                    675:                         }
                    676:                         msg("Enchanted %s.",inv_name(lb,TRUE));
                    677:                     when ARMOR:
                    678:                         if ((armors[lb->o_which].a_class - lb->o_ac) +
                    679:                             howmuch > MAXENCHANT) {
                    680:                             msg("The enchantment doesn't seem to work!");
                    681:                             break;
                    682:                         }
                    683:                         else
                    684:                             lb->o_ac -= howmuch;
                    685:                         msg("Enchanted %s.",inv_name(lb,TRUE));
                    686:                     when STICK:
                    687:                         lb->o_charges += rnd(16)+10;
                    688:                         if (lb->o_charges < 0)
                    689:                             lb->o_charges = 0;
                    690:                         if (EQUAL(ws_type[lb->o_which], "staff")) {
                    691:                             if (lb->o_charges > 200)
                    692:                                 lb->o_charges = 200;
                    693:                         }
                    694:                         else {
                    695:                             if (lb->o_charges > 200)  /* make em the same */
                    696:                                 lb->o_charges = 200;
                    697:                         }
                    698:                         msg("Enchanted %s.",inv_name(lb,TRUE));
                    699:                     when WEAPON:
                    700:                         if(lb->o_hplus+lb->o_dplus+howmuch > MAXENCHANT * 2){
                    701:                             msg("The enchantment doesn't seem to work!");
                    702:                             break;
                    703:                         }
                    704:                         if (rnd(100) < 50)
                    705:                             lb->o_hplus += howmuch;
                    706:                         else
                    707:                             lb->o_dplus += howmuch;
                    708:                         msg("Enchanted %s.",inv_name(lb,TRUE));
                    709:                     when MM:
                    710:                         switch (lb->o_which) {
                    711:                             case MM_BRACERS:
                    712:                                 if (lb->o_ac + howmuch > MAXENCHANT) {
                    713:                                    msg("The enchantment doesn't seem to work!");
                    714:                                    break;
                    715:                                 }
                    716:                                 else lb->o_ac += howmuch;
                    717:                                 msg("Enchanted %s.",inv_name(lb,TRUE));
                    718:                             when MM_PROTECT:
                    719:                                 if (lb->o_ac + howmuch > MAXENCHANT) {
                    720:                                    msg("The enchantment doesn't seem to work!");
                    721:                                    break;
                    722:                                 }
                    723:                                 else lb->o_ac += howmuch;
                    724:                                 msg("Enchanted %s.",inv_name(lb,TRUE));
                    725:                         }
                    726:                         lb->o_flags |= flags;
                    727:                     when POTION:
                    728:                     case SCROLL:
                    729:                     default:
                    730:                         lb->o_flags |= flags;
                    731:                     msg("Enchanted %s.",inv_name(lb,TRUE));
                    732:                 }
                    733:             }
                    734:             if (is_scroll) s_know[S_ALLENCH] = TRUE;
                    735:
                    736:             /* If gotten here via prayer or Ankh, dock his wisdom. */
                    737:             if (!is_scroll) {
                    738:                 pstats.s_wisdom--;
                    739:         if (pstats.s_wisdom < 3) pstats.s_wisdom = 3;
                    740:                 msg("You feel a drain on your system. ");
                    741:             }
                    742:         }
                    743:         when S_FINDTRAPS:
                    744:             for (i=0; i<ntraps; i++) {
                    745:                 if (!(traps[i].tr_flags & ISFOUND)) {
                    746:                     traps[i].tr_flags |= ISFOUND;
                    747:                     if (cansee(traps[i].tr_pos.y, traps[i].tr_pos.x))
                    748:                         mvwaddch(cw,traps[i].tr_pos.y,traps[i].tr_pos.x,
                    749:                                  traps[i].tr_type);
                    750:                 }
                    751:             }
                    752:             if (ntraps > 0) {
                    753:                 msg("You sense the presence of traps.");
                    754:                 if (is_scroll) s_know[S_FINDTRAPS] = TRUE;
                    755:             }
                    756:             else
                    757:                 msg(nothing);
                    758:
                    759:         when S_RUNES:
                    760:         {
                    761:                 register struct linked_list *sitem;
                    762:
                    763:                 msg("The scroll explodes in a ball of fire!");
                    764:                 if (on(player, NOFIRE)) {
                    765:                         msg("The fire does not seem to affect you.");
                    766:                         break;
                    767:                 }
                    768:                 explode(&player);
                    769:                 if (pstats.s_hpt <= 0) {
                    770:             pstats.s_hpt = -1;
                    771:                     death(D_SCROLL);
                    772:         }
                    773:                 for (sitem = pack; sitem != NULL; sitem = nitem) {
                    774:                     nitem = next(sitem); /* in case we delete it */
                    775:                     nobj = OBJPTR(sitem);
                    776:                     /*
                    777:                      * check for loss of all scrolls and give them
                    778:                      * a save versus fire
                    779:                      */
                    780:                     if (nobj->o_type == SCROLL && roll(1,20) < 17) {
                    781:                         msg("%s burns up!", inv_name(nobj, TRUE));
                    782:                         inpack--;
                    783:                         detach(pack, sitem);
                    784:                         o_discard(sitem);
                    785:                     }
                    786:                 }
                    787:         }
                    788:
                    789:         when S_CHARM:
                    790:         {
                    791:             bool spots[9];
                    792:             int x, y, spot, count, numcharmed, something, bonus;
                    793:             struct linked_list *item;
                    794:             register struct thing *tp;
                    795:
                    796:             /* Initialize the places where we look around us */
                    797:             for (i=0; i<9; i++) spots[i] = FALSE;
                    798:             count = 0;  /* No spots tried yet */
                    799:             numcharmed = 0;     /* Nobody charmed yet */
                    800:             something = 0;      /* Nothing has been seen yet */
                    801:             bonus = 0;          /* no bonus yet */
                    802:
                    803:             /* Now look around us randomly for a charmee */
                    804:             while (count < 9) {
                    805:                 do {
                    806:                     spot = rnd(9);
                    807:                 } while (spots[spot] == TRUE);
                    808:
                    809:                 /* We found a place */
                    810:                 count++;
                    811:                 spots[spot] = TRUE;
                    812:                 y = hero.y - 1 + (spot / 3);
                    813:                 x = hero.x - 1 + (spot % 3);
                    814:
                    815:                 /* Be sure to stay on the board! */
                    816:                 if (x < 0 || x >= cols || (y < 1) || (y >= lines - 2))
                    817:                         continue;
                    818:
                    819:                 /* Is there a monster here? */
                    820:                 if (!isalpha(mvwinch(mw, y, x))) continue;
                    821:
                    822:                 /* What kind is it? */
                    823:                 item = find_mons(y, x);
                    824:                 if (item == NULL) continue;
                    825:
                    826:                 tp = THINGPTR(item);
                    827:                 if (on(*tp,ISCHARMED) || on(*tp,ISUNIQUE) || on(*tp,ISUNDEAD))
                    828:                     continue;
                    829:
                    830:                 /* Will the monster be charmed? */
                    831:                 if (blessed) bonus -= 3;
                    832:                 bonus -= (pstats.s_charisma - 12) / 3;
                    833:                 if ((player.t_ctype==C_PALADIN || player.t_ctype==C_RANGER) &&
                    834:                     off(*tp, ISMEAN))
                    835:                         bonus -= 3;
                    836:                 if (save(VS_MAGIC, tp, bonus)) continue;
                    837:
                    838:                 /* We got him! */
                    839:                 numcharmed++;
                    840:
                    841:                 /* Let the player know (maybe) */
                    842:                 if ((off(*tp, ISINVIS)     || on(player, CANSEE)) &&
                    843:                     (off(*tp, ISSHADOW)    || on(player, CANSEE)) &&
                    844:                     cansee(y, x)) {
                    845:                         if (on(*tp, CANSURPRISE)) {
                    846:                             turn_off(*tp, CANSURPRISE);
                    847:                             msg("What the !? ");
                    848:                         }
                    849:                         msg("The eyes of %s glaze over!",
                    850:                             prname(monster_name(tp), FALSE));
                    851:                         something++;
                    852:                 }
                    853:
                    854:                 /* Charm him and turn off any side effects */
                    855:                 turn_on(*tp, ISCHARMED);
                    856:                 runto(tp, &hero);
                    857:                 tp->t_action = A_NIL;
                    858:
                    859:                 /* If monster was suffocating us, stop it */
                    860:                 if (on(*tp, DIDSUFFOCATE)) {
                    861:                     turn_off(*tp, DIDSUFFOCATE);
                    862:                     extinguish(suffocate);
                    863:                 }
                    864:
                    865:                 /* If monster held us, stop it */
                    866:                 if (on(*tp, DIDHOLD) && (--hold_count == 0))
                    867:                         turn_off(player, ISHELD);
                    868:                 turn_off(*tp, DIDHOLD);
                    869:
                    870:                 /* If frightened of this monster, stop */
                    871:                 if (on(player, ISFLEE) &&
                    872:                     player.t_dest == &tp->t_pos) turn_off(player, ISFLEE);
                    873:
                    874:                 if ((blessed && numcharmed >= 5) || numcharmed > 0) break;
                    875:             }
                    876:
                    877:             if (something == 0) msg(nothing);
                    878:         }
                    879:
                    880:         otherwise:
                    881:             msg("What a puzzling scroll!");
                    882:             if (item != NULL) o_discard(item);
                    883:             return;
                    884:     }
                    885:     look(TRUE, FALSE);  /* put the result of the scroll on the screen */
                    886:     status(FALSE);
                    887:     if (is_scroll && item && s_know[which] && s_guess[which])
                    888:     {
                    889:         free(s_guess[which]);
                    890:         s_guess[which] = NULL;
                    891:     }
                    892:     else if (is_scroll                          &&
                    893:              !s_know[which]                     &&
                    894:              item                               &&
                    895:              askme                              &&
                    896:              (obj->o_flags & ISKNOW) == 0       &&
                    897:              (obj->o_flags & ISPOST) == 0       &&
                    898:              s_guess[which] == NULL) {
                    899:         nameitem(item, FALSE);
                    900:     }
                    901:     if (item != NULL) o_discard(item);
                    902:     updpack(TRUE, &player);
                    903: }
                    904:

CVSweb