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

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

1.1       rubenllo    1: /*
                      2:  * Read a scroll and let it happen
                      3:  *
                      4:  * Advanced Rogue
                      5:  * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
                      6:  * All rights reserved.
                      7:  *
                      8:  * Based on "Rogue: Exploring the Dungeons of Doom"
                      9:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     10:  * All rights reserved.
                     11:  *
                     12:  * See the file LICENSE.TXT for full copyright and licensing information.
                     13:  */
                     14:
                     15: #include "curses.h"
                     16: #include <ctype.h>
                     17: #include <stdlib.h>
                     18: #include <string.h>
                     19: #include "rogue.h"
                     20:
                     21:
                     22:
                     23: /*
                     24:  * let the hero get rid of some type of monster (but not a UNIQUE!)
                     25:  */
                     26: void
                     27: genocide(void)
                     28: {
                     29:     register struct linked_list *ip;
                     30:     register struct thing *mp;
                     31:     register int i;
                     32:     register struct linked_list *nip;
                     33:     register int num_monst = NUMMONST-NUMUNIQUE-1, /* cannot genocide uniques */
                     34:                 pres_monst=1,
                     35:                 num_lines=2*(LINES-3);
                     36:     register int which_monst;
                     37:     char monst_name[40];
                     38:
                     39:     /* Print out the monsters */
                     40:     while (num_monst > 0) {
                     41:        int left_limit;
                     42:
                     43:        if (num_monst < num_lines) left_limit = (num_monst+1)/2;
                     44:        else left_limit = num_lines/2;
                     45:
                     46:        wclear(hw);
                     47:        touchwin(hw);
                     48:
                     49:        /* Print left column */
                     50:        wmove(hw, 2, 0);
                     51:        for (i=0; i<left_limit; i++) {
                     52:            sprintf(monst_name,
                     53:                    "[%d] %c%s\n",
                     54:                    pres_monst,
                     55:                    monsters[pres_monst].m_normal ? ' ' : '*',
                     56:                    monsters[pres_monst].m_name);
                     57:            waddstr(hw, monst_name);
                     58:            pres_monst++;
                     59:        }
                     60:
                     61:        /* Print right column */
                     62:        for (i=0; i<left_limit && pres_monst<=NUMMONST-NUMUNIQUE-1; i++) {
                     63:            sprintf(monst_name,
                     64:                    "[%d] %c%s\n",
                     65:                    pres_monst,
                     66:                    monsters[pres_monst].m_normal ? ' ' : '*',
                     67:                    monsters[pres_monst].m_name);
                     68:            wmove(hw, i+2, COLS/2);
                     69:            waddstr(hw, monst_name);
                     70:            pres_monst++;
                     71:        }
                     72:
                     73:        if ((num_monst -= num_lines) > 0) {
                     74:            mvwaddstr(hw, LINES-1, 0, morestr);
                     75:            draw(hw);
                     76:            wait_for(hw,' ');
                     77:        }
                     78:
                     79:        else {
                     80:            mvwaddstr(hw, 0, 0, "Which monster");
                     81:            if (!terse) waddstr(hw, " do you wish to wipe out");
                     82:            waddstr(hw, "? ");
                     83:            draw(hw);
                     84:        }
                     85:     }
                     86:
                     87: get_monst:
                     88:     get_str(monst_name, hw);
                     89:     which_monst = atoi(monst_name);
                     90:     if ((which_monst < 1 || which_monst > NUMMONST-NUMUNIQUE-1)) {
                     91:        mvwaddstr(hw, 0, 0, "Please enter a number in the displayed range -- ");
                     92:        draw(hw);
                     93:        goto get_monst;
                     94:     }
                     95:
                     96:     /* Set up for redraw */
                     97:     clearok(cw, TRUE);
                     98:     touchwin(cw);
                     99:
                    100:     /* Remove this monster from the present level */
                    101:     for (ip = mlist; ip; ip = nip) {
                    102:        mp = THINGPTR(ip);
                    103:        nip = next(ip);
                    104:        if (mp->t_index == which_monst) {
                    105:            killed(ip, FALSE, FALSE);
                    106:        }
                    107:     }
                    108:
                    109:     /* Remove from available monsters */
                    110:     monsters[which_monst].m_normal = FALSE;
                    111:     monsters[which_monst].m_wander = FALSE;
                    112:     mpos = 0;
                    113:     msg("You have wiped out the %s.", monsters[which_monst].m_name);
                    114: }
                    115: 
                    116: void
                    117: read_scroll(int which, int flag, bool is_scroll)
                    118: {
                    119:     register struct object *obj = NULL, *nobj;
                    120:     register struct linked_list *item, *nitem;
                    121:     register int i,j;
                    122:     register char ch, nch;
                    123:     bool cursed, blessed;
                    124:     char buf[LINELEN];
                    125:
                    126:     blessed = FALSE;
                    127:     cursed = FALSE;
                    128:     item = NULL;
                    129:
                    130:     if (which < 0) {
                    131:        if (on(player, ISBLIND)) {
                    132:            msg("You can't see to read anything");
                    133:            return;
                    134:        }
                    135:        item = get_item(pack, "read", SCROLL);
                    136:        if (item == NULL)
                    137:            return;
                    138:
                    139:        obj = OBJPTR(item);
                    140:        /* remove it from the pack */
                    141:        inpack--;
                    142:        detach(pack, item);
                    143:
                    144:        msg("As you read the scroll, it vanishes.");
                    145:        cursed = (obj->o_flags & ISCURSED) != 0;
                    146:        blessed = (obj->o_flags & ISBLESSED) != 0;
                    147:
                    148:        which = obj->o_which;
                    149:     }
                    150:     else {
                    151:        cursed = flag & ISCURSED;
                    152:        blessed = flag & ISBLESSED;
                    153:     }
                    154:
                    155:
                    156:     switch (which) {
                    157:        case S_CONFUSE:
                    158:            /*
                    159:             * Scroll of monster confusion.  Give him that power.
                    160:             */
                    161:            msg("Your hands begin to glow red");
                    162:            turn_on(player, CANHUH);
                    163:        when S_CURING:
                    164:            /*
                    165:             * A cure disease spell
                    166:             */
                    167:            if (on(player, HASINFEST) ||
                    168:                on(player, HASDISEASE)||
                    169:                on(player, DOROT)) {
                    170:                if (on(player, HASDISEASE)) {
                    171:                    extinguish(cure_disease);
                    172:                    cure_disease();
                    173:                }
                    174:                if (on(player, HASINFEST)) {
                    175:                    msg(terse ? "You feel yourself improving."
                    176:                              : "You begin to feel yourself improving again.");
                    177:                    turn_off(player, HASINFEST);
                    178:                    infest_dam = 0;
                    179:                }
                    180:                if (on(player, DOROT)) {
                    181:                    msg("You feel your skin returning to normal.");
                    182:                    turn_off(player, DOROT);
                    183:                }
                    184:            }
                    185:            else {
                    186:                msg(nothing);
                    187:                break;
                    188:            }
                    189:            if (is_scroll) s_know[S_CURING] = TRUE;
                    190:        when S_LIGHT:
                    191:            if (blue_light(blessed, cursed) && is_scroll)
                    192:                s_know[S_LIGHT] = TRUE;
                    193:        when S_HOLD:
                    194:            if (cursed) {
                    195:                /*
                    196:                 * This scroll aggravates all the monsters on the current
                    197:                 * level and sets them running towards the hero
                    198:                 */
                    199:                aggravate();
                    200:                msg("You hear a high pitched humming noise.");
                    201:            }
                    202:            else if (blessed) { /* Hold all monsters on level */
                    203:                if (mlist == NULL) msg(nothing);
                    204:                else {
                    205:                    register struct linked_list *mon;
                    206:                    register struct thing *th;
                    207:
                    208:                    for (mon = mlist; mon != NULL; mon = next(mon)) {
                    209:                        th = THINGPTR(mon);
                    210:                        turn_off(*th, ISRUN);
                    211:                        turn_on(*th, ISHELD);
                    212:                    }
                    213:                    msg("A sudden peace comes over the dungeon.");
                    214:                }
                    215:            }
                    216:            else {
                    217:                /*
                    218:                 * Hold monster scroll.  Stop all monsters within two spaces
                    219:                 * from chasing after the hero.
                    220:                 */
                    221:                    register int x,y;
                    222:                    register struct linked_list *mon;
                    223:                    bool gotone=FALSE;
                    224:
                    225:                    for (x = hero.x-2; x <= hero.x+2; x++) {
                    226:                        for (y = hero.y-2; y <= hero.y+2; y++) {
                    227:                            if (y < 1 || x < 0 || y > LINES - 3 || x > COLS - 1)
                    228:                                continue;
                    229:                            if (isalpha(mvwinch(mw, y, x))) {
                    230:                                if ((mon = find_mons(y, x)) != NULL) {
                    231:                                    register struct thing *th;
                    232:
                    233:                                    gotone = TRUE;
                    234:                                    th = THINGPTR(mon);
                    235:                                    turn_off(*th, ISRUN);
                    236:                                    turn_on(*th, ISHELD);
                    237:                                }
                    238:                            }
                    239:                        }
                    240:                    }
                    241:                    if (gotone) msg("A sudden peace surrounds you.");
                    242:                    else msg(nothing);
                    243:            }
                    244:        when S_SLEEP:
                    245:            /*
                    246:             * if cursed, you fall asleep
                    247:             */
                    248:            if (is_scroll) s_know[S_SLEEP] = TRUE;
                    249:            if (cursed) {
                    250:                if (ISWEARING(R_ALERT))
                    251:                    msg("You feel drowsy for a moment.");
                    252:                else {
                    253:                    msg("You fall asleep.");
                    254:                    no_command += 4 + rnd(SLEEPTIME);
                    255:                }
                    256:            }
                    257:            else {
                    258:                /*
                    259:                 * sleep monster scroll.
                    260:                 * puts all monsters within 2 spaces asleep
                    261:                 */
                    262:                    register int x,y;
                    263:                    register struct linked_list *mon;
                    264:                    bool gotone=FALSE;
                    265:
                    266:                    for (x = hero.x-2; x <= hero.x+2; x++) {
                    267:                        for (y = hero.y-2; y <= hero.y+2; y++) {
                    268:                            if (y < 1 || x < 0 || y > LINES - 3 || x > COLS - 1)
                    269:                                continue;
                    270:                            if (isalpha(mvwinch(mw, y, x))) {
                    271:                                if ((mon = find_mons(y, x)) != NULL) {
                    272:                                    register struct thing *th;
                    273:
                    274:                                    th = THINGPTR(mon);
                    275:                                    if (on(*th, ISUNDEAD))
                    276:                                        continue;
                    277:                                    th->t_no_move += SLEEPTIME;
                    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(NULL);
                    312:            }
                    313:            if (is_scroll) s_know[S_IDENT] = TRUE;
                    314:        when S_MAP:
                    315:            /*
                    316:             * Scroll of magic mapping.
                    317:             */
                    318:            if (is_scroll && s_know[S_MAP] != TRUE) {
                    319:                waddstr(msgw, morestr);
                    320:                 draw(msgw);
                    321:                 wait_for(msgw, ' ');
                    322:                msg("");
                    323:            }
                    324:            overwrite(stdscr, hw);
                    325:            /*
                    326:             * Take all the things we want to keep hidden out of the window
                    327:             */
                    328:            for (i = 1; i < LINES-2; i++)
                    329:                for (j = 0; j < COLS; j++)
                    330:                {
                    331:                    switch (nch = ch = CCHAR( mvwinch(hw, i, j) ))
                    332:                    {
                    333:                        case SECRETDOOR:
                    334:                            nch = secretdoor (i, j);
                    335:                            break;
                    336:                        case '-':
                    337:                        case '|':
                    338:                        case DOOR:
                    339:                        case PASSAGE:
                    340:                        case ' ':
                    341:                        case STAIRS:
                    342:                            if (mvwinch(mw, i, j) != ' ')
                    343:                            {
                    344:                                register struct thing *it;
                    345:
                    346:                                it = THINGPTR(find_mons(i, j));
                    347:                                if (it && it->t_oldch == ' ')
                    348:                                    it->t_oldch = nch;
                    349:                            }
                    350:                            break;
                    351:                        default:
                    352:                            nch = ' ';
                    353:                    }
                    354:                    if (nch != ch)
                    355:                        waddch(hw, nch);
                    356:                }
                    357:            /*
                    358:             * Copy in what he has discovered
                    359:             */
                    360:            overlay(cw, hw);
                    361:            /*
                    362:             * And set up for display
                    363:             */
                    364:            overwrite(hw, cw);
                    365:             draw(cw);
                    366:            if (is_scroll && s_know[S_MAP] != TRUE) {
                    367:                msg("Oh, now this scroll has a map on it.");
                    368:                s_know[S_MAP] = TRUE;
                    369:             }
                    370:        when S_GFIND:
                    371:            /*
                    372:             * Scroll of gold detection
                    373:             */
                    374:            if (lvl_obj != NULL) {
                    375:                register struct linked_list *gitem;
                    376:                struct object *cur;
                    377:                int gtotal = 0;
                    378:
                    379:                wclear(hw);
                    380:                for (gitem = lvl_obj; gitem != NULL; gitem = next(gitem)) {
                    381:                    cur = OBJPTR(gitem);
                    382:                    if (cur->o_type == GOLD) {
                    383:                        gtotal += cur->o_count;
                    384:                        mvwaddch(hw, cur->o_pos.y, cur->o_pos.x, GOLD);
                    385:                    }
                    386:                }
                    387:                if (gtotal) {
                    388:                    if (is_scroll) s_know[S_GFIND] = TRUE;
                    389:                    waddstr(msgw, morestr);
                    390:                     draw(msgw);
                    391:                     wait_for(msgw, ' ');
                    392:                    msg("");
                    393:                    overlay(hw,cw);
                    394:                     draw(cw);
                    395:                    msg("You begin to feel greedy and you sense gold.");
                    396:                    break;
                    397:                }
                    398:            }
                    399:            msg("You begin to feel a pull downward");
                    400:        when S_TELEP:
                    401:            /*
                    402:             * Scroll of teleportation:
                    403:             * Make him disappear and reappear
                    404:             */
                    405:            if (cursed) {
                    406:                int old_max = cur_max;
                    407:
                    408:                turns = (vlevel * 3) * LEVEL;
                    409:                level = nfloors;
                    410:                new_level(NORMLEV);
                    411:                status(TRUE);
                    412:                mpos = 0;
                    413:                msg("You are banished to the lower regions.");
                    414:                if (old_max == cur_max) /* if he's been here, make it harder */
                    415:                    aggravate();
                    416:            }
                    417:            else if (blessed) {
                    418:                int     old_level,
                    419:                        much = rnd(4) - 4;
                    420:
                    421:                old_level = level;
                    422:                if (much != 0) {
                    423:                    level += much;
                    424:                    if (level < 1)
                    425:                        level = 1;
                    426:                    mpos = 0;
                    427:                    cur_max = level;
                    428:                    turns += much*LEVEL;
                    429:                    if (turns < 0)
                    430:                        turns = 0;
                    431:                    new_level(NORMLEV);         /* change levels */
                    432:                    if (level == old_level)
                    433:                        status(TRUE);
                    434:                    msg("You are whisked away to another region.");
                    435:                }
                    436:            }
                    437:            else {
                    438:                teleport();
                    439:            }
                    440:            if (is_scroll) s_know[S_TELEP] = TRUE;
                    441:        when S_SCARE:
                    442:            /*
                    443:             * A monster will refuse to step on a scare monster scroll
                    444:             * if it is dropped.  Thus reading it is a mistake and produces
                    445:             * laughter at the poor rogue's boo boo.
                    446:             */
                    447:            msg("You hear maniacal laughter in the distance.");
                    448:        when S_REMOVE:
                    449:            if (cursed) { /* curse all player's possessions */
                    450:                for (nitem = pack; nitem != NULL; nitem = next(nitem)) {
                    451:                    nobj = OBJPTR(nitem);
                    452:                    if (nobj->o_flags & ISBLESSED)
                    453:                        nobj->o_flags &= ~ISBLESSED;
                    454:                    else
                    455:                        nobj->o_flags |= ISCURSED;
                    456:                }
                    457:                msg("The smell of fire and brimstone fills the air.");
                    458:            }
                    459:            else if (blessed) {
                    460:                for (nitem = pack; nitem != NULL; nitem = next(nitem)) {
                    461:                    nobj = OBJPTR(nitem);
                    462:                    nobj->o_flags &= ~ISCURSED;
                    463:                }
                    464:                msg("Your pack glistens brightly");
                    465:            }
                    466:            else {
                    467:                if ((nitem = get_item(pack, "remove the curse on",ALL))!=NULL){
                    468:                    nobj = OBJPTR(nitem);
                    469:                    nobj->o_flags &= ~ISCURSED;
                    470:                    msg("Removed the curse from %s",inv_name(nobj,TRUE));
                    471:                }
                    472:            }
                    473:            if (is_scroll) s_know[S_REMOVE] = TRUE;
                    474:        when S_PETRIFY:
                    475:            switch (mvinch(hero.y, hero.x)) {
                    476:                case TRAPDOOR:
                    477:                case DARTTRAP:
                    478:                case TELTRAP:
                    479:                case ARROWTRAP:
                    480:                case SLEEPTRAP:
                    481:                case BEARTRAP:
                    482:                    {
                    483:                        register int i;
                    484:
                    485:                        /* Find the right trap */
                    486:                        for (i=0; i<ntraps && !ce(traps[i].tr_pos, hero); i++);
                    487:                        ntraps--;
                    488:
                    489:                        if (!ce(traps[i].tr_pos, hero))
                    490:                            msg("What a strange trap!");
                    491:                        else {
                    492:                            while (i < ntraps) {
                    493:                                traps[i] = traps[i + 1];
                    494:                                i++;
                    495:                            }
                    496:                        }
                    497:                    }
                    498:                    goto pet_message;
                    499:                case DOOR:
                    500:                case SECRETDOOR:
                    501:                case FLOOR:
                    502:                case PASSAGE:
                    503: pet_message:       msg("The dungeon begins to rumble and shake!");
                    504:                    addch(WALL);
                    505:
                    506:                    /* If the player is phased, unphase him */
                    507:                    if (on(player, CANINWALL)) {
                    508:                        extinguish(unphase);
                    509:                        turn_off(player, CANINWALL);
                    510:                        msg("Your dizzy feeling leaves you.");
                    511:                    }
                    512:
                    513:                    /* Mark the player as in a wall */
                    514:                    turn_on(player, ISINWALL);
                    515:                    break;
                    516:                default:
                    517:                    msg(nothing);
                    518:            }
                    519:        when S_GENOCIDE:
                    520:            msg("You have been granted the boon of genocide!--More--");
                    521:            wait_for(cw,' ');
                    522:            msg("");
                    523:            genocide();
                    524:            if (is_scroll) s_know[S_GENOCIDE] = TRUE;
                    525:        when S_PROTECT: {
                    526:            struct linked_list *ll;
                    527:            struct object *lb;
                    528:            bool did_it = FALSE;
                    529:            msg("You are granted the power of protection.");
                    530:            if ((ll = get_item(pack, "protect", PROTECTABLE)) != NULL) {
                    531:                lb = OBJPTR(ll);
                    532:                mpos = 0;
                    533:                if (cursed) {
                    534:                    switch(lb->o_type) {        /* ruin it completely */
                    535:                        case RING: if (lb->o_ac > 0) {
                    536:                                    if (is_current(lb)) {
                    537:                                        switch (lb->o_which) {
                    538:                                            case R_ADDWISDOM:
                    539:                                                pstats.s_wisdom -= lb->o_ac;
                    540:                                            when R_ADDINTEL:
                    541:                                                pstats.s_intel -= lb->o_ac;
                    542:                                            when R_ADDSTR:
                    543:                                                pstats.s_str -= lb->o_ac;
                    544:                                            when R_ADDHIT:
                    545:                                                pstats.s_dext -= lb->o_ac;
                    546:                                        }
                    547:                                    }
                    548:                                    did_it = TRUE;
                    549:                                        lb->o_ac = 0;
                    550:                                }
                    551:                        when ARMOR: if (lb->o_ac > 10) {
                    552:                                        did_it = TRUE;
                    553:                                        lb->o_ac = 10;
                    554:                                    }
                    555:                        when STICK: if (lb->o_charges > 0) {
                    556:                                        did_it = TRUE;
                    557:                                        lb->o_charges = 0;
                    558:                                    }
                    559:                        when WEAPON:if (lb->o_hplus > 0) {
                    560:                                        did_it = TRUE;
                    561:                                        lb->o_hplus = 0;
                    562:                                    }
                    563:                                    if (lb->o_dplus > 0) {
                    564:                                        did_it = TRUE;
                    565:                                        lb->o_dplus = 0;
                    566:                                    }
                    567:                    }
                    568:                    if (lb->o_flags & ISPROT) {
                    569:                        did_it = TRUE;
                    570:                        lb->o_flags &= ~ISPROT;
                    571:                    }
                    572:                    if (lb->o_flags & ISBLESSED) {
                    573:                        did_it = TRUE;
                    574:                        lb->o_flags &= ~ISBLESSED;
                    575:                    }
                    576:                    if (did_it)
                    577:                        msg("Your %s glows red for a moment",inv_name(lb,TRUE));
                    578:                    else {
                    579:                        msg(nothing);
                    580:                        break;
                    581:                    }
                    582:                }
                    583:                else  {
                    584:                    lb->o_flags |= ISPROT;
                    585:                    msg("Protected %s.",inv_name(lb,TRUE));
                    586:                }
                    587:            }
                    588:            if (is_scroll) s_know[S_PROTECT] = TRUE;
                    589:        }
                    590:        when S_MAKEIT:
                    591:            msg("You have been endowed with the power of creation.");
                    592:            if (is_scroll) s_know[S_MAKEIT] = TRUE;
                    593:            create_obj(TRUE, 0, 0);
                    594:        when S_ALLENCH: {
                    595:            struct linked_list *ll;
                    596:            struct object *lb;
                    597:            int howmuch, flags;
                    598:            if (is_scroll && s_know[S_ALLENCH] == FALSE) {
                    599:                msg("You are granted the power of enchantment.");
                    600:                msg("You may enchant anything(weapon,ring,armor,scroll,potion)");
                    601:            }
                    602:            if ((ll = get_item(pack, "enchant",ALL)) != NULL) {
                    603:                lb = OBJPTR(ll);
                    604:                lb->o_flags &= ~ISCURSED;
                    605:                if (blessed) {
                    606:                    howmuch = 2;
                    607:                    flags = ISBLESSED;
                    608:                }
                    609:                else if (cursed) {
                    610:                    howmuch = -1;
                    611:                    flags = ISCURSED;
                    612:                }
                    613:                else {
                    614:                    howmuch = 1;
                    615:                    flags = ISBLESSED;
                    616:                }
                    617:                switch(lb->o_type) {
                    618:                    case RING:
                    619:                        if (lb->o_ac + howmuch > MAXENCHANT) {
                    620:                            msg("The enchantment doesn't seem to work!");
                    621:                            break;
                    622:                        }
                    623:                        lb->o_ac += howmuch;
                    624:                        if (lb==cur_ring[LEFT_1]  || lb==cur_ring[LEFT_2]  ||
                    625:                            lb==cur_ring[LEFT_3]  || lb==cur_ring[LEFT_4]  ||
                    626:                            lb==cur_ring[RIGHT_1] || lb==cur_ring[RIGHT_2] ||
                    627:                            lb==cur_ring[RIGHT_3] || lb==cur_ring[RIGHT_4]) {
                    628:                            switch (lb->o_which) {
                    629:                                case R_ADDWISDOM: pstats.s_wisdom += howmuch;
                    630:                                when R_ADDINTEL:  pstats.s_intel += howmuch;
                    631:                                when R_ADDSTR:    pstats.s_str += howmuch;
                    632:                                when R_ADDHIT:    pstats.s_dext += howmuch;
                    633:                            }
                    634:                        }
                    635:                        msg("Enchanted %s.",inv_name(lb,TRUE));
                    636:                    when ARMOR:
                    637:                        if ((armors[lb->o_which].a_class - lb->o_ac) +
                    638:                            howmuch > MAXENCHANT) {
                    639:                            msg("The enchantment doesn't seem to work!");
                    640:                            break;
                    641:                        }
                    642:                        else
                    643:                            lb->o_ac -= howmuch;
                    644:                        msg("Enchanted %s.",inv_name(lb,TRUE));
                    645:                    when STICK:
                    646:                        lb->o_charges += (howmuch * 10) + rnd(5);
                    647:                        if (lb->o_charges < 0)
                    648:                            lb->o_charges = 0;
                    649:                        if (EQUAL(ws_type[lb->o_which], "staff")) {
                    650:                            if (lb->o_charges > 100)
                    651:                                lb->o_charges = 100;
                    652:                        }
                    653:                        else {
                    654:                            if (lb->o_charges > 50)
                    655:                                lb->o_charges = 50;
                    656:                        }
                    657:                        msg("Enchanted %s.",inv_name(lb,TRUE));
                    658:                    when WEAPON:
                    659:                        if(lb->o_hplus+lb->o_dplus+howmuch > MAXENCHANT * 2){
                    660:                            msg("The enchantment doesn't seem to work!");
                    661:                            break;
                    662:                        }
                    663:                        if (rnd(100) < 50)
                    664:                            lb->o_hplus += howmuch;
                    665:                        else
                    666:                            lb->o_dplus += howmuch;
                    667:                        msg("Enchanted %s.",inv_name(lb,TRUE));
                    668:                    when MM:
                    669:                        switch (lb->o_which) {
                    670:                            case MM_BRACERS:
                    671:                            case MM_PROTECT:
                    672:                                if (lb->o_ac + howmuch > MAXENCHANT) {
                    673:                                   msg("The enchantment doesn't seem to work!");
                    674:                                   break;
                    675:                                }
                    676:                                else lb->o_ac += howmuch;
                    677:                                msg("Enchanted %s.",inv_name(lb,TRUE));
                    678:                        }
                    679:                        lb->o_flags |= flags;
                    680:                    when POTION:
                    681:                    case SCROLL:
                    682:                    default:
                    683:                        lb->o_flags |= flags;
                    684:                    msg("Enchanted %s.",inv_name(lb,TRUE));
                    685:                }
                    686:            }
                    687:            if (is_scroll) s_know[S_ALLENCH] = TRUE;
                    688:            if (!is_scroll) {
                    689:                pstats.s_const--;
                    690:                max_stats.s_const--;
                    691:                if (pstats.s_const <= 0)
                    692:                    death(D_CONSTITUTION);
                    693:                msg("You feel less healthy now");
                    694:            }
                    695:        }
                    696:        otherwise:
                    697:            msg("What a puzzling scroll!");
                    698:            return;
                    699:     }
                    700:     look(TRUE, FALSE); /* put the result of the scroll on the screen */
                    701:     status(FALSE);
                    702:     if (is_scroll && s_know[which] && s_guess[which])
                    703:     {
                    704:        free(s_guess[which]);
                    705:        s_guess[which] = NULL;
                    706:     }
                    707:     else if (is_scroll &&
                    708:             !s_know[which] &&
                    709:             askme &&
                    710:             (obj->o_flags & ISKNOW) == 0 &&
                    711:             (obj->o_flags & ISPOST) == 0 &&
                    712:             s_guess[which] == NULL) {
                    713:        msg(terse ? "Call it: " : "What do you want to call it? ");
                    714:        if (get_str(buf, msgw) == NORM)
                    715:        {
                    716:            s_guess[which] = new(strlen(buf) + 1);
                    717:            strcpy(s_guess[which], buf);
                    718:        }
                    719:     }
                    720:     if (item != NULL) o_discard(item);
                    721:     updpack(TRUE);
                    722: }

CVSweb