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