1 /* NetHack 3.6 eat.c $NHDT-Date: 1502754159 2017/08/14 23:42:39 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.179 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2012. */
4 /* NetHack may be freely redistributed. See license for details. */
6 /* JNetHack Copyright */
7 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
8 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2018 */
9 /* JNetHack may be freely redistributed. See license for details. */
13 STATIC_PTR int NDECL(eatmdone);
14 STATIC_PTR int NDECL(eatfood);
15 STATIC_PTR struct obj *FDECL(costly_tin, (int));
16 STATIC_PTR int NDECL(opentin);
17 STATIC_PTR int NDECL(unfaint);
19 STATIC_DCL const char *FDECL(food_xname, (struct obj *, BOOLEAN_P));
20 STATIC_DCL void FDECL(choke, (struct obj *));
21 STATIC_DCL void NDECL(recalc_wt);
22 STATIC_DCL unsigned FDECL(obj_nutrition, (struct obj *));
23 STATIC_DCL struct obj *FDECL(touchfood, (struct obj *));
24 STATIC_DCL void NDECL(do_reset_eat);
25 STATIC_DCL void FDECL(done_eating, (BOOLEAN_P));
26 STATIC_DCL void FDECL(cprefx, (int));
27 STATIC_DCL int FDECL(intrinsic_possible, (int, struct permonst *));
28 STATIC_DCL void FDECL(givit, (int, struct permonst *));
29 STATIC_DCL void FDECL(cpostfx, (int));
30 STATIC_DCL void FDECL(consume_tin, (const char *));
31 STATIC_DCL void FDECL(start_tin, (struct obj *));
32 STATIC_DCL int FDECL(eatcorpse, (struct obj *));
33 STATIC_DCL void FDECL(start_eating, (struct obj *));
34 STATIC_DCL void FDECL(fprefx, (struct obj *));
35 STATIC_DCL void FDECL(fpostfx, (struct obj *));
36 STATIC_DCL int NDECL(bite);
37 STATIC_DCL int FDECL(edibility_prompts, (struct obj *));
38 STATIC_DCL int FDECL(rottenfood, (struct obj *));
39 STATIC_DCL void NDECL(eatspecial);
40 STATIC_DCL int FDECL(bounded_increase, (int, int, int));
41 STATIC_DCL void FDECL(accessory_has_effect, (struct obj *));
42 STATIC_DCL void FDECL(eataccessory, (struct obj *));
43 STATIC_DCL const char *FDECL(foodword, (struct obj *));
44 STATIC_DCL int FDECL(tin_variety, (struct obj *, BOOLEAN_P));
45 STATIC_DCL boolean FDECL(maybe_cannibal, (int, BOOLEAN_P));
49 /* also used to see if you're allowed to eat cats and dogs */
50 #define CANNIBAL_ALLOWED() (Role_if(PM_CAVEMAN) || Race_if(PM_ORC))
52 /* monster types that cause hero to be turned into stone if eaten */
53 #define flesh_petrifies(pm) (touch_petrifies(pm) || (pm) == &mons[PM_MEDUSA])
55 /* Rider corpses are treated as non-rotting so that attempting to eat one
56 will be sure to reach the stage of eating where that meal is fatal */
57 #define nonrotting_corpse(mnum) \
58 ((mnum) == PM_LIZARD || (mnum) == PM_LICHEN || is_rider(&mons[mnum]))
60 /* non-rotting non-corpses; unlike lizard corpses, these items will behave
61 as if rotten if they are cursed (fortune cookies handled elsewhere) */
62 #define nonrotting_food(otyp) \
63 ((otyp) == LEMBAS_WAFER || (otyp) == CRAM_RATION)
65 STATIC_OVL NEARDATA const char comestibles[] = { FOOD_CLASS, 0 };
66 STATIC_OVL NEARDATA const char offerfodder[] = { FOOD_CLASS, AMULET_CLASS,
69 /* Gold must come first for getobj(). */
70 STATIC_OVL NEARDATA const char allobj[] = {
71 COIN_CLASS, WEAPON_CLASS, ARMOR_CLASS, POTION_CLASS,
72 SCROLL_CLASS, WAND_CLASS, RING_CLASS, AMULET_CLASS,
73 FOOD_CLASS, TOOL_CLASS, GEM_CLASS, ROCK_CLASS,
74 BALL_CLASS, CHAIN_CLASS, SPBOOK_CLASS, 0
77 STATIC_OVL boolean force_save_hs = FALSE;
79 /* see hunger states in hack.h - texts used on bottom line */
81 const char *hu_stat[] = { "Satiated", " ", "Hungry ", "Weak ",
82 "Fainting", "Fainted ", "Starved " };
84 const char *hu_stat[] = { "
\96\9e\95 ", " ", "
\82Ø
\82±
\82Ø
\82±", "
\90\8a\8eã ",
85 "
\82Ó
\82ç
\82Ó
\82ç", "
\91²
\93| ", "
\89ì
\8e\80 " };
89 * Decide whether a particular object can be eaten by the possibly
90 * polymorphed character. Not used for monster checks.
94 register struct obj *obj;
96 /* protect invocation tools but not Rider corpses (handled elsewhere)*/
97 /* if (obj->oclass != FOOD_CLASS && obj_resists(obj, 0, 0)) */
98 if (objects[obj->otyp].oc_unique)
100 /* above also prevents the Amulet from being eaten, so we must never
101 allow fake amulets to be eaten either [which is already the case] */
103 if (metallivorous(youmonst.data) && is_metallic(obj)
104 && (youmonst.data != &mons[PM_RUST_MONSTER] || is_rustprone(obj)))
107 /* Ghouls only eat non-veggy corpses or eggs (see dogfood()) */
108 if (u.umonnum == PM_GHOUL)
109 return (boolean)((obj->otyp == CORPSE
110 && !vegan(&mons[obj->corpsenm]))
111 || (obj->otyp == EGG));
113 if (u.umonnum == PM_GELATINOUS_CUBE && is_organic(obj)
114 /* [g.cubes can eat containers and retain all contents
115 as engulfed items, but poly'd player can't do that] */
116 && !Has_contents(obj))
119 /* return (boolean) !!index(comestibles, obj->oclass); */
120 return (boolean) (obj->oclass == FOOD_CLASS);
126 context.botl = (u.uhs != NOT_HUNGRY || ATEMP(A_STR) < 0);
129 if (ATEMP(A_STR) < 0)
133 /* tin types [SPINACH_TIN = -1, overrides corpsenm, nut==600] */
134 static const struct {
135 const char *txt; /* description */
136 int nut; /* nutrition */
137 Bitfield(fodder, 1); /* stocked by health food shops */
138 Bitfield(greasy, 1); /* causes slippery fingers */
140 } tintxts[] = { { "rotten", -50, 0, 0 }, /* ROTTEN_TIN = 0 */
141 { "homemade", 50, 1, 0 }, /* HOMEMADE_TIN = 1 */
142 { "soup made from", 20, 1, 0 },
143 { "french fried", 40, 0, 1 },
144 { "pickled", 40, 1, 0 },
145 { "boiled", 50, 1, 0 },
146 { "smoked", 50, 1, 0 },
147 { "dried", 55, 1, 0 },
148 { "deep fried", 60, 0, 1 },
149 { "szechuan", 70, 1, 0 },
150 { "broiled", 80, 0, 0 },
151 { "stir fried", 80, 0, 1 },
152 { "sauteed", 95, 0, 0 },
153 { "candied", 100, 1, 0 },
154 { "pureed", 500, 1, 0 },
157 } tintxts[] = { { "
\95\85\82Á
\82½", -50, 0, 0 }, /* ROTTEN_TIN = 0 */
158 { "
\8e©
\89Æ
\90»
\82Ì", 50, 1, 0 }, /* HOMEMADE_TIN = 1 */
159 { "
\82Ì
\83X
\81[
\83v", 20, 1, 0 },
160 { "
\82Ì
\83t
\83\89\83C", 40, 0, 1 },
161 { "
\82Ì
\92Ð
\95¨", 40, 1, 0 },
162 { "
\82ä
\82Å", 50, 1, 0 },
163 { "
\82Ìà
\8e\90»", 50, 1, 0 },
164 { "
\8a£
\91\87", 55, 1, 0 },
165 { "
\82Ì
\97g
\82°
\95¨", 60, 0, 1 },
166 { "
\8el
\90ì
\95\97", 70, 1, 0 },
167 { "
\82Ì
\96Ô
\8fÄ
\82«", 80, 0, 0 },
168 { "àu
\82ß", 80, 0, 1 },
169 { "
\82Ì
\83\
\83e
\81[", 95, 0, 0 },
170 { "
\82Ì
\8d»
\93\9c\92Ð
\82¯", 100, 1, 0 },
171 { "
\82Ì
\83s
\83\85\81[
\83\8c", 500, 1, 0 },
174 #define TTSZ SIZE(tintxts)
176 static char *eatmbuf = 0; /* set by cpostfx() */
178 /* called after mimicing is over */
182 /* release `eatmbuf' */
184 if (nomovemsg == eatmbuf)
186 free((genericptr_t) eatmbuf), eatmbuf = 0;
189 if (youmonst.m_ap_type) {
190 youmonst.m_ap_type = M_AP_NOTHING;
196 /* called when hallucination is toggled */
200 const char *altmsg = 0;
201 int altapp = 0; /* lint suppression */
203 if (!eatmbuf || nomovemsg != eatmbuf)
206 if (is_obj_mappear(&youmonst,ORANGE) && !Hallucination) {
207 /* revert from hallucinatory to "normal" mimicking */
209 altmsg = "You now prefer mimicking yourself.";
211 altmsg = "
\82 \82È
\82½
\82Í
\8e©
\95ª
\8e©
\90g
\82Ì
\82Ü
\82Ë
\82ð
\82·
\82é
\82±
\82Æ
\82ð
\91I
\82ñ
\82¾
\81D";
213 } else if (is_obj_mappear(&youmonst,GOLD_PIECE) && Hallucination) {
214 /* won't happen; anything which might make immobilized
215 hero begin hallucinating (black light attack, theft
216 of Grayswandir) will terminate the mimicry first */
218 altmsg = "Your rind escaped intact.";
220 altmsg = "
\82 \82È
\82½
\82Ì
\94ç
\82ª
\82»
\82Ì
\82Ü
\82Ü
\82Ì
\8c`
\82Å
\93¦
\82°
\82Ä
\82¢
\82Á
\82½
\81D";
225 /* replace end-of-mimicking message */
226 if (strlen(altmsg) > strlen(eatmbuf)) {
227 free((genericptr_t) eatmbuf);
228 eatmbuf = (char *) alloc(strlen(altmsg) + 1);
230 nomovemsg = strcpy(eatmbuf, altmsg);
231 /* update current image */
232 youmonst.mappearance = altapp;
237 /* ``[the(] singular(food, xname) [)]'' */
238 STATIC_OVL const char *
239 food_xname(food, the_pfx)
245 if (food->otyp == CORPSE) {
246 result = corpse_xname(food, (const char *) 0,
247 CXN_SINGULAR | (the_pfx ? CXN_PFX_THE : 0));
248 /* not strictly needed since pname values are capitalized
249 and the() is a no-op for them */
250 if (type_is_pname(&mons[food->corpsenm]))
253 /* the ordinary case */
254 result = singular(food, xname);
257 result = the(result);
261 /* Created by GAN 01/28/87
262 * Amended by AKP 09/22/87: if not hard, don't choke, just vomit.
263 * Amended by 3. 06/12/89: if not hard, sometimes choke anyway, to keep risk.
264 * 11/10/89: if hard, rarely vomit anyway, for slim chance.
266 * To a full belly all food is bad. (It.)
272 /* only happens if you were satiated */
273 if (u.uhs != SATIATED) {
274 if (!food || food->otyp != AMULET_OF_STRANGULATION)
276 } else if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL) {
277 adjalign(-1); /* gluttony is unchivalrous */
279 You_feel("like a glutton!");
281 You("
\91å
\90H
\8a¿
\82Ì
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I");
284 exercise(A_CON, FALSE);
286 if (Breathless || (!Strangled && !rn2(20))) {
287 /* choking by eating AoS doesn't involve stuffing yourself */
288 if (food && food->otyp == AMULET_OF_STRANGULATION) {
290 You("choke, but recover your composure.");
292 You("
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82½
\81D
\82µ
\82©
\82µ
\82È
\82ñ
\82Æ
\82à
\82È
\82©
\82Á
\82½
\81D");
296 You("stuff yourself and then vomit voluminously.");
298 pline("
\82ª
\82Â
\82ª
\82Â
\82Æ
\8cû
\82É
\8bl
\82ß
\8d\9e\82ñ
\82¾
\82ª
\81C
\83h
\83o
\82Á
\82Æ
\93f
\82«
\8fo
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
299 morehungry(1000); /* you just got *very* sick! */
302 killer.format = KILLED_BY_AN;
304 * Note all "killer"s below read "Choked on %s" on the
305 * high score list & tombstone. So plan accordingly.
309 You("choke over your %s.", foodword(food));
311 You("%s
\82ð
\8dA
\82É
\8bl
\82Ü
\82ç
\82¹
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D", foodword(food));
312 if (food->oclass == COIN_CLASS) {
314 Strcpy(killer.name, "very rich meal");
316 Strcpy(killer.name, "
\82Æ
\82Ä
\82à
\8d\82\89¿
\82È
\97¿
\97\9d");
318 killer.format = KILLED_BY;
319 Strcpy(killer.name, killer_xname(food));
323 You("choke over it.");
325 pline("
\8dA
\82É
\8bl
\82Ü
\82ç
\82¹
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
327 Strcpy(killer.name, "quick snack");
329 Strcpy(killer.name, "
\91\81\90H
\82¢");
334 pline("
\82 \82È
\82½
\82Í
\8e\80\82É
\82Ü
\82µ
\82½
\81D
\81D
\81D");
339 /* modify object wt. depending on time spent consuming it */
343 struct obj *piece = context.victual.piece;
345 impossible("recalc_wt without piece");
348 debugpline1("Old weight = %d", piece->owt);
349 debugpline2("Used time = %d, Req'd time = %d", context.victual.usedtime,
350 context.victual.reqtime);
351 piece->owt = weight(piece);
352 debugpline1("New weight = %d", piece->owt);
355 /* called when eating interrupted by an event */
359 /* we only set a flag here - the actual reset process is done after
360 * the round is spent eating.
362 if (context.victual.eating && !context.victual.doreset) {
363 debugpline0("reset_eat...");
364 context.victual.doreset = TRUE;
369 /* base nutrition of a food-class object */
374 unsigned nut = (otmp->otyp == CORPSE) ? mons[otmp->corpsenm].cnutrit
375 : otmp->globby ? otmp->owt
376 : (unsigned) objects[otmp->otyp].oc_nutrition;
378 if (otmp->otyp == LEMBAS_WAFER) {
379 if (maybe_polyd(is_elf(youmonst.data), Race_if(PM_ELF)))
380 nut += nut / 4; /* 800 -> 1000 */
381 else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC)))
382 nut -= nut / 4; /* 800 -> 600 */
383 /* prevent polymorph making a partly eaten wafer
384 become more nutritious than an untouched one */
385 if (otmp->oeaten >= nut)
386 otmp->oeaten = (otmp->oeaten < objects[LEMBAS_WAFER].oc_nutrition)
388 } else if (otmp->otyp == CRAM_RATION) {
389 if (maybe_polyd(is_dwarf(youmonst.data), Race_if(PM_DWARF)))
390 nut += nut / 6; /* 600 -> 700 */
395 STATIC_OVL struct obj *
399 if (otmp->quan > 1L) {
401 (void) splitobj(otmp, otmp->quan - 1L);
403 otmp = splitobj(otmp, 1L);
404 debugpline0("split object,");
408 costly_alteration(otmp, COST_BITE);
409 otmp->oeaten = obj_nutrition(otmp);
414 if (inv_cnt(FALSE) >= 52) {
415 sellobj_state(SELL_DONTSELL);
417 sellobj_state(SELL_NORMAL);
419 otmp->nomerge = 1; /* used to prevent merge */
427 /* When food decays, in the middle of your meal, we don't want to dereference
428 * any dangling pointers, so set it to null (which should still trigger
429 * do_reset_eat() at the beginning of eatfood()) and check for null pointers
436 if (obj == context.victual.piece) {
437 context.victual.piece = (struct obj *) 0;
438 context.victual.o_id = 0;
441 obj_stop_timers(obj);
444 /* renaming an object used to result in it having a different address,
445 so the sequence start eating/opening, get interrupted, name the food,
446 resume eating/opening would restart from scratch */
448 food_substitution(old_obj, new_obj)
449 struct obj *old_obj, *new_obj;
451 if (old_obj == context.victual.piece) {
452 context.victual.piece = new_obj;
453 context.victual.o_id = new_obj->o_id;
455 if (old_obj == context.tin.tin) {
456 context.tin.tin = new_obj;
457 context.tin.o_id = new_obj->o_id;
464 debugpline0("do_reset_eat...");
465 if (context.victual.piece) {
466 context.victual.o_id = 0;
467 context.victual.piece = touchfood(context.victual.piece);
468 if (context.victual.piece)
469 context.victual.o_id = context.victual.piece->o_id;
472 context.victual.fullwarn = context.victual.eating =
473 context.victual.doreset = FALSE;
474 /* Do not set canchoke to FALSE; if we continue eating the same object
475 * we need to know if canchoke was set when they started eating it the
476 * previous time. And if we don't continue eating the same object
477 * canchoke always gets recalculated anyway.
483 /* called each move during eating process */
487 if (!context.victual.piece
488 || (!carried(context.victual.piece)
489 && !obj_here(context.victual.piece, u.ux, u.uy))) {
490 /* maybe it was stolen? */
494 if (!context.victual.eating)
497 if (++context.victual.usedtime <= context.victual.reqtime) {
500 return 1; /* still busy */
511 struct obj *piece = context.victual.piece;
513 piece->in_use = TRUE;
514 occupation = 0; /* do this early, so newuhs() knows we're done */
522 You("finish eating %s.", food_xname(piece, TRUE));
524 You("%s
\82ð
\90H
\82×
\8fI
\82¦
\82½
\81D", food_xname(piece, TRUE));
526 if (piece->otyp == CORPSE || piece->globby)
527 cpostfx(piece->corpsenm);
535 context.victual.piece = (struct obj *) 0;
536 context.victual.o_id = 0;
537 context.victual.fullwarn = context.victual.eating =
538 context.victual.doreset = FALSE;
547 u.uconduct.unvegan++;
549 violated_vegetarian();
552 /* handle side-effects of mind flayer's tentacle attack */
554 eat_brains(magr, mdef, visflag, dmg_p)
555 struct monst *magr, *mdef;
557 int *dmg_p; /* for dishing out extra damage in lieu of Int loss */
559 struct permonst *pd = mdef->data;
560 boolean give_nutrit = FALSE;
561 int result = MM_HIT, xtra_dmg = rnd(10);
563 if (noncorporeal(pd)) {
566 pline("%s brain is unharmed.",
567 (mdef == &youmonst) ? "Your" : s_suffix(Monnam(mdef)));
569 pline("%s
\82Ì
\94]
\82Í
\96³
\8e\96\82¾
\82Á
\82½
\81D",
570 (mdef == &youmonst) ? "
\82 \82È
\82½" : Monnam(mdef));
572 return MM_MISS; /* side-effects can't occur */
573 } else if (magr == &youmonst) {
575 You("eat %s brain!", s_suffix(mon_nam(mdef)));
577 You("%s
\82Ì
\94]
\82ð
\90H
\82×
\82½
\81I", mon_nam(mdef));
578 } else if (mdef == &youmonst) {
580 Your("brain is eaten!");
582 Your("
\94]
\82Í
\90H
\82×
\82ç
\82ê
\82½
\81I");
583 } else { /* monster against monster */
584 if (visflag && canspotmon(mdef))
586 pline("%s brain is eaten!", s_suffix(Monnam(mdef)));
588 pline("%s
\82Ì
\94]
\82Í
\90H
\82×
\82ç
\82ê
\82½
\81I", Monnam(mdef));
591 if (flesh_petrifies(pd)) {
592 /* mind flayer has attempted to eat the brains of a petrification
593 inducing critter (most likely Medusa; attacking a cockatrice via
594 tentacle-touch should have been caught before reaching this far) */
595 if (magr == &youmonst) {
596 if (!Stone_resistance && !Stoned)
597 make_stoned(5L, (char *) 0, KILLED_BY_AN, pd->mname);
599 /* no need to check for poly_when_stoned or Stone_resistance;
600 mind flayers don't have those capabilities */
601 if (visflag && canseemon(magr))
603 pline("%s turns to stone!", Monnam(magr));
605 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(magr));
608 /* life-saved; don't continue eating the brains */
611 if (magr->mtame && !visflag)
612 /* parallels mhitm.c's brief_feeling */
614 You("have a sad thought for a moment, then it passes.");
616 You("
\94ß
\82µ
\82¢
\8dl
\82¦
\82É
\82¨
\82»
\82í
\82ê
\82½
\82ª
\81A
\82·
\82®
\82É
\89ß
\82¬
\82³
\82Á
\82½
\81D");
622 if (magr == &youmonst) {
624 * player mind flayer is eating something's brain
627 if (mindless(pd)) { /* (cannibalism not possible here) */
629 pline("%s doesn't notice.", Monnam(mdef));
631 pline("%s
\82Í
\8bC
\82Ã
\82¢
\82Ä
\82¢
\82È
\82¢
\81D", Monnam(mdef));
632 /* all done; no extra harm inflicted upon target */
634 } else if (is_rider(pd)) {
636 pline("Ingesting that is fatal.");
638 pline("
\8eæ
\82è
\8d\9e\82ñ
\82¾
\82ç
\82·
\82®
\82É
\8e\80\82ñ
\82Å
\82µ
\82Ü
\82Á
\82½
\81D");
640 Sprintf(killer.name, "unwisely ate the brain of %s", pd->mname);
641 killer.format = NO_KILLER_PREFIX;
643 Sprintf(killer.name, "
\8bð
\82©
\82É
\82à%s
\82Ì
\91Ì
\82ð
\90H
\82×
\82Ä", pd->mname);
644 killer.format = KILLED_BY;
647 /* life-saving needed to reach here */
648 exercise(A_WIS, FALSE);
649 *dmg_p += xtra_dmg; /* Rider takes extra damage */
651 morehungry(-rnd(30)); /* cannot choke */
652 if (ABASE(A_INT) < AMAX(A_INT)) {
653 /* recover lost Int; won't increase current max */
654 ABASE(A_INT) += rnd(4);
655 if (ABASE(A_INT) > AMAX(A_INT))
656 ABASE(A_INT) = AMAX(A_INT);
659 exercise(A_WIS, TRUE);
662 /* targetting another mind flayer or your own underlying species
664 (void) maybe_cannibal(monsndx(pd), TRUE);
666 } else if (mdef == &youmonst) {
668 * monster mind flayer is eating hero's brain
670 /* no such thing as mindless players */
671 if (ABASE(A_INT) <= ATTRMIN(A_INT)) {
673 static NEARDATA const char brainlessness[] = "brainlessness";
675 static NEARDATA const char brainlessness[] = "
\94]
\82ð
\8e¸
\82Á
\82Ä";
678 Strcpy(killer.name, brainlessness);
679 killer.format = KILLED_BY;
681 /* amulet of life saving has now been used up */
683 pline("Unfortunately your brain is still gone.");
685 pline("
\8ec
\94O
\82È
\82ª
\82ç
\82 \82È
\82½
\82É
\82Í
\94]
\82ª
\82È
\82¢
\81D");
686 /* sanity check against adding other forms of life-saving */
687 u.uprops[LIFESAVED].extrinsic =
688 u.uprops[LIFESAVED].intrinsic = 0L;
691 Your("last thought fades away.");
693 Your("
\8dÅ
\8cã
\82Ì
\8ev
\82¢
\82ª
\91\96\94n
\93\95\82Ì
\82æ
\82¤
\82É
\89¡
\82¬
\82Á
\82½
\81D");
695 Strcpy(killer.name, brainlessness);
696 killer.format = KILLED_BY;
698 /* can only get here when in wizard or explore mode and user has
699 explicitly chosen not to die; arbitrarily boost intelligence */
700 ABASE(A_INT) = ATTRMIN(A_INT) + 2;
702 You_feel("like a scarecrow.");
704 You("
\82©
\82©
\82µ
\82Ì
\82æ
\82¤
\82È
\8bC
\8e\9d\82ª
\82µ
\82½
\81D");
706 give_nutrit = TRUE; /* in case a conflicted pet is doing this */
707 exercise(A_WIS, FALSE);
708 /* caller handles Int and memory loss */
712 * monster mind flayer is eating another monster's brain
715 if (visflag && canspotmon(mdef))
717 pline("%s doesn't notice.", Monnam(mdef));
719 pline("%s
\82Í
\8bC
\82Ã
\82¢
\82Ä
\82¢
\82È
\82¢
\81D", Monnam(mdef));
721 } else if (is_rider(pd)) {
724 result = MM_AGR_DIED;
725 /* Rider takes extra damage regardless of whether attacker dies */
730 if (*dmg_p >= mdef->mhp && visflag && canspotmon(mdef))
732 pline("%s last thought fades away...",
733 s_suffix(Monnam(mdef)));
735 pline("%s
\82Ì
\8dÅ
\8cã
\82Ì
\8ev
\82¢
\82ª
\82æ
\82¬
\82é
\81D
\81D
\81D",
741 if (give_nutrit && magr->mtame && !magr->isminion) {
742 EDOG(magr)->hungrytime += rnd(60);
749 /* eating a corpse or egg of one's own species is usually naughty */
751 maybe_cannibal(pm, allowmsg)
755 static NEARDATA long ate_brains = 0L;
756 struct permonst *fptr = &mons[pm]; /* food type */
758 /* when poly'd into a mind flayer, multiple tentacle hits in one
759 turn cause multiple digestion checks to occur; avoid giving
760 multiple luck penalties for the same attack */
761 if (moves == ate_brains)
763 ate_brains = moves; /* ate_anything, not just brains... */
765 if (!CANNIBAL_ALLOWED()
766 /* non-cannibalistic heroes shouldn't eat own species ever
767 and also shouldn't eat current species when polymorphed
768 (even if having the form of something which doesn't care
769 about cannibalism--hero's innate traits aren't altered) */
771 || (Upolyd && same_race(youmonst.data, fptr))
772 || (u.ulycn >= LOW_PM && were_beastie(pm) == u.ulycn))) {
774 if (Upolyd && your_race(fptr))
776 You("have a bad feeling deep inside.");
778 You("
\8c\99\88«
\8a´
\82É
\82¨
\82»
\82í
\82ê
\82½
\81D");
780 You("cannibal! You will regret this!");
782 pline("
\8b¤
\8bò
\82¢
\82¾
\81I
\8cã
\89÷
\82·
\82é
\82¼
\81I");
784 HAggravate_monster |= FROMOUTSIDE;
785 change_luck(-rn1(4, 2)); /* -5..-2 */
795 (void) maybe_cannibal(pm, TRUE);
796 if (flesh_petrifies(&mons[pm])) {
797 if (!Stone_resistance
798 && !(poly_when_stoned(youmonst.data)
799 && polymon(PM_STONE_GOLEM))) {
801 Sprintf(killer.name, "tasting %s meat", mons[pm].mname);
803 Sprintf(killer.name, "%s
\82Ì
\93÷
\82ð
\90H
\82×", mons[pm].mname);
804 killer.format = KILLED_BY;
806 You("turn to stone.");
808 You("
\90Î
\82É
\82È
\82Á
\82½
\81D");
810 if (context.victual.piece)
811 context.victual.eating = FALSE;
812 return; /* lifesaved */
823 /* cannibals are allowed to eat domestic animals without penalty */
824 if (!CANNIBAL_ALLOWED()) {
826 You_feel("that eating the %s was a bad idea.", mons[pm].mname);
828 pline("%s
\82ð
\90H
\82×
\82é
\82Ì
\82Í
\82æ
\82
\82È
\82¢
\8bC
\82ª
\82µ
\82½
\81D", mons[pm].mname);
829 HAggravate_monster |= FROMOUTSIDE;
840 pline("Eating that is instantly fatal.");
842 pline("
\90H
\82×
\82½
\82ç
\82·
\82®
\82É
\8e\80\82ñ
\82Å
\82µ
\82Ü
\82Á
\82½
\81D");
844 Sprintf(killer.name, "unwisely ate the body of %s", mons[pm].mname);
845 killer.format = NO_KILLER_PREFIX;
847 Sprintf(killer.name, "
\8bð
\82©
\82É
\82à%s
\82Ì
\91Ì
\82ð
\90H
\82×
\82Ä", mons[pm].mname);
848 killer.format = KILLED_BY;
851 /* life-saving needed to reach here */
852 exercise(A_WIS, FALSE);
853 /* It so happens that since we know these monsters */
854 /* cannot appear in tins, context.victual.piece will always */
855 /* be what we want, which is not generally true. */
856 if (revive_corpse(context.victual.piece)) {
857 context.victual.piece = (struct obj *) 0;
858 context.victual.o_id = 0;
863 if (!Slimed && !Unchanging && !slimeproof(youmonst.data)) {
865 You("don't feel very well.");
867 You("
\82·
\82²
\82
\8bC
\95ª
\82ª
\88«
\82¢
\81D");
868 make_slimed(10L, (char *) 0);
869 delayed_killer(SLIMED, KILLED_BY_AN, "");
873 if (acidic(&mons[pm]) && Stoned)
886 Sprintf(buf, "What a pity--you just ruined a future piece of %sart!",
887 ACURR(A_CHA) > 15 ? "fine " : "");
889 Sprintf(buf, "
\82È
\82ñ
\82Ä
\82±
\82Æ
\82¾
\81I%s
\8c|
\8fp
\8dì
\95i
\82É
\82È
\82ê
\82½
\82©
\82à
\82µ
\82ê
\82È
\82¢
\82Ì
\82É
\81I",
890 ACURR(A_CHA) > 15 ? "
\8bM
\8fd
\82È" : "");
894 Strcpy(buf, "You feel limber!");
896 Strcpy(buf, "
\91Ì
\82ª
\93î
\82ç
\82©
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I");
897 make_stoned(0L, buf, 0, (char *) 0);
901 * If you add an intrinsic that can be gotten by eating a monster, add it
902 * to intrinsic_possible() and givit(). (It must already be in prop.h to
903 * be an intrinsic property.)
904 * It would be very easy to make the intrinsics not try to give you one
905 * that you already had by checking to see if you have it in
906 * intrinsic_possible() instead of givit(), but we're not that nice.
909 /* intrinsic_possible() returns TRUE iff a monster can give an intrinsic. */
911 intrinsic_possible(type, ptr)
913 register struct permonst *ptr;
918 #define ifdebugresist(Msg) \
924 #define ifdebugresist(Msg) /*empty*/
928 res = (ptr->mconveys & MR_FIRE) != 0;
929 ifdebugresist("can get fire resistance");
932 res = (ptr->mconveys & MR_SLEEP) != 0;
933 ifdebugresist("can get sleep resistance");
936 res = (ptr->mconveys & MR_COLD) != 0;
937 ifdebugresist("can get cold resistance");
940 res = (ptr->mconveys & MR_DISINT) != 0;
941 ifdebugresist("can get disintegration resistance");
943 case SHOCK_RES: /* shock (electricity) resistance */
944 res = (ptr->mconveys & MR_ELEC) != 0;
945 ifdebugresist("can get shock resistance");
948 res = (ptr->mconveys & MR_POISON) != 0;
949 ifdebugresist("can get poison resistance");
952 res = can_teleport(ptr);
953 ifdebugresist("can get teleport");
955 case TELEPORT_CONTROL:
956 res = control_teleport(ptr);
957 ifdebugresist("can get teleport control");
960 res = telepathic(ptr);
961 ifdebugresist("can get telepathy");
971 /* givit() tries to give you an intrinsic based on the monster's level
972 * and what type of intrinsic it is trying to give you.
977 register struct permonst *ptr;
981 debugpline1("Attempting to give intrinsic %d", type);
982 /* some intrinsics are easier to get than others */
985 if ((ptr == &mons[PM_KILLER_BEE] || ptr == &mons[PM_SCORPION])
994 case TELEPORT_CONTROL:
1005 if (ptr->mlevel <= rn2(chance))
1006 return; /* failed die roll */
1010 debugpline0("Trying to give fire resistance");
1011 if (!(HFire_resistance & FROMOUTSIDE)) {
1013 You(Hallucination ? "be chillin'." : "feel a momentary chill.");
1015 You(Hallucination ? "
\81u
\83N
\81[
\83\8b\91î
\94z
\95Ö
\81v
\82³
\82ê
\82Ä
\82¢
\82é
\82æ
\82¤
\82¾
\81D" : "
\88ê
\8fu
\8a¦
\82¯
\82ª
\82µ
\82½
\81D");
1016 HFire_resistance |= FROMOUTSIDE;
1020 debugpline0("Trying to give sleep resistance");
1021 if (!(HSleep_resistance & FROMOUTSIDE)) {
1023 You_feel("wide awake.");
1025 You("
\82Ï
\82Á
\82¿
\82è
\96Ú
\82ª
\82³
\82ß
\82½
\81D");
1026 HSleep_resistance |= FROMOUTSIDE;
1030 debugpline0("Trying to give cold resistance");
1031 if (!(HCold_resistance & FROMOUTSIDE)) {
1033 You_feel("full of hot air.");
1035 You("
\94M
\95\97\82ð
\91S
\90g
\82É
\8a´
\82¶
\82½
\81D");
1036 HCold_resistance |= FROMOUTSIDE;
1040 debugpline0("Trying to give disintegration resistance");
1041 if (!(HDisint_resistance & FROMOUTSIDE)) {
1043 You_feel(Hallucination ? "totally together, man." : "very firm.");
1045 You_feel(Hallucination ? "
\90¢
\8aE
\90l
\97Þ
\82Æ
\8cZ
\92í
\82É
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D" : "
\82Æ
\82Ä
\82à
\8aæ
\8fä
\82É
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1046 HDisint_resistance |= FROMOUTSIDE;
1049 case SHOCK_RES: /* shock (electricity) resistance */
1050 debugpline0("Trying to give shock resistance");
1051 if (!(HShock_resistance & FROMOUTSIDE)) {
1054 You_feel("grounded in reality.");
1056 You("
\8eÀ
\82Í
\83A
\81[
\83X
\82³
\82ê
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1059 Your("health currently feels amplified!");
1061 pline("
\8c\92\8dN
\82ª
\91\9d\95\9d\82³
\82ê
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I");
1062 HShock_resistance |= FROMOUTSIDE;
1066 debugpline0("Trying to give poison resistance");
1067 if (!(HPoison_resistance & FROMOUTSIDE)) {
1069 You_feel(Poison_resistance ? "especially healthy." : "healthy.");
1071 You_feel(Poison_resistance ? "
\93Á
\82É
\8c\92\8dN
\82É
\82È
\82Á
\82½
\8bC
\82ª
\82µ
\82½
\81D" : "
\8c\92\8dN
\82É
\82È
\82Á
\82½
\8bC
\82ª
\82µ
\82½
\81D");
1072 HPoison_resistance |= FROMOUTSIDE;
1076 debugpline0("Trying to give teleport");
1077 if (!(HTeleportation & FROMOUTSIDE)) {
1079 You_feel(Hallucination ? "diffuse." : "very jumpy.");
1081 pline(Hallucination ? "
\91Ì
\82ª
\94ò
\82Ñ
\8eU
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D" : "
\92µ
\96ô
\97Í
\82ª
\8d\82\82Ü
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1082 HTeleportation |= FROMOUTSIDE;
1085 case TELEPORT_CONTROL:
1086 debugpline0("Trying to give teleport control");
1087 if (!(HTeleport_control & FROMOUTSIDE)) {
1089 You_feel(Hallucination ? "centered in your personal space."
1090 : "in control of yourself.");
1092 You_feel(Hallucination ? "
\8e©
\8cÈ
\92\86\90S
\93I
\82É
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D"
1093 : "
\8e©
\95ª
\8e©
\90g
\82ð
\90§
\8cä
\82Å
\82«
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1095 HTeleport_control |= FROMOUTSIDE;
1099 debugpline0("Trying to give telepathy");
1100 if (!(HTelepat & FROMOUTSIDE)) {
1102 You_feel(Hallucination ? "in touch with the cosmos."
1103 : "a strange mental acuity.");
1105 You_feel(Hallucination ? "
\89F
\92\88\82Ì
\90_
\94é
\82É
\90G
\82ê
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D"
1106 : "
\8aï
\96
\82È
\90¸
\90_
\93I
\89s
\82³
\82ð
\8a´
\82¶
\82½
\81D");
1108 HTelepat |= FROMOUTSIDE;
1109 /* If blind, make sure monsters show up. */
1115 debugpline0("Tried to give an impossible intrinsic");
1120 /* called after completely consuming a corpse */
1125 register int tmp = 0;
1126 int catch_lycanthropy = NON_PM;
1128 /* in case `afternmv' didn't get called for previously mimicking
1129 gold, clean up now to avoid `eatmbuf' memory leak */
1135 /* MRKR: "eye of newt" may give small magical energy boost */
1136 if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) {
1137 int old_uen = u.uen;
1139 if (u.uen > u.uenmax) {
1144 if (old_uen != u.uen) {
1146 You_feel("a mild buzz.");
1148 You("
\82·
\82±
\82µ
\82Ó
\82ç
\82Ó
\82ç
\82µ
\82½
\81D");
1156 case PM_HUMAN_WERERAT:
1157 catch_lycanthropy = PM_WERERAT;
1159 case PM_HUMAN_WEREJACKAL:
1160 catch_lycanthropy = PM_WEREJACKAL;
1162 case PM_HUMAN_WEREWOLF:
1163 catch_lycanthropy = PM_WEREWOLF;
1170 make_blinded(0L, !u.ucreamed);
1175 set_itimeout(&HInvis, (long) rn1(100, 50));
1176 if (!Blind && !BInvis)
1177 self_invis_message();
1179 if (!(HInvis & INTRINSIC))
1181 You_feel("hidden!");
1183 Your("
\8ep
\82Í
\89B
\82³
\82ê
\82½
\81I");
1184 HInvis |= FROMOUTSIDE;
1185 HSee_invisible |= FROMOUTSIDE;
1189 case PM_YELLOW_LIGHT:
1191 make_stunned((HStun & TIMEOUT) + 30L, FALSE);
1194 make_stunned((HStun & TIMEOUT) + 30L, FALSE);
1196 case PM_GIANT_MIMIC:
1199 case PM_LARGE_MIMIC:
1202 case PM_SMALL_MIMIC:
1204 if (youmonst.data->mlet != S_MIMIC && !Unchanging) {
1207 u.uconduct.polyselfs++; /* you're changing form */
1209 You_cant("resist the temptation to mimic %s.",
1210 Hallucination ? "an orange" : "a pile of gold");
1212 You("%s
\82ð
\90^
\8e\97\82µ
\82½
\82¢
\97U
\98f
\82É
\82©
\82ç
\82ê
\82½
\81D",
1213 Hallucination ? "
\83I
\83\8c\83\93\83W" : "
\8bà
\89Ý
\82Ì
\8eR");
1215 /* A pile of gold can't ride. */
1217 dismount_steed(DISMOUNT_FELL);
1220 multi_reason = "pretending to be a pile of gold";
1222 multi_reason = "
\8bà
\89Ý
\82Ì
\8eR
\82Ì
\90^
\8e\97\82ð
\82µ
\82Ä
\82¢
\82é
\8e\9e\82É";
1226 ? "You suddenly dread being peeled and mimic %s again!"
1228 ? "
\93Ë
\91R
\8aÛ
\97\87\82É
\82³
\82ê
\82é
\82Ì
\82ª
\8b°
\82ë
\82µ
\82
\82È
\82Á
\82Ä
\82Ü
\82½%s
\82Ì
\90^
\8e\97\82ð
\82µ
\82½
\81I"
1230 : "You now prefer mimicking %s again.",
1232 : "
\82±
\82ñ
\82Ç
\82Í
\82Ü
\82½%s
\82Ì
\90^
\8e\97\82ª
\82µ
\82½
\82
\82È
\82Á
\82½
\81D",
1233 an(Upolyd ? youmonst.data->mname : urace.noun));
1234 eatmbuf = dupstr(buf);
1235 nomovemsg = eatmbuf;
1236 afternmv = eatmdone;
1237 /* ??? what if this was set before? */
1238 youmonst.m_ap_type = M_AP_OBJECT;
1239 youmonst.mappearance = Hallucination ? ORANGE : GOLD_PIECE;
1242 /* make gold symbol show up now */
1243 display_nhwindow(WIN_MAP, TRUE);
1246 case PM_QUANTUM_MECHANIC:
1248 Your("velocity suddenly seems very uncertain!");
1250 Your("
\91¬
\93x
\82ª
\93Ë
\91R
\81C
\95s
\8am
\92è
\82É
\82È
\82Á
\82½
\81I");
1251 if (HFast & INTRINSIC) {
1252 HFast &= ~INTRINSIC;
1254 You("seem slower.");
1256 You("
\92x
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
1258 HFast |= FROMOUTSIDE;
1260 You("seem faster.");
1262 You("
\91¬
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
1266 if ((HStun & TIMEOUT) > 2)
1267 make_stunned(2L, FALSE);
1268 if ((HConfusion & TIMEOUT) > 2)
1269 make_confused(2L, FALSE);
1272 case PM_DOPPELGANGER:
1273 case PM_SANDESTIN: /* moot--they don't leave corpses */
1276 You_feel("momentarily different."); /* same as poly trap */
1278 You_feel("
\88ê
\8fu
\88á
\82Á
\82½
\8a´
\82¶
\82ª
\82µ
\82½
\81D"); /* same as poly trap */
1282 You_feel("a change coming over you.");
1284 pline("
\95Ï
\89»
\82ª
\96K
\82ê
\82½
\81D");
1288 case PM_DISENCHANTER:
1289 /* picks an intrinsic at random and removes it; there's
1290 no feedback if hero already lacks the chosen ability */
1291 debugpline0("using attrcurse to strip an intrinsic");
1294 case PM_MIND_FLAYER:
1295 case PM_MASTER_MIND_FLAYER:
1296 if (ABASE(A_INT) < ATTRMAX(A_INT)) {
1299 pline("Yum! That was real brain food!");
1301 pline("
\82¤
\82Ü
\82¢
\81I
\82±
\82ê
\82±
\82»
\96{
\93\96\82Ì
\81u
\93ª
\82Ì
\97Ç
\82
\82È
\82é
\90H
\8e\96\81v
\82¾
\81I");
1302 (void) adjattrib(A_INT, 1, FALSE);
1303 break; /* don't give them telepathy, too */
1307 pline("For some reason, that tasted bland.");
1309 pline("
\82Ç
\82¤
\82µ
\82½
\82í
\82¯
\82©
\81C
\92W
\94\92\82È
\96¡
\82¾
\81D");
1313 struct permonst *ptr = &mons[pm];
1314 boolean conveys_STR = is_giant(ptr);
1317 if (dmgtype(ptr, AD_STUN) || dmgtype(ptr, AD_HALU)
1318 || pm == PM_VIOLET_FUNGUS) {
1320 pline("Oh wow! Great stuff!");
1322 pline("
\83\8f\81[
\83H
\81I
\82±
\82è
\82á
\82·
\82²
\82¢
\81I");
1323 (void) make_hallucinated((HHallucination & TIMEOUT) + 200L, FALSE,
1327 /* Check the monster for all of the intrinsics. If this
1328 * monster can give more than one, pick one to try to give
1329 * from among all it can give.
1331 * Strength from giants is now treated like an intrinsic
1332 * rather than being given unconditionally.
1334 count = 0; /* number of possible intrinsics */
1335 tmp = 0; /* which one we will try to give */
1338 tmp = -1; /* use -1 as fake prop index for STR */
1339 debugpline1("\"Intrinsic\" strength, %d", tmp);
1341 for (i = 1; i <= LAST_PROP; i++) {
1342 if (!intrinsic_possible(i, ptr))
1345 /* a 1 in count chance of replacing the old choice
1346 with this one, and a count-1 in count chance
1347 of keeping the old choice (note that 1 in 1 and
1348 0 in 1 are what we want for the first candidate) */
1350 debugpline2("Intrinsic %d replacing %d", i, tmp);
1354 /* if strength is the only candidate, give it 50% chance */
1355 if (conveys_STR && count == 1 && !rn2(2))
1357 /* if something was chosen, give it now (givit() might fail) */
1359 gainstr((struct obj *) 0, 0, TRUE);
1363 } /* default case */
1366 if (catch_lycanthropy >= LOW_PM) {
1367 set_ulycn(catch_lycanthropy);
1368 retouch_equipment(2);
1374 violated_vegetarian()
1376 u.uconduct.unvegetarian++;
1377 if (Role_if(PM_MONK)) {
1379 You_feel("guilty.");
1381 pline("
\8dß
\82ð
\8a´
\82¶
\82½
\81D");
1387 /* common code to check and possibly charge for 1 context.tin.tin,
1388 * will split() context.tin.tin if necessary */
1389 STATIC_PTR struct obj *
1390 costly_tin(alter_type)
1391 int alter_type; /* COST_xxx */
1393 struct obj *tin = context.tin.tin;
1395 if (carried(tin) ? tin->unpaid
1396 : (costly_spot(tin->ox, tin->oy) && !tin->no_charge)) {
1397 if (tin->quan > 1L) {
1398 tin = context.tin.tin = splitobj(tin, 1L);
1399 context.tin.o_id = tin->o_id;
1401 costly_alteration(tin, alter_type);
1407 tin_variety_txt(s, tinvariety)
1413 if (s && tinvariety) {
1415 for (k = 0; k < TTSZ - 1; ++k) {
1416 l = (int) strlen(tintxts[k].txt);
1417 if (!strncmpi(s, tintxts[k].txt, l) && ((int) strlen(s) > l)
1428 * This assumes that buf already contains the word "tin",
1429 * as is the case with caller xname().
1431 /*JP:
\81u
\8aÊ
\8bl
\81v
\82Í
\8cã
\82Å
\95t
\82¯
\82é */
1433 tin_details(obj, mnum, buf)
1441 int r = tin_variety(obj, TRUE);
1444 if (r == SPINACH_TIN)
1446 Strcat(buf, " of spinach");
1448 Strcat(buf, "
\83z
\83E
\83\8c\83\93\91\90\82Ì");
1449 else if (mnum == NON_PM)
1451 Strcpy(buf, "empty tin");
1453 Strcat(buf, "
\8bó
\82Á
\82Û
\82Ì");
1455 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Í
\8cã
\82Å*/
1456 if ((obj->cknown || iflags.override_ID) && obj->spe < 0) {
1457 if (r == ROTTEN_TIN || r == HOMEMADE_TIN) {
1458 /* put these before the word tin */
1459 Sprintf(buf2, "%s %s of ", tintxts[r].txt, buf);
1462 Sprintf(eos(buf), " of %s ", tintxts[r].txt);
1464 Sprintf(eos(buf), "%s", tintxts[r].txt);
1466 Strcpy(eos(buf), " of ");
1469 #if 1 /*JP*//*
\81u
\82Ì
\81v
\82Å
\8en
\82Ü
\82é
\82È
\82ç
\8cã
\92u
\81A
\82»
\82ê
\88È
\8aO
\82È
\82ç
\91O
\92u*/
1470 if (strstr(tintxts[r].txt, "
\82Ì") != tintxts[r].txt) {
1471 Strcpy(eos(buf), tintxts[r].txt);
1474 if (vegetarian(&mons[mnum]))
1476 Sprintf(eos(buf), "%s", mons[mnum].mname);
1478 Sprintf(eos(buf), "%s", mons[mnum].mname);
1481 Sprintf(eos(buf), "%s meat", mons[mnum].mname);
1483 Sprintf(eos(buf), "%s
\82Ì
\93÷", mons[mnum].mname);
1484 #if 1 /*JP*//*
\81u
\82Ì
\81v
\82Å
\8en
\82Ü
\82é
\82È
\82ç
\8cã
\92u
\81A
\82»
\82ê
\88È
\8aO
\82È
\82ç
\91O
\92u*/
1485 if (strstr(tintxts[r].txt, "
\82Ì") == tintxts[r].txt) {
1486 Strcpy(eos(buf), tintxts[r].txt);
1488 Strcpy(eos(buf), "
\82Ì");
1495 set_tin_variety(obj, forcetype)
1501 if (forcetype == SPINACH_TIN
1502 || (forcetype == HEALTHY_TIN
1503 && (obj->corpsenm == NON_PM /* empty or already spinach */
1504 || !vegetarian(&mons[obj->corpsenm])))) { /* replace meat */
1505 obj->corpsenm = NON_PM; /* not based on any monster */
1506 obj->spe = 1; /* spinach */
1508 } else if (forcetype == HEALTHY_TIN) {
1509 r = tin_variety(obj, FALSE);
1510 if (r < 0 || r >= TTSZ)
1511 r = ROTTEN_TIN; /* shouldn't happen */
1512 while ((r == ROTTEN_TIN && !obj->cursed) || !tintxts[r].fodder)
1514 } else if (forcetype >= 0 && forcetype < TTSZ - 1) {
1516 } else { /* RANDOM_TIN */
1517 r = rn2(TTSZ - 1); /* take your pick */
1518 if (r == ROTTEN_TIN && nonrotting_corpse(obj->corpsenm))
1519 r = HOMEMADE_TIN; /* lizards don't rot */
1521 obj->spe = -(r + 1); /* offset by 1 to allow index 0 */
1525 tin_variety(obj, disp)
1527 boolean disp; /* we're just displaying so leave things alone */
1531 if (obj->spe == 1) {
1533 } else if (obj->cursed) {
1534 r = ROTTEN_TIN; /* always rotten if cursed */
1535 } else if (obj->spe < 0) {
1537 --r; /* get rid of the offset */
1541 if (!disp && r == HOMEMADE_TIN && !obj->blessed && !rn2(7))
1542 r = ROTTEN_TIN; /* some homemade tins go bad */
1544 if (r == ROTTEN_TIN && nonrotting_corpse(obj->corpsenm))
1545 r = HOMEMADE_TIN; /* lizards don't rot */
1555 struct obj *tin = context.tin.tin;
1557 r = tin_variety(tin, FALSE);
1558 if (tin->otrapped || (tin->cursed && r != HOMEMADE_TIN && !rn2(8))) {
1560 b_trapped("tin", 0);
1562 b_trapped("
\8aÊ", 0);
1563 tin = costly_tin(COST_DSTROY);
1567 pline1(mesg); /* "You succeed in opening the tin." */
1569 if (r != SPINACH_TIN) {
1570 mnum = tin->corpsenm;
1571 if (mnum == NON_PM) {
1573 pline("It turns out to be empty.");
1575 pline("
\8aÊ
\82Í
\8bó
\82Á
\82Û
\82¾
\82Á
\82½
\81D");
1576 tin->dknown = tin->known = 1;
1577 tin = costly_tin(COST_OPEN);
1581 which = 0; /* 0=>plural, 1=>as-is, 2=>"the" prefix */
1582 if ((mnum == PM_COCKATRICE || mnum == PM_CHICKATRICE)
1583 && (Stone_resistance || Hallucination)) {
1588 which = 1; /* suppress pluralization */
1589 } else if (Hallucination) {
1590 what = rndmonnam(NULL);
1592 what = mons[mnum].mname;
1593 if (the_unique_pm(&mons[mnum]))
1595 else if (type_is_pname(&mons[mnum]))
1599 what = makeplural(what);
1600 else if (which == 2)
1604 pline("It smells like %s.", what);
1606 pline("%s
\82Ì
\82æ
\82¤
\82È
\93õ
\82¢
\82ª
\82µ
\82½
\81D", what);
1608 if (yn("Eat it?") == 'n') {
1610 if (yn("
\90H
\82×
\82Ü
\82·
\82©
\81H") == 'n') {
1613 You("discard the open tin.");
1615 You("
\8aJ
\82¯
\82½
\8aÊ
\82ð
\8eÌ
\82Ä
\82½
\81D");
1617 tin->dknown = tin->known = 1;
1618 tin = costly_tin(COST_OPEN);
1622 /* in case stop_occupation() was called on previous meal */
1623 context.victual.piece = (struct obj *) 0;
1624 context.victual.o_id = 0;
1625 context.victual.fullwarn = context.victual.eating =
1626 context.victual.doreset = FALSE;
1629 You("consume %s %s.", tintxts[r].txt, mons[mnum].mname);
1630 #else /*JP:
\81u
\82Ì
\81v
\82Å
\8en
\82Ü
\82é
\82È
\82ç
\8cã
\92u
\81A
\82»
\82ê
\88È
\8aO
\82È
\82ç
\91O
\92u */
1631 if (strstr(tintxts[r].txt, "
\82Ì") == tintxts[r].txt) {
1632 You("%s%s
\82Ì
\8aÊ
\8bl
\82ð
\82½
\82¢
\82ç
\82°
\82½
\81D", mons[mnum].mname, tintxts[r].txt);
1634 You("%s%s
\82Ì
\8aÊ
\8bl
\82ð
\82½
\82¢
\82ç
\82°
\82½
\81D", tintxts[r].txt, mons[mnum].mname);
1638 eating_conducts(&mons[mnum]);
1640 tin->dknown = tin->known = 1;
1644 /* charge for one at pre-eating cost */
1645 tin = costly_tin(COST_OPEN);
1647 if (tintxts[r].nut < 0) /* rotten */
1648 make_vomiting((long) rn1(15, 10), FALSE);
1650 lesshungry(tintxts[r].nut);
1652 if (tintxts[r].greasy) {
1653 /* Assume !Glib, because you can't open tins when Glib. */
1654 incr_itimeout(&Glib, rnd(15));
1656 pline("Eating %s food made your %s very slippery.",
1657 tintxts[r].txt, makeplural(body_part(FINGER)));
1659 pline("
\96û
\82Á
\82Û
\82¢
\95¨
\82ð
\90H
\82×
\82½
\82Ì
\82Å
\82 \82È
\82½
\82Ì%s
\82Í
\8a\8a\82è
\82â
\82·
\82
\82È
\82Á
\82½
\81D",
1664 } else { /* spinach... */
1667 pline("It contains some decaying%s%s substance.",
1668 Blind ? "" : " ", Blind ? "" : hcolor(NH_GREEN));
1670 pline("%s
\95\85\82Á
\82½
\95¨
\91Ì
\82ª
\93ü
\82Á
\82Ä
\82¢
\82é
\81D",
1671 Blind ? "" : hcolor(NH_GREEN));
1675 pline("It contains spinach.");
1677 pline("
\83z
\83E
\83\8c\83\93\91\90\82ª
\93ü
\82Á
\82Ä
\82¢
\82é
\81D");
1678 tin->dknown = tin->known = 1;
1682 if (yn("Eat it?") == 'n') {
1684 if (yn("
\90H
\82×
\82Ü
\82·
\82©
\81H") == 'n') {
1687 You("discard the open tin.");
1689 You("
\8aJ
\82¯
\82½
\8aÊ
\82ð
\8eÌ
\82Ä
\82½
\81D");
1690 tin = costly_tin(COST_OPEN);
1695 * Same order as with non-spinach above:
1696 * conduct update, side-effects, shop handling, and nutrition.
1698 u.uconduct.food++; /* don't need vegetarian checks for spinach */
1701 pline("This makes you feel like %s!",
1702 Hallucination ? "Swee'pea" : "Popeye");
1704 pline("%s
\82Ì
\82æ
\82¤
\82È
\8bC
\95ª
\82É
\82È
\82Á
\82½
\81I",
1705 Hallucination ? "
\83X
\83C
\81[
\83s
\81[" : "
\83|
\83p
\83C");
1707 gainstr(tin, 0, FALSE);
1709 tin = costly_tin(COST_OPEN);
1711 lesshungry(tin->blessed
1714 ? (400 + rnd(200)) /* uncursed */
1715 : (200 + rnd(400))); /* cursed */
1723 context.tin.tin = (struct obj *) 0;
1724 context.tin.o_id = 0;
1727 /* called during each move whilst opening a tin */
1731 /* perhaps it was stolen (although that should cause interruption) */
1732 if (!carried(context.tin.tin)
1733 && (!obj_here(context.tin.tin, u.ux, u.uy) || !can_reach_floor(TRUE)))
1734 return 0; /* %% probably we should use tinoid */
1735 if (context.tin.usedtime++ >= 50) {
1737 You("give up your attempt to open the tin.");
1739 You("
\8aÊ
\82ð
\8aJ
\82¯
\82é
\82Ì
\82ð
\82 \82«
\82ç
\82ß
\82½
\81D");
1742 if (context.tin.usedtime < context.tin.reqtime)
1743 return 1; /* still busy */
1746 consume_tin("You succeed in opening the tin.");
1748 consume_tin("
\8aÊ
\82ð
\8aJ
\82¯
\82é
\82Ì
\82É
\90¬
\8c÷
\82µ
\82½
\81D");
1752 /* called when starting to open a tin */
1757 const char *mesg = 0;
1760 if (metallivorous(youmonst.data)) {
1762 mesg = "You bite right into the metal tin...";
1764 mesg = "
\8bà
\91®
\82Ì
\8aÊ
\82ð
\8a\9a\82Ý
\82Í
\82¶
\82ß
\82½
\81D
\81D
\81D";
1766 } else if (cantwield(youmonst.data)) { /* nohands || verysmall */
1768 You("cannot handle the tin properly to open it.");
1770 You("
\8aÊ
\82ð
\82¤
\82Ü
\82
\8aJ
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
1772 } else if (otmp->blessed) {
1773 /* 50/50 chance for immediate access vs 1 turn delay (unless
1774 wielding blessed tin opener which always yields immediate
1775 access); 1 turn delay case is non-deterministic: getting
1776 interrupted and retrying might yield another 1 turn delay
1777 or might open immediately on 2nd (or 3rd, 4th, ...) try */
1778 tmp = (uwep && uwep->blessed && uwep->otyp == TIN_OPENER) ? 0 : rn2(2);
1781 mesg = "The tin opens like magic!";
1783 mesg = "
\8aÊ
\82Í
\96\82\96@
\82Ì
\82æ
\82¤
\82É
\8aJ
\82¢
\82½
\81I";
1786 pline_The("tin seems easy to open.");
1788 pline_The("
\8aÊ
\82Í
\8aÈ
\92P
\82É
\8aJ
\82¯
\82ç
\82ê
\82»
\82¤
\82¾
\81D");
1790 switch (uwep->otyp) {
1793 mesg = "You easily open the tin."; /* iff tmp==0 */
1795 mesg = "
\82 \82È
\82½
\82Í
\8aÈ
\92P
\82É
\8aÊ
\82ð
\8aJ
\82¯
\82½
\81D"; /* iff tmp==0 */
1797 tmp = rn2(uwep->cursed ? 3 : !uwep->blessed ? 2 : 1);
1817 pline("Using %s you try to open the tin.", yobjnam(uwep, (char *) 0));
1819 You("%s
\82ð
\8eg
\82Á
\82Ä
\8aÊ
\82ð
\8aJ
\82¯
\82æ
\82¤
\82Æ
\82µ
\82½
\81D", xname(uwep));
1823 pline("It is not so easy to open this tin.");
1825 pline("
\82±
\82Ì
\8aÊ
\82ð
\8aJ
\82¯
\82é
\82Ì
\82Í
\97e
\88Õ
\82È
\82±
\82Æ
\82Å
\82Í
\82È
\82¢
\81D");
1828 pline_The("tin slips from your %s.",
1830 pline("
\8aÊ
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D",
1831 makeplural(body_part(FINGER)));
1832 if (otmp->quan > 1L) {
1833 otmp = splitobj(otmp, 1L);
1841 tmp = rn1(1 + 500 / ((int) (ACURR(A_DEX) + ACURRSTR)), 10);
1844 context.tin.tin = otmp;
1845 context.tin.o_id = otmp->o_id;
1847 consume_tin(mesg); /* begin immediately */
1849 context.tin.reqtime = tmp;
1850 context.tin.usedtime = 0;
1852 set_occupation(opentin, "opening the tin", 0);
1854 set_occupation(opentin, "
\8aÊ
\82ð
\8aJ
\82¯
\82é", 0);
1859 /* called when waking up after fainting */
1861 Hear_again(VOID_ARGS)
1863 /* Chance of deafness going away while fainted/sleeping/etc. */
1865 make_deaf(0L, FALSE);
1866 context.botl = TRUE;
1871 /* called on the "first bite" of rotten food */
1877 pline("Blecch! Rotten %s!", foodword(obj));
1879 pline("
\83Q
\83F
\81I
\95\85\82Á
\82½%s
\82¾
\81I", foodword(obj));
1883 You_feel("rather trippy.");
1885 You("
\82Ö
\82ë
\82Ö
\82ë
\82µ
\82½
\81D");
1888 You_feel("rather %s.", body_part(LIGHT_HEADED));
1890 You("%s
\81D", body_part(LIGHT_HEADED));
1891 make_confused(HConfusion + d(2, 4), FALSE);
1892 } else if (!rn2(4) && !Blind) {
1894 pline("Everything suddenly goes dark.");
1896 pline("
\93Ë
\91R
\91S
\82Ä
\82ª
\88Ã
\82
\82È
\82Á
\82½
\81D");
1897 /* hero is not Blind, but Blinded timer might be nonzero if
1898 blindness is being overridden by the Eyes of the Overworld */
1899 make_blinded((Blinded & TIMEOUT) + (long) d(2, 10), FALSE);
1901 Your1(vision_clears);
1902 } else if (!rn2(3)) {
1903 const char *what, *where;
1904 int duration = rnd(10);
1908 what = "goes", where = "dark";
1910 what = "
\82È
\82Á
\82½", where = "
\88Ã
\88Å
\82É";
1911 else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
1913 what = "you lose control of", where = "yourself";
1915 what = "
\90§
\8cä
\82Å
\82«
\82È
\82
\82È
\82Á
\82½", where = "
\8e©
\95ª
\82ð";
1918 what = "you slap against the",
1920 what = "
\82É
\82Ô
\82Â
\82©
\82Á
\82½",
1922 where = (u.usteed) ? "saddle" : surface(u.ux, u.uy);
1924 where = (u.usteed) ? "
\88Æ" : surface(u.ux, u.uy);
1926 pline_The("world spins and %s %s.", what, where);
1928 pline("
\90¢
\8aE
\82ª
\89ñ
\93]
\82µ
\81C%s%s
\81D", where, what);
1929 incr_itimeout(&HDeaf, duration);
1930 context.botl = TRUE;
1933 multi_reason = "unconscious from rotten food";
1935 multi_reason = "
\95\85\82Á
\82½
\90H
\82×
\95¨
\82Å
\88Ó
\8e¯
\82ð
\8e¸
\82Á
\82Ä
\82¢
\82é
\8aÔ
\82É";
1937 nomovemsg = "You are conscious again.";
1939 nomovemsg = "
\82 \82È
\82½
\82Í
\82Ü
\82½
\90³
\8bC
\82Ã
\82¢
\82½
\81D";
1940 afternmv = Hear_again;
1946 /* called when a corpse is selected as food */
1951 int retcode = 0, tp = 0, mnum = otmp->corpsenm;
1953 boolean stoneable = (flesh_petrifies(&mons[mnum]) && !Stone_resistance
1954 && !poly_when_stoned(youmonst.data)),
1955 slimeable = (mnum == PM_GREEN_SLIME && !Slimed && !Unchanging
1956 && !slimeproof(youmonst.data)),
1957 glob = otmp->globby ? TRUE : FALSE;
1960 if (!vegan(&mons[mnum]))
1961 u.uconduct.unvegan++;
1962 if (!vegetarian(&mons[mnum]))
1963 violated_vegetarian();
1965 if (!nonrotting_corpse(mnum)) {
1966 long age = peek_at_iced_corpse_age(otmp);
1968 rotted = (monstermoves - age) / (10L + rn2(20));
1971 else if (otmp->blessed)
1975 if (mnum != PM_ACID_BLOB && !stoneable && !slimeable && rotted > 5L) {
1976 boolean cannibal = maybe_cannibal(mnum, FALSE);
1979 pline("Ulch - that %s was tainted%s!",
1980 (mons[mnum].mlet == S_FUNGUS) ? "fungoid vegetation"
1982 : vegetarian(&mons[mnum]) ? "protoplasm"
1984 cannibal ? ", you cannibal" : "");
1985 #else /*
\93ú
\96{
\8cê
\82Å
\82Í
\92P
\8f\83\82É */
1986 pline("
\83I
\83F
\81I
\82±
\82ê
\82Í
\95\85\82Á
\82Ä
\82¢
\82é
\81I%s",
1987 cannibal ? "
\82µ
\82©
\82à
\8b¤
\90H
\82¢
\82¾
\81I" : "");
1989 if (Sick_resistance) {
1991 pline("It doesn't seem at all sickening, though...");
1993 pline("
\82µ
\82©
\82µ
\81C
\82¢
\82½
\82Á
\82Ä
\8c³
\8bC
\82¾
\81D
\81D
\81D");
1997 sick_time = (long) rn1(10, 10);
1998 /* make sure new ill doesn't result in improvement */
1999 if (Sick && (sick_time > Sick))
2000 sick_time = (Sick > 1L) ? Sick - 1L : 1L;
2002 make_sick(sick_time, corpse_xname(otmp, "rotted", CXN_NORMAL),
2003 TRUE, SICK_VOMITABLE);
2005 make_sick(sick_time, corpse_xname(otmp, "
\95\85\82Á
\82½", CXN_NORMAL),
2006 TRUE, SICK_VOMITABLE);
2010 pline("(It must have died too long ago to be safe to eat.)");
2012 pline("(
\82±
\82Ì
\93÷
\82Í
\88À
\91S
\82É
\90H
\82×
\82ç
\82ê
\82é
\8e\9e\8aÔ
\82ð
\89ß
\82¬
\82Ä
\82µ
\82Ü
\82Á
\82Ä
\82¢
\82½
\82æ
\82¤
\82¾
\81D)");
2019 } else if (acidic(&mons[mnum]) && !Acid_resistance) {
2022 You("have a very bad case of stomach acid."); /* not body_part() */
2024 pline("
\88Ý
\8e_
\82Ì
\92²
\8eq
\82ª
\82Æ
\82Ä
\82à
\88«
\82¢
\81D");
2027 losehp(rnd(15), !glob ? "acidic corpse" : "acidic glob",
2028 KILLED_BY_AN); /* acid damage */
2029 #else /*
\93ú
\96{
\8cê
\82Å
\82Í
\8bæ
\95Ê
\82µ
\82È
\82¢ */
2030 losehp(rnd(15), "
\8e_
\82Ì
\8e\80\91Ì
\82Å", KILLED_BY_AN);
2032 } else if (poisonous(&mons[mnum]) && rn2(5)) {
2035 pline("Ecch - that must have been poisonous!");
2037 pline("
\83E
\83Q
\83F
\81[
\81C
\97L
\93Å
\82¾
\82Á
\82½
\82É
\82¿
\82ª
\82¢
\82È
\82¢
\81I");
2038 if (!Poison_resistance) {
2041 losehp(rnd(15), !glob ? "poisonous corpse" : "poisonous glob",
2044 losehp(rnd(15), "
\93Å
\82Ì
\8e\80\91Ì
\82Å", KILLED_BY_AN);
2048 You("seem unaffected by the poison.");
2050 You("
\93Å
\82Ì
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
2051 /* now any corpse left too long will make you mildly ill */
2052 } else if ((rotted > 5L || (rotted > 3L && rn2(5))) && !Sick_resistance) {
2055 You_feel("%ssick.", (Sick) ? "very " : "");
2057 You("%s
\8bC
\95ª
\82ª
\88«
\82¢
\81D", (Sick) ? "
\82Æ
\82Ä
\82à" : "");
2059 losehp(rnd(8), !glob ? "cadaver" : "rotted glob", KILLED_BY_AN);
2061 losehp(rnd(8), "
\95\85\97\90\8e\80\91Ì
\82Å", KILLED_BY_AN);
2064 /* delay is weight dependent */
2065 context.victual.reqtime = 3 + ((!glob ? mons[mnum].cwt : otmp->owt) >> 6);
2067 if (!tp && !nonrotting_corpse(mnum) && (otmp->orotten || !rn2(7))) {
2068 if (rottenfood(otmp)) {
2069 otmp->orotten = TRUE;
2070 (void) touchfood(otmp);
2074 if (!mons[otmp->corpsenm].cnutrit) {
2075 /* no nutrition: rots away, no message if you passed out */
2078 pline_The("corpse rots away completely.");
2080 pline("
\8e\80\91Ì
\82Í
\8a®
\91S
\82É
\95\85\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
2089 consume_oeaten(otmp, 2); /* oeaten >>= 2 */
2090 } else if ((mnum == PM_COCKATRICE || mnum == PM_CHICKATRICE)
2091 && (Stone_resistance || Hallucination)) {
2093 pline("This tastes just like chicken!");
2095 pline("
\82±
\82ê
\82Í
\8c{
\93÷
\82Ì
\96¡
\82¾
\81I");
2096 } else if (mnum == PM_FLOATING_EYE && u.umonnum == PM_RAVEN) {
2098 You("peck the eyeball with delight.");
2100 You("
\96Ú
\8bÊ
\82ð
\82Â
\82ñ
\82Â
\82ñ
\82Â
\82Â
\82¢
\82½
\81D");
2102 /* yummy is always False for omnivores, palatable always True */
2103 boolean yummy = (vegan(&mons[mnum])
2104 ? (!carnivorous(youmonst.data)
2105 && herbivorous(youmonst.data))
2106 : (carnivorous(youmonst.data)
2107 && !herbivorous(youmonst.data))),
2108 palatable = ((vegetarian(&mons[mnum])
2109 ? herbivorous(youmonst.data)
2110 : carnivorous(youmonst.data))
2112 && ((rotted < 1) ? TRUE : !rn2(rotted+1)));
2113 const char *pmxnam = food_xname(otmp, FALSE);
2116 if (!strncmpi(pmxnam, "the ", 4))
2118 pline("%s%s %s %s%c",
2119 type_is_pname(&mons[mnum])
2120 ? "" : the_unique_pm(&mons[mnum]) ? "The " : "This ",
2122 Hallucination ? "is" : "tastes",
2123 /* tiger reference is to TV ads for "Frosted Flakes",
2124 breakfast cereal targeted at kids by "Tony the tiger" */
2126 ? (yummy ? ((u.umonnum == PM_TIGER) ? "gr-r-reat" : "gnarly")
2127 : palatable ? "copacetic" : "grody")
2128 : (yummy ? "delicious" : palatable ? "okay" : "terrible"),
2129 (yummy || !palatable) ? '!' : '.');
2131 pline("
\82±
\82Ì%s
\82Í%s%s",
2134 ? (yummy ? ((u.umonnum == PM_TIGER) ? "
\83O
\83D
\83\8c\83C
\83g
\83D"
2135 : "
\83C
\83P
\82Ä
\82é")
2136 : palatable ? "
\82Ü
\82 \82 \82è
\82¾" : "
\83C
\83P
\82Ä
\82È
\82¢")
2137 : (yummy ? "
\82Æ
\82Ä
\82à
\8e|
\82¢" : palatable ? "
\82Ü
\82 \82Ü
\82 \82¾"
2138 : "
\82Ð
\82Ç
\82¢
\96¡
\82¾"),
2139 (yummy || !palatable) ? "
\81I" : "
\81D");
2146 /* called as you start to eat */
2151 const char *old_nomovemsg, *save_nomovemsg;
2153 debugpline2("start_eating: %s (victual = %s)",
2154 /* note: fmt_ptr() returns a static buffer but supports
2155 several such so we don't need to copy the first result
2156 before calling it a second time */
2157 fmt_ptr((genericptr_t) otmp),
2158 fmt_ptr((genericptr_t) context.victual.piece));
2159 debugpline1("reqtime = %d", context.victual.reqtime);
2160 debugpline1("(original reqtime = %d)", objects[otmp->otyp].oc_delay);
2161 debugpline1("nmod = %d", context.victual.nmod);
2162 debugpline1("oeaten = %d", otmp->oeaten);
2163 context.victual.fullwarn = context.victual.doreset = FALSE;
2164 context.victual.eating = TRUE;
2166 if (otmp->otyp == CORPSE || otmp->globby) {
2167 cprefx(context.victual.piece->corpsenm);
2168 if (!context.victual.piece || !context.victual.eating) {
2169 /* rider revived, or died and lifesaved */
2174 old_nomovemsg = nomovemsg;
2176 /* survived choking, finish off food that's nearly done;
2177 need this to handle cockatrice eggs, fortune cookies, etc */
2178 if (++context.victual.usedtime >= context.victual.reqtime) {
2179 /* don't want done_eating() to issue nomovemsg if it
2180 is due to vomit() called by bite() */
2181 save_nomovemsg = nomovemsg;
2186 nomovemsg = save_nomovemsg;
2191 if (++context.victual.usedtime >= context.victual.reqtime) {
2192 /* print "finish eating" message if they just resumed -dlc */
2193 done_eating(context.victual.reqtime > 1 ? TRUE : FALSE);
2198 Sprintf(msgbuf, "eating %s", food_xname(otmp, TRUE));
2200 Sprintf(msgbuf, "%s
\82ð
\90H
\82×
\82é", food_xname(otmp, TRUE));
2201 set_occupation(eatfood, msgbuf, 0);
2205 * called on "first bite" of (non-corpse) food.
2206 * used for non-rotten non-tin non-corpse food
2212 switch (otmp->otyp) {
2214 if (u.uhunger <= 200)
2216 pline(Hallucination ? "Oh wow, like, superior, man!"
2218 pline(Hallucination ? "
\82Ü
\82Á
\82½
\82è
\82Æ
\82µ
\82Ä
\81C
\82»
\82ê
\82Å
\82¢
\82Ä
\82µ
\82Â
\82±
\82
\82È
\82¢
\81I
\82±
\82ê
\82¼
\8b\86\8bÉ
\82Ì
\83\81\83j
\83\85\81[
\82¾
\81I"
2220 : "That food really hit the spot!");
2222 : "
\82±
\82Ì
\90H
\82×
\95¨
\82Í
\96{
\93\96\82É
\90\
\82µ
\95ª
\82È
\82¢
\81I");
2223 else if (u.uhunger <= 700)
2225 pline("That satiated your %s!", body_part(STOMACH));
2227 pline("
\96\9e\95 \82É
\82È
\82Á
\82½
\81I");
2230 if (carnivorous(youmonst.data) && !humanoid(youmonst.data))
2232 pline("That tripe ration was surprisingly good!");
2234 pline("
\82±
\82Ì
\83\82\83c
\93÷
\82Í
\82¨
\82Ç
\82ë
\82
\82Ù
\82Ç
\8e|
\82¢
\81I");
2235 else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC)))
2237 pline(Hallucination ? "Tastes great! Less filling!"
2239 pline(Hallucination ? "
\82¤
\82Ü
\82¢
\81I
\82à
\82Á
\82Æ
\82Ù
\82µ
\82
\82È
\82é
\82Ë
\81I"
2241 : "Mmm, tripe... not bad!");
2243 : "
\82ñ
\81[
\81C
\83\82\83c
\82©
\81D
\81D
\81D
\88«
\82
\82È
\82¢
\81I");
2246 pline("Yak - dog food!");
2248 pline("
\82¤
\82°
\81C
\83h
\83b
\83O
\83t
\81[
\83h
\82¾
\81I");
2249 more_experienced(1, 0);
2251 /* not cannibalism, but we use similar criteria
2252 for deciding whether to be sickened by this meal */
2253 if (rn2(2) && !CANNIBAL_ALLOWED())
2254 make_vomiting((long) rn1(context.victual.reqtime, 14), FALSE);
2258 if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC))) {
2260 pline("%s", "!#?&* elf kibble!");
2262 pline("%s", "
\81I
\81\94\81H
\81\95\81\96 \83G
\83\8b\83N
\82Ì
\90H
\82¢
\95¨
\81I");
2264 } else if (maybe_polyd(is_elf(youmonst.data), Race_if(PM_ELF))) {
2266 pline("A little goes a long way.");
2268 pline("
\8f
\82µ
\82Å
\8f\
\95ª
\82¾
\81D");
2274 case HUGE_CHUNK_OF_MEAT:
2277 case CLOVE_OF_GARLIC:
2278 if (is_undead(youmonst.data)) {
2279 make_vomiting((long) rn1(context.victual.reqtime, 5), FALSE);
2284 if (otmp->otyp == SLIME_MOLD && !otmp->cursed
2285 && otmp->spe == context.current_fruit) {
2287 pline("My, that was a %s %s!",
2288 Hallucination ? "primo" : "yummy",
2289 singular(otmp, xname));
2291 pline("
\82¨
\82â
\81C
\82È
\82ñ
\82Ä%s%s
\82¾
\81I",
2292 Hallucination ? "
\8fã
\95i
\82È" : "
\82¨
\82¢
\82µ
\82¢",
2293 singular(otmp, xname));
2295 } else if (otmp->otyp == APPLE && otmp->cursed && !Sleep_resistance) {
2296 ; /* skip core joke; feedback deferred til fpostfx() */
2298 #if defined(MAC) || defined(MACOSX)
2299 /* KMH -- Why should Unix have all the fun?
2300 We check MACOSX before UNIX to get the Apple-specific apple
2301 message; the '#if UNIX' code will still kick in for pear. */
2302 } else if (otmp->otyp == APPLE) {
2304 pline("Delicious! Must be a Macintosh!");
2306 pline("
\82·
\82Î
\82ç
\82µ
\82¢
\81I
\83}
\83b
\83L
\83\93\83g
\83b
\83V
\83\85\82É
\88á
\82¢
\82È
\82¢
\81I");
2310 } else if (otmp->otyp == APPLE || otmp->otyp == PEAR) {
2311 if (!Hallucination) {
2312 pline("Core dumped.");
2314 /* This is based on an old Usenet joke, a fake a.out manual
2319 pline("%s -- core dumped.",
2321 ? "Segmentation fault"
2327 } else if (otmp->otyp == EGG && stale_egg(otmp)) {
2329 pline("Ugh. Rotten egg."); /* perhaps others like it */
2331 pline("
\83E
\83Q
\83F
\81[
\95\85\82Á
\82½
\97\91\82¾
\81D");
2333 /* increasing existing nausea means that it will take longer
2334 before eventual vomit, but also means that constitution
2335 will be abused more times before illness completes */
2336 make_vomiting((Vomiting & TIMEOUT) + (long) d(10, 4), TRUE);
2340 pline("This %s is %s", singular(otmp, xname),
2342 ? (Hallucination ? "grody!" : "terrible!")
2343 : (otmp->otyp == CRAM_RATION
2344 || otmp->otyp == K_RATION
2345 || otmp->otyp == C_RATION)
2347 : Hallucination ? "gnarly!" : "delicious!");
2349 pline("
\82±
\82Ì%s
\82Í%s", singular(otmp, xname),
2351 ? (Hallucination ? "
\83C
\83P
\82Ä
\82È
\82¢
\81I" : "
\82Ð
\82Ç
\82¢
\96¡
\82¾
\81I")
2352 : (otmp->otyp == CRAM_RATION
2353 || otmp->otyp == K_RATION
2354 || otmp->otyp == C_RATION)
2355 ? "
\96¡
\8bC
\82È
\82¢
\81D"
2356 : Hallucination ? "
\83C
\83P
\82Ä
\82é
\81I" : "
\82¤
\82Ü
\82¢
\81I");
2359 break; /* default */
2363 /* increment a combat intrinsic with limits on its growth */
2365 bounded_increase(old, inc, typ)
2368 int absold, absinc, sgnold, sgninc;
2370 /* don't include any amount coming from worn rings */
2371 if (uright && uright->otyp == typ)
2373 if (uleft && uleft->otyp == typ)
2375 absold = abs(old), absinc = abs(inc);
2376 sgnold = sgn(old), sgninc = sgn(inc);
2378 if (absinc == 0 || sgnold != sgninc || absold + absinc < 10) {
2379 ; /* use inc as-is */
2380 } else if (absold + absinc < 20) {
2381 absinc = rnd(absinc); /* 1..n */
2382 if (absold + absinc < 10)
2383 absinc = 10 - absold;
2384 inc = sgninc * absinc;
2385 } else if (absold + absinc < 40) {
2386 absinc = rn2(absinc) ? 1 : 0;
2387 if (absold + absinc < 20)
2388 absinc = rnd(20 - absold);
2389 inc = sgninc * absinc;
2391 inc = 0; /* no further increase allowed via this method */
2397 accessory_has_effect(otmp)
2401 pline("Magic spreads through your body as you digest the %s.",
2402 otmp->oclass == RING_CLASS ? "ring" : "amulet");
2404 pline("
\82 \82È
\82½
\82ª%s
\82ð
\8fÁ
\89»
\82·
\82é
\82Æ
\81C
\82»
\82Ì
\96\82\97Í
\82ª
\91Ì
\82É
\82µ
\82Ý
\82±
\82ñ
\82¾
\81D",
2405 otmp->oclass == RING_CLASS ? "
\8ew
\97Ö" : "
\96\82\8f\9c\82¯");
2413 int typ = otmp->otyp;
2416 /* Note: rings are not so common that this is unbalancing. */
2417 /* (How often do you even _find_ 3 rings of polymorph in a game?) */
2418 oldprop = u.uprops[objects[typ].oc_oprop].intrinsic;
2419 if (otmp == uleft || otmp == uright) {
2422 return; /* died from sink fall */
2424 otmp->known = otmp->dknown = 1; /* by taste */
2425 if (!rn2(otmp->oclass == RING_CLASS ? 3 : 5)) {
2426 switch (otmp->otyp) {
2428 if (!objects[typ].oc_oprop)
2429 break; /* should never happen */
2431 if (!(u.uprops[objects[typ].oc_oprop].intrinsic & FROMOUTSIDE))
2432 accessory_has_effect(otmp);
2434 u.uprops[objects[typ].oc_oprop].intrinsic |= FROMOUTSIDE;
2437 case RIN_SEE_INVISIBLE:
2438 set_mimic_blocking();
2440 if (Invis && !oldprop && !ESee_invisible
2441 && !perceives(youmonst.data) && !Blind) {
2444 pline("Suddenly you can see yourself.");
2446 pline("
\93Ë
\91R
\8e©
\95ª
\8e©
\90g
\82ª
\8c©
\82¦
\82é
\82æ
\82¤
\82É
\82È
\82Á
\82½
\81D");
2450 case RIN_INVISIBILITY:
2451 if (!oldprop && !EInvis && !BInvis && !See_invisible
2455 Your("body takes on a %s transparency...",
2456 Hallucination ? "normal" : "strange");
2458 pline("%s
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\93§
\89ß
\90«
\82ð
\82à
\82Á
\82½
\81D
\81D
\81D",
2459 Hallucination ? "
\82 \82½
\82è
\82Ü
\82¦
\82È
\82±
\82Æ
\82¾
\82ª" : "
\8aï
\96
\82È
\82±
\82Æ
\82É");
2464 case RIN_PROTECTION_FROM_SHAPE_CHAN:
2467 case RIN_LEVITATION:
2468 /* undo the `.intrinsic |= FROMOUTSIDE' done above */
2469 u.uprops[LEVITATION].intrinsic = oldprop;
2472 incr_itimeout(&HLevitation, d(10, 20));
2476 } /* inner switch */
2477 break; /* default case of outer switch */
2480 accessory_has_effect(otmp);
2481 if (adjattrib(A_CHA, otmp->spe, -1))
2484 case RIN_GAIN_STRENGTH:
2485 accessory_has_effect(otmp);
2486 if (adjattrib(A_STR, otmp->spe, -1))
2489 case RIN_GAIN_CONSTITUTION:
2490 accessory_has_effect(otmp);
2491 if (adjattrib(A_CON, otmp->spe, -1))
2494 case RIN_INCREASE_ACCURACY:
2495 accessory_has_effect(otmp);
2496 u.uhitinc = (schar) bounded_increase((int) u.uhitinc, otmp->spe,
2497 RIN_INCREASE_ACCURACY);
2499 case RIN_INCREASE_DAMAGE:
2500 accessory_has_effect(otmp);
2501 u.udaminc = (schar) bounded_increase((int) u.udaminc, otmp->spe,
2502 RIN_INCREASE_DAMAGE);
2504 case RIN_PROTECTION:
2505 accessory_has_effect(otmp);
2506 HProtection |= FROMOUTSIDE;
2507 u.ublessed = bounded_increase(u.ublessed, otmp->spe,
2511 case RIN_FREE_ACTION:
2512 /* Give sleep resistance instead */
2513 if (!(HSleep_resistance & FROMOUTSIDE))
2514 accessory_has_effect(otmp);
2515 if (!Sleep_resistance)
2517 You_feel("wide awake.");
2519 You("
\82Ï
\82Á
\82¿
\82è
\96Ú
\82ª
\82³
\82ß
\82½
\81D");
2520 HSleep_resistance |= FROMOUTSIDE;
2522 case AMULET_OF_CHANGE:
2523 accessory_has_effect(otmp);
2527 You("are suddenly very %s!",
2528 flags.female ? "feminine" : "masculine");
2530 You("
\93Ë
\91R
\82Æ
\82Ä
\82à%s
\82Á
\82Û
\82
\82È
\82Á
\82½
\81I",
2531 flags.female ? "
\8f\97" : "
\92j");
2535 case AMULET_OF_UNCHANGING:
2536 /* un-change: it's a pun */
2537 if (!Unchanging && Upolyd) {
2538 accessory_has_effect(otmp);
2543 case AMULET_OF_STRANGULATION: /* bad idea! */
2544 /* no message--this gives no permanent effect */
2547 case AMULET_OF_RESTFUL_SLEEP: { /* another bad idea! */
2548 long newnap = (long) rnd(100), oldnap = (HSleepy & TIMEOUT);
2550 if (!(HSleepy & FROMOUTSIDE))
2551 accessory_has_effect(otmp);
2552 HSleepy |= FROMOUTSIDE;
2553 /* might also be wearing one; use shorter of two timeouts */
2554 if (newnap < oldnap || oldnap == 0L)
2555 HSleepy = (HSleepy & ~TIMEOUT) | newnap;
2558 case RIN_SUSTAIN_ABILITY:
2559 case AMULET_OF_LIFE_SAVING:
2560 case AMULET_OF_REFLECTION: /* nice try */
2561 /* can't eat Amulet of Yendor or fakes,
2562 * and no oc_prop even if you could -3.
2569 /* called after eating non-food */
2573 struct obj *otmp = context.victual.piece;
2575 /* lesshungry wants an occupation to handle choke messages correctly */
2577 set_occupation(eatfood, "eating non-food", 0);
2579 set_occupation(eatfood, "
\90H
\82×
\82é", 0);
2580 lesshungry(context.victual.nmod);
2582 context.victual.piece = (struct obj *) 0;
2583 context.victual.o_id = 0;
2584 context.victual.eating = 0;
2585 if (otmp->oclass == COIN_CLASS) {
2589 useupf(otmp, otmp->quan);
2590 vault_gd_watching(GD_EATGOLD);
2593 if (objects[otmp->otyp].oc_material == PAPER) {
2595 if (otmp->otyp == SCR_MAIL)
2598 pline("This junk mail is less than satisfying.");
2600 pline("
\82±
\82Ì
\83S
\83~
\83\81\81[
\83\8b\82Í
\96\9e\91«
\82É
\82Í
\82Ù
\82Ç
\89\93\82¢
\81D");
2603 if (otmp->otyp == SCR_SCARE_MONSTER)
2604 /* to eat scroll, hero is currently polymorphed into a monster */
2606 pline("Yuck%c", otmp->blessed ? '!' : '.');
2608 pline("
\82¨
\82¦
\82Á%s", otmp->blessed ? "
\81I" : "
\81D");
2609 else if (otmp->oclass == SCROLL_CLASS
2610 /* check description after checking for specific scrolls */
2611 && !strcmpi(OBJ_DESCR(objects[otmp->otyp]), "YUM YUM"))
2613 pline("Yum%c", otmp->blessed ? '!' : '.');
2615 pline("
\82¤
\82Ü
\82¢%s", otmp->blessed ? "
\81I" : "
\81D");
2618 pline("Needs salt...");
2620 pline("
\96¡
\82ª
\82¤
\82·
\82¢
\81D
\81D
\81D");
2622 if (otmp->oclass == POTION_CLASS) {
2623 otmp->quan++; /* dopotion() does a useup() */
2624 (void) dopotion(otmp);
2625 } else if (otmp->oclass == RING_CLASS || otmp->oclass == AMULET_CLASS) {
2627 } else if (otmp->otyp == LEASH && otmp->leashmon) {
2631 /* KMH -- idea by "Tommy the Terrorist" */
2632 if (otmp->otyp == TRIDENT && !otmp->cursed) {
2633 /* sugarless chewing gum which used to be heavily advertised on TV */
2635 pline(Hallucination ? "Four out of five dentists agree."
2636 : "That was pure chewing satisfaction!");
2638 pline(Hallucination ? "
\8cÜ
\90l
\82É
\8el
\90l
\82Ì
\8e\95\88ã
\8eÒ
\82ª
\83g
\83\89\83C
\83f
\83\93\83g
\82ð
\82¨
\91E
\82ß
\82µ
\82Ä
\82¢
\82Ü
\82·
\81D"
2639 : "
\8f\83\90\88\82É
\8a\9a\82Ý
\82½
\82¢
\8bC
\8e\9d\82ð
\96\9e\82½
\82µ
\82½
\81I");
2641 exercise(A_WIS, TRUE);
2643 if (otmp->otyp == FLINT && !otmp->cursed) {
2644 /* chewable vitamin for kids based on "The Flintstones" TV cartoon */
2646 pline("Yabba-dabba delicious!");
2648 pline("
\83\84\83b
\83o
\83_
\83b
\83o
\82¤
\82Ü
\82¢
\81I");
2649 exercise(A_CON, TRUE);
2652 if (otmp == uwep && otmp->quan == 1L)
2654 if (otmp == uquiver && otmp->quan == 1L)
2656 if (otmp == uswapwep && otmp->quan == 1L)
2662 unpunish(); /* but no useup() */
2663 else if (carried(otmp))
2669 /* NOTE: the order of these words exactly corresponds to the
2670 order of oc_material values #define'd in objclass.h. */
2671 static const char *foodwords[] = {
2673 "meal", "liquid", "wax", "food", "meat", "paper",
2674 "cloth", "leather", "wood", "bone", "scale", "metal",
2675 "metal", "metal", "silver", "gold", "platinum", "mithril",
2676 "plastic", "glass", "rich food", "stone"
2678 "
\93÷", "
\89t
\91Ì", "
\96û", "
\90H
\97¿", "
\93÷", "
\8e\86",
2679 "
\95\9e", "
\94ç", "
\96Ø", "
\8d\9c", "
\97Ø", "
\8bà
\91®",
2680 "
\8bà
\91®", "
\8bà
\91®", "
\8bâ", "
\8bà", "
\83v
\83\89\83`
\83i", "
\83~
\83X
\83\8a\83\8b",
2681 "
\83v
\83\89\83X
\83`
\83b
\83N", "
\83K
\83\89\83X", "
\8d\82\8b\89\97¿
\97\9d", "
\90Î"
2685 STATIC_OVL const char *
2689 if (otmp->oclass == FOOD_CLASS)
2694 if (otmp->oclass == GEM_CLASS && objects[otmp->otyp].oc_material == GLASS
2696 makeknown(otmp->otyp);
2697 return foodwords[objects[otmp->otyp].oc_material];
2700 /* called after consuming (non-corpse) food */
2705 switch (otmp->otyp) {
2706 case SPRIG_OF_WOLFSBANE:
2707 if (u.ulycn >= LOW_PM || is_were(youmonst.data))
2712 || !attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND))
2713 make_blinded((long) u.ucreamed, TRUE);
2715 case FORTUNE_COOKIE:
2716 outrumor(bcsign(otmp), BY_COOKIE);
2718 u.uconduct.literate++;
2720 case LUMP_OF_ROYAL_JELLY:
2721 /* This stuff seems to be VERY healthy! */
2722 gainstr(otmp, 1, TRUE);
2724 u.mh += otmp->cursed ? -rnd(20) : rnd(20);
2725 if (u.mh > u.mhmax) {
2729 } else if (u.mh <= 0) {
2733 u.uhp += otmp->cursed ? -rnd(20) : rnd(20);
2734 if (u.uhp > u.uhpmax) {
2738 } else if (u.uhp <= 0) {
2739 killer.format = KILLED_BY_AN;
2741 Strcpy(killer.name, "rotten lump of royal jelly");
2744 Strcpy(killer.name, "
\95\85\82Á
\82½
\83\8d\83C
\83\84\83\8b\83[
\83\8a\81[
\82ð
\90H
\82×
\90H
\92\86\93Å
\82Å");
2753 if (flesh_petrifies(&mons[otmp->corpsenm])) {
2754 if (!Stone_resistance
2755 && !(poly_when_stoned(youmonst.data)
2756 && polymon(PM_STONE_GOLEM))) {
2759 Sprintf(killer.name, "%s egg",
2761 Sprintf(killer.name, "%s
\82Ì
\97\91\82Å",
2762 mons[otmp->corpsenm].mname);
2763 make_stoned(5L, (char *) 0, KILLED_BY_AN, killer.name);
2766 /* note: no "tastes like chicken" message for eggs */
2769 case EUCALYPTUS_LEAF:
2770 if (Sick && !otmp->cursed)
2771 make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2772 if (Vomiting && !otmp->cursed)
2773 make_vomiting(0L, TRUE);
2776 if (otmp->cursed && !Sleep_resistance) {
2777 /* Snow White; 'poisoned' applies to [a subset of] weapons,
2778 not food, so we substitute cursed; fortunately our hero
2779 won't have to wait for a prince to be rescued/revived */
2780 if (Race_if(PM_DWARF) && Hallucination)
2782 verbalize("Heigh-ho, ho-hum, I think I'll skip work today.");
2784 verbalize("
\83n
\83C
\83z
\81[
\81C
\83n
\83C
\83z
\81[
\81C
\8d¡
\93ú
\82Í
\8bx
\82Ý
\81D");
2785 else if (Deaf || !flags.acoustics)
2787 You("fall asleep.");
2789 You("
\96°
\82è
\82É
\97\8e\82¿
\82½
\81D");
2792 You_hear("sinister laughter as you fall asleep...");
2794 You_hear("
\96°
\82è
\82É
\97\8e\82¿
\82é
\82Æ
\82«
\82É
\8e×
\88«
\82È
\8fÎ
\82¢
\90º
\82ð
\95·
\82¢
\82½
\81D
\81D
\81D");
2795 fall_asleep(-rn1(11, 20), TRUE);
2803 /* intended for eating a spellbook while polymorphed, but not used;
2804 "leather" applied to appearance, not composition, and has been
2805 changed to "leathery" to reflect that */
2806 STATIC_DCL boolean FDECL(leather_cover, (struct obj *));
2812 const char *odesc = OBJ_DESCR(objects[otmp->otyp]);
2814 if (odesc && (otmp->oclass == SPBOOK_CLASS)) {
2815 if (!strcmp(odesc, "leather"))
2823 * return 0 if the food was not dangerous.
2824 * return 1 if the food was dangerous and you chose to stop.
2825 * return 2 if the food was dangerous and you chose to eat it anyway.
2828 edibility_prompts(otmp)
2831 /* Blessed food detection grants hero a one-use
2832 * ability to detect food that is unfit for consumption
2833 * or dangerous and avoid it.
2836 char buf[BUFSZ], foodsmell[BUFSZ],
2837 it_or_they[QBUFSZ], eat_it_anyway[QBUFSZ];
2839 char buf[BUFSZ], foodsmell[BUFSZ],
2840 eat_it_anyway[QBUFSZ];
2842 boolean cadaver = (otmp->otyp == CORPSE || otmp->globby),
2843 stoneorslime = FALSE;
2844 int material = objects[otmp->otyp].oc_material, mnum = otmp->corpsenm;
2848 Strcpy(foodsmell, Tobjnam(otmp, "smell"));
2850 Strcpy(foodsmell, xname(otmp));
2853 Strcpy(it_or_they, (otmp->quan == 1L) ? "it" : "they");
2856 Sprintf(eat_it_anyway, "Eat %s anyway?",
2857 (otmp->quan == 1L) ? "it" : "one");
2859 Strcpy(eat_it_anyway, "
\82»
\82ê
\82Å
\82à
\90H
\82×
\82é
\81H");
2862 if (cadaver || otmp->otyp == EGG || otmp->otyp == TIN) {
2863 /* These checks must match those in eatcorpse() */
2864 stoneorslime = (flesh_petrifies(&mons[mnum]) && !Stone_resistance
2865 && !poly_when_stoned(youmonst.data));
2867 if (mnum == PM_GREEN_SLIME || otmp->otyp == GLOB_OF_GREEN_SLIME)
2868 stoneorslime = (!Unchanging && !slimeproof(youmonst.data));
2870 if (cadaver && !nonrotting_corpse(mnum)) {
2871 long age = peek_at_iced_corpse_age(otmp);
2873 /* worst case rather than random
2874 in this calculation to force prompt */
2875 rotted = (monstermoves - age) / (10L + 0 /* was rn2(20) */);
2878 else if (otmp->blessed)
2884 * These problems with food should be checked in
2885 * order from most detrimental to least detrimental.
2887 if (cadaver && mnum != PM_ACID_BLOB && rotted > 5L && !Sick_resistance) {
2890 Sprintf(buf, "%s like %s could be tainted! %s", foodsmell, it_or_they,
2893 Sprintf(buf, "%s
\82Í
\89\98\90õ
\82³
\82ê
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81I%s",
2894 foodsmell, eat_it_anyway);
2896 if (yn_function(buf, ynchars, 'n') == 'n')
2903 Sprintf(buf, "%s like %s could be something very dangerous! %s",
2904 foodsmell, it_or_they, eat_it_anyway);
2906 Sprintf(buf, "%s
\82Í
\82È
\82ñ
\82¾
\82©
\82·
\82²
\82
\8aë
\8c¯
\82»
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81I%s",
2907 foodsmell, eat_it_anyway);
2909 if (yn_function(buf, ynchars, 'n') == 'n')
2914 if (otmp->orotten || (cadaver && rotted > 3L)) {
2917 Sprintf(buf, "%s like %s could be rotten! %s", foodsmell, it_or_they,
2920 Sprintf(buf, "%s
\82Í
\95\85\82Á
\82½
\82æ
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81I%s",
2921 foodsmell, eat_it_anyway);
2923 if (yn_function(buf, ynchars, 'n') == 'n')
2928 if (cadaver && poisonous(&mons[mnum]) && !Poison_resistance) {
2931 Sprintf(buf, "%s like %s might be poisonous! %s", foodsmell,
2932 it_or_they, eat_it_anyway);
2934 Sprintf(buf, "%s
\82Í
\93Å
\82ð
\82à
\82Á
\82Ä
\82¢
\82»
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81I%s",
2935 foodsmell, eat_it_anyway);
2937 if (yn_function(buf, ynchars, 'n') == 'n')
2942 if (otmp->otyp == APPLE && otmp->cursed && !Sleep_resistance) {
2943 /* causes sleep, for long enough to be dangerous */
2945 Sprintf(buf, "%s like %s might have been poisoned. %s", foodsmell,
2946 it_or_they, eat_it_anyway);
2948 Sprintf(buf, "%s
\82Í
\93Å
\82ª
\93ü
\82ê
\82ç
\82ê
\82Ä
\82¢
\82»
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81I%s",
2949 foodsmell, eat_it_anyway);
2951 return (yn_function(buf, ynchars, 'n') == 'n') ? 1 : 2;
2953 if (cadaver && !vegetarian(&mons[mnum]) && !u.uconduct.unvegetarian
2954 && Role_if(PM_MONK)) {
2956 Sprintf(buf, "%s unhealthy. %s", foodsmell, eat_it_anyway);
2958 Sprintf(buf, "%s
\82Í
\8c\92\8dN
\82É
\88«
\82»
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81D%s", foodsmell, eat_it_anyway);
2959 if (yn_function(buf, ynchars, 'n') == 'n')
2964 if (cadaver && acidic(&mons[mnum]) && !Acid_resistance) {
2966 Sprintf(buf, "%s rather acidic. %s", foodsmell, eat_it_anyway);
2968 Sprintf(buf, "%s
\82Í
\8f
\82µ
\8e_
\82Á
\82Ï
\82»
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81D%s", foodsmell, eat_it_anyway);
2969 if (yn_function(buf, ynchars, 'n') == 'n')
2974 if (Upolyd && u.umonnum == PM_RUST_MONSTER && is_metallic(otmp)
2975 && otmp->oerodeproof) {
2977 Sprintf(buf, "%s disgusting to you right now. %s", foodsmell,
2980 Sprintf(buf, "%s
\82Í
\8bC
\95ª
\82ª
\88«
\82
\82È
\82é
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81D%s", foodsmell,
2983 if (yn_function(buf, ynchars, 'n') == 'n')
2990 * Breaks conduct, but otherwise safe.
2992 if (!u.uconduct.unvegan
2993 && ((material == LEATHER || material == BONE
2994 || material == DRAGON_HIDE || material == WAX)
2995 || (cadaver && !vegan(&mons[mnum])))) {
2997 Sprintf(buf, "%s foul and unfamiliar to you. %s", foodsmell,
3000 Sprintf(buf, "%s
\82Í
\89\98\82ê
\82Ä
\82¢
\82Ä
\81C
\82 \82È
\82½
\82É
\82È
\82¶
\82Ü
\82È
\82¢
\82æ
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81D%s", foodsmell,
3003 if (yn_function(buf, ynchars, 'n') == 'n')
3008 if (!u.uconduct.unvegetarian
3009 && ((material == LEATHER || material == BONE
3010 || material == DRAGON_HIDE)
3011 || (cadaver && !vegetarian(&mons[mnum])))) {
3013 Sprintf(buf, "%s unfamiliar to you. %s", foodsmell, eat_it_anyway);
3015 Sprintf(buf, "%s
\82Í
\82 \82È
\82½
\82É
\82È
\82¶
\82Ü
\82È
\82¢
\82æ
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81D%s", foodsmell, eat_it_anyway);
3016 if (yn_function(buf, ynchars, 'n') == 'n')
3022 if (cadaver && mnum != PM_ACID_BLOB && rotted > 5L && Sick_resistance) {
3023 /* Tainted meat with Sick_resistance */
3025 Sprintf(buf, "%s like %s could be tainted! %s", foodsmell, it_or_they,
3028 Sprintf(buf, "%s
\82Í
\89\98\90õ
\82³
\82ê
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\82É
\82¨
\82¢
\82ª
\82·
\82é
\81I%s", foodsmell,
3031 if (yn_function(buf, ynchars, 'n') == 'n')
3044 int basenutrit; /* nutrition of full item */
3045 boolean dont_start = FALSE, nodelicious = FALSE;
3049 pline("If you can't breathe air, how can you consume solids?");
3051 pline("
\91§
\82à
\82Å
\82«
\82È
\82¢
\82Ì
\82É
\81C
\82Ç
\82¤
\82â
\82Á
\82Ä
\90H
\82×
\82½
\82ç
\82¢
\82¢
\82ñ
\82¾
\82¢
\81H");
3054 if (!(otmp = floorfood("eat", 0)))
3056 if (check_capacity((char *) 0))
3060 int res = edibility_prompts(otmp);
3065 "%s stops tingling and your sense of smell returns to normal.",
3068 Your("%s
\82ª
\82¤
\82¸
\82¤
\82¸
\82·
\82é
\82Ì
\82Í
\8e~
\82Ü
\82è
\81C
\9ak
\8ao
\82Í
\95\81\92Ê
\82É
\96ß
\82Á
\82½
\81D",
3077 /* We have to make non-foods take 1 move to eat, unless we want to
3078 * do ridiculous amounts of coding to deal with partly eaten plate
3079 * mails, players who polymorph back to human in the middle of their
3080 * metallic meal, etc....
3082 if (!is_edible(otmp)) {
3084 You("cannot eat that!");
3086 You("
\82»
\82ê
\82ð
\90H
\82×
\82ç
\82ê
\82È
\82¢
\81I");
3088 } else if ((otmp->owornmask & (W_ARMOR | W_TOOL | W_AMUL | W_SADDLE))
3090 /* let them eat rings */
3092 You_cant("eat %s you're wearing.", something);
3094 You("
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\8aÔ
\82Í
\90H
\82×
\82ê
\82È
\82¢
\81D");
3096 } else if (!(carried(otmp) ? retouch_object(&otmp, FALSE)
3097 : touch_artifact(otmp, &youmonst))) {
3098 return 1; /* got blasted so use a turn */
3100 if (is_metallic(otmp) && u.umonnum == PM_RUST_MONSTER
3101 && otmp->oerodeproof) {
3102 otmp->rknown = TRUE;
3103 if (otmp->quan > 1L) {
3105 (void) splitobj(otmp, otmp->quan - 1L);
3107 otmp = splitobj(otmp, 1L);
3110 pline("Ulch - that %s was rustproofed!", xname(otmp));
3112 pline("
\83E
\83Q
\83F
\81[
\81I%s
\82Í
\96h
\8eK
\82³
\82ê
\82Ä
\82¢
\82é
\81I", xname(otmp));
3113 /* The regurgitated object's rustproofing is gone now */
3114 otmp->oerodeproof = 0;
3115 make_stunned((HStun & TIMEOUT) + (long) rn2(10), TRUE);
3117 * We don't expect rust monsters to be wielding welded weapons
3118 * or wearing cursed rings which were rustproofed, but guard
3119 * against the possibility just in case.
3121 if (welded(otmp) || (otmp->cursed && (otmp->owornmask & W_RING))) {
3122 otmp->bknown = 1; /* for ring; welded() does this for weapon */
3124 You("spit out %s.", the(xname(otmp)));
3126 You("%s
\82ð
\93f
\82«
\8fo
\82µ
\82½
\81D", xname(otmp));
3129 You("spit %s out onto the %s.", the(xname(otmp)),
3130 surface(u.ux, u.uy));
3132 You("%s
\82ð%s
\82É
\93f
\82«
\8fo
\82µ
\82½
\81D", the(xname(otmp)),
3133 surface(u.ux, u.uy));
3135 if (carried(otmp)) {
3136 /* no need to check for leash in use; it's not metallic */
3137 if (otmp->owornmask)
3138 remove_worn_item(otmp, FALSE);
3146 /* KMH -- Slow digestion is... indigestible */
3147 if (otmp->otyp == RIN_SLOW_DIGESTION) {
3149 pline("This ring is indigestible!");
3151 pline("
\82±
\82Ì
\8ew
\97Ö
\82Í
\8fÁ
\89»
\82µ
\82É
\82
\82¢
\81I");
3152 (void) rottenfood(otmp);
3153 if (otmp->dknown && !objects[otmp->otyp].oc_name_known
3154 && !objects[otmp->otyp].oc_uname)
3158 if (otmp->oclass != FOOD_CLASS) {
3161 context.victual.reqtime = 1;
3162 context.victual.piece = otmp;
3163 context.victual.o_id = otmp->o_id;
3164 /* Don't split it, we don't need to if it's 1 move */
3165 context.victual.usedtime = 0;
3166 context.victual.canchoke = (u.uhs == SATIATED);
3167 /* Note: gold weighs 1 pt. for each 1000 pieces (see
3168 pickup.c) so gold and non-gold is consistent. */
3169 if (otmp->oclass == COIN_CLASS)
3170 basenutrit = ((otmp->quan > 200000L)
3172 : (int) (otmp->quan / 100L));
3173 else if (otmp->oclass == BALL_CLASS || otmp->oclass == CHAIN_CLASS)
3174 basenutrit = weight(otmp);
3175 /* oc_nutrition is usually weight anyway */
3177 basenutrit = objects[otmp->otyp].oc_nutrition;
3179 if (otmp->otyp == SCR_MAIL) {
3184 context.victual.nmod = basenutrit;
3185 context.victual.eating = TRUE; /* needed for lesshungry() */
3187 material = objects[otmp->otyp].oc_material;
3188 if (material == LEATHER || material == BONE
3189 || material == DRAGON_HIDE) {
3190 u.uconduct.unvegan++;
3191 violated_vegetarian();
3192 } else if (material == WAX)
3193 u.uconduct.unvegan++;
3197 (void) rottenfood(otmp);
3199 } else if (objects[otmp->otyp].oc_material == PAPER)
3202 if (otmp->oclass == WEAPON_CLASS && otmp->opoisoned) {
3204 pline("Ecch - that must have been poisonous!");
3206 pline("
\83E
\83Q
\83F
\81[
\81C
\97L
\93Å
\82¾
\82Á
\82½
\82É
\88á
\82¢
\82È
\82¢
\81I");
3207 if (!Poison_resistance) {
3210 losehp(rnd(15), xname(otmp), KILLED_BY_AN);
3214 Sprintf(jbuf, "%s
\82Å", xname(otmp));
3215 losehp(rnd(15), jbuf, KILLED_BY_AN);
3220 You("seem unaffected by the poison.");
3222 You("
\93Å
\82Ì
\89e
\8b¿
\82ð
\8eó
\82¯
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
3223 } else if (!nodelicious) {
3225 pline("%s%s is delicious!",
3227 && otmp->oartifact < ART_ORB_OF_DETECTION)
3230 (otmp->oclass == COIN_CLASS)
3232 : singular(otmp, xname));
3234 pline("
\82±
\82Ì%s
\82Í
\8e|
\82¢
\81I",
3235 otmp->oclass == COIN_CLASS
3237 : singular(otmp, xname));
3244 if (otmp == context.victual.piece) {
3245 /* If they weren't able to choke, they don't suddenly become able to
3246 * choke just because they were interrupted. On the other hand, if
3247 * they were able to choke before, if they lost food it's possible
3248 * they shouldn't be able to choke now.
3250 if (u.uhs != SATIATED)
3251 context.victual.canchoke = FALSE;
3252 context.victual.o_id = 0;
3253 context.victual.piece = touchfood(otmp);
3254 if (context.victual.piece)
3255 context.victual.o_id = context.victual.piece->o_id;
3257 You("resume your meal.");
3259 You("
\90H
\8e\96\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D");
3260 start_eating(context.victual.piece);
3264 /* nothing in progress - so try to find something. */
3265 /* tins are a special case */
3266 /* tins must also check conduct separately in case they're discarded */
3267 if (otmp->otyp == TIN) {
3275 context.victual.o_id = 0;
3276 context.victual.piece = otmp = touchfood(otmp);
3277 if (context.victual.piece)
3278 context.victual.o_id = context.victual.piece->o_id;
3279 context.victual.usedtime = 0;
3281 /* Now we need to calculate delay and nutritional info.
3282 * The base nutrition calculated here and in eatcorpse() accounts
3283 * for normal vs. rotten food. The reqtime and nutrit values are
3284 * then adjusted in accordance with the amount of food left.
3286 if (otmp->otyp == CORPSE || otmp->globby) {
3287 int tmp = eatcorpse(otmp);
3291 context.victual.piece = (struct obj *) 0;
3292 context.victual.o_id = 0;
3296 /* if not used up, eatcorpse sets up reqtime and may modify oeaten */
3298 /* No checks for WAX, LEATHER, BONE, DRAGON_HIDE. These are
3299 * all handled in the != FOOD_CLASS case, above.
3301 switch (objects[otmp->otyp].oc_material) {
3303 u.uconduct.unvegan++;
3304 if (otmp->otyp != EGG) {
3305 violated_vegetarian();
3310 if (otmp->otyp == PANCAKE || otmp->otyp == FORTUNE_COOKIE /*eggs*/
3311 || otmp->otyp == CREAM_PIE || otmp->otyp == CANDY_BAR /*milk*/
3312 || otmp->otyp == LUMP_OF_ROYAL_JELLY)
3313 u.uconduct.unvegan++;
3317 context.victual.reqtime = objects[otmp->otyp].oc_delay;
3318 if (otmp->otyp != FORTUNE_COOKIE
3319 && (otmp->cursed || (!nonrotting_food(otmp->otyp)
3320 && (monstermoves - otmp->age)
3321 > (otmp->blessed ? 50L : 30L)
3322 && (otmp->orotten || !rn2(7))))) {
3323 if (rottenfood(otmp)) {
3324 otmp->orotten = TRUE;
3327 consume_oeaten(otmp, 1); /* oeaten >>= 1 */
3332 /* re-calc the nutrition */
3333 basenutrit = (int) obj_nutrition(otmp);
3336 "before rounddiv: victual.reqtime == %d, oeaten == %d, basenutrit == %d",
3337 context.victual.reqtime, otmp->oeaten, basenutrit);
3339 context.victual.reqtime = (basenutrit == 0) ? 0
3340 : rounddiv(context.victual.reqtime * (long) otmp->oeaten, basenutrit);
3342 debugpline1("after rounddiv: victual.reqtime == %d",
3343 context.victual.reqtime);
3345 * calculate the modulo value (nutrit. units per round eating)
3346 * note: this isn't exact - you actually lose a little nutrition due
3348 * TODO: add in a "remainder" value to be given at the end of the meal.
3350 if (context.victual.reqtime == 0 || otmp->oeaten == 0)
3351 /* possible if most has been eaten before */
3352 context.victual.nmod = 0;
3353 else if ((int) otmp->oeaten >= context.victual.reqtime)
3354 context.victual.nmod = -((int) otmp->oeaten
3355 / context.victual.reqtime);
3357 context.victual.nmod = context.victual.reqtime % otmp->oeaten;
3358 context.victual.canchoke = (u.uhs == SATIATED);
3372 if (!carrying(TIN)) {
3374 You("have no tin to open.");
3376 You("
\8aÊ
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D");
3381 if (obj->cursed && obj->bknown) {
3385 if (ynq(safe_qbuf(qbuf, "Really wield ", "?",
3386 obj, doname, thesimpleoname, "that")) != 'y')
3388 if (ynq(safe_qbuf(qbuf, "
\96{
\93\96\82É", "
\82ð
\91\95\94õ
\82·
\82é
\81H",
3389 obj, doname, thesimpleoname, "
\82»
\82ê")) != 'y')
3393 if (!wield_tool(obj, "use"))
3398 otmp = getobj(comestibles, "open");
3406 /* Take a single bite from a piece of food, checking for choking and
3407 * modifying usedtime. Returns 1 if they choked and survived, 0 otherwise.
3412 if (context.victual.canchoke && u.uhunger >= 2000) {
3413 choke(context.victual.piece);
3416 if (context.victual.doreset) {
3420 force_save_hs = TRUE;
3421 if (context.victual.nmod < 0) {
3422 lesshungry(-context.victual.nmod);
3423 consume_oeaten(context.victual.piece,
3424 context.victual.nmod); /* -= -nmod */
3425 } else if (context.victual.nmod > 0
3426 && (context.victual.usedtime % context.victual.nmod)) {
3428 consume_oeaten(context.victual.piece, -1); /* -= 1 */
3430 force_save_hs = FALSE;
3435 /* as time goes by - called by moveloop(every move) & domove(melee attack) */
3439 if (u.uinvulnerable)
3440 return; /* you don't feel hungrier */
3442 /* being polymorphed into a creature which doesn't eat prevents
3443 this first uhunger decrement, but to stay in such form the hero
3444 will need to wear an Amulet of Unchanging so still burn a small
3445 amount of nutrition in the 'moves % 20' ring/amulet check below */
3446 if ((!Unaware || !rn2(10)) /* slow metabolic rate while asleep */
3447 && (carnivorous(youmonst.data)
3448 || herbivorous(youmonst.data)
3449 || metallivorous(youmonst.data))
3451 u.uhunger--; /* ordinary food consumption */
3453 if (moves % 2) { /* odd turns */
3454 /* Regeneration uses up food, unless due to an artifact */
3455 if ((HRegeneration & ~FROMFORM)
3456 || (ERegeneration & ~(W_ARTI | W_WEP)))
3458 if (near_capacity() > SLT_ENCUMBER)
3460 } else { /* even turns */
3463 /* Conflict uses up food too */
3464 if (HConflict || (EConflict & (~W_ARTI)))
3466 /* +0 charged rings don't do anything, so don't affect hunger.
3467 Slow digestion cancels move hunger but still causes ring hunger. */
3468 switch ((int) (moves % 20)) { /* note: use even cases only */
3470 if (uleft && (uleft->spe || !objects[uleft->otyp].oc_charged))
3478 if (uright && (uright->spe || !objects[uright->otyp].oc_charged))
3492 /* called after vomiting and after performing feats of magic */
3501 /* called after eating (and after drinking fruit juice) */
3506 /* See comments in newuhs() for discussion on force_save_hs */
3507 boolean iseating = (occupation == eatfood) || force_save_hs;
3509 debugpline1("lesshungry(%d)", num);
3511 if (u.uhunger >= 2000) {
3512 if (!iseating || context.victual.canchoke) {
3514 choke(context.victual.piece);
3517 choke(occupation == opentin ? context.tin.tin
3518 : (struct obj *) 0);
3519 /* no reset_eat() */
3522 /* Have lesshungry() report when you're nearly full so all eating
3523 * warns when you're about to choke.
3525 if (u.uhunger >= 1500) {
3526 if (!context.victual.eating
3527 || (context.victual.eating && !context.victual.fullwarn)) {
3529 pline("You're having a hard time getting all of it down.");
3531 pline("
\91S
\82Ä
\82ð
\88ù
\82Ý
\82±
\82Þ
\82É
\82Í
\8e\9e\8aÔ
\82ª
\82©
\82©
\82é
\81D");
3533 nomovemsg = "You're finally finished.";
3535 nomovemsg = "
\82â
\82Á
\82Æ
\90H
\82×
\8fI
\82¦
\82½
\81D";
3536 if (!context.victual.eating) {
3539 context.victual.fullwarn = TRUE;
3540 if (context.victual.canchoke
3541 && context.victual.reqtime > 1) {
3542 /* a one-gulp food will not survive a stop */
3544 if (yn_function("Continue eating?", ynchars, 'n')
3546 if (yn_function("
\90H
\82×
\91±
\82¯
\82Ü
\82·
\82©
\81H", ynchars, 'n')
3549 nomovemsg = (char *) 0;
3563 (void) Hear_again();
3564 if (u.uhs > FAINTING)
3574 return (boolean) (u.uhs == FAINTED);
3577 /* call when a faint must be prematurely terminated */
3581 if (afternmv == unfaint)
3583 unmul("You revive.");
3585 unmul("
\82 \82È
\82½
\82Í
\8bC
\82ª
\82Â
\82¢
\82½
\81D");
3588 /* compute and comment on your (new?) hunger status */
3594 static unsigned save_hs;
3595 static boolean saved_hs = FALSE;
3600 : (h > 150) ? NOT_HUNGRY
3601 : (h > 50) ? HUNGRY : (h > 0) ? WEAK : FAINTING;
3603 /* While you're eating, you may pass from WEAK to HUNGRY to NOT_HUNGRY.
3604 * This should not produce the message "you only feel hungry now";
3605 * that message should only appear if HUNGRY is an endpoint. Therefore
3606 * we check to see if we're in the middle of eating. If so, we save
3607 * the first hunger status, and at the end of eating we decide what
3608 * message to print based on the _entire_ meal, not on each little bit.
3610 /* It is normally possible to check if you are in the middle of a meal
3611 * by checking occupation == eatfood, but there is one special case:
3612 * start_eating() can call bite() for your first bite before it
3613 * sets the occupation.
3614 * Anyone who wants to get that case to work _without_ an ugly static
3615 * force_save_hs variable, feel free.
3617 /* Note: If you become a certain hunger status in the middle of the
3618 * meal, and still have that same status at the end of the meal,
3619 * this will incorrectly print the associated message at the end of
3620 * the meal instead of the middle. Such a case is currently
3621 * impossible, but could become possible if a message for SATIATED
3622 * were added or if HUNGRY and WEAK were separated by a big enough
3623 * gap to fit two bites.
3625 if (occupation == eatfood || force_save_hs) {
3639 if (newhs == FAINTING) {
3640 /* u,uhunger is likely to be negative at this point */
3641 int uhunger_div_by_10 = sgn(u.uhunger) * ((abs(u.uhunger) + 5) / 10);
3645 if (u.uhs <= WEAK || rn2(20 - uhunger_div_by_10) >= 19) {
3646 if (!is_fainted() && multi >= 0 /* %% */) {
3647 int duration = 10 - uhunger_div_by_10;
3649 /* stop what you're doing, then faint */
3652 You("faint from lack of food.");
3654 You("
\95 \82ª
\8c¸
\82Á
\82Ä
\93|
\82ê
\82½
\81D");
3655 incr_itimeout(&HDeaf, duration);
3656 context.botl = TRUE;
3659 multi_reason = "fainted from lack of food";
3661 multi_reason = "
\8bó
\95 \82Å
\91²
\93|
\82µ
\82Ä
\82¢
\82é
\8aÔ
\82É";
3663 nomovemsg = "You regain consciousness.";
3665 nomovemsg = "
\82 \82È
\82½
\82Í
\90³
\8bC
\82Ã
\82¢
\82½
\81D";
3670 selftouch("Falling, you");
3672 selftouch("
\97\8e\82¿
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í");
3675 /* this used to be -(200 + 20 * Con) but that was when being asleep
3676 suppressed per-turn uhunger decrement but being fainted didn't;
3677 now uhunger becomes more negative at a slower rate */
3678 } else if (u.uhunger < -(100 + 10 * (int) ACURR(A_CON))) {
3683 You("die from starvation.");
3685 You("
\89ì
\8e\80\82µ
\82½
\81D");
3686 killer.format = KILLED_BY;
3688 Strcpy(killer.name, "starvation");
3690 Strcpy(killer.name, "
\90H
\97¿
\95s
\91«
\82Å
\89ì
\8e\80\82µ
\82½");
3692 /* if we return, we lifesaved, and that calls newuhs */
3697 if (newhs != u.uhs) {
3698 if (newhs >= WEAK && u.uhs < WEAK) {
3699 /* this used to be losestr(1) which had the potential to
3700 be fatal (still handled below) by reducing HP if it
3701 tried to take base strength below minimum of 3 */
3702 ATEMP(A_STR) = -1; /* temporary loss overrides Fixed_abil */
3703 /* defer context.botl status update until after hunger message */
3704 } else if (newhs < WEAK && u.uhs >= WEAK) {
3705 /* this used to be losestr(-1) which could be abused by
3706 becoming weak while wearing ring of sustain ability,
3707 removing ring, eating to 'restore' strength which boosted
3708 strength by a point each time the cycle was performed;
3709 substituting "while polymorphed" for sustain ability and
3710 "rehumanize" for ring removal might have done that too */
3711 ATEMP(A_STR) = 0; /* repair of loss also overrides Fixed_abil */
3712 /* defer context.botl status update until after hunger message */
3717 if (Hallucination) {
3719 You((!incr) ? "now have a lesser case of the munchies."
3720 : "are getting the munchies.");
3723 You("
\83n
\83\89\83w
\83\8a\82ª
\8c¸
\82Á
\82½
\81D");
3725 pline("
\83n
\83\89\83w
\83\8a\83w
\83\8a\83n
\83\89\81D");
3730 You((!incr) ? "only feel hungry now."
3732 You((!incr) ? "
\92P
\82É
\95 \83y
\83R
\8fó
\91Ô
\82É
\82È
\82Á
\82½
\81D"
3737 ? "
\8bó
\95 \8a´
\82ð
\8a´
\82¶
\82½
\81D"
3739 : "are beginning to feel hungry.");
3741 : "
\8bó
\95 \8a´
\82ð
\82¨
\82Ú
\82¦
\82Í
\82¶
\82ß
\82½
\81D");
3742 if (incr && occupation
3743 && (occupation != eatfood && occupation != opentin))
3745 context.travel = context.travel1 = context.mv = context.run = 0;
3750 pline((!incr) ? "You still have the munchies."
3752 pline((!incr) ? "
\83n
\83\89\83w
\83\8a\82ª
\8c¸
\82ç
\82È
\82¢
\81D"
3754 : "The munchies are interfering with your motor capabilities.");
3756 : "
\83n
\83\89\83w
\83\8a\82ª
\83\82\81[
\83^
\81[
\90«
\94\
\82É
\89e
\8b¿
\82ð
\97^
\82¦
\82Ä
\82¢
\82é
\81D");
3757 else if (incr && (Role_if(PM_WIZARD) || Race_if(PM_ELF)
3758 || Role_if(PM_VALKYRIE)))
3760 pline("%s needs food, badly!",
3762 pline("%s
\82É
\82Í
\8e\8a\8b}
\90H
\97¿
\82ª
\95K
\97v
\82¾
\81I",
3763 (Role_if(PM_WIZARD) || Role_if(PM_VALKYRIE))
3768 : "
\83G
\83\8b\83t");
3774 ? "
\90\8a\8eã
\8fó
\91Ô
\82É
\82È
\82Á
\82½
\81D"
3776 : (u.uhunger < 45) ? "feel weak."
3778 : (u.uhunger < 45) ? "
\90\8a\8eã
\82µ
\82Ä
\82«
\82½
\81D"
3780 : "are beginning to feel weak.");
3782 : "
\8eã
\82
\82È
\82Á
\82Ä
\82«
\82½
\82æ
\82¤
\82É
\8a´
\82¶
\82½
\81D");
3783 if (incr && occupation
3784 && (occupation != eatfood && occupation != opentin))
3786 context.travel = context.travel1 = context.mv = context.run = 0;
3792 if ((Upolyd ? u.mh : u.uhp) < 1) {
3794 You("die from hunger and exhaustion.");
3796 You("
\8bó
\95 \82Æ
\90\8a\8eã
\82Å
\8e\80\82ñ
\82¾
\81D");
3797 killer.format = KILLED_BY;
3799 Strcpy(killer.name, "exhaustion");
3801 Strcpy(killer.name, "
\8bó
\95 \82Æ
\90\8a\8eã
\82Å
\8e\80\82ñ
\82¾");
3808 /* Returns an object representing food.
3809 * Object may be either on floor or in inventory.
3811 /*JP CHECK: 3.6.1
\82Å
\82Ì
\8cÄ
\82Ñ
\8fo
\82µ
\8c³
3812 apply.c:2478: if (!(corpse = floorfood("tin", 2)))
3813 eat.c:3050: if (!(otmp = floorfood("eat", 0)))
3814 pray.c:1659: otmp = floorfood("sacrifice", 1);
3815 \82±
\82Ì
\8aÖ
\90\94\82Í
\89p
\8cê
\96¼
\82Ì
\82Ü
\82Ü
\8cÄ
\82Ñ
\8fo
\82·
\82±
\82Æ
\81B
3818 floorfood(verb, corpsecheck)
3820 int corpsecheck; /* 0, no check, 1, corpses, 2, tinnable corpses */
3822 register struct obj *otmp;
3825 boolean feeding = !strcmp(verb, "eat"), /* corpsecheck==0 */
3826 offering = !strcmp(verb, "sacrifice"); /* corpsecheck==1 */
3829 const char *jverb = trans_verb(verb)->jp;
3832 /* if we can't touch floor objects then use invent food only */
3833 if (iflags.menu_requested /* command was preceded by 'm' prefix */
3834 || !can_reach_floor(TRUE) || (feeding && u.usteed)
3835 || (is_pool_or_lava(u.ux, u.uy)
3836 && (Wwalking || is_clinger(youmonst.data)
3837 || (Flying && !Breathless))))
3840 if (feeding && metallivorous(youmonst.data)) {
3842 struct trap *ttmp = t_at(u.ux, u.uy);
3844 if (ttmp && ttmp->tseen && ttmp->ttyp == BEAR_TRAP) {
3845 /* If not already stuck in the trap, perhaps there should
3846 be a chance to becoming trapped? Probably not, because
3847 then the trap would just get eaten on the _next_ turn... */
3849 Sprintf(qbuf, "There is a bear trap here (%s); eat it?",
3851 Sprintf(qbuf, "
\82±
\82±
\82É
\82Í
\8cF
\82Ìã©(%s)
\82ª
\82 \82é;
\90H
\82×
\82Ü
\82·
\82©
\81H",
3853 (u.utrap && u.utraptype == TT_BEARTRAP) ? "holding you"
3855 (u.utrap && u.utraptype == TT_BEARTRAP) ? "
\82 \82È
\82½
\82ð
\92Í
\82Ü
\82¦
\82Ä
\82¢
\82é"
3859 : "
\89Ò
\93®
\92\86");
3860 if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') {
3861 u.utrap = u.utraptype = 0;
3863 return mksobj(BEARTRAP, TRUE, FALSE);
3864 } else if (c == 'q') {
3865 return (struct obj *) 0;
3869 if (youmonst.data != &mons[PM_RUST_MONSTER]
3870 && (gold = g_at(u.ux, u.uy)) != 0) {
3872 if (gold->quan == 1L)
3873 Sprintf(qbuf, "There is 1 gold piece here; eat it?");
3875 Sprintf(qbuf, "There are %ld gold pieces here; eat them?",
3878 Sprintf(qbuf, "
\82±
\82±
\82É
\82Í%ld
\96\87\82Ì
\8bà
\89Ý
\82ª
\82 \82é
\81D
\90H
\82×
\82Ü
\82·
\82©
\81H", gold->quan);
3880 if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') {
3882 } else if (c == 'q') {
3883 return (struct obj *) 0;
3888 /* Is there some food (probably a heavy corpse) here on the ground? */
3889 for (otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) {
3891 ? (otmp->otyp == CORPSE
3892 && (corpsecheck == 1 || tinnable(otmp)))
3893 : feeding ? (otmp->oclass != COIN_CLASS && is_edible(otmp))
3894 : otmp->oclass == FOOD_CLASS) {
3896 boolean one = (otmp->quan == 1L);
3898 /* if blind and without gloves, attempting to eat (or tin or
3899 offer) a cockatrice corpse is fatal before asking whether
3900 or not to use it; otherwise, 'm<dir>' followed by 'e' could
3901 be used to locate cockatrice corpses without touching them */
3902 if (otmp->otyp == CORPSE && will_feel_cockatrice(otmp, FALSE)) {
3903 feel_cockatrice(otmp, FALSE);
3904 /* if life-saved (or poly'd into stone golem), terminate
3905 attempt to eat off floor */
3906 return (struct obj *) 0;
3908 /* "There is <an object> here; <verb> it?" or
3909 "There are <N objects> here; <verb> one?" */
3911 Sprintf(qbuf, "There %s ", otense(otmp, "are"));
3912 Sprintf(qsfx, " here; %s %s?", verb, one ? "it" : "one");
3913 (void) safe_qbuf(qbuf, qbuf, qsfx, otmp, doname, ansimpleoname,
3914 one ? something : (const char *) "things");
3916 Strcpy(qbuf, "
\82±
\82±
\82É");
3917 Sprintf(qsfx, "
\82ª
\82 \82é; %s%s?", one ? "" : "
\88ê
\82Â", jverb);
3918 (void) safe_qbuf(qbuf, qbuf, qsfx, otmp, doname, ansimpleoname,
3919 one ? something : (const char *) "
\89½
\82©");
3921 if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y')
3924 return (struct obj *) 0;
3929 /* We cannot use ALL_CLASSES since that causes getobj() to skip its
3930 * "ugly checks" and we need to check for inedible items.
3932 otmp = getobj(feeding ? allobj : offering ? offerfodder : comestibles,
3934 if (corpsecheck && otmp && !(offering && otmp->oclass == AMULET_CLASS))
3935 if (otmp->otyp != CORPSE || (corpsecheck == 2 && !tinnable(otmp))) {
3937 You_cant("%s that!", verb);
3939 You_cant("
\82»
\82ê
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81I", jverb);
3940 return (struct obj *) 0;
3945 /* Side effects of vomiting */
3946 /* added nomul (MRS) - it makes sense, you're too busy being sick! */
3948 vomit() /* A good idea from David Neves */
3950 if (cantvomit(youmonst.data)) {
3951 /* doesn't cure food poisoning; message assumes that we aren't
3952 dealing with some esoteric body_part() */
3954 Your("jaw gapes convulsively.");
3956 Your("
\82 \82²
\82Í
\94
\8dì
\93I
\82É
\91å
\82«
\82
\8aJ
\82¢
\82½
\81D");
3958 make_sick(0L, (char *) 0, TRUE, SICK_VOMITABLE);
3959 /* if not enough in stomach to actually vomit then dry heave;
3960 vomiting_dialog() gives a vomit message when its countdown
3961 reaches 0, but only if u.uhs < FAINTING (and !cantvomit()) */
3962 if (u.uhs >= FAINTING)
3963 Your("%s heaves convulsively!", body_part(STOMACH));
3966 /* nomul()/You_can_move_again used to be unconditional, which was
3967 viable while eating but not for Vomiting countdown where hero might
3968 be immobilized for some other reason at the time vomit() is called */
3972 multi_reason = "vomiting";
3974 multi_reason = "
\9aq
\93f
\82µ
\82Ä
\82¢
\82é
\8dÅ
\92\86\82É";
3975 nomovemsg = You_can_move_again;
3980 eaten_stat(base, obj)
3984 long uneaten_amt, full_amount;
3986 /* get full_amount first; obj_nutrition() might modify obj->oeaten */
3987 full_amount = (long) obj_nutrition(obj);
3988 uneaten_amt = (long) obj->oeaten;
3989 if (uneaten_amt > full_amount) {
3991 "partly eaten food (%ld) more nutritious than untouched food (%ld)",
3992 uneaten_amt, full_amount);
3993 uneaten_amt = full_amount;
3996 base = (int) (full_amount ? (long) base * uneaten_amt / full_amount : 0L);
3997 return (base < 1) ? 1 : base;
4000 /* reduce obj's oeaten field, making sure it never hits or passes 0 */
4002 consume_oeaten(obj, amt)
4007 * This is a hack to try to squelch several long standing mystery
4008 * food bugs. A better solution would be to rewrite the entire
4009 * victual handling mechanism from scratch using a less complex
4010 * model. Alternatively, this routine could call done_eating()
4011 * or food_disappears() but its callers would need revisions to
4012 * cope with context.victual.piece unexpectedly going away.
4014 * Multi-turn eating operates by setting the food's oeaten field
4015 * to its full nutritional value and then running a counter which
4016 * independently keeps track of whether there is any food left.
4017 * The oeaten field can reach exactly zero on the last turn, and
4018 * the object isn't removed from inventory until the next turn
4019 * when the "you finish eating" message gets delivered, so the
4020 * food would be restored to the status of untouched during that
4021 * interval. This resulted in unexpected encumbrance messages
4022 * at the end of a meal (if near enough to a threshold) and would
4023 * yield full food if there was an interruption on the critical
4024 * turn. Also, there have been reports over the years of food
4025 * becoming massively heavy or producing unlimited satiation;
4026 * this would occur if reducing oeaten via subtraction attempted
4027 * to drop it below 0 since its unsigned type would produce a
4028 * huge positive value instead. So far, no one has figured out
4029 * _why_ that inappropriate subtraction might sometimes happen.
4033 /* bit shift to divide the remaining amount of food */
4034 obj->oeaten >>= amt;
4036 /* simple decrement; value is negative so we actually add it */
4037 if ((int) obj->oeaten > -amt)
4043 if (obj->oeaten == 0) {
4044 if (obj == context.victual.piece) /* always true unless wishing... */
4045 context.victual.reqtime =
4046 context.victual.usedtime; /* no bites left */
4047 obj->oeaten = 1; /* smallest possible positive value */
4051 /* called when eatfood occupation has been interrupted,
4052 or in the case of theft, is about to be interrupted */
4054 maybe_finished_meal(stopping)
4057 /* in case consume_oeaten() has decided that the food is all gone */
4058 if (occupation == eatfood
4059 && context.victual.usedtime >= context.victual.reqtime) {
4061 occupation = 0; /* for do_reset_eat */
4062 (void) eatfood(); /* calls done_eating() to use up
4063 context.victual.piece */
4069 /* Tin of <something> to the rescue? Decide whether current occupation
4070 is an attempt to eat a tin of something capable of saving hero's life.
4071 We don't care about consumption of non-tinned food here because special
4072 effects there take place on first bite rather than at end of occupation.
4073 [Popeye the Sailor gets out of trouble by eating tins of spinach. :-] */
4081 if (occupation != opentin)
4083 otin = context.tin.tin;
4084 /* make sure hero still has access to tin */
4086 && (!obj_here(otin, u.ux, u.uy) || !can_reach_floor(TRUE)))
4088 /* unknown tin is assumed to be helpful */
4091 /* known tin is helpful if it will stop life-threatening problem */
4092 mndx = otin->corpsenm;
4094 /* note: not used; hunger code bypasses stop_occupation() when eating */
4096 return (boolean) (mndx != NON_PM || otin->spe == 1);
4097 /* flesh from lizards and acidic critters stops petrification */
4099 return (boolean) (mndx >= LOW_PM
4100 && (mndx == PM_LIZARD || acidic(&mons[mndx])));
4101 /* no tins can cure these (yet?) */