Annotation of 43BSDTahoe/games/hack/hack.read.c, revision 1.1.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.