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