home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
- /* hack.eat.c version 1.0.1 - added morehungry() and FAINTED */
-
- #include "hack.h"
- char POISONOUS[] = "ADKSVabhks";
- extern char *nomovemsg;
- extern int (*afternmv)();
-
- /* hunger texts used on bottom line (each 8 chars long) */
- #define SATIATED 0
- #define NOT_HUNGRY 1
- #define HUNGRY 2
- #define WEAK 3
- #define FAINTING 4
- #define FAINTED 5
- #define STARVED 6
-
- char *hu_stat[] = {
- "Satiated",
- " ",
- "Hungry ",
- "Weak ",
- "Fainting",
- "Fainted ",
- "Starved "
- };
-
- init_uhunger(){
- u.uhunger = 900;
- u.uhs = NOT_HUNGRY;
- }
-
- struct { char *txt; int nut; } tintxts[] = {
- {"It contains first quality peaches - what a surprise!", 40},
- {"It contains salmon - not bad!", 60},
- {"It contains apple juice - perhaps not what you hoped for.", 20},
- {"It contains some nondescript substance, tasting awfully.", 500},
- {"It contains rotten meat. You vomit.", -50},
- {"It turns out to be empty.", 0}
- };
-
- tinopen(){
- #define TTSZ (sizeof(tintxts)/sizeof(tintxts[0]))
- register int r = rn2(2*TTSZ);
- if(r < TTSZ){
- pline(tintxts[r].txt);
- lesshungry(tintxts[r].nut);
- if(r == 1) /* SALMON */ {
- Glib = rnd(15);
- pline("Eating salmon made your fingers very slippery.");
- }
- } else {
- pline("It contains spinach - this makes you feel like Popeye!");
- lesshungry(600);
- if(u.ustr < 118)
- u.ustr += rnd( ((u.ustr < 17) ? 19 : 118) - u.ustr);
- if(u.ustr > u.ustrmax) u.ustrmax = u.ustr;
- flags.botl = 1;
- }
- }
-
- Meatdone(){
- u.usym = '@';
- prme();
- }
-
- doeat(){
- register struct obj *otmp;
- register struct objclass *ftmp;
- register int tmp;
-
- otmp = getobj("%", "eat");
- if(!otmp) return(0);
- if(otmp->otyp == TIN){
- if(uwep && (uwep->otyp == AXE || uwep->otyp == DAGGER ||
- uwep->otyp == CRYSKNIFE)){
- pline("Using your %s you try to open the tin",
- aobjnam(uwep, (char *) 0));
- tmp = 3;
- } else {
- pline("It is not so easy to open this tin.");
- if(Glib) {
- pline("The tin slips out of your hands.");
- dropx(otmp);
- return(1);
- }
- if(otmp->quan > 1) {
- register struct obj *obj;
- extern struct obj *splitobj();
-
- obj = splitobj(otmp, 1);
- if(otmp == uwep) setuwep(obj);
- }
- tmp = 2 + rn2(1 + 500/((int)(u.ulevel + u.ustr)));
- }
- if(tmp > 50){
- nomul(-50);
- nomovemsg="You give up your attempt to open the tin.";
- } else {
- nomul(-tmp);
- nomovemsg = "You succeed in opening the tin.";
- afternmv = tinopen;
- useup(otmp);
- }
- return(1);
- }
- ftmp = &objects[otmp->otyp];
- if(otmp->otyp >= CORPSE && eatcorpse(otmp)) goto eatx;
- if(!rn2(7) && otmp->otyp != FORTUNE_COOKIE) {
- pline("Blecch! Rotten food!");
- if(!rn2(4)) {
- pline("You feel rather light headed.");
- Confusion += d(2,4);
- } else if(!rn2(4)&& !Blind) {
- pline("Everything suddenly goes dark.");
- Blind = d(2,10);
- seeoff(0);
- } else if(!rn2(3)) {
- if(Blind)
- pline("The world spins and you slap against the floor.");
- else
- pline("The world spins and goes dark.");
- nomul(-rnd(10));
- nomovemsg = "You are conscious again.";
- }
- lesshungry(ftmp->nutrition / 4);
- } else {
- multi = -ftmp->oc_delay;
- if(u.uhunger >= 1500) {
- pline("You choke over your food.");
- pline("You die...");
- killer = ftmp->oc_name;
- done("choked");
- }
- switch(otmp->otyp){
- case FOOD_RATION:
- if(u.uhunger <= 200)
- pline("That food really hit the spot!");
- else if(u.uhunger <= 700)
- pline("That satiated your stomach!");
- else {
- pline("You're having a hard time getting all that food down.");
- multi -= 2;
- }
- lesshungry(ftmp->nutrition);
- if(multi < 0) nomovemsg = "You finished your meal.";
- break;
- case TRIPE_RATION:
- pline("Yak - dog food!");
- u.uexp++;
- u.urexp += 4;
- flags.botl = 1;
- if(rn2(2)){
- pline("You vomit.");
- morehungry(20);
- } else lesshungry(ftmp->nutrition);
- break;
- default:
- if(otmp->otyp >= CORPSE)
- pline("That %s tasted terrible!",ftmp->oc_name);
- else
- pline("That %s was delicious!",ftmp->oc_name);
- lesshungry(ftmp->nutrition);
- #ifdef QUEST
- if(otmp->otyp == CARROT && !Blind){
- u.uhorizon++;
- setsee();
- pline("Your vision improves.");
- }
- #endif QUEST
- if(otmp->otyp == FORTUNE_COOKIE) {
- if(Blind) {
- pline("This cookie has a scrap of paper inside!");
- pline("What a pity, that you cannot read it!");
- } else
- outrumor();
- }
- break;
- }
- }
- eatx:
- if(multi<0 && !nomovemsg){
- static char msgbuf[BUFSZ];
- (void) sprintf(msgbuf, "You finished eating the %s.",
- ftmp->oc_name);
- nomovemsg = msgbuf;
- }
- useup(otmp);
- return(1);
- }
-
- /* called in hack.main.c */
- gethungry(){
- --u.uhunger;
- if((Regeneration || Hunger) && moves%2) u.uhunger--;
- newuhs(TRUE);
- }
-
- /* called after vomiting and after performing feats of magic */
- morehungry(num) register int num; {
- u.uhunger -= num;
- newuhs(TRUE);
- }
-
- /* called after eating something (and after drinking fruit juice) */
- lesshungry(num) register int num; {
- u.uhunger += num;
- newuhs(FALSE);
- }
-
- unfaint(){
- u.uhs = FAINTING;
- flags.botl = 1;
- }
-
- newuhs(incr) boolean incr; {
- register int newhs, h = u.uhunger;
-
- newhs = (h > 1000) ? SATIATED :
- (h > 150) ? NOT_HUNGRY :
- (h > 50) ? HUNGRY :
- (h > 0) ? WEAK : FAINTING;
-
- if(newhs == FAINTING) {
- if(u.uhs == FAINTED)
- newhs = FAINTED;
- if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) {
- if(u.uhs != FAINTED && multi >= 0 /* %% */) {
- pline("You faint from lack of food.");
- nomul(-10+(u.uhunger/10));
- nomovemsg = "You regain consciousness.";
- afternmv = unfaint;
- newhs = FAINTED;
- }
- } else
- if(u.uhunger < -(int)(200 + 25*u.ulevel)) {
- u.uhs = STARVED;
- flags.botl = 1;
- bot();
- pline("You die from starvation.");
- done("starved");
- }
- }
-
- if(newhs != u.uhs) {
- if(newhs >= WEAK && u.uhs < WEAK)
- losestr(1);
- else
- if(newhs < WEAK && u.uhs >= WEAK && u.ustr < u.ustrmax)
- losestr(-1);
- switch(newhs){
- case HUNGRY:
- pline((!incr) ? "You only feel hungry now." :
- (u.uhunger < 145) ? "You feel hungry." :
- "You are beginning to feel hungry.");
- break;
- case WEAK:
- pline((!incr) ? "You feel weak now." :
- (u.uhunger < 45) ? "You feel weak." :
- "You are beginning to feel weak.");
- break;
- }
- u.uhs = newhs;
- flags.botl = 1;
- }
- }
-
- /* returns 1 if some text was printed */
- eatcorpse(otmp) register struct obj *otmp; {
- register schar let = otmp->spe;
- register int tp = 0;
- if(moves > otmp->age + 50 + rn2(100)) {
- tp++;
- pline("Ulch -- that meat was tainted!");
- pline("You get very sick.");
- Sick = 10 + rn2(10);
- u.usick_cause = objects[otmp->otyp].oc_name;
- } else if(index(POISONOUS, let) && rn2(5)){
- tp++;
- pline("Ecch -- that must have been poisonous!");
- if(!Poison_resistance){
- losehp(rnd(15), "poisonous corpse");
- losestr(rnd(4));
- } else
- pline("You don't seem affected by the poison.");
- } else if(index("ELNOPQRUuxz", let) && rn2(5)){
- tp++;
- pline("You feel sick.");
- losehp(rnd(8), "cadaver");
- }
- switch(let) {
- case 'L':
- case 'N':
- case 't':
- Teleportation |= INTRINSIC;
- break;
- case 'W':
- pluslvl();
- break;
- case 'n':
- u.uhp = u.uhpmax;
- flags.botl = 1;
- /* fall into next case */
- case '@':
- pline("You cannibal! You will be sorry for this!");
- /* not tp++; */
- /* fall into next case */
- case 'd':
- Aggravate_monster |= INTRINSIC;
- break;
- case 'I':
- See_invisible |= INTRINSIC;
- if(!Invis) newsym(u.ux, u.uy);
- Invis += 50;
- /* fall into next case */
- case 'y':
- #ifdef QUEST
- u.uhorizon++;
- #endif QUEST
- /* fall into next case */
- case 'B':
- Confusion = 50;
- break;
- case 'D':
- Fire_resistance |= INTRINSIC;
- break;
- case 'E':
- Telepat |= INTRINSIC;
- break;
- case 'F':
- case 'Y':
- Cold_resistance |= INTRINSIC;
- break;
- case 'k':
- case 's':
- Poison_resistance |= INTRINSIC;
- break;
- case 'c':
- pline("You turn to stone.");
- killer = "dead cockatrice";
- done("died");
- case 'M':
- pline("You cannot resist the temptation to mimic a treasure chest.");
- tp++;
- nomul(-30);
- afternmv = Meatdone;
- nomovemsg = "You now again prefer mimicking a human.";
- u.usym = '$';
- prme();
- break;
- }
- return(tp);
- }
-
-