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

Annotation of early-roguelike/srogue/scrolls.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * Read a scroll and let it happen
        !             3:  *
        !             4:  * @(#)scrolls.c       9.0     (rdk)    7/17/84
        !             5:  *
        !             6:  * Super-Rogue
        !             7:  * Copyright (C) 1984 Robert D. Kindelberger
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * Based on "Rogue: Exploring the Dungeons of Doom"
        !            11:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            12:  * All rights reserved.
        !            13:  *
        !            14:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            15:  */
        !            16:
        !            17: #include <stdlib.h>
        !            18: #include <string.h>
        !            19: #include <ctype.h>
        !            20: #include "rogue.h"
        !            21: #include "rogue.ext"
        !            22:
        !            23: /*
        !            24:  * read_scroll:
        !            25:  *     Let the hero read a scroll
        !            26:  */
        !            27: void
        !            28: read_scroll(void)
        !            29: {
        !            30:        reg struct object *obj;
        !            31:        reg struct linked_list *item;
        !            32:        reg int i, j, wh;
        !            33:        reg char ch, nch;
        !            34:        struct room *rp;
        !            35:        struct linked_list *titem;
        !            36:        char buf[LINLEN];
        !            37:        bool bless, curse;
        !            38:
        !            39:        if ((item = get_item("read", SCROLL)) == NULL)
        !            40:                return;
        !            41:        obj = OBJPTR(item);
        !            42:        if (obj->o_type != SCROLL) {
        !            43:                msg("Nothing to read.");
        !            44:                after = FALSE;
        !            45:                return;
        !            46:        }
        !            47:        msg("As you read the scroll, it vanishes.");
        !            48:        wh = obj->o_which;
        !            49:        bless = o_on(obj, ISBLESS);
        !            50:        curse = o_on(obj, ISCURSED);
        !            51:        del_pack(item);         /* Get rid of the thing */
        !            52:
        !            53:        /*
        !            54:         * Calculate the effect it has on the hero
        !            55:         */
        !            56:        switch(wh) {
        !            57:        case S_KNOWALL:
        !            58:                if (!curse) {
        !            59:                        idenpack();                             /* identify all the pack */
        !            60:                        msg("You feel more knowledgable.");
        !            61:                        chg_abil(WIS,1,TRUE);
        !            62:                        s_know[S_KNOWALL] = TRUE;
        !            63:                }
        !            64:        when S_CONFUSE:
        !            65:                if (!curse) {
        !            66:                        /*
        !            67:                         * Scroll of monster confusion.  Give him that power.
        !            68:                         */
        !            69:                        msg("Your hands begin to glow red.");
        !            70:                        player.t_flags |= CANHUH;
        !            71:                        s_know[S_CONFUSE] = TRUE;
        !            72:                }
        !            73:        when S_LIGHT:
        !            74:                rp = player.t_room;
        !            75:                if (!curse) {
        !            76:                        if (rp == NULL) {
        !            77:                                s_know[S_LIGHT] = TRUE;
        !            78:                                msg("The corridor glows and then fades.");
        !            79:                        }
        !            80:                        else {
        !            81:                                if (rf_on(rp,ISDARK)) {
        !            82:                                        s_know[S_LIGHT] = TRUE;
        !            83:                                        msg("The room is lit.");
        !            84:                                        rp->r_flags &= ~ISDARK;
        !            85:                                }
        !            86:                                light(&hero);
        !            87:                                mvwaddch(cw, hero.y, hero.x, PLAYER);
        !            88:                        }
        !            89:                }
        !            90:        when S_ARMOR:
        !            91:                if (!curse) {
        !            92:                        if (cur_armor != NULL && o_off(cur_armor,ISPROT)) {
        !            93:                                s_know[S_ARMOR] = TRUE;
        !            94:                                msg("Your armor glows faintly for a moment.");
        !            95:                                if (o_on(cur_armor,ISCURSED))
        !            96:                                        cur_armor->o_ac = armors[cur_armor->o_which].a_class;
        !            97:                                else
        !            98:                                        cur_armor->o_ac--;
        !            99:                                resoflg(cur_armor,ISCURSED);
        !           100:                        }
        !           101:                }
        !           102:        when S_HOLD:
        !           103:                if (!curse) {
        !           104:                        /*
        !           105:                         * Hold monster scroll.  Stop all monsters within 3 spaces
        !           106:                         * from chasing after the hero.
        !           107:                         */
        !           108:                        reg int x,y;
        !           109:                        reg struct linked_list *mon;
        !           110:
        !           111:                        for (x = hero.x - 3; x <= hero.x + 3; x++) {
        !           112:                                for (y = hero.y - 3; y <= hero.y + 3; y++) {
        !           113:                                        if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x))) {
        !           114:                                                if ((mon = find_mons(y, x)) != NULL) {
        !           115:                                                        reg struct thing *th;
        !           116:
        !           117:                                                        th = THINGPTR(mon);
        !           118:                                                        th->t_flags &= ~ISRUN;
        !           119:                                                        th->t_flags |= ISHELD;
        !           120:                                                        th->t_flags |= ISSTUCK;
        !           121:                                                }
        !           122:                                        }
        !           123:                                }
        !           124:                        }
        !           125:                }
        !           126:        when S_SLEEP:
        !           127:                /*
        !           128:                 * Scroll which makes you fall asleep
        !           129:                 */
        !           130:                if (!bless) {
        !           131:                        s_know[S_SLEEP] = TRUE;
        !           132:                        msg("You fall asleep.");
        !           133:                        player.t_nocmd += 4 + rnd(SLEEPTIME);
        !           134:                }
        !           135:        when S_CREATE:
        !           136:                if (!bless) {
        !           137:                        if (makemons(mtlev[rnd(levcount)]->m_show))
        !           138:                                s_know[S_CREATE] = TRUE;
        !           139:                        else
        !           140:                                msg("You hear a faint cry of anguish in the distance.");
        !           141:                }
        !           142:        when S_IDENT:
        !           143:                if (!curse) {
        !           144:                        msg("This scroll is an identify scroll");
        !           145:                        s_know[S_IDENT] = TRUE;
        !           146:                        whatis(NULL);
        !           147:                }
        !           148:        when S_MAP:
        !           149:                if (curse)
        !           150:                        break;
        !           151:                s_know[S_MAP] = TRUE;
        !           152:                addmsg("Oh, now this scroll has a ");
        !           153:                if (rnd(100) < 10 || bless) {
        !           154:                        addmsg("very detailed map on it.");
        !           155:                        endmsg();
        !           156:                        displevl();
        !           157:                }
        !           158:                else {
        !           159:                        addmsg("map on it.");
        !           160:                        endmsg();
        !           161:                        overwrite(stdscr, hw);
        !           162:                        for (i = 1; i < LINES - 2; i++) {
        !           163:                                for (j = 0; j < COLS; j++) {
        !           164:                                        switch (nch = ch = mvwinch(hw, i, j)) {
        !           165:                                                case SECRETDOOR:
        !           166:                                                        nch = DOOR;
        !           167:                                                        mvaddch(i, j, nch);
        !           168:                                                case '-':
        !           169:                                                case '|':
        !           170:                                                case DOOR:
        !           171:                                                case PASSAGE:
        !           172:                                                case ' ':
        !           173:                                                case STAIRS:
        !           174:                                                        if (mvwinch(mw, i, j) != ' ') {
        !           175:                                                                struct thing *it;
        !           176:                                                                struct linked_list *blah;
        !           177:
        !           178:                                                                blah = find_mons(i, j);
        !           179:                                                                if (blah != NULL) {
        !           180:                                                                        it = THINGPTR(blah);
        !           181:                                                                        if (it->t_oldch == ' ')
        !           182:                                                                                it->t_oldch = nch;
        !           183:                                                                }
        !           184:                                                        }
        !           185:                                                        break;
        !           186:                                                default:
        !           187:                                                        nch = ' ';
        !           188:                                        }
        !           189:                                        if (nch != ch)
        !           190:                                                waddch(hw, nch);
        !           191:                                }
        !           192:                        }
        !           193:                        overlay(cw, hw);
        !           194:                        overwrite(hw, cw);
        !           195:                }
        !           196:        when S_GFIND:
        !           197:                if (!curse) {
        !           198:                        int gtotal = 0;
        !           199:                        struct room *rp;
        !           200:
        !           201:                        wclear(hw);
        !           202:                        for (rp = rooms; rp < &rooms[MAXROOMS]; rp++) {
        !           203:                                gtotal += rp->r_goldval;
        !           204:                                if (rp->r_goldval != 0 &&
        !           205:                                  mvinch(rp->r_gold.y,rp->r_gold.x) == GOLD)
        !           206:                                        mvwaddch(hw,rp->r_gold.y,rp->r_gold.x,GOLD);
        !           207:                        }
        !           208:                        if (gtotal) {
        !           209:                                s_know[S_GFIND] = TRUE;
        !           210:                                msg("You begin to feel greedy and sense gold.");
        !           211:                                overlay(hw,cw);
        !           212:                        }
        !           213:                        else
        !           214:                                msg("You begin to feel a pull downward.");
        !           215:                }
        !           216:        when S_TELEP:
        !           217:                if (!curse) {
        !           218:                        int rm;
        !           219:                        struct room *cur_room;
        !           220:
        !           221:                        cur_room = player.t_room;
        !           222:                        rm = teleport(rndspot, &player);
        !           223:                        if (cur_room != &rooms[rm])
        !           224:                                s_know[S_TELEP] = TRUE;
        !           225:                }
        !           226:        when S_ENCH:
        !           227:                if (!curse) {
        !           228:                        if (cur_weapon == NULL || (cur_weapon != NULL &&
        !           229:                          (o_on(cur_weapon,ISPROT) || cur_weapon->o_type != WEAPON)))
        !           230:                                msg("You feel a strange sense of loss.");
        !           231:                        else {
        !           232:                                s_know[S_ENCH] = TRUE;
        !           233:                                if (o_on(cur_weapon,ISCURSED)) {
        !           234:                                        resoflg(cur_weapon,ISCURSED);
        !           235:                                        cur_weapon->o_hplus = rnd(2);
        !           236:                                        cur_weapon->o_dplus = rnd(2);
        !           237:                                }
        !           238:                                else {          /* weapon was not cursed here */
        !           239:                                        if (rnd(100) < 50)
        !           240:                                                cur_weapon->o_hplus += 1;
        !           241:                                        else
        !           242:                                                cur_weapon->o_dplus += 1;
        !           243:                                }
        !           244:                                setoflg(cur_weapon, ISKNOW);
        !           245:                                msg("Your %s glows blue for a moment.",
        !           246:                                  w_magic[cur_weapon->o_which].mi_name);
        !           247:                        }
        !           248:                }
        !           249:        when S_SCARE:
        !           250:                /*
        !           251:                 * A monster will refuse to step on a scare monster scroll
        !           252:                 * if it is dropped.  Thus reading it is a mistake and produces
        !           253:                 * laughter at the poor rogue's boo boo.
        !           254:                 */
        !           255:                msg("You hear maniacal laughter in the distance.");
        !           256:        when S_REMOVE:
        !           257:                if (!curse) {
        !           258:                        if (cur_armor != NULL && o_off(cur_armor,ISPROT))
        !           259:                                resoflg(cur_armor,ISCURSED);
        !           260:                        if (cur_weapon != NULL && o_off(cur_weapon,ISPROT))
        !           261:                                resoflg(cur_weapon,ISCURSED);
        !           262:                        if (cur_ring[LEFT]!=NULL && o_off(cur_ring[LEFT],ISPROT))
        !           263:                                resoflg(cur_ring[LEFT],ISCURSED);
        !           264:                        if (cur_ring[RIGHT]!=NULL && o_off(cur_ring[RIGHT],ISPROT))
        !           265:                                resoflg(cur_ring[RIGHT],ISCURSED);
        !           266:                        msg("You feel as if somebody is watching over you.");
        !           267:                        s_know[S_REMOVE] = TRUE;
        !           268:                }
        !           269:        when S_AGGR:
        !           270:                if (!bless) {
        !           271:                        if (mlist != NULL) {
        !           272:                                aggravate();
        !           273:                                msg("You hear a high pitched humming noise.");
        !           274:                                s_know[S_AGGR] = TRUE;
        !           275:                        }
        !           276:                }
        !           277:        when S_NOP:
        !           278:                msg("This scroll seems to be blank.");
        !           279:        when S_GENOCIDE:
        !           280:                if (!curse) {
        !           281:                        msg("You have been granted the boon of genocide.");
        !           282:                        genocide();
        !           283:                        s_know[S_GENOCIDE] = TRUE;
        !           284:                }
        !           285:        when S_DCURSE:
        !           286:                if (!bless) {
        !           287:                        struct linked_list *ll;
        !           288:                        struct object *lb;
        !           289:
        !           290:                        msg("Your pack shudders.");
        !           291:                        for (ll = pack ; ll != NULL ; ll = next(ll)) {
        !           292:                                lb = OBJPTR(ll);
        !           293:                                if (o_off(lb,ISPROT)) {
        !           294:                                        resoflg(lb, ISBLESS);
        !           295:                                        setoflg(lb, ISCURSED);
        !           296:                                }
        !           297:                        }
        !           298:                }
        !           299:        when S_DLEVEL:
        !           300:                if (!bless) {
        !           301:                        int much = rnd(9) - 4;
        !           302:
        !           303:                        if (much != 0) {
        !           304:                                level += much;
        !           305:                                if (level < 1)
        !           306:                                        level = 1;
        !           307:                                mpos = 0;
        !           308:                                new_level(NORMLEV);             /* change levels */
        !           309:                                msg("You are whisked away to another region.");
        !           310:                                s_know[S_DLEVEL] = TRUE;
        !           311:                        }
        !           312:                }
        !           313:        when S_PROTECT:
        !           314:                if (!curse) {
        !           315:                        struct linked_list *ll;
        !           316:                        struct object *lb;
        !           317:
        !           318:                        msg("You are granted the power of protection.");
        !           319:                        if ((ll = get_item("protect",0)) != NULL) {
        !           320:                                lb = OBJPTR(ll);
        !           321:                                setoflg(lb,ISPROT);
        !           322:                                mpos = 0;
        !           323:                                msg("Protected %s.",inv_name(lb,TRUE));
        !           324:                        }
        !           325:                        s_know[S_PROTECT] = TRUE;
        !           326:                }
        !           327:        when S_ALLENCH:
        !           328:                if (!curse) {
        !           329:                        struct linked_list *ll;
        !           330:                        struct object *lb;
        !           331:                        int howmuch, ac, good;
        !           332:
        !           333:                        msg("You are granted the power of enchantment.");
        !           334:                        good = TRUE;
        !           335:                        if ((ll = get_item("enchant",0)) != NULL) {
        !           336:                                lb = OBJPTR(ll);
        !           337:                                resoflg(lb,ISCURSED);
        !           338:                                resoflg(lb,ISPROT);
        !           339:                                howmuch = rnd(3) + 1;
        !           340:                                switch(lb->o_type) {
        !           341:                                        case RING:
        !           342:                                                if (lb->o_ac < 0)
        !           343:                                                        lb->o_ac = 0;
        !           344:                                                lb->o_ac += howmuch;
        !           345:                                        when ARMOR:
        !           346:                                                ac = armors[lb->o_which].a_class;
        !           347:                                                if (lb->o_ac > ac)
        !           348:                                                        lb->o_ac = ac;
        !           349:                                                lb->o_ac -= howmuch;
        !           350:                                        when STICK:
        !           351:                                                lb->o_charges += howmuch + 10;
        !           352:                                        when WEAPON:
        !           353:                                                if (lb->o_dplus < 0)
        !           354:                                                        lb->o_dplus = 0;
        !           355:                                                if (lb->o_hplus < 0)
        !           356:                                                        lb->o_hplus = 0;
        !           357:                                                lb->o_hplus += howmuch;
        !           358:                                                lb->o_dplus += howmuch;
        !           359:                                        otherwise:
        !           360:                                                msg("You are injured as the scroll flashes & bursts into flames !!!");
        !           361:                                                chg_hpt(-roll(6,6),FALSE,K_SCROLL);
        !           362:                                                good = FALSE;
        !           363:                                }
        !           364:                                if (good) {
        !           365:                                        mpos = 0;
        !           366:                                        msg("Enchanted %s.",inv_name(lb,TRUE));
        !           367:                                }
        !           368:                        }
        !           369:                        s_know[S_ALLENCH] = TRUE;
        !           370:                }
        !           371:        when S_BLESS:
        !           372:                if (!curse) {
        !           373:                        struct linked_list *ll;
        !           374:                        struct object *lb;
        !           375:
        !           376:                        msg("Your pack glistens brightly.");
        !           377:                        for (ll = pack ; ll != NULL ; ll = next(ll)) {
        !           378:                                whatis(ll);
        !           379:                                lb = OBJPTR(ll);
        !           380:                                resoflg(lb,ISCURSED);
        !           381:                                setoflg(lb,ISBLESS);
        !           382:                        }
        !           383:                }
        !           384:        when S_MAKEIT:
        !           385:                if (!curse) {
        !           386:                        msg("You have been endowed with the power of creation.");
        !           387:                        s_know[S_MAKEIT] = TRUE;
        !           388:                        create_obj(TRUE);
        !           389:                }
        !           390:        when S_BAN: {
        !           391:                int howdeep;
        !           392:                char *ptr = "";
        !           393:
        !           394:                if (bless) {
        !           395:                        if (level > 6) {
        !           396:                                howdeep = 1 + rnd(5);
        !           397:                                ptr = "elevated to the upper";
        !           398:                        }
        !           399:                        else {
        !           400:                                howdeep = -1;
        !           401:                                bless = FALSE;
        !           402:                        }
        !           403:                }
        !           404:                else {
        !           405:                        howdeep = level + 10 + rnd(20) + (curse * 20);
        !           406:                        ptr = "banished to the lower";
        !           407:                }
        !           408:                if ((!bless && level < howdeep) || bless) {
        !           409:                        level = howdeep;
        !           410:                        new_level(NORMLEV);
        !           411:                        mpos = 0;
        !           412:                        msg("You are %s regions.", ptr);
        !           413:                        s_know[S_BAN] = TRUE;
        !           414:                }
        !           415:        }
        !           416:        when S_CWAND:
        !           417:                if (!curse) {
        !           418:                        struct linked_list *ll;
        !           419:                        struct object *lb;
        !           420:                        bool wands = FALSE;
        !           421:
        !           422:                        for (ll = pack ; ll != NULL ; ll = next(ll)) {
        !           423:                                lb = OBJPTR(ll);
        !           424:                                if (lb->o_type == STICK) {
        !           425:                                        whatis(ll);
        !           426:                                        setoflg(lb, ISKNOW);
        !           427:                                        resoflg(lb, ISCURSED);
        !           428:                                        lb->o_charges += rnd(11) + 5;
        !           429:                                        wands = TRUE;
        !           430:                                }
        !           431:                        }
        !           432:                        if (wands) {
        !           433:                                msg("Your sticks gleam.");
        !           434:                                s_know[wh] = TRUE;
        !           435:                        }
        !           436:                }
        !           437:        when S_LOCTRAP: {
        !           438:                struct trap *trp;
        !           439:
        !           440:                if (ntraps > 0) {
        !           441:                        for (trp = &traps[0]; trp < &traps[ntraps]; trp++)
        !           442:                                trp->tr_flags |= ISFOUND;
        !           443:                        look(FALSE);
        !           444:                        msg("You now recognize pitfalls.");
        !           445:                        s_know[S_LOCTRAP] = TRUE;
        !           446:                }
        !           447:        }
        !           448:        otherwise:
        !           449:                msg("What a puzzling scroll!");
        !           450:                return;
        !           451:        }
        !           452:        look(TRUE);
        !           453:        nochange = FALSE;
        !           454:        if (s_know[wh] && s_guess[wh]) {
        !           455:                free(s_guess[wh]);
        !           456:                s_guess[wh] = NULL;
        !           457:        }
        !           458:        else if (!s_know[wh] && s_guess[wh] == NULL) {
        !           459:                strcpy(buf, s_names[wh]);
        !           460:                msg(callit);
        !           461:                if (get_str(buf, cw) == NORM) {
        !           462:                        s_guess[wh] = new(strlen(buf) + 1);
        !           463:                        strcpy(s_guess[wh], buf);
        !           464:                }
        !           465:        }
        !           466: }

CVSweb