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

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.eat.c - version 1.0.3 */
        !             3: 
        !             4: #include       "hack.h"
        !             5: char POISONOUS[] = "ADKSVabhks";
        !             6: extern char *nomovemsg;
        !             7: extern int (*afternmv)();
        !             8: extern int (*occupation)();
        !             9: extern char *occtxt;
        !            10: extern struct obj *splitobj(), *addinv();
        !            11: 
        !            12: /* hunger texts used on bottom line (each 8 chars long) */
        !            13: #define        SATIATED        0
        !            14: #define NOT_HUNGRY     1
        !            15: #define        HUNGRY          2
        !            16: #define        WEAK            3
        !            17: #define        FAINTING        4
        !            18: #define FAINTED                5
        !            19: #define STARVED                6
        !            20: 
        !            21: char *hu_stat[] = {
        !            22:        "Satiated",
        !            23:        "        ",
        !            24:        "Hungry  ",
        !            25:        "Weak    ",
        !            26:        "Fainting",
        !            27:        "Fainted ",
        !            28:        "Starved "
        !            29: };
        !            30: 
        !            31: init_uhunger(){
        !            32:        u.uhunger = 900;
        !            33:        u.uhs = NOT_HUNGRY;
        !            34: }
        !            35: 
        !            36: #define        TTSZ    SIZE(tintxts)
        !            37: struct { char *txt; int nut; } tintxts[] = {
        !            38:        "It contains first quality peaches - what a surprise!", 40,
        !            39:        "It contains salmon - not bad!",        60,
        !            40:        "It contains apple juice - perhaps not what you hoped for.", 20,
        !            41:        "It contains some nondescript substance, tasting awfully.", 500,
        !            42:        "It contains rotten meat. You vomit.", -50,
        !            43:        "It turns out to be empty.",    0
        !            44: };
        !            45: 
        !            46: static struct {
        !            47:        struct obj *tin;
        !            48:        int usedtime, reqtime;
        !            49: } tin;
        !            50: 
        !            51: opentin(){
        !            52:        register int r;
        !            53: 
        !            54:        if(!carried(tin.tin))           /* perhaps it was stolen? */
        !            55:                return(0);              /* %% probably we should use tinoid */
        !            56:        if(tin.usedtime++ >= 50) {
        !            57:                pline("You give up your attempt to open the tin.");
        !            58:                return(0);
        !            59:        }
        !            60:        if(tin.usedtime < tin.reqtime)
        !            61:                return(1);              /* still busy */
        !            62: 
        !            63:        pline("You succeed in opening the tin.");
        !            64:        useup(tin.tin);
        !            65:        r = rn2(2*TTSZ);
        !            66:        if(r < TTSZ){
        !            67:            pline(tintxts[r].txt);
        !            68:            lesshungry(tintxts[r].nut);
        !            69:            if(r == 1)  /* SALMON */ {
        !            70:                Glib = rnd(15);
        !            71:                pline("Eating salmon made your fingers very slippery.");
        !            72:            }
        !            73:        } else {
        !            74:            pline("It contains spinach - this makes you feel like Popeye!");
        !            75:            lesshungry(600);
        !            76:            if(u.ustr < 118)
        !            77:                u.ustr += rnd( ((u.ustr < 17) ? 19 : 118) - u.ustr);
        !            78:            if(u.ustr > u.ustrmax) u.ustrmax = u.ustr;
        !            79:            flags.botl = 1;
        !            80:        }
        !            81:        return(0);
        !            82: }
        !            83: 
        !            84: Meatdone(){
        !            85:        u.usym = '@';
        !            86:        prme();
        !            87: }
        !            88: 
        !            89: doeat(){
        !            90:        register struct obj *otmp;
        !            91:        register struct objclass *ftmp;
        !            92:        register tmp;
        !            93: 
        !            94:        /* Is there some food (probably a heavy corpse) here on the ground? */
        !            95:        if(!Levitation)
        !            96:        for(otmp = fobj; otmp; otmp = otmp->nobj) {
        !            97:                if(otmp->ox == u.ux && otmp->oy == u.uy &&
        !            98:                   otmp->olet == FOOD_SYM) {
        !            99:                        pline("There %s %s here; eat %s? [ny] ",
        !           100:                                (otmp->quan == 1) ? "is" : "are",
        !           101:                                doname(otmp),
        !           102:                                (otmp->quan == 1) ? "it" : "one");
        !           103:                        if(readchar() == 'y') {
        !           104:                                if(otmp->quan != 1)
        !           105:                                        (void) splitobj(otmp, 1);
        !           106:                                freeobj(otmp);
        !           107:                                otmp = addinv(otmp);
        !           108:                                addtobill(otmp);
        !           109:                                goto gotit;
        !           110:                        }
        !           111:                }
        !           112:        }
        !           113:        otmp = getobj("%", "eat");
        !           114:        if(!otmp) return(0);
        !           115: gotit:
        !           116:        if(otmp->otyp == TIN){
        !           117:                if(uwep) {
        !           118:                        switch(uwep->otyp) {
        !           119:                        case CAN_OPENER:
        !           120:                                tmp = 1;
        !           121:                                break;
        !           122:                        case DAGGER:
        !           123:                        case CRYSKNIFE:
        !           124:                                tmp = 3;
        !           125:                                break;
        !           126:                        case PICK_AXE:
        !           127:                        case AXE:
        !           128:                                tmp = 6;
        !           129:                                break;
        !           130:                        default:
        !           131:                                goto no_opener;
        !           132:                        }
        !           133:                        pline("Using your %s you try to open the tin.",
        !           134:                                aobjnam(uwep, (char *) 0));
        !           135:                } else {
        !           136:                no_opener:
        !           137:                        pline("It is not so easy to open this tin.");
        !           138:                        if(Glib) {
        !           139:                                pline("The tin slips out of your hands.");
        !           140:                                if(otmp->quan > 1) {
        !           141:                                        register struct obj *obj;
        !           142:                                        extern struct obj *splitobj();
        !           143: 
        !           144:                                        obj = splitobj(otmp, 1);
        !           145:                                        if(otmp == uwep) setuwep(obj);
        !           146:                                }
        !           147:                                dropx(otmp);
        !           148:                                return(1);
        !           149:                        }
        !           150:                        tmp = 10 + rn2(1 + 500/((int)(u.ulevel + u.ustr)));
        !           151:                }
        !           152:                tin.reqtime = tmp;
        !           153:                tin.usedtime = 0;
        !           154:                tin.tin = otmp;
        !           155:                occupation = opentin;
        !           156:                occtxt = "opening the tin";
        !           157:                return(1);
        !           158:        }
        !           159:        ftmp = &objects[otmp->otyp];
        !           160:        multi = -ftmp->oc_delay;
        !           161:        if(otmp->otyp >= CORPSE && eatcorpse(otmp)) goto eatx;
        !           162:        if(!rn2(7) && otmp->otyp != FORTUNE_COOKIE) {
        !           163:                pline("Blecch!  Rotten food!");
        !           164:                if(!rn2(4)) {
        !           165:                        pline("You feel rather light headed.");
        !           166:                        Confusion += d(2,4);
        !           167:                } else if(!rn2(4)&& !Blind) {
        !           168:                        pline("Everything suddenly goes dark.");
        !           169:                        Blind = d(2,10);
        !           170:                        seeoff(0);
        !           171:                } else if(!rn2(3)) {
        !           172:                        if(Blind)
        !           173:                          pline("The world spins and you slap against the floor.");
        !           174:                        else
        !           175:                          pline("The world spins and goes dark.");
        !           176:                        nomul(-rnd(10));
        !           177:                        nomovemsg = "You are conscious again.";
        !           178:                }
        !           179:                lesshungry(ftmp->nutrition / 4);
        !           180:        } else {
        !           181:                if(u.uhunger >= 1500) {
        !           182:                        pline("You choke over your food.");
        !           183:                        pline("You die...");
        !           184:                        killer = ftmp->oc_name;
        !           185:                        done("choked");
        !           186:                }
        !           187:                switch(otmp->otyp){
        !           188:                case FOOD_RATION:
        !           189:                        if(u.uhunger <= 200)
        !           190:                                pline("That food really hit the spot!");
        !           191:                        else if(u.uhunger <= 700)
        !           192:                                pline("That satiated your stomach!");
        !           193:                        else {
        !           194:        pline("You're having a hard time getting all that food down.");
        !           195:                                multi -= 2;
        !           196:                        }
        !           197:                        lesshungry(ftmp->nutrition);
        !           198:                        if(multi < 0) nomovemsg = "You finished your meal.";
        !           199:                        break;
        !           200:                case TRIPE_RATION:
        !           201:                        pline("Yak - dog food!");
        !           202:                        more_experienced(1,0);
        !           203:                        flags.botl = 1;
        !           204:                        if(rn2(2)){
        !           205:                                pline("You vomit.");
        !           206:                                morehungry(20);
        !           207:                                if(Sick) {
        !           208:                                        Sick = 0;       /* David Neves */
        !           209:                                        pline("What a relief!");
        !           210:                                }
        !           211:                        } else  lesshungry(ftmp->nutrition);
        !           212:                        break;
        !           213:                default:
        !           214:                        if(otmp->otyp >= CORPSE)
        !           215:                        pline("That %s tasted terrible!",ftmp->oc_name);
        !           216:                        else
        !           217:                        pline("That %s was delicious!",ftmp->oc_name);
        !           218:                        lesshungry(ftmp->nutrition);
        !           219:                        if(otmp->otyp == DEAD_LIZARD && (Confusion > 2))
        !           220:                                Confusion = 2;
        !           221:                        else
        !           222: #ifdef QUEST
        !           223:                        if(otmp->otyp == CARROT && !Blind){
        !           224:                                u.uhorizon++;
        !           225:                                setsee();
        !           226:                                pline("Your vision improves.");
        !           227:                        } else
        !           228: #endif QUEST
        !           229:                        if(otmp->otyp == FORTUNE_COOKIE) {
        !           230:                          if(Blind) {
        !           231:                            pline("This cookie has a scrap of paper inside!");
        !           232:                            pline("What a pity, that you cannot read it!");
        !           233:                          } else
        !           234:                            outrumor();
        !           235:                        } else
        !           236:                        if(otmp->otyp == LUMP_OF_ROYAL_JELLY) {
        !           237:                                /* This stuff seems to be VERY healthy! */
        !           238:                                if(u.ustrmax < 118) u.ustrmax++;
        !           239:                                if(u.ustr < u.ustrmax) u.ustr++;
        !           240:                                u.uhp += rnd(20);
        !           241:                                if(u.uhp > u.uhpmax) {
        !           242:                                        if(!rn2(17)) u.uhpmax++;
        !           243:                                        u.uhp = u.uhpmax;
        !           244:                                }
        !           245:                                heal_legs();
        !           246:                        }
        !           247:                        break;
        !           248:                }
        !           249:        }
        !           250: eatx:
        !           251:        if(multi<0 && !nomovemsg){
        !           252:                static char msgbuf[BUFSZ];
        !           253:                (void) sprintf(msgbuf, "You finished eating the %s.",
        !           254:                                ftmp->oc_name);
        !           255:                nomovemsg = msgbuf;
        !           256:        }
        !           257:        useup(otmp);
        !           258:        return(1);
        !           259: }
        !           260: 
        !           261: /* called in hack.main.c */
        !           262: gethungry(){
        !           263:        --u.uhunger;
        !           264:        if(moves % 2) {
        !           265:                if(Regeneration) u.uhunger--;
        !           266:                if(Hunger) u.uhunger--;
        !           267:                /* a3:  if(Hunger & LEFT_RING) u.uhunger--;
        !           268:                        if(Hunger & RIGHT_RING) u.uhunger--;
        !           269:                   etc. */
        !           270:        }
        !           271:        if(moves % 20 == 0) {                   /* jimt@asgb */
        !           272:                if(uleft) u.uhunger--;
        !           273:                if(uright) u.uhunger--;
        !           274:        }
        !           275:        newuhs(TRUE);
        !           276: }
        !           277: 
        !           278: /* called after vomiting and after performing feats of magic */
        !           279: morehungry(num) register num; {
        !           280:        u.uhunger -= num;
        !           281:        newuhs(TRUE);
        !           282: }
        !           283: 
        !           284: /* called after eating something (and after drinking fruit juice) */
        !           285: lesshungry(num) register num; {
        !           286:        u.uhunger += num;
        !           287:        newuhs(FALSE);
        !           288: }
        !           289: 
        !           290: unfaint(){
        !           291:        u.uhs = FAINTING;
        !           292:        flags.botl = 1;
        !           293: }
        !           294: 
        !           295: newuhs(incr) boolean incr; {
        !           296:        register int newhs, h = u.uhunger;
        !           297: 
        !           298:        newhs = (h > 1000) ? SATIATED :
        !           299:                (h > 150) ? NOT_HUNGRY :
        !           300:                (h > 50) ? HUNGRY :
        !           301:                (h > 0) ? WEAK : FAINTING;
        !           302: 
        !           303:        if(newhs == FAINTING) {
        !           304:                if(u.uhs == FAINTED)
        !           305:                        newhs = FAINTED;
        !           306:                if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) {
        !           307:                        if(u.uhs != FAINTED && multi >= 0 /* %% */) {
        !           308:                                pline("You faint from lack of food.");
        !           309:                                nomul(-10+(u.uhunger/10));
        !           310:                                nomovemsg = "You regain consciousness.";
        !           311:                                afternmv = unfaint;
        !           312:                                newhs = FAINTED;
        !           313:                        }
        !           314:                } else
        !           315:                if(u.uhunger < -(int)(200 + 25*u.ulevel)) {
        !           316:                        u.uhs = STARVED;
        !           317:                        flags.botl = 1;
        !           318:                        bot();
        !           319:                        pline("You die from starvation.");
        !           320:                        done("starved");
        !           321:                }
        !           322:        }
        !           323: 
        !           324:        if(newhs != u.uhs) {
        !           325:                if(newhs >= WEAK && u.uhs < WEAK)
        !           326:                        losestr(1);     /* this may kill you -- see below */
        !           327:                else
        !           328:                if(newhs < WEAK && u.uhs >= WEAK && u.ustr < u.ustrmax)
        !           329:                        losestr(-1);
        !           330:                switch(newhs){
        !           331:                case HUNGRY:
        !           332:                        pline((!incr) ? "You only feel hungry now." :
        !           333:                              (u.uhunger < 145) ? "You feel hungry." :
        !           334:                                "You are beginning to feel hungry.");
        !           335:                        break;
        !           336:                case WEAK:
        !           337:                        pline((!incr) ? "You feel weak now." :
        !           338:                              (u.uhunger < 45) ? "You feel weak." :
        !           339:                                "You are beginning to feel weak.");
        !           340:                        break;
        !           341:                }
        !           342:                u.uhs = newhs;
        !           343:                flags.botl = 1;
        !           344:                if(u.uhp < 1) {
        !           345:                        pline("You die from hunger and exhaustion.");
        !           346:                        killer = "exhaustion";
        !           347:                        done("starved");
        !           348:                }
        !           349:        }
        !           350: }
        !           351: 
        !           352: #define        CORPSE_I_TO_C(otyp)     (char) ((otyp >= DEAD_ACID_BLOB)\
        !           353:                     ?  'a' + (otyp - DEAD_ACID_BLOB)\
        !           354:                     :  '@' + (otyp - DEAD_HUMAN))
        !           355: poisonous(otmp)
        !           356: register struct obj *otmp;
        !           357: {
        !           358:        return(index(POISONOUS, CORPSE_I_TO_C(otmp->otyp)) != 0);
        !           359: }
        !           360: 
        !           361: /* returns 1 if some text was printed */
        !           362: eatcorpse(otmp) register struct obj *otmp; {
        !           363: register char let = CORPSE_I_TO_C(otmp->otyp);
        !           364: register tp = 0;
        !           365:        if(let != 'a' && moves > otmp->age + 50 + rn2(100)) {
        !           366:                tp++;
        !           367:                pline("Ulch -- that meat was tainted!");
        !           368:                pline("You get very sick.");
        !           369:                Sick = 10 + rn2(10);
        !           370:                u.usick_cause = objects[otmp->otyp].oc_name;
        !           371:        } else if(index(POISONOUS, let) && rn2(5)){
        !           372:                tp++;
        !           373:                pline("Ecch -- that must have been poisonous!");
        !           374:                if(!Poison_resistance){
        !           375:                        losestr(rnd(4));
        !           376:                        losehp(rnd(15), "poisonous corpse");
        !           377:                } else
        !           378:                        pline("You don't seem affected by the poison.");
        !           379:        } else if(index("ELNOPQRUuxz", let) && rn2(5)){
        !           380:                tp++;
        !           381:                pline("You feel sick.");
        !           382:                losehp(rnd(8), "cadaver");
        !           383:        }
        !           384:        switch(let) {
        !           385:        case 'L':
        !           386:        case 'N':
        !           387:        case 't':
        !           388:                Teleportation |= INTRINSIC;
        !           389:                break;
        !           390:        case 'W':
        !           391:                pluslvl();
        !           392:                break;
        !           393:        case 'n':
        !           394:                u.uhp = u.uhpmax;
        !           395:                flags.botl = 1;
        !           396:                /* fall into next case */
        !           397:        case '@':
        !           398:                pline("You cannibal! You will be sorry for this!");
        !           399:                /* not tp++; */
        !           400:                /* fall into next case */
        !           401:        case 'd':
        !           402:                Aggravate_monster |= INTRINSIC;
        !           403:                break;
        !           404:        case 'I':
        !           405:                if(!Invis) {
        !           406:                        Invis = 50+rn2(100);
        !           407:                        if(!See_invisible)
        !           408:                                newsym(u.ux, u.uy);
        !           409:                } else {
        !           410:                        Invis |= INTRINSIC;
        !           411:                        See_invisible |= INTRINSIC;
        !           412:                }
        !           413:                /* fall into next case */
        !           414:        case 'y':
        !           415: #ifdef QUEST
        !           416:                u.uhorizon++;
        !           417: #endif QUEST
        !           418:                /* fall into next case */
        !           419:        case 'B':
        !           420:                Confusion = 50;
        !           421:                break;
        !           422:        case 'D':
        !           423:                Fire_resistance |= INTRINSIC;
        !           424:                break;
        !           425:        case 'E':
        !           426:                Telepat |= INTRINSIC;
        !           427:                break;
        !           428:        case 'F':
        !           429:        case 'Y':
        !           430:                Cold_resistance |= INTRINSIC;
        !           431:                break;
        !           432:        case 'k':
        !           433:        case 's':
        !           434:                Poison_resistance |= INTRINSIC;
        !           435:                break;
        !           436:        case 'c':
        !           437:                pline("You turn to stone.");
        !           438:                killer = "dead cockatrice";
        !           439:                done("died");
        !           440:                /* NOTREACHED */
        !           441:        case 'a':
        !           442:          if(Stoned) {
        !           443:              pline("What a pity - you just destroyed a future piece of art!");
        !           444:              tp++;
        !           445:              Stoned = 0;
        !           446:          }
        !           447:          break;
        !           448:        case 'M':
        !           449:          pline("You cannot resist the temptation to mimic a treasure chest.");
        !           450:          tp++;
        !           451:          nomul(-30);
        !           452:          afternmv = Meatdone;
        !           453:          nomovemsg = "You now again prefer mimicking a human.";
        !           454:          u.usym = '$';
        !           455:          prme();
        !           456:          break;
        !           457:        }
        !           458:        return(tp);
        !           459: }

unix.superglobalmegacorp.com

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