Annotation of 43BSDTahoe/games/hack/hack.read.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.read.c - version 1.0.3 */
        !             3: 
        !             4: #include "hack.h"
        !             5: 
        !             6: extern struct monst *makemon();
        !             7: extern struct obj *mkobj_at();
        !             8: int identify();
        !             9: 
        !            10: doread() {
        !            11:        register struct obj *scroll;
        !            12:        register boolean confused = (Confusion != 0);
        !            13:        register boolean known = FALSE;
        !            14:        extern struct obj *some_armor();
        !            15: 
        !            16:        scroll = getobj("?", "read");
        !            17:        if(!scroll) return(0);
        !            18:        if(!scroll->dknown && Blind) {
        !            19:            pline("Being blind, you cannot read the formula on the scroll.");
        !            20:            return(0);
        !            21:        }
        !            22:        if(Blind)
        !            23:          pline("As you pronounce the formula on it, the scroll disappears.");
        !            24:        else
        !            25:          pline("As you read the scroll, it disappears.");
        !            26:        if(confused)
        !            27:          pline("Being confused, you mispronounce the magic words ... ");
        !            28: 
        !            29:        switch(scroll->otyp) {
        !            30: #ifdef MAIL
        !            31:        case SCR_MAIL:
        !            32:                readmail(/* scroll */);
        !            33:                break;
        !            34: #endif MAIL
        !            35:        case SCR_ENCHANT_ARMOR:
        !            36:            {   register struct obj *otmp = some_armor();
        !            37:                if(!otmp) {
        !            38:                        strange_feeling(scroll,"Your skin glows then fades.");
        !            39:                        return(1);
        !            40:                }
        !            41:                if(confused) {
        !            42:                        pline("Your %s glows silver for a moment.",
        !            43:                                objects[otmp->otyp].oc_name);
        !            44:                        otmp->rustfree = 1;
        !            45:                        break;
        !            46:                }
        !            47:                if(otmp->spe > 3 && rn2(otmp->spe)) {
        !            48:        pline("Your %s glows violently green for a while, then evaporates.",
        !            49:                        objects[otmp->otyp].oc_name);
        !            50:                        useup(otmp);
        !            51:                        break;
        !            52:                }
        !            53:                pline("Your %s glows green for a moment.",
        !            54:                        objects[otmp->otyp].oc_name);
        !            55:                otmp->cursed = 0;
        !            56:                otmp->spe++;
        !            57:                break;
        !            58:            }
        !            59:        case SCR_DESTROY_ARMOR:
        !            60:                if(confused) {
        !            61:                        register struct obj *otmp = some_armor();
        !            62:                        if(!otmp) {
        !            63:                                strange_feeling(scroll,"Your bones itch.");
        !            64:                                return(1);
        !            65:                        }
        !            66:                        pline("Your %s glows purple for a moment.",
        !            67:                                objects[otmp->otyp].oc_name);
        !            68:                        otmp->rustfree = 0;
        !            69:                        break;
        !            70:                }
        !            71:                if(uarm) {
        !            72:                    pline("Your armor turns to dust and falls to the floor!");
        !            73:                    useup(uarm);
        !            74:                } else if(uarmh) {
        !            75:                    pline("Your helmet turns to dust and is blown away!");
        !            76:                    useup(uarmh);
        !            77:                } else if(uarmg) {
        !            78:                        pline("Your gloves vanish!");
        !            79:                        useup(uarmg);
        !            80:                        selftouch("You");
        !            81:                } else {
        !            82:                        strange_feeling(scroll,"Your skin itches.");
        !            83:                        return(1);
        !            84:                }
        !            85:                break;
        !            86:        case SCR_CONFUSE_MONSTER:
        !            87:                if(confused) {
        !            88:                        pline("Your hands begin to glow purple.");
        !            89:                        Confusion += rnd(100);
        !            90:                } else {
        !            91:                        pline("Your hands begin to glow blue.");
        !            92:                        u.umconf = 1;
        !            93:                }
        !            94:                break;
        !            95:        case SCR_SCARE_MONSTER:
        !            96:            {   register int ct = 0;
        !            97:                register struct monst *mtmp;
        !            98: 
        !            99:                for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
        !           100:                        if(cansee(mtmp->mx,mtmp->my)) {
        !           101:                                if(confused)
        !           102:                                        mtmp->mflee = mtmp->mfroz =
        !           103:                                        mtmp->msleep = 0;
        !           104:                                else
        !           105:                                        mtmp->mflee = 1;
        !           106:                                ct++;
        !           107:                        }
        !           108:                if(!ct) {
        !           109:                    if(confused)
        !           110:                        pline("You hear sad wailing in the distance.");
        !           111:                    else
        !           112:                        pline("You hear maniacal laughter in the distance.");
        !           113:                }
        !           114:                break;
        !           115:            }
        !           116:        case SCR_BLANK_PAPER:
        !           117:                if(confused)
        !           118:                    pline("You see strange patterns on this scroll.");
        !           119:                else
        !           120:                    pline("This scroll seems to be blank.");
        !           121:                break;
        !           122:        case SCR_REMOVE_CURSE:
        !           123:            {   register struct obj *obj;
        !           124:                if(confused)
        !           125:                  pline("You feel like you need some help.");
        !           126:                else
        !           127:                  pline("You feel like someone is helping you.");
        !           128:                for(obj = invent; obj ; obj = obj->nobj)
        !           129:                        if(obj->owornmask)
        !           130:                                obj->cursed = confused;
        !           131:                if(Punished && !confused) {
        !           132:                        Punished = 0;
        !           133:                        freeobj(uchain);
        !           134:                        unpobj(uchain);
        !           135:                        free((char *) uchain);
        !           136:                        uball->spe = 0;
        !           137:                        uball->owornmask &= ~W_BALL;
        !           138:                        uchain = uball = (struct obj *) 0;
        !           139:                }
        !           140:                break;
        !           141:            }
        !           142:        case SCR_CREATE_MONSTER:
        !           143:            {   register int cnt = 1;
        !           144: 
        !           145:                if(!rn2(73)) cnt += rnd(4);
        !           146:                if(confused) cnt += 12;
        !           147:                while(cnt--)
        !           148:                    (void) makemon(confused ? PM_ACID_BLOB :
        !           149:                        (struct permonst *) 0, u.ux, u.uy);
        !           150:                break;
        !           151:            }
        !           152:        case SCR_ENCHANT_WEAPON:
        !           153:                if(uwep && confused) {
        !           154:                        pline("Your %s glows silver for a moment.",
        !           155:                                objects[uwep->otyp].oc_name);
        !           156:                        uwep->rustfree = 1;
        !           157:                } else
        !           158:                        if(!chwepon(scroll, 1))         /* tests for !uwep */
        !           159:                                return(1);
        !           160:                break;
        !           161:        case SCR_DAMAGE_WEAPON:
        !           162:                if(uwep && confused) {
        !           163:                        pline("Your %s glows purple for a moment.",
        !           164:                                objects[uwep->otyp].oc_name);
        !           165:                        uwep->rustfree = 0;
        !           166:                } else
        !           167:                        if(!chwepon(scroll, -1))        /* tests for !uwep */
        !           168:                                return(1);
        !           169:                break;
        !           170:        case SCR_TAMING:
        !           171:            {   register int i,j;
        !           172:                register int bd = confused ? 5 : 1;
        !           173:                register struct monst *mtmp;
        !           174: 
        !           175:                for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++)
        !           176:                if(mtmp = m_at(u.ux+i, u.uy+j))
        !           177:                        (void) tamedog(mtmp, (struct obj *) 0);
        !           178:                break;
        !           179:            }
        !           180:        case SCR_GENOCIDE:
        !           181:            {   extern char genocided[], fut_geno[];
        !           182:                char buf[BUFSZ];
        !           183:                register struct monst *mtmp, *mtmp2;
        !           184: 
        !           185:                pline("You have found a scroll of genocide!");
        !           186:                known = TRUE;
        !           187:                if(confused)
        !           188:                        *buf = u.usym;
        !           189:                else do {
        !           190:            pline("What monster do you want to genocide (Type the letter)? ");
        !           191:                        getlin(buf);
        !           192:                } while(strlen(buf) != 1 || !monstersym(*buf));
        !           193:                if(!index(fut_geno, *buf))
        !           194:                        charcat(fut_geno, *buf);
        !           195:                if(!index(genocided, *buf))
        !           196:                        charcat(genocided, *buf);
        !           197:                else {
        !           198:                        pline("Such monsters do not exist in this world.");
        !           199:                        break;
        !           200:                }
        !           201:                for(mtmp = fmon; mtmp; mtmp = mtmp2){
        !           202:                        mtmp2 = mtmp->nmon;
        !           203:                        if(mtmp->data->mlet == *buf)
        !           204:                                mondead(mtmp);
        !           205:                }
        !           206:                pline("Wiped out all %c's.", *buf);
        !           207:                if(*buf == u.usym) {
        !           208:                        killer = "scroll of genocide";
        !           209:                        u.uhp = -1;
        !           210:                }
        !           211:                break;
        !           212:                }
        !           213:        case SCR_LIGHT:
        !           214:                if(!Blind) known = TRUE;
        !           215:                litroom(!confused);
        !           216:                break;
        !           217:        case SCR_TELEPORTATION:
        !           218:                if(confused)
        !           219:                        level_tele();
        !           220:                else {
        !           221: #ifdef QUEST
        !           222:                        register int oux = u.ux, ouy = u.uy;
        !           223:                        tele();
        !           224:                        if(dist(oux, ouy) > 100) known = TRUE;
        !           225: #else QUEST
        !           226:                        register int uroom = inroom(u.ux, u.uy);
        !           227:                        tele();
        !           228:                        if(uroom != inroom(u.ux, u.uy)) known = TRUE;
        !           229: #endif QUEST
        !           230:                }
        !           231:                break;
        !           232:        case SCR_GOLD_DETECTION:
        !           233:            /* Unfortunately this code has become slightly less elegant,
        !           234:               now that gold and traps no longer are of the same type. */
        !           235:            if(confused) {
        !           236:                register struct trap *ttmp;
        !           237: 
        !           238:                if(!ftrap) {
        !           239:                        strange_feeling(scroll, "Your toes stop itching.");
        !           240:                        return(1);
        !           241:                } else {
        !           242:                        for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
        !           243:                                if(ttmp->tx != u.ux || ttmp->ty != u.uy)
        !           244:                                        goto outtrapmap;
        !           245:                        /* only under me - no separate display required */
        !           246:                        pline("Your toes itch!");
        !           247:                        break;
        !           248:                outtrapmap:
        !           249:                        cls();
        !           250:                        for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
        !           251:                                at(ttmp->tx, ttmp->ty, '$');
        !           252:                        prme();
        !           253:                        pline("You feel very greedy!");
        !           254:                }
        !           255:            } else {
        !           256:                register struct gold *gtmp;
        !           257: 
        !           258:                if(!fgold) {
        !           259:                        strange_feeling(scroll, "You feel materially poor.");
        !           260:                        return(1);
        !           261:                } else {
        !           262:                        known = TRUE;
        !           263:                        for(gtmp = fgold; gtmp; gtmp = gtmp->ngold)
        !           264:                                if(gtmp->gx != u.ux || gtmp->gy != u.uy)
        !           265:                                        goto outgoldmap;
        !           266:                        /* only under me - no separate display required */
        !           267:                        pline("You notice some gold between your feet.");
        !           268:                        break;
        !           269:                outgoldmap:
        !           270:                        cls();
        !           271:                        for(gtmp = fgold; gtmp; gtmp = gtmp->ngold)
        !           272:                                at(gtmp->gx, gtmp->gy, '$');
        !           273:                        prme();
        !           274:                        pline("You feel very greedy, and sense gold!");
        !           275:                }
        !           276:            }
        !           277:                /* common sequel */
        !           278:                more();
        !           279:                docrt();
        !           280:                break;
        !           281:        case SCR_FOOD_DETECTION:
        !           282:            {   register ct = 0, ctu = 0;
        !           283:                register struct obj *obj;
        !           284:                register char foodsym = confused ? POTION_SYM : FOOD_SYM;
        !           285: 
        !           286:                for(obj = fobj; obj; obj = obj->nobj)
        !           287:                        if(obj->olet == FOOD_SYM) {
        !           288:                                if(obj->ox == u.ux && obj->oy == u.uy) ctu++;
        !           289:                                else ct++;
        !           290:                        }
        !           291:                if(!ct && !ctu) {
        !           292:                        strange_feeling(scroll,"Your nose twitches.");
        !           293:                        return(1);
        !           294:                } else if(!ct) {
        !           295:                        known = TRUE;
        !           296:                        pline("You smell %s close nearby.",
        !           297:                                confused ? "something" : "food");
        !           298:                        
        !           299:                } else {
        !           300:                        known = TRUE;
        !           301:                        cls();
        !           302:                        for(obj = fobj; obj; obj = obj->nobj)
        !           303:                            if(obj->olet == foodsym)
        !           304:                                at(obj->ox, obj->oy, FOOD_SYM);
        !           305:                        prme();
        !           306:                        pline("Your nose tingles and you smell %s!",
        !           307:                                confused ? "something" : "food");
        !           308:                        more();
        !           309:                        docrt();
        !           310:                }
        !           311:                break;
        !           312:            }
        !           313:        case SCR_IDENTIFY:
        !           314:                /* known = TRUE; */
        !           315:                if(confused)
        !           316:                        pline("You identify this as an identify scroll.");
        !           317:                else
        !           318:                        pline("This is an identify scroll.");
        !           319:                useup(scroll);
        !           320:                objects[SCR_IDENTIFY].oc_name_known = 1;
        !           321:                if(!confused)
        !           322:                    while(
        !           323:                        !ggetobj("identify", identify, rn2(5) ? 1 : rn2(5))
        !           324:                        && invent
        !           325:                    );
        !           326:                return(1);
        !           327:        case SCR_MAGIC_MAPPING:
        !           328:            {   register struct rm *lev;
        !           329:                register int num, zx, zy;
        !           330: 
        !           331:                known = TRUE;
        !           332:                pline("On this scroll %s a map!",
        !           333:                        confused ? "was" : "is");
        !           334:                for(zy = 0; zy < ROWNO; zy++)
        !           335:                        for(zx = 0; zx < COLNO; zx++) {
        !           336:                                if(confused && rn2(7)) continue;
        !           337:                                lev = &(levl[zx][zy]);
        !           338:                                if((num = lev->typ) == 0)
        !           339:                                        continue;
        !           340:                                if(num == SCORR) {
        !           341:                                        lev->typ = CORR;
        !           342:                                        lev->scrsym = CORR_SYM;
        !           343:                                } else
        !           344:                                if(num == SDOOR) {
        !           345:                                        lev->typ = DOOR;
        !           346:                                        lev->scrsym = '+';
        !           347:                                        /* do sth in doors ? */
        !           348:                                } else if(lev->seen) continue;
        !           349: #ifndef QUEST
        !           350:                                if(num != ROOM)
        !           351: #endif QUEST
        !           352:                                {
        !           353:                                  lev->seen = lev->new = 1;
        !           354:                                  if(lev->scrsym == ' ' || !lev->scrsym)
        !           355:                                    newsym(zx,zy);
        !           356:                                  else
        !           357:                                    on_scr(zx,zy);
        !           358:                                }
        !           359:                        }
        !           360:                break;
        !           361:            }
        !           362:        case SCR_AMNESIA:
        !           363:            {   register int zx, zy;
        !           364: 
        !           365:                known = TRUE;
        !           366:                for(zx = 0; zx < COLNO; zx++) for(zy = 0; zy < ROWNO; zy++)
        !           367:                    if(!confused || rn2(7))
        !           368:                        if(!cansee(zx,zy))
        !           369:                            levl[zx][zy].seen = 0;
        !           370:                docrt();
        !           371:                pline("Thinking of Maud you forget everything else.");
        !           372:                break;
        !           373:            }
        !           374:        case SCR_FIRE:
        !           375:            {   register int num;
        !           376:                register struct monst *mtmp;
        !           377: 
        !           378:                known = TRUE;
        !           379:                if(confused) {
        !           380:                    pline("The scroll catches fire and you burn your hands.");
        !           381:                    losehp(1, "scroll of fire");
        !           382:                } else {
        !           383:                    pline("The scroll erupts in a tower of flame!");
        !           384:                    if(Fire_resistance)
        !           385:                        pline("You are uninjured.");
        !           386:                    else {
        !           387:                        num = rnd(6);
        !           388:                        u.uhpmax -= num;
        !           389:                        losehp(num, "scroll of fire");
        !           390:                    }
        !           391:                }
        !           392:                num = (2*num + 1)/3;
        !           393:                for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
        !           394:                    if(dist(mtmp->mx,mtmp->my) < 3) {
        !           395:                        mtmp->mhp -= num;
        !           396:                        if(index("FY", mtmp->data->mlet))
        !           397:                            mtmp->mhp -= 3*num; /* this might well kill 'F's */
        !           398:                        if(mtmp->mhp < 1) {
        !           399:                            killed(mtmp);
        !           400:                            break;              /* primitive */
        !           401:                        }
        !           402:                    }
        !           403:                }
        !           404:                break;
        !           405:            }
        !           406:        case SCR_PUNISHMENT:
        !           407:                known = TRUE;
        !           408:                if(confused) {
        !           409:                        pline("You feel guilty.");
        !           410:                        break;
        !           411:                }
        !           412:                pline("You are being punished for your misbehaviour!");
        !           413:                if(Punished){
        !           414:                        pline("Your iron ball gets heavier.");
        !           415:                        uball->owt += 15;
        !           416:                        break;
        !           417:                }
        !           418:                Punished = INTRINSIC;
        !           419:                setworn(mkobj_at(CHAIN_SYM, u.ux, u.uy), W_CHAIN);
        !           420:                setworn(mkobj_at(BALL_SYM, u.ux, u.uy), W_BALL);
        !           421:                uball->spe = 1;         /* special ball (see save) */
        !           422:                break;
        !           423:        default:
        !           424:                impossible("What weird language is this written in? (%u)",
        !           425:                        scroll->otyp);
        !           426:        }
        !           427:        if(!objects[scroll->otyp].oc_name_known) {
        !           428:                if(known && !confused) {
        !           429:                        objects[scroll->otyp].oc_name_known = 1;
        !           430:                        more_experienced(0,10);
        !           431:                } else if(!objects[scroll->otyp].oc_uname)
        !           432:                        docall(scroll);
        !           433:        }
        !           434:        useup(scroll);
        !           435:        return(1);
        !           436: }
        !           437: 
        !           438: identify(otmp)         /* also called by newmail() */
        !           439: register struct obj *otmp;
        !           440: {
        !           441:        objects[otmp->otyp].oc_name_known = 1;
        !           442:        otmp->known = otmp->dknown = 1;
        !           443:        prinv(otmp);
        !           444:        return(1);
        !           445: }
        !           446: 
        !           447: litroom(on)
        !           448: register boolean on;
        !           449: {
        !           450:        register num,zx,zy;
        !           451: 
        !           452:        /* first produce the text (provided he is not blind) */
        !           453:        if(Blind) goto do_it;
        !           454:        if(!on) {
        !           455:                if(u.uswallow || !xdnstair || levl[u.ux][u.uy].typ == CORR ||
        !           456:                    !levl[u.ux][u.uy].lit) {
        !           457:                        pline("It seems even darker in here than before.");
        !           458:                        return;
        !           459:                } else
        !           460:                        pline("It suddenly becomes dark in here.");
        !           461:        } else {
        !           462:                if(u.uswallow){
        !           463:                        pline("%s's stomach is lit.", Monnam(u.ustuck));
        !           464:                        return;
        !           465:                }
        !           466:                if(!xdnstair){
        !           467:                        pline("Nothing Happens.");
        !           468:                        return;
        !           469:                }
        !           470: #ifdef QUEST
        !           471:                pline("The cave lights up around you, then fades.");
        !           472:                return;
        !           473: #else QUEST
        !           474:                if(levl[u.ux][u.uy].typ == CORR) {
        !           475:                    pline("The corridor lights up around you, then fades.");
        !           476:                    return;
        !           477:                } else if(levl[u.ux][u.uy].lit) {
        !           478:                    pline("The light here seems better now.");
        !           479:                    return;
        !           480:                } else
        !           481:                    pline("The room is lit.");
        !           482: #endif QUEST
        !           483:        }
        !           484: 
        !           485: do_it:
        !           486: #ifdef QUEST
        !           487:        return;
        !           488: #else QUEST
        !           489:        if(levl[u.ux][u.uy].lit == on)
        !           490:                return;
        !           491:        if(levl[u.ux][u.uy].typ == DOOR) {
        !           492:                if(IS_ROOM(levl[u.ux][u.uy+1].typ)) zy = u.uy+1;
        !           493:                else if(IS_ROOM(levl[u.ux][u.uy-1].typ)) zy = u.uy-1;
        !           494:                else zy = u.uy;
        !           495:                if(IS_ROOM(levl[u.ux+1][u.uy].typ)) zx = u.ux+1;
        !           496:                else if(IS_ROOM(levl[u.ux-1][u.uy].typ)) zx = u.ux-1;
        !           497:                else zx = u.ux;
        !           498:        } else {
        !           499:                zx = u.ux;
        !           500:                zy = u.uy;
        !           501:        }
        !           502:        for(seelx = u.ux; (num = levl[seelx-1][zy].typ) != CORR && num != 0;
        !           503:                seelx--);
        !           504:        for(seehx = u.ux; (num = levl[seehx+1][zy].typ) != CORR && num != 0;
        !           505:                seehx++);
        !           506:        for(seely = u.uy; (num = levl[zx][seely-1].typ) != CORR && num != 0;
        !           507:                seely--);
        !           508:        for(seehy = u.uy; (num = levl[zx][seehy+1].typ) != CORR && num != 0;
        !           509:                seehy++);
        !           510:        for(zy = seely; zy <= seehy; zy++)
        !           511:                for(zx = seelx; zx <= seehx; zx++) {
        !           512:                        levl[zx][zy].lit = on;
        !           513:                        if(!Blind && dist(zx,zy) > 2)
        !           514:                                if(on) prl(zx,zy); else nosee(zx,zy);
        !           515:                }
        !           516:        if(!on) seehx = 0;
        !           517: #endif QUEST
        !           518: }
        !           519: 
        !           520: /* Test whether we may genocide all monsters with symbol  ch  */
        !           521: monstersym(ch)                         /* arnold@ucsfcgl */
        !           522: register char ch;
        !           523: {
        !           524:        register struct permonst *mp;
        !           525:        extern struct permonst pm_eel;
        !           526: 
        !           527:        /*
        !           528:         * can't genocide certain monsters
        !           529:         */
        !           530:        if (index("12 &:", ch))
        !           531:                return FALSE;
        !           532: 
        !           533:        if (ch == pm_eel.mlet)
        !           534:                return TRUE;
        !           535:        for (mp = mons; mp < &mons[CMNUM+2]; mp++)
        !           536:                if (mp->mlet == ch)
        !           537:                        return TRUE;
        !           538:        return FALSE;
        !           539: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.