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

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.mhitu.c - version 1.0.3 */
        !             3: 
        !             4: #include       "hack.h"
        !             5: extern struct monst *makemon();
        !             6: 
        !             7: /*
        !             8:  * mhitu: monster hits you
        !             9:  *       returns 1 if monster dies (e.g. 'y', 'F'), 0 otherwise
        !            10:  */
        !            11: mhitu(mtmp)
        !            12: register struct monst *mtmp;
        !            13: {
        !            14:        register struct permonst *mdat = mtmp->data;
        !            15:        register int tmp, ctmp;
        !            16: 
        !            17:        nomul(0);
        !            18: 
        !            19:        /* If swallowed, can only be affected by hissers and by u.ustuck */
        !            20:        if(u.uswallow) {
        !            21:                if(mtmp != u.ustuck) {
        !            22:                        if(mdat->mlet == 'c' && !rn2(13)) {
        !            23:                                pline("Outside, you hear %s's hissing!",
        !            24:                                        monnam(mtmp));
        !            25:                                pline("%s gets turned to stone!",
        !            26:                                        Monnam(u.ustuck));
        !            27:                                pline("And the same fate befalls you.");
        !            28:                                done_in_by(mtmp);
        !            29:                                /* "notreached": not return(1); */
        !            30:                        }
        !            31:                        return(0);
        !            32:                }
        !            33:                switch(mdat->mlet) {    /* now mtmp == u.ustuck */
        !            34:                case ',':
        !            35:                        youswld(mtmp, (u.uac > 0) ? u.uac+4 : 4,
        !            36:                                5, "The trapper");
        !            37:                        break;
        !            38:                case '\'':
        !            39:                        youswld(mtmp,rnd(6),7,"The lurker above");
        !            40:                        break;
        !            41:                case 'P':
        !            42:                        youswld(mtmp,d(2,4),12,"The purple worm");
        !            43:                        break;
        !            44:                default:
        !            45:                        /* This is not impossible! */
        !            46:                        pline("The mysterious monster totally digests you.");
        !            47:                        u.uhp = 0;
        !            48:                }
        !            49:                if(u.uhp < 1) done_in_by(mtmp);
        !            50:                return(0);
        !            51:        }
        !            52: 
        !            53:        if(mdat->mlet == 'c' && Stoned)
        !            54:                return(0);
        !            55: 
        !            56:        /* make eels visible the moment they hit/miss us */
        !            57:        if(mdat->mlet == ';' && mtmp->minvis && cansee(mtmp->mx,mtmp->my)){
        !            58:                mtmp->minvis = 0;
        !            59:                pmon(mtmp);
        !            60:        }
        !            61:        if(!index("1&DuxynNF",mdat->mlet))
        !            62:                tmp = hitu(mtmp,d(mdat->damn,mdat->damd));
        !            63:        else
        !            64:                tmp = 0;
        !            65:        if(index(UNDEAD, mdat->mlet) && midnight())
        !            66:                tmp += hitu(mtmp,d(mdat->damn,mdat->damd));
        !            67: 
        !            68:        ctmp = tmp && !mtmp->mcan &&
        !            69:          (!uarm || objects[uarm->otyp].a_can < rnd(3) || !rn2(50));
        !            70:        switch(mdat->mlet) {
        !            71:        case '1':
        !            72:                if(wiz_hit(mtmp)) return(1);    /* he disappeared */
        !            73:                break;
        !            74:        case '&':
        !            75:                if(!mtmp->cham && !mtmp->mcan && !rn2(13)) {
        !            76:                        (void) makemon(PM_DEMON,u.ux,u.uy);
        !            77:                } else {
        !            78:                        (void) hitu(mtmp,d(2,6));
        !            79:                        (void) hitu(mtmp,d(2,6));
        !            80:                        (void) hitu(mtmp,rnd(3));
        !            81:                        (void) hitu(mtmp,rnd(3));
        !            82:                        (void) hitu(mtmp,rn1(4,2));
        !            83:                }
        !            84:                break;
        !            85:        case ',':
        !            86:                if(tmp) justswld(mtmp,"The trapper");
        !            87:                break;
        !            88:        case '\'':
        !            89:                if(tmp) justswld(mtmp, "The lurker above");
        !            90:                break;
        !            91:        case ';':
        !            92:                if(ctmp) {
        !            93:                        if(!u.ustuck && !rn2(10)) {
        !            94:                                pline("%s swings itself around you!",
        !            95:                                        Monnam(mtmp));
        !            96:                                u.ustuck = mtmp;
        !            97:                        } else if(u.ustuck == mtmp &&
        !            98:                            levl[mtmp->mx][mtmp->my].typ == POOL) {
        !            99:                                pline("%s drowns you ...", Monnam(mtmp));
        !           100:                                done("drowned");
        !           101:                        }
        !           102:                }
        !           103:                break;
        !           104:        case 'A':
        !           105:                if(ctmp && rn2(2)) {
        !           106:                    if(Poison_resistance)
        !           107:                        pline("The sting doesn't seem to affect you.");
        !           108:                    else {
        !           109:                        pline("You feel weaker!");
        !           110:                        losestr(1);
        !           111:                    }
        !           112:                }
        !           113:                break;
        !           114:        case 'C':
        !           115:                (void) hitu(mtmp,rnd(6));
        !           116:                break;
        !           117:        case 'c':
        !           118:                if(!rn2(5)) {
        !           119:                        pline("You hear %s's hissing!", monnam(mtmp));
        !           120:                        if(ctmp || !rn2(20) || (flags.moonphase == NEW_MOON
        !           121:                            && !carrying(DEAD_LIZARD))) {
        !           122:                                Stoned = 5;
        !           123:                                /* pline("You get turned to stone!"); */
        !           124:                                /* done_in_by(mtmp); */
        !           125:                        }
        !           126:                }
        !           127:                break;
        !           128:        case 'D':
        !           129:                if(rn2(6) || mtmp->mcan) {
        !           130:                        (void) hitu(mtmp,d(3,10));
        !           131:                        (void) hitu(mtmp,rnd(8));
        !           132:                        (void) hitu(mtmp,rnd(8));
        !           133:                        break;
        !           134:                }
        !           135:                kludge("%s breathes fire!","The dragon");
        !           136:                buzz(-1,mtmp->mx,mtmp->my,u.ux-mtmp->mx,u.uy-mtmp->my);
        !           137:                break;
        !           138:        case 'd':
        !           139:                (void) hitu(mtmp,d(2, (flags.moonphase == FULL_MOON) ? 3 : 4));
        !           140:                break;
        !           141:        case 'e':
        !           142:                (void) hitu(mtmp,d(3,6));
        !           143:                break;
        !           144:        case 'F':
        !           145:                if(mtmp->mcan) break;
        !           146:                kludge("%s explodes!","The freezing sphere");
        !           147:                if(Cold_resistance) pline("You don't seem affected by it.");
        !           148:                else {
        !           149:                        xchar dn;
        !           150:                        if(17-(u.ulevel/2) > rnd(20)) {
        !           151:                                pline("You get blasted!");
        !           152:                                dn = 6;
        !           153:                        } else {
        !           154:                                pline("You duck the blast...");
        !           155:                                dn = 3;
        !           156:                        }
        !           157:                        losehp_m(d(dn,6), mtmp);
        !           158:                }
        !           159:                mondead(mtmp);
        !           160:                return(1);
        !           161:        case 'g':
        !           162:                if(ctmp && multi >= 0 && !rn2(3)) {
        !           163:                        kludge("You are frozen by %ss juices","the cube'");
        !           164:                        nomul(-rnd(10));
        !           165:                }
        !           166:                break;
        !           167:        case 'h':
        !           168:                if(ctmp && multi >= 0 && !rn2(5)) {
        !           169:                        nomul(-rnd(10));
        !           170:                        kludge("You are put to sleep by %ss bite!",
        !           171:                                "the homunculus'");
        !           172:                }
        !           173:                break;
        !           174:        case 'j':
        !           175:                tmp = hitu(mtmp,rnd(3));
        !           176:                tmp &= hitu(mtmp,rnd(3));
        !           177:                if(tmp){
        !           178:                        (void) hitu(mtmp,rnd(4));
        !           179:                        (void) hitu(mtmp,rnd(4));
        !           180:                }
        !           181:                break;
        !           182:        case 'k':
        !           183:                if((hitu(mtmp,rnd(4)) || !rn2(3)) && ctmp){
        !           184:                        poisoned("bee's sting",mdat->mname);
        !           185:                }
        !           186:                break;
        !           187:        case 'L':
        !           188:                if(tmp) stealgold(mtmp);
        !           189:                break;
        !           190:        case 'N':
        !           191:                if(mtmp->mcan && !Blind) {
        !           192:        pline("%s tries to seduce you, but you seem not interested.",
        !           193:                        Amonnam(mtmp, "plain"));
        !           194:                        if(rn2(3)) rloc(mtmp);
        !           195:                } else if(steal(mtmp)) {
        !           196:                        rloc(mtmp);
        !           197:                        mtmp->mflee = 1;
        !           198:                }
        !           199:                break;
        !           200:        case 'n':
        !           201:                if(!uwep && !uarm && !uarmh && !uarms && !uarmg) {
        !           202:                    pline("%s hits! (I hope you don't mind)",
        !           203:                        Monnam(mtmp));
        !           204:                        u.uhp += rnd(7);
        !           205:                        if(!rn2(7)) u.uhpmax++;
        !           206:                        if(u.uhp > u.uhpmax) u.uhp = u.uhpmax;
        !           207:                        flags.botl = 1;
        !           208:                        if(!rn2(50)) rloc(mtmp);
        !           209:                } else {
        !           210:                        (void) hitu(mtmp,d(2,6));
        !           211:                        (void) hitu(mtmp,d(2,6));
        !           212:                }
        !           213:                break;
        !           214:        case 'o':
        !           215:                tmp = hitu(mtmp,rnd(6));
        !           216:                if(hitu(mtmp,rnd(6)) && tmp &&  /* hits with both paws */
        !           217:                    !u.ustuck && rn2(2)) {
        !           218:                        u.ustuck = mtmp;
        !           219:                        kludge("%s has grabbed you!","The owlbear");
        !           220:                        u.uhp -= d(2,8);
        !           221:                } else if(u.ustuck == mtmp) {
        !           222:                        u.uhp -= d(2,8);
        !           223:                        pline("You are being crushed.");
        !           224:                }
        !           225:                break;
        !           226:        case 'P':
        !           227:                if(ctmp && !rn2(4))
        !           228:                        justswld(mtmp,"The purple worm");
        !           229:                else
        !           230:                        (void) hitu(mtmp,d(2,4));
        !           231:                break;
        !           232:        case 'Q':
        !           233:                (void) hitu(mtmp,rnd(2));
        !           234:                (void) hitu(mtmp,rnd(2));
        !           235:                break;
        !           236:        case 'R':
        !           237:                if(tmp && uarmh && !uarmh->rustfree &&
        !           238:                    (int) uarmh->spe >= -1) {
        !           239:                        pline("Your helmet rusts!");
        !           240:                        uarmh->spe--;
        !           241:                } else
        !           242:                if(ctmp && uarm && !uarm->rustfree &&   /* Mike Newton */
        !           243:                 uarm->otyp < STUDDED_LEATHER_ARMOR &&
        !           244:                 (int) uarm->spe >= -1) {
        !           245:                        pline("Your armor rusts!");
        !           246:                        uarm->spe--;
        !           247:                }
        !           248:                break;
        !           249:        case 'S':
        !           250:                if(ctmp && !rn2(8)) {
        !           251:                        poisoned("snake's bite",mdat->mname);
        !           252:                }
        !           253:                break;
        !           254:        case 's':
        !           255:                if(tmp && !rn2(8)) {
        !           256:                        poisoned("scorpion's sting",mdat->mname);
        !           257:                }
        !           258:                (void) hitu(mtmp,rnd(8));
        !           259:                (void) hitu(mtmp,rnd(8));
        !           260:                break;
        !           261:        case 'T':
        !           262:                (void) hitu(mtmp,rnd(6));
        !           263:                (void) hitu(mtmp,rnd(6));
        !           264:                break;
        !           265:        case 't':
        !           266:                if(!rn2(5)) rloc(mtmp);
        !           267:                break;
        !           268:        case 'u':
        !           269:                mtmp->mflee = 1;
        !           270:                break;
        !           271:        case 'U':
        !           272:                (void) hitu(mtmp,d(3,4));
        !           273:                (void) hitu(mtmp,d(3,4));
        !           274:                break;
        !           275:        case 'v':
        !           276:                if(ctmp && !u.ustuck) u.ustuck = mtmp;
        !           277:                break;
        !           278:        case 'V':
        !           279:                if(tmp) u.uhp -= 4;
        !           280:                if(ctmp) losexp();
        !           281:                break;
        !           282:        case 'W':
        !           283:                if(ctmp) losexp();
        !           284:                break;
        !           285: #ifndef NOWORM
        !           286:        case 'w':
        !           287:                if(tmp) wormhit(mtmp);
        !           288: #endif NOWORM
        !           289:                break;
        !           290:        case 'X':
        !           291:                (void) hitu(mtmp,rnd(5));
        !           292:                (void) hitu(mtmp,rnd(5));
        !           293:                (void) hitu(mtmp,rnd(5));
        !           294:                break;
        !           295:        case 'x':
        !           296:                { register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE;
        !           297:                  pline("%s pricks in your %s leg!",
        !           298:                        Monnam(mtmp), (side == RIGHT_SIDE) ? "right" : "left");
        !           299:                  set_wounded_legs(side, rnd(50));
        !           300:                  losehp_m(2, mtmp);
        !           301:                  break;
        !           302:                }
        !           303:        case 'y':
        !           304:                if(mtmp->mcan) break;
        !           305:                mondead(mtmp);
        !           306:                if(!Blind) {
        !           307:                        pline("You are blinded by a blast of light!");
        !           308:                        Blind = d(4,12);
        !           309:                        seeoff(0);
        !           310:                }
        !           311:                return(1);
        !           312:        case 'Y':
        !           313:                (void) hitu(mtmp,rnd(6));
        !           314:                break;
        !           315:        }
        !           316:        if(u.uhp < 1) done_in_by(mtmp);
        !           317:        return(0);
        !           318: }
        !           319: 
        !           320: hitu(mtmp,dam)
        !           321: register struct monst *mtmp;
        !           322: register dam;
        !           323: {
        !           324:        register tmp, res;
        !           325: 
        !           326:        nomul(0);
        !           327:        if(u.uswallow) return(0);
        !           328: 
        !           329:        if(mtmp->mhide && mtmp->mundetected) {
        !           330:                mtmp->mundetected = 0;
        !           331:                if(!Blind) {
        !           332:                        register struct obj *obj;
        !           333:                        extern char * Xmonnam();
        !           334:                        if(obj = o_at(mtmp->mx,mtmp->my))
        !           335:                                pline("%s was hidden under %s!",
        !           336:                                        Xmonnam(mtmp), doname(obj));
        !           337:                }
        !           338:        }
        !           339: 
        !           340:        tmp = u.uac;
        !           341:        /* give people with Ac = -10 at least some vulnerability */
        !           342:        if(tmp < 0) {
        !           343:                dam += tmp;             /* decrease damage */
        !           344:                if(dam <= 0) dam = 1;
        !           345:                tmp = -rn2(-tmp);
        !           346:        }
        !           347:        tmp += mtmp->data->mlevel;
        !           348:        if(multi < 0) tmp += 4;
        !           349:        if((Invis && mtmp->data->mlet != 'I') || !mtmp->mcansee) tmp -= 2;
        !           350:        if(mtmp->mtrapped) tmp -= 2;
        !           351:        if(tmp <= rnd(20)) {
        !           352:                if(Blind) pline("It misses.");
        !           353:                else pline("%s misses.",Monnam(mtmp));
        !           354:                res = 0;
        !           355:        } else {
        !           356:                if(Blind) pline("It hits!");
        !           357:                else pline("%s hits!",Monnam(mtmp));
        !           358:                losehp_m(dam, mtmp);
        !           359:                res = 1;
        !           360:        }
        !           361:        stop_occupation();
        !           362:        return(res);
        !           363: }

unix.superglobalmegacorp.com

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