xref: /openbsd-src/games/hack/hack.eat.c (revision 6acf840eb12048fe6e815d917fa237f8a82441d8)
1*6acf840eSmestre /*	$OpenBSD: hack.eat.c,v 1.11 2016/01/09 21:54:11 mestre Exp $	*/
2d0b779f3Sniklas 
3df930be7Sderaadt /*
4d25013f2Scamield  * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
5d25013f2Scamield  * Amsterdam
6d25013f2Scamield  * All rights reserved.
7d25013f2Scamield  *
8d25013f2Scamield  * Redistribution and use in source and binary forms, with or without
9d25013f2Scamield  * modification, are permitted provided that the following conditions are
10d25013f2Scamield  * met:
11d25013f2Scamield  *
12d25013f2Scamield  * - Redistributions of source code must retain the above copyright notice,
13d25013f2Scamield  * this list of conditions and the following disclaimer.
14d25013f2Scamield  *
15d25013f2Scamield  * - Redistributions in binary form must reproduce the above copyright
16d25013f2Scamield  * notice, this list of conditions and the following disclaimer in the
17d25013f2Scamield  * documentation and/or other materials provided with the distribution.
18d25013f2Scamield  *
19d25013f2Scamield  * - Neither the name of the Stichting Centrum voor Wiskunde en
20d25013f2Scamield  * Informatica, nor the names of its contributors may be used to endorse or
21d25013f2Scamield  * promote products derived from this software without specific prior
22d25013f2Scamield  * written permission.
23d25013f2Scamield  *
24d25013f2Scamield  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
25d25013f2Scamield  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26d25013f2Scamield  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
27d25013f2Scamield  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
28d25013f2Scamield  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29d25013f2Scamield  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30d25013f2Scamield  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31d25013f2Scamield  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32d25013f2Scamield  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33d25013f2Scamield  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34d25013f2Scamield  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35d25013f2Scamield  */
36d25013f2Scamield 
37d25013f2Scamield /*
38d25013f2Scamield  * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
39d25013f2Scamield  * All rights reserved.
40d25013f2Scamield  *
41d25013f2Scamield  * Redistribution and use in source and binary forms, with or without
42d25013f2Scamield  * modification, are permitted provided that the following conditions
43d25013f2Scamield  * are met:
44d25013f2Scamield  * 1. Redistributions of source code must retain the above copyright
45d25013f2Scamield  *    notice, this list of conditions and the following disclaimer.
46d25013f2Scamield  * 2. Redistributions in binary form must reproduce the above copyright
47d25013f2Scamield  *    notice, this list of conditions and the following disclaimer in the
48d25013f2Scamield  *    documentation and/or other materials provided with the distribution.
49d25013f2Scamield  * 3. The name of the author may not be used to endorse or promote products
50d25013f2Scamield  *    derived from this software without specific prior written permission.
51d25013f2Scamield  *
52d25013f2Scamield  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
53d25013f2Scamield  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
54d25013f2Scamield  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
55d25013f2Scamield  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
56d25013f2Scamield  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
57d25013f2Scamield  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
58d25013f2Scamield  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
59d25013f2Scamield  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
60d25013f2Scamield  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
61d25013f2Scamield  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62df930be7Sderaadt  */
63df930be7Sderaadt 
644a5fbbc4Spjanzen #include <stdio.h>
65aed906e4Smestre 
66df930be7Sderaadt #include "hack.h"
67aed906e4Smestre 
68df930be7Sderaadt char POISONOUS[] = "ADKSVabhks";
69df930be7Sderaadt extern char *nomovemsg;
704a5fbbc4Spjanzen extern void (*afternmv)(void);
714a5fbbc4Spjanzen extern int (*occupation)(void);
72df930be7Sderaadt extern char *occtxt;
73df930be7Sderaadt 
74df930be7Sderaadt /* hunger texts used on bottom line (each 8 chars long) */
75df930be7Sderaadt #define	SATIATED	0
76df930be7Sderaadt #define NOT_HUNGRY	1
77df930be7Sderaadt #define	HUNGRY		2
78df930be7Sderaadt #define	WEAK		3
79df930be7Sderaadt #define	FAINTING	4
80df930be7Sderaadt #define FAINTED		5
81df930be7Sderaadt #define STARVED		6
82df930be7Sderaadt 
83df930be7Sderaadt char *hu_stat[] = {
84df930be7Sderaadt 	"Satiated",
85df930be7Sderaadt 	"        ",
86df930be7Sderaadt 	"Hungry  ",
87df930be7Sderaadt 	"Weak    ",
88df930be7Sderaadt 	"Fainting",
89df930be7Sderaadt 	"Fainted ",
90df930be7Sderaadt 	"Starved "
91df930be7Sderaadt };
92df930be7Sderaadt 
93df930be7Sderaadt #define	TTSZ	SIZE(tintxts)
944a5fbbc4Spjanzen struct {
954a5fbbc4Spjanzen 	char *txt;
964a5fbbc4Spjanzen 	int nut;
974a5fbbc4Spjanzen } tintxts[] = {
984a5fbbc4Spjanzen 	{ "It contains first quality peaches - what a surprise!",	40 },
994a5fbbc4Spjanzen 	{ "It contains salmon - not bad!",	60 },
1004a5fbbc4Spjanzen 	{ "It contains apple juice - perhaps not what you hoped for.", 20 },
1014a5fbbc4Spjanzen 	{ "It contains some nondescript substance, tasting awfully.", 500 },
1024a5fbbc4Spjanzen 	{ "It contains rotten meat. You vomit.", -50 },
1034a5fbbc4Spjanzen 	{ "It turns out to be empty.",	0 }
104df930be7Sderaadt };
105df930be7Sderaadt 
106df930be7Sderaadt static struct {
107df930be7Sderaadt 	struct obj *tin;
108df930be7Sderaadt 	int usedtime, reqtime;
109df930be7Sderaadt } tin;
110df930be7Sderaadt 
1114a5fbbc4Spjanzen static void newuhs(boolean);
1124a5fbbc4Spjanzen static int  eatcorpse(struct obj *);
1134a5fbbc4Spjanzen 
1144a5fbbc4Spjanzen void
init_uhunger(void)115aed906e4Smestre init_uhunger(void)
1164a5fbbc4Spjanzen {
1174a5fbbc4Spjanzen 	u.uhunger = 900;
1184a5fbbc4Spjanzen 	u.uhs = NOT_HUNGRY;
1194a5fbbc4Spjanzen }
1204a5fbbc4Spjanzen 
1214a5fbbc4Spjanzen int
opentin(void)122aed906e4Smestre opentin(void)
1234a5fbbc4Spjanzen {
1244a5fbbc4Spjanzen 	int r;
125df930be7Sderaadt 
126df930be7Sderaadt 	if(!carried(tin.tin))		/* perhaps it was stolen? */
127df930be7Sderaadt 		return(0);		/* %% probably we should use tinoid */
128df930be7Sderaadt 	if(tin.usedtime++ >= 50) {
129df930be7Sderaadt 		pline("You give up your attempt to open the tin.");
130df930be7Sderaadt 		return(0);
131df930be7Sderaadt 	}
132df930be7Sderaadt 	if(tin.usedtime < tin.reqtime)
133df930be7Sderaadt 		return(1);		/* still busy */
134df930be7Sderaadt 
135df930be7Sderaadt 	pline("You succeed in opening the tin.");
136df930be7Sderaadt 	useup(tin.tin);
137df930be7Sderaadt 	r = rn2(2*TTSZ);
138df930be7Sderaadt 	if(r < TTSZ){
139911134d2Sguenther 	    pline("%s", tintxts[r].txt);
140df930be7Sderaadt 	    lesshungry(tintxts[r].nut);
141df930be7Sderaadt 	    if(r == 1)	/* SALMON */ {
142df930be7Sderaadt 		Glib = rnd(15);
143df930be7Sderaadt 		pline("Eating salmon made your fingers very slippery.");
144df930be7Sderaadt 	    }
145df930be7Sderaadt 	} else {
146df930be7Sderaadt 	    pline("It contains spinach - this makes you feel like Popeye!");
147df930be7Sderaadt 	    lesshungry(600);
148df930be7Sderaadt 	    if(u.ustr < 118)
149df930be7Sderaadt 		u.ustr += rnd( ((u.ustr < 17) ? 19 : 118) - u.ustr);
150df930be7Sderaadt 	    if(u.ustr > u.ustrmax) u.ustrmax = u.ustr;
151df930be7Sderaadt 	    flags.botl = 1;
152df930be7Sderaadt 	}
153df930be7Sderaadt 	return(0);
154df930be7Sderaadt }
155df930be7Sderaadt 
1564a5fbbc4Spjanzen void
Meatdone(void)157aed906e4Smestre Meatdone(void)
1584a5fbbc4Spjanzen {
159df930be7Sderaadt 	u.usym = '@';
160df930be7Sderaadt 	prme();
161df930be7Sderaadt }
162df930be7Sderaadt 
1634a5fbbc4Spjanzen int
doeat(void)164aed906e4Smestre doeat(void)
1654a5fbbc4Spjanzen {
1664a5fbbc4Spjanzen 	struct obj *otmp;
1674a5fbbc4Spjanzen 	struct objclass *ftmp;
1684a5fbbc4Spjanzen 	int tmp;
169df930be7Sderaadt 
170df930be7Sderaadt 	/* Is there some food (probably a heavy corpse) here on the ground? */
171df930be7Sderaadt 	if(!Levitation)
172df930be7Sderaadt 	for(otmp = fobj; otmp; otmp = otmp->nobj) {
173df930be7Sderaadt 		if(otmp->ox == u.ux && otmp->oy == u.uy &&
174df930be7Sderaadt 		   otmp->olet == FOOD_SYM) {
175df930be7Sderaadt 			pline("There %s %s here; eat %s? [ny] ",
176df930be7Sderaadt 				(otmp->quan == 1) ? "is" : "are",
177df930be7Sderaadt 				doname(otmp),
178df930be7Sderaadt 				(otmp->quan == 1) ? "it" : "one");
179df930be7Sderaadt 			if(readchar() == 'y') {
180df930be7Sderaadt 				if(otmp->quan != 1)
181df930be7Sderaadt 					(void) splitobj(otmp, 1);
182df930be7Sderaadt 				freeobj(otmp);
183df930be7Sderaadt 				otmp = addinv(otmp);
184df930be7Sderaadt 				addtobill(otmp);
185df930be7Sderaadt 				goto gotit;
186df930be7Sderaadt 			}
187df930be7Sderaadt 		}
188df930be7Sderaadt 	}
189df930be7Sderaadt 	otmp = getobj("%", "eat");
190df930be7Sderaadt 	if(!otmp) return(0);
191df930be7Sderaadt gotit:
192df930be7Sderaadt 	if(otmp->otyp == TIN){
193df930be7Sderaadt 		if(uwep) {
194df930be7Sderaadt 			switch(uwep->otyp) {
195df930be7Sderaadt 			case CAN_OPENER:
196df930be7Sderaadt 				tmp = 1;
197df930be7Sderaadt 				break;
198df930be7Sderaadt 			case DAGGER:
199df930be7Sderaadt 			case CRYSKNIFE:
200df930be7Sderaadt 				tmp = 3;
201df930be7Sderaadt 				break;
202df930be7Sderaadt 			case PICK_AXE:
203df930be7Sderaadt 			case AXE:
204df930be7Sderaadt 				tmp = 6;
205df930be7Sderaadt 				break;
206df930be7Sderaadt 			default:
207df930be7Sderaadt 				goto no_opener;
208df930be7Sderaadt 			}
209df930be7Sderaadt 			pline("Using your %s you try to open the tin.",
210*6acf840eSmestre 				aobjnam(uwep, NULL));
211df930be7Sderaadt 		} else {
212df930be7Sderaadt 		no_opener:
213df930be7Sderaadt 			pline("It is not so easy to open this tin.");
214df930be7Sderaadt 			if(Glib) {
215df930be7Sderaadt 				pline("The tin slips out of your hands.");
216df930be7Sderaadt 				if(otmp->quan > 1) {
2174a5fbbc4Spjanzen 					struct obj *obj;
218df930be7Sderaadt 
219df930be7Sderaadt 					obj = splitobj(otmp, 1);
220df930be7Sderaadt 					if(otmp == uwep) setuwep(obj);
221df930be7Sderaadt 				}
222df930be7Sderaadt 				dropx(otmp);
223df930be7Sderaadt 				return(1);
224df930be7Sderaadt 			}
225df930be7Sderaadt 			tmp = 10 + rn2(1 + 500/((int)(u.ulevel + u.ustr)));
226df930be7Sderaadt 		}
227df930be7Sderaadt 		tin.reqtime = tmp;
228df930be7Sderaadt 		tin.usedtime = 0;
229df930be7Sderaadt 		tin.tin = otmp;
230df930be7Sderaadt 		occupation = opentin;
231df930be7Sderaadt 		occtxt = "opening the tin";
232df930be7Sderaadt 		return(1);
233df930be7Sderaadt 	}
234df930be7Sderaadt 	ftmp = &objects[otmp->otyp];
235df930be7Sderaadt 	multi = -ftmp->oc_delay;
236df930be7Sderaadt 	if(otmp->otyp >= CORPSE && eatcorpse(otmp)) goto eatx;
237df930be7Sderaadt 	if(!rn2(7) && otmp->otyp != FORTUNE_COOKIE) {
238df930be7Sderaadt 		pline("Blecch!  Rotten food!");
239df930be7Sderaadt 		if(!rn2(4)) {
240df930be7Sderaadt 			pline("You feel rather light headed.");
241df930be7Sderaadt 			Confusion += d(2,4);
242df930be7Sderaadt 		} else if(!rn2(4)&& !Blind) {
243df930be7Sderaadt 			pline("Everything suddenly goes dark.");
244df930be7Sderaadt 			Blind = d(2,10);
245df930be7Sderaadt 			seeoff(0);
246df930be7Sderaadt 		} else if(!rn2(3)) {
247df930be7Sderaadt 			if(Blind)
248df930be7Sderaadt 			  pline("The world spins and you slap against the floor.");
249df930be7Sderaadt 			else
250df930be7Sderaadt 			  pline("The world spins and goes dark.");
251df930be7Sderaadt 			nomul(-rnd(10));
252df930be7Sderaadt 			nomovemsg = "You are conscious again.";
253df930be7Sderaadt 		}
254df930be7Sderaadt 		lesshungry(ftmp->nutrition / 4);
255df930be7Sderaadt 	} else {
256df930be7Sderaadt 		if(u.uhunger >= 1500) {
257df930be7Sderaadt 			pline("You choke over your food.");
258df930be7Sderaadt 			pline("You die...");
259df930be7Sderaadt 			killer = ftmp->oc_name;
260df930be7Sderaadt 			done("choked");
261df930be7Sderaadt 		}
262df930be7Sderaadt 		switch(otmp->otyp){
263df930be7Sderaadt 		case FOOD_RATION:
264df930be7Sderaadt 			if(u.uhunger <= 200)
265df930be7Sderaadt 				pline("That food really hit the spot!");
266df930be7Sderaadt 			else if(u.uhunger <= 700)
267df930be7Sderaadt 				pline("That satiated your stomach!");
268df930be7Sderaadt 			else {
269df930be7Sderaadt 	pline("You're having a hard time getting all that food down.");
270df930be7Sderaadt 				multi -= 2;
271df930be7Sderaadt 			}
272df930be7Sderaadt 			lesshungry(ftmp->nutrition);
273df930be7Sderaadt 			if(multi < 0) nomovemsg = "You finished your meal.";
274df930be7Sderaadt 			break;
275df930be7Sderaadt 		case TRIPE_RATION:
276df930be7Sderaadt 			pline("Yak - dog food!");
277df930be7Sderaadt 			more_experienced(1,0);
278df930be7Sderaadt 			flags.botl = 1;
279df930be7Sderaadt 			if(rn2(2)){
280df930be7Sderaadt 				pline("You vomit.");
281df930be7Sderaadt 				morehungry(20);
282df930be7Sderaadt 				if(Sick) {
283df930be7Sderaadt 					Sick = 0;	/* David Neves */
284df930be7Sderaadt 					pline("What a relief!");
285df930be7Sderaadt 				}
286df930be7Sderaadt 			} else	lesshungry(ftmp->nutrition);
287df930be7Sderaadt 			break;
288df930be7Sderaadt 		default:
289df930be7Sderaadt 			if(otmp->otyp >= CORPSE)
290df930be7Sderaadt 			pline("That %s tasted terrible!",ftmp->oc_name);
291df930be7Sderaadt 			else
292df930be7Sderaadt 			pline("That %s was delicious!",ftmp->oc_name);
293df930be7Sderaadt 			lesshungry(ftmp->nutrition);
294df930be7Sderaadt 			if(otmp->otyp == DEAD_LIZARD && (Confusion > 2))
295df930be7Sderaadt 				Confusion = 2;
296df930be7Sderaadt 			else
297df930be7Sderaadt #ifdef QUEST
298df930be7Sderaadt 			if(otmp->otyp == CARROT && !Blind){
299df930be7Sderaadt 				u.uhorizon++;
300df930be7Sderaadt 				setsee();
301df930be7Sderaadt 				pline("Your vision improves.");
302df930be7Sderaadt 			} else
30354da88e4Spjanzen #endif /* QUEST */
304df930be7Sderaadt 			if(otmp->otyp == FORTUNE_COOKIE) {
305df930be7Sderaadt 			  if(Blind) {
306df930be7Sderaadt 			    pline("This cookie has a scrap of paper inside!");
307df930be7Sderaadt 			    pline("What a pity, that you cannot read it!");
308df930be7Sderaadt 			  } else
309df930be7Sderaadt 			    outrumor();
310df930be7Sderaadt 			} else
311df930be7Sderaadt 			if(otmp->otyp == LUMP_OF_ROYAL_JELLY) {
312df930be7Sderaadt 				/* This stuff seems to be VERY healthy! */
313df930be7Sderaadt 				if(u.ustrmax < 118) u.ustrmax++;
314df930be7Sderaadt 				if(u.ustr < u.ustrmax) u.ustr++;
315df930be7Sderaadt 				u.uhp += rnd(20);
316df930be7Sderaadt 				if(u.uhp > u.uhpmax) {
317df930be7Sderaadt 					if(!rn2(17)) u.uhpmax++;
318df930be7Sderaadt 					u.uhp = u.uhpmax;
319df930be7Sderaadt 				}
320df930be7Sderaadt 				heal_legs();
321df930be7Sderaadt 			}
322df930be7Sderaadt 			break;
323df930be7Sderaadt 		}
324df930be7Sderaadt 	}
325df930be7Sderaadt eatx:
326df930be7Sderaadt 	if(multi<0 && !nomovemsg){
327df930be7Sderaadt 		static char msgbuf[BUFSZ];
32842ceebb3Sderaadt 		(void) snprintf(msgbuf, sizeof msgbuf,
32942ceebb3Sderaadt 				"You finished eating the %s.",
330df930be7Sderaadt 				ftmp->oc_name);
331df930be7Sderaadt 		nomovemsg = msgbuf;
332df930be7Sderaadt 	}
333df930be7Sderaadt 	useup(otmp);
334df930be7Sderaadt 	return(1);
335df930be7Sderaadt }
336df930be7Sderaadt 
3374a5fbbc4Spjanzen void
gethungry(void)338aed906e4Smestre gethungry(void)
3394a5fbbc4Spjanzen {
340df930be7Sderaadt 	--u.uhunger;
341df930be7Sderaadt 	if(moves % 2) {
342df930be7Sderaadt 		if(Regeneration) u.uhunger--;
343df930be7Sderaadt 		if(Hunger) u.uhunger--;
344df930be7Sderaadt 		/* a3:  if(Hunger & LEFT_RING) u.uhunger--;
345df930be7Sderaadt 			if(Hunger & RIGHT_RING) u.uhunger--;
346df930be7Sderaadt 		   etc. */
347df930be7Sderaadt 	}
348df930be7Sderaadt 	if(moves % 20 == 0) {			/* jimt@asgb */
349df930be7Sderaadt 		if(uleft) u.uhunger--;
350df930be7Sderaadt 		if(uright) u.uhunger--;
351df930be7Sderaadt 	}
352df930be7Sderaadt 	newuhs(TRUE);
353df930be7Sderaadt }
354df930be7Sderaadt 
355df930be7Sderaadt /* called after vomiting and after performing feats of magic */
3564a5fbbc4Spjanzen void
morehungry(int num)3574a5fbbc4Spjanzen morehungry(int num)
3584a5fbbc4Spjanzen {
359df930be7Sderaadt 	u.uhunger -= num;
360df930be7Sderaadt 	newuhs(TRUE);
361df930be7Sderaadt }
362df930be7Sderaadt 
363df930be7Sderaadt /* called after eating something (and after drinking fruit juice) */
3644a5fbbc4Spjanzen void
lesshungry(int num)3654a5fbbc4Spjanzen lesshungry(int num)
3664a5fbbc4Spjanzen {
367df930be7Sderaadt 	u.uhunger += num;
368df930be7Sderaadt 	newuhs(FALSE);
369df930be7Sderaadt }
370df930be7Sderaadt 
3714a5fbbc4Spjanzen void
unfaint(void)372aed906e4Smestre unfaint(void)
3734a5fbbc4Spjanzen {
374df930be7Sderaadt 	u.uhs = FAINTING;
375df930be7Sderaadt 	flags.botl = 1;
376df930be7Sderaadt }
377df930be7Sderaadt 
3784a5fbbc4Spjanzen static void
newuhs(boolean incr)3794a5fbbc4Spjanzen newuhs(boolean incr)
3804a5fbbc4Spjanzen {
3814a5fbbc4Spjanzen 	int newhs, h = u.uhunger;
382df930be7Sderaadt 
383df930be7Sderaadt 	newhs = (h > 1000) ? SATIATED :
384df930be7Sderaadt 		(h > 150) ? NOT_HUNGRY :
385df930be7Sderaadt 		(h > 50) ? HUNGRY :
386df930be7Sderaadt 		(h > 0) ? WEAK : FAINTING;
387df930be7Sderaadt 
388df930be7Sderaadt 	if(newhs == FAINTING) {
389df930be7Sderaadt 		if(u.uhs == FAINTED)
390df930be7Sderaadt 			newhs = FAINTED;
391df930be7Sderaadt 		if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) {
392df930be7Sderaadt 			if(u.uhs != FAINTED && multi >= 0 /* %% */) {
393df930be7Sderaadt 				pline("You faint from lack of food.");
394df930be7Sderaadt 				nomul(-10+(u.uhunger/10));
395df930be7Sderaadt 				nomovemsg = "You regain consciousness.";
396df930be7Sderaadt 				afternmv = unfaint;
397df930be7Sderaadt 				newhs = FAINTED;
398df930be7Sderaadt 			}
399df930be7Sderaadt 		} else
400df930be7Sderaadt 		if(u.uhunger < -(int)(200 + 25*u.ulevel)) {
401df930be7Sderaadt 			u.uhs = STARVED;
402df930be7Sderaadt 			flags.botl = 1;
403df930be7Sderaadt 			bot();
404df930be7Sderaadt 			pline("You die from starvation.");
405df930be7Sderaadt 			done("starved");
406df930be7Sderaadt 		}
407df930be7Sderaadt 	}
408df930be7Sderaadt 
409df930be7Sderaadt 	if(newhs != u.uhs) {
410df930be7Sderaadt 		if(newhs >= WEAK && u.uhs < WEAK)
411df930be7Sderaadt 			losestr(1);	/* this may kill you -- see below */
412df930be7Sderaadt 		else
413df930be7Sderaadt 		if(newhs < WEAK && u.uhs >= WEAK && u.ustr < u.ustrmax)
414df930be7Sderaadt 			losestr(-1);
415df930be7Sderaadt 		switch(newhs){
416df930be7Sderaadt 		case HUNGRY:
417df930be7Sderaadt 			pline((!incr) ? "You only feel hungry now." :
418df930be7Sderaadt 			      (u.uhunger < 145) ? "You feel hungry." :
419df930be7Sderaadt 				"You are beginning to feel hungry.");
420df930be7Sderaadt 			break;
421df930be7Sderaadt 		case WEAK:
422df930be7Sderaadt 			pline((!incr) ? "You feel weak now." :
423df930be7Sderaadt 			      (u.uhunger < 45) ? "You feel weak." :
424df930be7Sderaadt 				"You are beginning to feel weak.");
425df930be7Sderaadt 			break;
426df930be7Sderaadt 		}
427df930be7Sderaadt 		u.uhs = newhs;
428df930be7Sderaadt 		flags.botl = 1;
429df930be7Sderaadt 		if(u.uhp < 1) {
430df930be7Sderaadt 			pline("You die from hunger and exhaustion.");
431df930be7Sderaadt 			killer = "exhaustion";
432df930be7Sderaadt 			done("starved");
433df930be7Sderaadt 		}
434df930be7Sderaadt 	}
435df930be7Sderaadt }
436df930be7Sderaadt 
437df930be7Sderaadt #define	CORPSE_I_TO_C(otyp)	(char) ((otyp >= DEAD_ACID_BLOB)\
438df930be7Sderaadt 		     ?  'a' + (otyp - DEAD_ACID_BLOB)\
439df930be7Sderaadt 		     :	'@' + (otyp - DEAD_HUMAN))
4404a5fbbc4Spjanzen int
poisonous(struct obj * otmp)4414a5fbbc4Spjanzen poisonous(struct obj *otmp)
442df930be7Sderaadt {
443180acc8fSmillert 	return(strchr(POISONOUS, CORPSE_I_TO_C(otmp->otyp)) != 0);
444df930be7Sderaadt }
445df930be7Sderaadt 
446df930be7Sderaadt /* returns 1 if some text was printed */
4474a5fbbc4Spjanzen static int
eatcorpse(struct obj * otmp)4484a5fbbc4Spjanzen eatcorpse(struct obj *otmp)
4494a5fbbc4Spjanzen {
4504a5fbbc4Spjanzen 	char let = CORPSE_I_TO_C(otmp->otyp);
4514a5fbbc4Spjanzen 	int tp = 0;
4524a5fbbc4Spjanzen 
453df930be7Sderaadt 	if(let != 'a' && moves > otmp->age + 50 + rn2(100)) {
454df930be7Sderaadt 		tp++;
455df930be7Sderaadt 		pline("Ulch -- that meat was tainted!");
456df930be7Sderaadt 		pline("You get very sick.");
457df930be7Sderaadt 		Sick = 10 + rn2(10);
458df930be7Sderaadt 		u.usick_cause = objects[otmp->otyp].oc_name;
459180acc8fSmillert 	} else if(strchr(POISONOUS, let) && rn2(5)){
460df930be7Sderaadt 		tp++;
461df930be7Sderaadt 		pline("Ecch -- that must have been poisonous!");
462df930be7Sderaadt 		if(!Poison_resistance){
463df930be7Sderaadt 			losestr(rnd(4));
464df930be7Sderaadt 			losehp(rnd(15), "poisonous corpse");
465df930be7Sderaadt 		} else
466df930be7Sderaadt 			pline("You don't seem affected by the poison.");
467180acc8fSmillert 	} else if(strchr("ELNOPQRUuxz", let) && rn2(5)){
468df930be7Sderaadt 		tp++;
469df930be7Sderaadt 		pline("You feel sick.");
470df930be7Sderaadt 		losehp(rnd(8), "cadaver");
471df930be7Sderaadt 	}
472df930be7Sderaadt 	switch(let) {
473df930be7Sderaadt 	case 'L':
474df930be7Sderaadt 	case 'N':
475df930be7Sderaadt 	case 't':
476df930be7Sderaadt 		Teleportation |= INTRINSIC;
477df930be7Sderaadt 		break;
478df930be7Sderaadt 	case 'W':
479df930be7Sderaadt 		pluslvl();
480df930be7Sderaadt 		break;
481df930be7Sderaadt 	case 'n':
482df930be7Sderaadt 		u.uhp = u.uhpmax;
483df930be7Sderaadt 		flags.botl = 1;
484df930be7Sderaadt 		/* fall into next case */
485df930be7Sderaadt 	case '@':
486df930be7Sderaadt 		pline("You cannibal! You will be sorry for this!");
487df930be7Sderaadt 		/* not tp++; */
488df930be7Sderaadt 		/* fall into next case */
489df930be7Sderaadt 	case 'd':
490df930be7Sderaadt 		Aggravate_monster |= INTRINSIC;
491df930be7Sderaadt 		break;
492df930be7Sderaadt 	case 'I':
493df930be7Sderaadt 		if(!Invis) {
494df930be7Sderaadt 			Invis = 50+rn2(100);
495df930be7Sderaadt 			if(!See_invisible)
496df930be7Sderaadt 				newsym(u.ux, u.uy);
497df930be7Sderaadt 		} else {
498df930be7Sderaadt 			Invis |= INTRINSIC;
499df930be7Sderaadt 			See_invisible |= INTRINSIC;
500df930be7Sderaadt 		}
501df930be7Sderaadt 		/* fall into next case */
502df930be7Sderaadt 	case 'y':
503df930be7Sderaadt #ifdef QUEST
504df930be7Sderaadt 		u.uhorizon++;
50554da88e4Spjanzen #endif /* QUEST */
506df930be7Sderaadt 		/* fall into next case */
507df930be7Sderaadt 	case 'B':
508df930be7Sderaadt 		Confusion = 50;
509df930be7Sderaadt 		break;
510df930be7Sderaadt 	case 'D':
511df930be7Sderaadt 		Fire_resistance |= INTRINSIC;
512df930be7Sderaadt 		break;
513df930be7Sderaadt 	case 'E':
514df930be7Sderaadt 		Telepat |= INTRINSIC;
515df930be7Sderaadt 		break;
516df930be7Sderaadt 	case 'F':
517df930be7Sderaadt 	case 'Y':
518df930be7Sderaadt 		Cold_resistance |= INTRINSIC;
519df930be7Sderaadt 		break;
520df930be7Sderaadt 	case 'k':
521df930be7Sderaadt 	case 's':
522df930be7Sderaadt 		Poison_resistance |= INTRINSIC;
523df930be7Sderaadt 		break;
524df930be7Sderaadt 	case 'c':
525df930be7Sderaadt 		pline("You turn to stone.");
526df930be7Sderaadt 		killer = "dead cockatrice";
527df930be7Sderaadt 		done("died");
528df930be7Sderaadt 	case 'a':
529df930be7Sderaadt 	  if(Stoned) {
530df930be7Sderaadt 	      pline("What a pity - you just destroyed a future piece of art!");
531df930be7Sderaadt 	      tp++;
532df930be7Sderaadt 	      Stoned = 0;
533df930be7Sderaadt 	  }
534df930be7Sderaadt 	  break;
535df930be7Sderaadt 	case 'M':
536df930be7Sderaadt 	  pline("You cannot resist the temptation to mimic a treasure chest.");
537df930be7Sderaadt 	  tp++;
538df930be7Sderaadt 	  nomul(-30);
539df930be7Sderaadt 	  afternmv = Meatdone;
540df930be7Sderaadt 	  nomovemsg = "You now again prefer mimicking a human.";
541df930be7Sderaadt 	  u.usym = '$';
542df930be7Sderaadt 	  prme();
543df930be7Sderaadt 	  break;
544df930be7Sderaadt 	}
545df930be7Sderaadt 	return(tp);
546df930be7Sderaadt }
547