Annotation of 43BSDReno/games/hack/hack.trap.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.trap.c - version 1.0.3 */
        !             3: 
        !             4: #include       "hack.h"
        !             5: 
        !             6: extern struct monst *makemon();
        !             7: 
        !             8: char vowels[] = "aeiou";
        !             9: 
        !            10: char *traps[] = {
        !            11:        " bear trap",
        !            12:        "n arrow trap",
        !            13:        " dart trap",
        !            14:        " trapdoor",
        !            15:        " teleportation trap",
        !            16:        " pit",
        !            17:        " sleeping gas trap",
        !            18:        " piercer",
        !            19:        " mimic"
        !            20: };
        !            21: 
        !            22: struct trap *
        !            23: maketrap(x,y,typ)
        !            24: register x,y,typ;
        !            25: {
        !            26:        register struct trap *ttmp;
        !            27: 
        !            28:        ttmp = newtrap();
        !            29:        ttmp->ttyp = typ;
        !            30:        ttmp->tseen = 0;
        !            31:        ttmp->once = 0;
        !            32:        ttmp->tx = x;
        !            33:        ttmp->ty = y;
        !            34:        ttmp->ntrap = ftrap;
        !            35:        ftrap = ttmp;
        !            36:        return(ttmp);
        !            37: }
        !            38: 
        !            39: dotrap(trap) register struct trap *trap; {
        !            40:        register int ttype = trap->ttyp;
        !            41: 
        !            42:        nomul(0);
        !            43:        if(trap->tseen && !rn2(5) && ttype != PIT)
        !            44:                pline("You escape a%s.", traps[ttype]);
        !            45:        else {
        !            46:                trap->tseen = 1;
        !            47:                switch(ttype) {
        !            48:                case SLP_GAS_TRAP:
        !            49:                        pline("A cloud of gas puts you to sleep!");
        !            50:                        nomul(-rnd(25));
        !            51:                        break;
        !            52:                case BEAR_TRAP:
        !            53:                        if(Levitation) {
        !            54:                                pline("You float over a bear trap.");
        !            55:                                break;
        !            56:                        }
        !            57:                        u.utrap = 4 + rn2(4);
        !            58:                        u.utraptype = TT_BEARTRAP;
        !            59:                        pline("A bear trap closes on your foot!");
        !            60:                        break;
        !            61:                case PIERC:
        !            62:                        deltrap(trap);
        !            63:                        if(makemon(PM_PIERCER,u.ux,u.uy)) {
        !            64:                          pline("A piercer suddenly drops from the ceiling!");
        !            65:                          if(uarmh)
        !            66:                                pline("Its blow glances off your helmet.");
        !            67:                          else
        !            68:                                (void) thitu(3,d(4,6),"falling piercer");
        !            69:                        }
        !            70:                        break;
        !            71:                case ARROW_TRAP:
        !            72:                        pline("An arrow shoots out at you!");
        !            73:                        if(!thitu(8,rnd(6),"arrow")){
        !            74:                                mksobj_at(ARROW, u.ux, u.uy);
        !            75:                                fobj->quan = 1;
        !            76:                        }
        !            77:                        break;
        !            78:                case TRAPDOOR:
        !            79:                        if(!xdnstair) {
        !            80: pline("A trap door in the ceiling opens and a rock falls on your head!");
        !            81: if(uarmh) pline("Fortunately, you are wearing a helmet!");
        !            82:                            losehp(uarmh ? 2 : d(2,10),"falling rock");
        !            83:                            mksobj_at(ROCK, u.ux, u.uy);
        !            84:                            fobj->quan = 1;
        !            85:                            stackobj(fobj);
        !            86:                            if(Invisible) newsym(u.ux, u.uy);
        !            87:                        } else {
        !            88:                            register int newlevel = dlevel + 1;
        !            89:                                while(!rn2(4) && newlevel < 29)
        !            90:                                        newlevel++;
        !            91:                                pline("A trap door opens up under you!");
        !            92:                                if(Levitation || u.ustuck) {
        !            93:                                pline("For some reason you don't fall in.");
        !            94:                                        break;
        !            95:                                }
        !            96: 
        !            97:                                goto_level(newlevel, FALSE);
        !            98:                        }
        !            99:                        break;
        !           100:                case DART_TRAP:
        !           101:                        pline("A little dart shoots out at you!");
        !           102:                        if(thitu(7,rnd(3),"little dart")) {
        !           103:                            if(!rn2(6))
        !           104:                                poisoned("dart","poison dart");
        !           105:                        } else {
        !           106:                                mksobj_at(DART, u.ux, u.uy);
        !           107:                                fobj->quan = 1;
        !           108:                        }
        !           109:                        break;
        !           110:                case TELEP_TRAP:
        !           111:                        if(trap->once) {
        !           112:                                deltrap(trap);
        !           113:                                newsym(u.ux,u.uy);
        !           114:                                vtele();
        !           115:                        } else {
        !           116:                                newsym(u.ux,u.uy);
        !           117:                                tele();
        !           118:                        }
        !           119:                        break;
        !           120:                case PIT:
        !           121:                        if(Levitation) {
        !           122:                                pline("A pit opens up under you!");
        !           123:                                pline("You don't fall in!");
        !           124:                                break;
        !           125:                        }
        !           126:                        pline("You fall into a pit!");
        !           127:                        u.utrap = rn1(6,2);
        !           128:                        u.utraptype = TT_PIT;
        !           129:                        losehp(rnd(6),"fall into a pit");
        !           130:                        selftouch("Falling, you");
        !           131:                        break;
        !           132:                default:
        !           133:                        impossible("You hit a trap of type %u", trap->ttyp);
        !           134:                }
        !           135:        }
        !           136: }
        !           137: 
        !           138: mintrap(mtmp) register struct monst *mtmp; {
        !           139:        register struct trap *trap = t_at(mtmp->mx, mtmp->my);
        !           140:        register int wasintrap = mtmp->mtrapped;
        !           141: 
        !           142:        if(!trap) {
        !           143:                mtmp->mtrapped = 0;     /* perhaps teleported? */
        !           144:        } else if(wasintrap) {
        !           145:                if(!rn2(40)) mtmp->mtrapped = 0;
        !           146:        } else {
        !           147:            register int tt = trap->ttyp;
        !           148:            int in_sight = cansee(mtmp->mx,mtmp->my);
        !           149:            extern char mlarge[];
        !           150: 
        !           151:            if(mtmp->mtrapseen & (1 << tt)) {
        !           152:                /* he has been in such a trap - perhaps he escapes */
        !           153:                if(rn2(4)) return(0);
        !           154:            }
        !           155:            mtmp->mtrapseen |= (1 << tt);
        !           156:            switch (tt) {
        !           157:                case BEAR_TRAP:
        !           158:                        if(index(mlarge, mtmp->data->mlet)) {
        !           159:                                if(in_sight)
        !           160:                                  pline("%s is caught in a bear trap!",
        !           161:                                        Monnam(mtmp));
        !           162:                                else
        !           163:                                  if(mtmp->data->mlet == 'o')
        !           164:                            pline("You hear the roaring of an angry bear!");
        !           165:                                mtmp->mtrapped = 1;
        !           166:                        }
        !           167:                        break;
        !           168:                case PIT:
        !           169:                        /* there should be a mtmp/data -> floating */
        !           170:                        if(!index("EywBfk'& ", mtmp->data->mlet)) { /* ab */
        !           171:                                mtmp->mtrapped = 1;
        !           172:                                if(in_sight)
        !           173:                                  pline("%s falls in a pit!", Monnam(mtmp));
        !           174:                        }
        !           175:                        break;
        !           176:                case SLP_GAS_TRAP:
        !           177:                        if(!mtmp->msleep && !mtmp->mfroz) {
        !           178:                                mtmp->msleep = 1;
        !           179:                                if(in_sight)
        !           180:                                  pline("%s suddenly falls asleep!",
        !           181:                                        Monnam(mtmp));
        !           182:                        }
        !           183:                        break;
        !           184:                case TELEP_TRAP:
        !           185:                        rloc(mtmp);
        !           186:                        if(in_sight && !cansee(mtmp->mx,mtmp->my))
        !           187:                                pline("%s suddenly disappears!",
        !           188:                                        Monnam(mtmp));
        !           189:                        break;
        !           190:                case ARROW_TRAP:
        !           191:                        if(in_sight) {
        !           192:                                pline("%s is hit by an arrow!",
        !           193:                                        Monnam(mtmp));
        !           194:                        }
        !           195:                        mtmp->mhp -= 3;
        !           196:                        break;
        !           197:                case DART_TRAP:
        !           198:                        if(in_sight) {
        !           199:                                pline("%s is hit by a dart!",
        !           200:                                        Monnam(mtmp));
        !           201:                        }
        !           202:                        mtmp->mhp -= 2;
        !           203:                        /* not mondied here !! */
        !           204:                        break;
        !           205:                case TRAPDOOR:
        !           206:                        if(!xdnstair) {
        !           207:                                mtmp->mhp -= 10;
        !           208:                                if(in_sight)
        !           209: pline("A trap door in the ceiling opens and a rock hits %s!", monnam(mtmp));
        !           210:                                break;
        !           211:                        }
        !           212:                        if(mtmp->data->mlet != 'w'){
        !           213:                                fall_down(mtmp);
        !           214:                                if(in_sight)
        !           215:                pline("Suddenly, %s disappears out of sight.", monnam(mtmp));
        !           216:                                return(2);      /* no longer on this level */
        !           217:                        }
        !           218:                        break;
        !           219:                case PIERC:
        !           220:                        break;
        !           221:                default:
        !           222:                        impossible("Some monster encountered a strange trap.");
        !           223:            }
        !           224:        }
        !           225:        return(mtmp->mtrapped);
        !           226: }
        !           227: 
        !           228: selftouch(arg) char *arg; {
        !           229:        if(uwep && uwep->otyp == DEAD_COCKATRICE){
        !           230:                pline("%s touch the dead cockatrice.", arg);
        !           231:                pline("You turn to stone.");
        !           232:                killer = objects[uwep->otyp].oc_name;
        !           233:                done("died");
        !           234:        }
        !           235: }
        !           236: 
        !           237: float_up(){
        !           238:        if(u.utrap) {
        !           239:                if(u.utraptype == TT_PIT) {
        !           240:                        u.utrap = 0;
        !           241:                        pline("You float up, out of the pit!");
        !           242:                } else {
        !           243:                        pline("You float up, only your leg is still stuck.");
        !           244:                }
        !           245:        } else
        !           246:                pline("You start to float in the air!");
        !           247: }
        !           248: 
        !           249: float_down(){
        !           250:        register struct trap *trap;
        !           251:        pline("You float gently to the ground.");
        !           252:        if(trap = t_at(u.ux,u.uy))
        !           253:                switch(trap->ttyp) {
        !           254:                case PIERC:
        !           255:                        break;
        !           256:                case TRAPDOOR:
        !           257:                        if(!xdnstair || u.ustuck) break;
        !           258:                        /* fall into next case */
        !           259:                default:
        !           260:                        dotrap(trap);
        !           261:        }
        !           262:        pickup(1);
        !           263: }
        !           264: 
        !           265: vtele() {
        !           266: #include "def.mkroom.h"
        !           267:        register struct mkroom *croom;
        !           268:        for(croom = &rooms[0]; croom->hx >= 0; croom++)
        !           269:            if(croom->rtype == VAULT) {
        !           270:                register x,y;
        !           271: 
        !           272:                x = rn2(2) ? croom->lx : croom->hx;
        !           273:                y = rn2(2) ? croom->ly : croom->hy;
        !           274:                if(teleok(x,y)) {
        !           275:                    teleds(x,y);
        !           276:                    return;
        !           277:                }
        !           278:            }
        !           279:        tele();
        !           280: }
        !           281: 
        !           282: tele() {
        !           283:        extern coord getpos();
        !           284:        coord cc;
        !           285:        register int nux,nuy;
        !           286: 
        !           287:        if(Teleport_control) {
        !           288:                pline("To what position do you want to be teleported?");
        !           289:                cc = getpos(1, "the desired position"); /* 1: force valid */
        !           290:                /* possible extensions: introduce a small error if
        !           291:                   magic power is low; allow transfer to solid rock */
        !           292:                if(teleok(cc.x, cc.y)){
        !           293:                        teleds(cc.x, cc.y);
        !           294:                        return;
        !           295:                }
        !           296:                pline("Sorry ...");
        !           297:        }
        !           298:        do {
        !           299:                nux = rnd(COLNO-1);
        !           300:                nuy = rn2(ROWNO);
        !           301:        } while(!teleok(nux, nuy));
        !           302:        teleds(nux, nuy);
        !           303: }
        !           304: 
        !           305: teleds(nux, nuy)
        !           306: register int nux,nuy;
        !           307: {
        !           308:        if(Punished) unplacebc();
        !           309:        unsee();
        !           310:        u.utrap = 0;
        !           311:        u.ustuck = 0;
        !           312:        u.ux = nux;
        !           313:        u.uy = nuy;
        !           314:        setsee();
        !           315:        if(Punished) placebc(1);
        !           316:        if(u.uswallow){
        !           317:                u.uswldtim = u.uswallow = 0;
        !           318:                docrt();
        !           319:        }
        !           320:        nomul(0);
        !           321:        if(levl[nux][nuy].typ == POOL && !Levitation)
        !           322:                drown();
        !           323:        (void) inshop();
        !           324:        pickup(1);
        !           325:        if(!Blind) read_engr_at(u.ux,u.uy);
        !           326: }
        !           327: 
        !           328: teleok(x,y) register int x,y; {        /* might throw him into a POOL */
        !           329:        return( isok(x,y) && !IS_ROCK(levl[x][y].typ) && !m_at(x,y) &&
        !           330:                !sobj_at(ENORMOUS_ROCK,x,y) && !t_at(x,y)
        !           331:        );
        !           332:        /* Note: gold is permitted (because of vaults) */
        !           333: }
        !           334: 
        !           335: dotele() {
        !           336:        extern char pl_character[];
        !           337: 
        !           338:        if(
        !           339: #ifdef WIZARD
        !           340:           !wizard &&
        !           341: #endif WIZARD
        !           342:                      (!Teleportation || u.ulevel < 6 ||
        !           343:                        (pl_character[0] != 'W' && u.ulevel < 10))) {
        !           344:                pline("You are not able to teleport at will.");
        !           345:                return(0);
        !           346:        }
        !           347:        if(u.uhunger <= 100 || u.ustr < 6) {
        !           348:                pline("You miss the strength for a teleport spell.");
        !           349:                return(1);
        !           350:        }
        !           351:        tele();
        !           352:        morehungry(100);
        !           353:        return(1);
        !           354: }
        !           355: 
        !           356: placebc(attach) int attach; {
        !           357:        if(!uchain || !uball){
        !           358:                impossible("Where are your chain and ball??");
        !           359:                return;
        !           360:        }
        !           361:        uball->ox = uchain->ox = u.ux;
        !           362:        uball->oy = uchain->oy = u.uy;
        !           363:        if(attach){
        !           364:                uchain->nobj = fobj;
        !           365:                fobj = uchain;
        !           366:                if(!carried(uball)){
        !           367:                        uball->nobj = fobj;
        !           368:                        fobj = uball;
        !           369:                }
        !           370:        }
        !           371: }
        !           372: 
        !           373: unplacebc(){
        !           374:        if(!carried(uball)){
        !           375:                freeobj(uball);
        !           376:                unpobj(uball);
        !           377:        }
        !           378:        freeobj(uchain);
        !           379:        unpobj(uchain);
        !           380: }
        !           381: 
        !           382: level_tele() {
        !           383: register int newlevel;
        !           384:        if(Teleport_control) {
        !           385:            char buf[BUFSZ];
        !           386: 
        !           387:            do {
        !           388:              pline("To what level do you want to teleport? [type a number] ");
        !           389:              getlin(buf);
        !           390:            } while(!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])));
        !           391:            newlevel = atoi(buf);
        !           392:        } else {
        !           393:            newlevel  = 5 + rn2(20);    /* 5 - 24 */
        !           394:            if(dlevel == newlevel)
        !           395:                if(!xdnstair) newlevel--; else newlevel++;
        !           396:        }
        !           397:        if(newlevel >= 30) {
        !           398:            if(newlevel > MAXLEVEL) newlevel = MAXLEVEL;
        !           399:            pline("You arrive at the center of the earth ...");
        !           400:            pline("Unfortunately it is here that hell is located.");
        !           401:            if(Fire_resistance) {
        !           402:                pline("But the fire doesn't seem to harm you.");
        !           403:            } else {
        !           404:                pline("You burn to a crisp.");
        !           405:                dlevel = maxdlevel = newlevel;
        !           406:                killer = "visit to the hell";
        !           407:                done("burned");
        !           408:            }
        !           409:        }
        !           410:        if(newlevel < 0) {
        !           411:            newlevel = 0;
        !           412:            pline("You are now high above the clouds ...");
        !           413:            if(Levitation) {
        !           414:                pline("You float gently down to earth.");
        !           415:                done("escaped");
        !           416:            }
        !           417:            pline("Unfortunately, you don't know how to fly.");
        !           418:            pline("You fall down a few thousand feet and break your neck.");
        !           419:            dlevel = 0;
        !           420:            killer = "fall";
        !           421:            done("died");
        !           422:        }
        !           423: 
        !           424:        goto_level(newlevel, FALSE); /* calls done("escaped") if newlevel==0 */
        !           425: }
        !           426: 
        !           427: drown()
        !           428: {
        !           429:        pline("You fall into a pool!");
        !           430:        pline("You can't swim!");
        !           431:        if(rn2(3) < u.uluck+2) {
        !           432:                /* most scrolls become unreadable */
        !           433:                register struct obj *obj;
        !           434: 
        !           435:                for(obj = invent; obj; obj = obj->nobj)
        !           436:                        if(obj->olet == SCROLL_SYM && rn2(12) > u.uluck)
        !           437:                                obj->otyp = SCR_BLANK_PAPER;
        !           438:                /* we should perhaps merge these scrolls ? */
        !           439: 
        !           440:                pline("You attempt a teleport spell."); /* utcsri!carroll */
        !           441:                (void) dotele();
        !           442:                if(levl[u.ux][u.uy].typ != POOL) return;
        !           443:        }
        !           444:        pline("You drown ...");
        !           445:        killer = "pool of water";
        !           446:        done("drowned");
        !           447: }

unix.superglobalmegacorp.com

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