1 /* NetHack 3.6 do.c $NHDT-Date: 1472809073 2016/09/02 09:37:53 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.158 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Derek S. Ray, 2015. */
4 /* NetHack may be freely redistributed. See license for details. */
6 /* Contains code for 'd', 'D' (drop), '>', '<' (up, down) */
8 /* JNetHack Copyright */
9 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
10 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2016 */
11 /* JNetHack may be freely redistributed. See license for details. */
16 STATIC_DCL void FDECL(trycall, (struct obj *));
17 STATIC_DCL void NDECL(polymorph_sink);
18 STATIC_DCL boolean NDECL(teleport_sink);
19 STATIC_DCL void FDECL(dosinkring, (struct obj *));
20 STATIC_PTR int FDECL(drop, (struct obj *));
21 STATIC_PTR int NDECL(wipeoff);
22 STATIC_DCL int FDECL(menu_drop, (int));
23 STATIC_DCL int NDECL(currentlevel_rewrite);
24 STATIC_DCL void NDECL(final_level);
25 /* static boolean FDECL(badspot, (XCHAR_P,XCHAR_P)); */
27 extern int n_dgns; /* number of dungeons, from dungeon.c */
29 static NEARDATA const char drop_types[] = { ALLOW_COUNT, COIN_CLASS,
32 /* 'd' command: drop one inventory item */
36 int result, i = (invent) ? 0 : (SIZE(drop_types) - 1);
39 sellobj_state(SELL_DELIBERATE);
40 result = drop(getobj(&drop_types[i], "drop"));
42 sellobj_state(SELL_NORMAL);
49 /* Called when a boulder is dropped, thrown, or pushed. If it ends up
50 * in a pool, it either fills the pool up or sinks away. In either case,
51 * it's gone for good... If the destination is not a pool, returns FALSE.
54 boulder_hits_pool(otmp, rx, ry, pushing)
59 if (!otmp || otmp->otyp != BOULDER) {
60 impossible("Not a boulder?");
61 } else if (!Is_waterlevel(&u.uz) && is_pool_or_lava(rx, ry)) {
62 boolean lava = is_lava(rx, ry), fills_up;
63 const char *what = waterbody_name(rx, ry);
64 schar ltyp = levl[rx][ry].typ;
65 int chance = rn2(10); /* water: 90%; lava: 10% */
66 fills_up = lava ? chance == 0 : chance != 0;
69 struct trap *ttmp = t_at(rx, ry);
71 if (ltyp == DRAWBRIDGE_UP) {
72 levl[rx][ry].drawbridgemask &= ~DB_UNDER; /* clear lava */
73 levl[rx][ry].drawbridgemask |= DB_FLOOR;
75 levl[rx][ry].typ = ROOM;
78 (void) delfloortrap(ttmp);
86 Strcpy(whobuf, "you");
88 Strcpy(whobuf, "
\82 \82È
\82½");
90 Strcpy(whobuf, y_monnam(u.usteed));
92 pline("%s %s %s into the %s.", upstart(whobuf),
93 vtense(whobuf, "push"), the(xname(otmp)), what);
95 pline("%s
\82Í%s
\82ð%s
\82Ì
\92\86\82Ö
\89\9f\82µ
\82±
\82ñ
\82¾
\81D", whobuf,
98 if (flags.verbose && !Blind)
100 pline("Now you can cross it!");
102 pline("
\82³
\82\9f\93n
\82ê
\82é
\82¼
\81I");
103 /* no splashing in this case */
106 if (!fills_up || !pushing) { /* splashing occurs */
108 if (pushing ? !Blind : cansee(rx, ry)) {
110 There("is a large splash as %s %s the %s.",
111 the(xname(otmp)), fills_up ? "fills" : "falls into",
114 pline("%s
\82ð%s
\82É%s
\82Æ
\91å
\82«
\82È
\82µ
\82Ô
\82«
\82ª
\82 \82ª
\82Á
\82½
\81D",
116 fills_up ? "
\96\84\82ß
\8d\9e\82Þ" : "
\97\8e\82·" );
120 You_hear("a%s splash.", lava ? " sizzling" : "");
122 You_hear("%s
\82Æ
\8c¾
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D",lava ? "
\83V
\83\85\81[
\83b" : "
\83p
\83V
\83\83\83b");
123 wake_nearto(rx, ry, 40);
126 if (fills_up && u.uinwater && distu(rx, ry) == 0) {
129 vision_full_recalc = 1;
131 You("find yourself on dry land again!");
133 You("
\82¢
\82Â
\82Ì
\82Ü
\82É
\82©
\8a£
\82¢
\82½
\8fê
\8f\8a\82É
\82¢
\82½
\81I");
134 } else if (lava && distu(rx, ry) <= 2) {
137 You("are hit by molten %s%c",
138 hliquid("lava"), Fire_resistance ? '.' : '!');
140 You("
\82Ç
\82ë
\82Ç
\82ë
\82Ì%s
\82Å
\83_
\83\81\81[
\83W
\82ð
\8eó
\82¯
\82½%s",
141 hliquid("
\97n
\8aâ"), Fire_resistance ? "
\81D" : "
\81I");
144 dmg = d((Fire_resistance ? 1 : 3), 6);
146 losehp(Maybe_Half_Phys(dmg), /* lava damage */
147 "molten lava", KILLED_BY);
149 losehp(Maybe_Half_Phys(dmg), /* lava damage */
150 "
\82Ç
\82ë
\82Ç
\82ë
\82Ì
\97n
\8aâ
\82Å", KILLED_BY);
152 } else if (!fills_up && flags.verbose
153 && (pushing ? !Blind : cansee(rx, ry)))
155 pline("It sinks without a trace!");
157 pline("
\82»
\82ê
\82Í
\82 \82Æ
\82©
\82½
\82à
\82È
\82
\92¾
\82ñ
\82¾
\81I");
160 /* boulder is now gone */
164 obfree(otmp, (struct obj *) 0);
170 /* Used for objects which sometimes do special things when dropped; must be
171 * called with the object not in any chain. Returns TRUE if the object goes
175 flooreffects(obj, x, y, verb)
180 #if 1 /*JP*//* trap.c */
181 extern const char *set_you[2];
187 if (obj->where != OBJ_FREE)
188 panic("flooreffects: obj not free");
190 /* make sure things like water_damage() have no pointers to follow */
191 obj->nobj = obj->nexthere = (struct obj *) 0;
193 if (obj->otyp == BOULDER && boulder_hits_pool(obj, x, y, FALSE)) {
195 } else if (obj->otyp == BOULDER && (t = t_at(x, y)) != 0
196 && (t->ttyp == PIT || t->ttyp == SPIKED_PIT
197 || t->ttyp == TRAPDOOR || t->ttyp == HOLE)) {
198 if (((mtmp = m_at(x, y)) && mtmp->mtrapped)
199 || (u.utrap && u.ux == x && u.uy == y)) {
202 pline_The("boulder %s into the pit%s.",
203 vtense((const char *) 0, verb),
204 (mtmp) ? "" : " with you");
206 pline("
\8aâ
\82Í%s
\97\8e\82µ
\8c\8a\82Ö%s
\81D",
207 (mtmp) ? "" : "
\82 \82È
\82½
\82Æ
\82¢
\82Á
\82µ
\82å
\82É",
211 if (!passes_walls(mtmp->data) && !throws_rocks(mtmp->data)) {
212 int dieroll = rnd(20);
214 if (hmon(mtmp, obj, HMON_THROWN, dieroll)
215 && !is_whirly(mtmp->data))
216 return FALSE; /* still alive */
220 if (!Passes_walls && !throws_rocks(youmonst.data)) {
222 losehp(Maybe_Half_Phys(rnd(15)),
223 "squished under a boulder", NO_KILLER_PREFIX);
225 losehp(Maybe_Half_Phys(rnd(15)),
226 "
\8aâ
\82Ì
\89º
\82Å
\92×
\82³
\82ê
\82Ä", KILLED_BY);
228 return FALSE; /* player remains trapped */
234 if (Blind && (x == u.ux) && (y == u.uy)) {
236 You_hear("a CRASH! beneath you.");
238 You_hear("
\91«
\8c³
\82Å
\89½
\82©
\82ª
\8dÓ
\82¯
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
239 } else if (!Blind && cansee(x, y)) {
241 pline_The("boulder %s%s.", t->tseen ? "" : "triggers and ",
243 ? "plugs a trap door"
244 : t->ttyp == HOLE ? "plugs a hole"
247 pline_The("
\8aâ
\82Í%s%s
\81D", t->tseen ? "" : "ã©
\82ð
\8bN
\93®
\82µ
\82Ä
\81C",
248 t->ttyp == TRAPDOOR ? "
\97\8e\82µ
\94à
\82ð
\96\84\82ß
\82½" :
249 t->ttyp == HOLE ? "
\8c\8a\82ð
\96\84\82ß
\82½" :
250 "
\97\8e\82µ
\8c\8a\82ð
\96\84\82ß
\82½");
254 You_hear("a boulder %s.", verb);
256 You_hear("
\8aâ
\82ª%s
\89¹
\82ð
\95·
\82¢
\82½
\81D", verb);
264 } else if (is_lava(x, y)) {
265 return lava_damage(obj, x, y);
266 } else if (is_pool(x, y)) {
267 /* Reasonably bulky objects (arbitrary) splash when dropped.
268 * If you're floating above the water even small things make
269 * noise. Stuff dropped near fountains always misses */
270 if ((Blind || (Levitation || Flying)) && !Deaf
271 && ((x == u.ux) && (y == u.uy))) {
273 if (weight(obj) > 9) {
277 pline("
\83o
\83V
\83\83\83b
\81I");
278 } else if (Levitation || Flying) {
282 pline("
\83|
\83`
\83\83\83\93\81I");
285 map_background(x, y, 0);
288 return water_damage(obj, NULL, FALSE) == ER_DESTROYED;
289 } else if (u.ux == x && u.uy == y && (t = t_at(x, y)) != 0
290 && uteetering_at_seen_pit(t)) {
293 You_hear("%s tumble downwards.", the(xname(obj)));
295 You_hear("%s
\82ª
\89º
\82Ì
\95û
\82Ö
\93]
\82ª
\82Á
\82Ä
\82¢
\82
\89¹
\82ð
\95·
\82¢
\82½
\81D", xname(obj));
298 pline("%s %s into %s pit.", The(xname(obj)),
299 otense(obj, "tumble"), the_your[t->madeby_u]);
301 pline("%s
\82Í%s
\97\8e\82Æ
\82µ
\8c\8a\82É
\93]
\82ª
\82è
\82¨
\82¿
\82½
\81D", xname(obj),
302 set_you[t->madeby_u]);
304 } else if (obj->globby) {
305 /* Globby things like puddings might stick together */
306 while (obj && (otmp = obj_nexto_xy(obj, x, y, TRUE)) != 0) {
307 pudding_merge_message(obj, otmp);
308 /* intentionally not getting the melded object; obj_meld may set
310 (void) obj_meld(&obj, &otmp);
312 return (boolean) !obj;
317 /* obj is an object dropped on an altar */
320 register struct obj *obj;
325 if (obj->oclass != COIN_CLASS) {
327 u.uconduct.gnostic++;
329 /* coins don't have bless/curse status */
330 obj->blessed = obj->cursed = 0;
333 if (obj->blessed || obj->cursed) {
335 There("is %s flash as %s %s the altar.",
336 an(hcolor(obj->blessed ? NH_AMBER : NH_BLACK)), doname(obj),
339 pline("%s
\82ª
\8dÕ
\92d
\82É
\90G
\82ê
\82é
\82Æ%s
\8cõ
\82Á
\82½
\81D",
341 jconj_adj(hcolor(obj->blessed ? NH_AMBER : NH_BLACK)));
347 pline("%s %s on the altar.", Doname2(obj), otense(obj, "land"));
349 pline("%s
\82ð
\8dÕ
\92d
\82Ì
\8fã
\82É
\92u
\82¢
\82½
\81D", Doname2(obj));
350 if (obj->oclass != COIN_CLASS)
357 register struct obj *obj;
359 if (!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname)
363 /* Transforms the sink at the player's position into
364 a fountain, throne, altar or grave. */
370 if (levl[u.ux][u.uy].typ != SINK)
373 level.flags.nsinks--;
374 levl[u.ux][u.uy].doormask = 0;
379 levl[u.ux][u.uy].typ = FOUNTAIN;
380 level.flags.nfountains++;
384 levl[u.ux][u.uy].typ = THRONE;
388 levl[u.ux][u.uy].typ = ALTAR;
389 levl[u.ux][u.uy].altarmask = Align2amask(rn2((int) A_LAWFUL + 2) - 1);
393 levl[u.ux][u.uy].typ = ROOM;
394 make_grave(u.ux, u.uy, (char *) 0);
395 if (levl[u.ux][u.uy].typ == GRAVE)
399 /* give message even if blind; we know we're not levitating,
400 so can feel the outcome even if we can't directly see it */
401 if (levl[u.ux][u.uy].typ != ROOM)
403 pline_The("sink transforms into %s!", an(defsyms[sym].explanation));
405 pline_The("
\97¬
\82µ
\91ä
\82Í%s
\82É
\95Ï
\89»
\82µ
\82½
\81I", defsyms[sym].explanation);
407 pline_The("sink vanishes.");
411 /* Teleports the sink at the player's position;
412 return True if sink teleported. */
425 eng = engr_at(cx, cy);
426 } while ((levl[cx][cy].typ != ROOM || trp || eng || cansee(cx, cy))
429 if (levl[cx][cy].typ == ROOM && !trp && !eng) {
430 /* create sink at new position */
431 levl[cx][cy].typ = SINK;
432 levl[cx][cy].looted = levl[u.ux][u.uy].looted;
434 /* remove old sink */
435 levl[u.ux][u.uy].typ = ROOM;
436 levl[u.ux][u.uy].looted = 0;
443 /* obj is a ring being dropped over a kitchen sink */
446 register struct obj *obj;
448 struct obj *otmp, *otmp2;
449 boolean ideed = TRUE;
450 boolean nosink = FALSE;
453 You("drop %s down the drain.", doname(obj));
455 You("%s
\82ð
\94r
\90\85\8cû
\82É
\97\8e\82µ
\82½
\81D", doname(obj));
456 obj->in_use = TRUE; /* block free identification via interrupt */
457 switch (obj->otyp) { /* effects that can be noticed without eyes */
460 You("thought %s got lost in the sink, but there it is!", yname(obj));
462 You("%s
\82ð
\8e¸
\82Á
\82½
\8bC
\82ª
\82µ
\82½
\82ª
\81C
\8bC
\82Ì
\82¹
\82¢
\82¾
\82Á
\82½
\81I", yname(obj));
464 case RIN_SLOW_DIGESTION:
466 pline_The("ring is regurgitated!");
468 pline("
\8ew
\97Ö
\82Í
\8bt
\97¬
\82µ
\82½
\81I");
476 pline_The("sink quivers upward for a moment.");
478 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu
\81C
\8fã
\89º
\82É
\90k
\82¦
\82½
\81D");
480 case RIN_POISON_RESISTANCE:
482 You("smell rotten %s.", makeplural(fruitname(FALSE)));
484 pline("
\95\85\82Á
\82½%s
\82Ì
\82æ
\82¤
\82È
\93õ
\82¢
\82ª
\82µ
\82½
\81D", fruitname(FALSE));
486 case RIN_AGGRAVATE_MONSTER:
488 pline("Several %s buzz angrily around the sink.",
489 Hallucination ? makeplural(rndmonnam(NULL)) : "flies");
491 pline("
\90\94\95C
\82Ì%s
\82ª
\83u
\83\93\83u
\83\93\97¬
\82µ
\91ä
\82Ì
\89ñ
\82è
\82ð
\94ò
\82Ñ
\82Ü
\82í
\82Á
\82½
\81D",
492 Hallucination ? rndmonnam(NULL) : "
\83n
\83G");
495 case RIN_SHOCK_RESISTANCE:
497 pline("Static electricity surrounds the sink.");
499 pline("
\97¬
\82µ
\91ä
\82ª
\83s
\83\8a\83s
\83\8a\82µ
\82Í
\82¶
\82ß
\82½
\81D");
503 You_hear("loud noises coming from the drain.");
505 You_hear("
\94r
\90\85\8cû
\82©
\82ç
\82Ì
\91å
\82«
\82È
\89¹
\82ð
\95·
\82¢
\82½
\81D");
507 case RIN_SUSTAIN_ABILITY: /* KMH */
509 pline_The("%s flow seems fixed.", hliquid("water"));
511 pline("%s
\82Ì
\97¬
\82ê
\82ª
\88ê
\92è
\82É
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D", hliquid("
\90\85"));
513 case RIN_GAIN_STRENGTH:
515 pline_The("%s flow seems %ser now.",
517 (obj->spe < 0) ? "weak" : "strong");
519 pline("%s
\82Ì
\97¬
\82ê
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
521 (obj->spe < 0) ? "
\8eã" : "
\8b");
524 case RIN_GAIN_CONSTITUTION:
526 pline_The("%s flow seems %ser now.",
528 (obj->spe < 0) ? "less" : "great");
530 pline("
\97¬
\82ê
\82é%s
\82Ì
\97Ê
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
532 (obj->spe < 0) ? "
\8f
\82È" : "
\91½");
535 case RIN_INCREASE_ACCURACY: /* KMH */
537 pline_The("%s flow %s the drain.",
539 (obj->spe < 0) ? "misses" : "hits");
541 pline("%s
\82ª
\94r
\90\85\8cû%s
\82æ
\82¤
\82É
\82È
\82Á
\82½
\81D",
543 (obj->spe < 0) ? "
\82©
\82ç
\94½
\82ê
\82é" : "
\82ß
\82ª
\82¯
\82Ä
\97¬
\82ê
\82é");
546 case RIN_INCREASE_DAMAGE:
548 pline_The("water's force seems %ser now.",
549 (obj->spe < 0) ? "small" : "great");
551 pline("
\90\85\82Ì
\90¨
\82¢
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
552 (obj->spe < 0) ? "
\8eã" : "
\8b");
557 for (otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp2) {
558 otmp2 = otmp->nexthere;
559 if (otmp != uball && otmp != uchain
560 && !obj_resists(otmp, 1, 99)) {
563 pline("Suddenly, %s %s from the sink!", doname(otmp),
564 otense(otmp, "vanish"));
566 pline("
\93Ë
\91R
\81C%s
\82Í
\97¬
\82µ
\91ä
\82©
\82ç
\8fÁ
\82¦
\82½
\81I", doname(otmp));
575 /* Not the same as aggravate monster; besides, it's obvious. */
577 pline("Several flies buzz around the sink.");
579 pline("
\90\94\95C
\82Ì
\83n
\83G
\82ª
\83u
\83\93\83u
\83\93\97¬
\82µ
\91ä
\82Ì
\89ñ
\82è
\82ð
\94ò
\82Ñ
\82Ü
\82í
\82Á
\82½
\81D");
581 case RIN_TELEPORTATION:
582 nosink = teleport_sink();
583 /* give message even if blind; we know we're not levitating,
584 so can feel the outcome even if we can't directly see it */
586 pline_The("sink %svanishes.", nosink ? "" : "momentarily ");
588 pline_The("
\97¬
\82µ
\91ä
\82Í%s
\8fÁ
\82¦
\82½
\81D", nosink ? "" : "
\88ê
\8fu");
594 /* for S_room case, same message as for teleportation is given */
595 ideed = (levl[u.ux][u.uy].typ != ROOM);
601 if (!Blind && !ideed) {
603 switch (obj->otyp) { /* effects that need eyes */
606 pline_The("faucets flash brightly for a moment.");
608 pline("
\8eÖ
\8cû
\82Í
\88ê
\8fu
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
610 case RIN_REGENERATION:
612 pline_The("sink looks as good as new.");
614 pline("
\97¬
\82µ
\91ä
\82ª
\90V
\95i
\82Ì
\82æ
\82¤
\82É
\82È
\82Á
\82½
\81D");
616 case RIN_INVISIBILITY:
618 You("don't see anything happen to the sink.");
620 pline("
\97¬
\82µ
\91ä
\82É
\89½
\82ª
\8bN
\82«
\82½
\82Ì
\82©
\8c©
\82¦
\82È
\82©
\82Á
\82½
\81D");
622 case RIN_FREE_ACTION:
624 You_see("the ring slide right down the drain!");
626 pline("
\8ew
\97Ö
\82ª
\94r
\90\85\8cû
\82ð
\82·
\82é
\82è
\82Æ
\94ð
\82¯
\82é
\82Ì
\82ð
\8c©
\82½
\81I");
628 case RIN_SEE_INVISIBLE:
630 You_see("some %s in the sink.",
631 Hallucination ? "oxygen molecules" : "air");
633 pline("
\97¬
\82µ
\91ä
\82Ì
\8fã
\82Ì%s
\82ª
\8c©
\82¦
\82½
\81D",
634 Hallucination ? "
\8e_
\91f
\95ª
\8eq" : "
\8bó
\8bC");
639 pline_The("sink seems to blend into the floor for a moment.");
641 pline("
\88ê
\8fu
\81C
\97¬
\82µ
\91ä
\82ª
\8f°
\82É
\97n
\82¯
\82±
\82ñ
\82¾
\82æ
\82¤
\82É
\8c©
\82¦
\82½
\81D");
643 case RIN_FIRE_RESISTANCE:
645 pline_The("hot %s faucet flashes brightly for a moment.",
647 #else /*
\82Æ
\82è
\82 \82¦
\82¸hliquid()
\82Í
\8eg
\82í
\82È
\82¢
\8c`
\82É*/
648 pline("
\88ê
\8fu
\81C
\94M
\93\92\82Ì
\8eÖ
\8cû
\82ª
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
651 case RIN_COLD_RESISTANCE:
653 pline_The("cold %s faucet flashes brightly for a moment.",
655 #else /*
\82Æ
\82è
\82 \82¦
\82¸hliquid()
\82Í
\8eg
\82í
\82È
\82¢
\8c`
\82É*/
656 pline("
\88ê
\8fu
\81C
\97â
\90\85\82Ì
\8eÖ
\8cû
\82ª
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
659 case RIN_PROTECTION_FROM_SHAPE_CHAN:
661 pline_The("sink looks nothing like a fountain.");
663 pline("
\97¬
\82µ
\91ä
\82Í
\90ò
\82Æ
\82Í
\82Ü
\82Á
\82½
\82
\88á
\82¤
\82à
\82Ì
\82Ì
\82æ
\82¤
\82É
\8c©
\82¦
\82½
\81D");
667 pline_The("sink glows %s for a moment.",
668 hcolor((obj->spe < 0) ? NH_BLACK : NH_SILVER));
670 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu%s
\8bP
\82¢
\82½
\81D",
671 jconj_adj(hcolor((obj->spe < 0) ? NH_BLACK : NH_SILVER)));
676 pline_The("sink glows %s for a moment.", hcolor(NH_WHITE));
678 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu%s
\8bP
\82¢
\82½
\81D", jconj_adj(hcolor(NH_WHITE)));
680 case RIN_TELEPORT_CONTROL:
681 /*JP: "beam aboard"
\82Í
\83X
\83^
\81[
\83g
\83\8c\83b
\83N
\82Ì
\81u
\93]
\91\97\81v*/
683 pline_The("sink looks like it is being beamed aboard somewhere.");
685 pline("
\97¬
\82µ
\91ä
\82Í
\82Ç
\82±
\82©
\82É
\93]
\91\97\82³
\82ê
\82æ
\82¤
\82Æ
\82µ
\82Ä
\82¢
\82é
\82æ
\82¤
\82É
\8c©
\82¦
\82½
\81D");
687 case RIN_POLYMORPH_CONTROL:
690 "sink momentarily looks like a regularly erupting geyser.");
692 "
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu
\8bK
\91¥
\90³
\82µ
\82
\95¬
\8fo
\82·
\82é
\8aÔ
\8c\87\90ò
\82Ì
\82æ
\82¤
\82É
\8c©
\82¦
\82½
\81D");
702 You_hear("the ring bouncing down the drainpipe.");
704 You_hear("
\8ew
\97Ö
\82ª
\94r
\90\85\8cû
\82É
\93\96\82½
\82è
\82È
\82ª
\82ç
\97\8e\82¿
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
706 if (!rn2(20) && !nosink) {
708 pline_The("sink backs up, leaving %s.", doname(obj));
710 pline("
\97¬
\82µ
\91ä
\82ª
\8bt
\97¬
\82µ
\82Ä
\81C%s
\82ª
\96ß
\82Á
\82Ä
\82«
\82½
\81D", doname(obj));
713 } else if (!rn2(5)) {
723 /* some common tests when trying to drop or throw items */
729 if (obj->owornmask & (W_ARMOR | W_ACCESSORY)) {
732 Norep("You cannot %s %s you are wearing.", word, something);
734 Norep("
\82 \82È
\82½
\82ª
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\82à
\82Ì
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", word);
737 if (obj->otyp == LOADSTONE && obj->cursed) {
738 /* getobj() kludge sets corpsenm to user's specified count
739 when refusing to split a stack of cursed loadstones */
741 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
742 /* getobj() ignores a count for throwing since that is
743 implicitly forced to be 1; replicate its kludge... */
744 if (!strcmp(word, "throw") && obj->quan > 1L)
748 pline("For some reason, you cannot %s%s the stone%s!", word,
749 obj->corpsenm ? " any of" : "", plur(obj->quan));
751 pline("
\82Ç
\82¤
\82¢
\82¤
\82í
\82¯
\82©
\81C
\82 \82È
\82½
\82Í
\90Î
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81I",
755 obj->corpsenm = 0; /* reset */
759 if (obj->otyp == LEASH && obj->leashmon != 0) {
762 pline_The("leash is tied around your %s.", body_part(HAND));
764 pline("
\95R
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D", body_part(HAND));
767 if (obj->owornmask & W_SADDLE) {
770 You("cannot %s %s you are sitting on.", word, something);
772 You("
\8fæ
\82Á
\82Ä
\82¢
\82é
\8aÔ
\82Í%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", word);
780 register struct obj *obj;
785 if (!canletgo(obj, "drop"))
787 if (!canletgo(obj, "
\92u
\82"))
794 setuwep((struct obj *) 0);
796 if (obj == uquiver) {
797 setuqwep((struct obj *) 0);
799 if (obj == uswapwep) {
800 setuswapwep((struct obj *) 0);
804 /* barrier between you and the floor */
808 /* doname can call s_suffix, reusing its buffer */
809 Strcpy(buf, s_suffix(mon_nam(u.ustuck)));
811 You("drop %s into %s %s.", doname(obj), buf,
812 mbodypart(u.ustuck, STOMACH));
814 You("%s
\82ð%s%s
\82É
\92u
\82¢
\82½
\81D", doname(obj), buf,
815 mbodypart(u.ustuck, STOMACH));
819 if ((obj->oclass == RING_CLASS || obj->otyp == MEAT_RING)
820 && IS_SINK(levl[u.ux][u.uy].typ)) {
824 if (!can_reach_floor(TRUE)) {
825 /* we might be levitating due to #invoke Heart of Ahriman;
826 if so, levitation would end during call to freeinv()
827 and we want hitfloor() to happen before float_down() */
828 boolean levhack = finesse_ahriman(obj);
831 ELevitation = W_ART; /* other than W_ARTI */
834 You("drop %s.", doname(obj));
836 You("%s
\82ð
\92u
\82¢
\82½
\81D", doname(obj));
837 /* Ensure update when we drop gold objects */
838 if (obj->oclass == COIN_CLASS)
843 float_down(I_SPECIAL | TIMEOUT, W_ARTI | W_ART);
846 if (!IS_ALTAR(levl[u.ux][u.uy].typ) && flags.verbose)
848 You("drop %s.", doname(obj));
850 You("%s
\82ð
\92u
\82¢
\82½
\81D", doname(obj));
856 /* dropx - take dropped item out of inventory;
857 called in several places - may produce output
858 (eg ship_object() and dropy() -> sellobj() both produce output) */
861 register struct obj *obj;
863 /* Ensure update when we drop gold objects */
864 if (obj->oclass == COIN_CLASS)
868 if (ship_object(obj, u.ux, u.uy, FALSE))
870 if (IS_ALTAR(levl[u.ux][u.uy].typ))
871 doaltarobj(obj); /* set bknown */
876 /* dropy - put dropped object at destination; called from lots of places */
884 /* dropz - really put dropped object at its destination... */
886 dropz(obj, with_impact)
891 setuwep((struct obj *) 0);
893 setuqwep((struct obj *) 0);
895 setuswapwep((struct obj *) 0);
898 if (!u.uswallow && flooreffects(obj, u.ux, u.uy, "drop"))
900 if (!u.uswallow && flooreffects(obj,u.ux,u.uy, "
\97\8e\82¿
\82é"))
902 /* uswallow check done by GAN 01/29/87 */
904 boolean could_petrify = FALSE;
905 boolean could_poly = FALSE;
906 boolean could_slime = FALSE;
907 boolean could_grow = FALSE;
908 boolean could_heal = FALSE;
910 if (obj != uball) { /* mon doesn't pick up ball */
911 if (obj->otyp == CORPSE) {
912 could_petrify = touch_petrifies(&mons[obj->corpsenm]);
913 could_poly = polyfodder(obj);
914 could_slime = (obj->corpsenm == PM_GREEN_SLIME);
915 could_grow = (obj->corpsenm == PM_WRAITH);
916 could_heal = (obj->corpsenm == PM_NURSE);
918 (void) mpickobj(u.ustuck, obj);
919 if (is_animal(u.ustuck->data)) {
920 if (could_poly || could_slime) {
921 (void) newcham(u.ustuck,
922 could_poly ? (struct permonst *) 0
923 : &mons[PM_GREEN_SLIME],
925 delobj(obj); /* corpse is digested */
926 } else if (could_petrify) {
927 minstapetrify(u.ustuck, TRUE);
928 /* Don't leave a cockatrice corpse in a statue */
931 } else if (could_grow) {
932 (void) grow_up(u.ustuck, (struct monst *) 0);
933 delobj(obj); /* corpse is digested */
934 } else if (could_heal) {
935 u.ustuck->mhp = u.ustuck->mhpmax;
936 delobj(obj); /* corpse is digested */
941 place_object(obj, u.ux, u.uy);
943 container_impact_dmg(obj, u.ux, u.uy);
945 drop_ball(u.ux, u.uy);
946 else if (level.flags.has_shop)
947 sellobj(obj, u.ux, u.uy);
949 if (Blind && Levitation)
951 newsym(u.ux, u.uy); /* remap location under self */
955 /* things that must change when not held; recurse into containers.
956 Called for both player and monsters */
958 obj_no_longer_held(obj)
963 } else if (Has_contents(obj)) {
964 struct obj *contents;
966 for (contents = obj->cobj; contents; contents = contents->nobj)
967 obj_no_longer_held(contents);
971 /* Normal crysknife reverts to worm tooth when not held by hero
972 * or monster; fixed crysknife has only 10% chance of reverting.
973 * When a stack of the latter is involved, it could be worthwhile
974 * to give each individual crysknife its own separate 10% chance,
975 * but we aren't in any position to handle stack splitting here.
977 if (!obj->oerodeproof || !rn2(10)) {
978 /* if monsters aren't moving, assume player is responsible */
979 if (!context.mon_moving && !program_state.gameover)
980 costly_alteration(obj, COST_DEGRD);
981 obj->otyp = WORM_TOOTH;
982 obj->oerodeproof = 0;
988 /* 'D' command: drop several things */
995 You("have nothing to drop.");
998 add_valid_menu_class(0); /* clear any classes already there */
1000 sellobj_state(SELL_DELIBERATE);
1001 if (flags.menu_style != MENU_TRADITIONAL
1002 || (result = ggetobj("drop", drop, 0, FALSE, (unsigned *) 0)) < -1)
1003 result = menu_drop(result);
1005 sellobj_state(SELL_NORMAL);
1007 reset_occupations();
1012 /* Drop things from the hero's inventory, using a menu. */
1017 int n, i, n_dropped = 0;
1019 struct obj *otmp, *otmp2;
1020 menu_item *pick_list;
1021 boolean all_categories = TRUE;
1022 boolean drop_everything = FALSE;
1025 all_categories = (retry == -2);
1026 } else if (flags.menu_style == MENU_FULL) {
1027 all_categories = FALSE;
1029 n = query_category("Drop what type of items?", invent,
1031 n = query_category("
\82Ç
\82Ì
\8eí
\97Þ
\82Ì
\83A
\83C
\83e
\83\80\82ð
\92u
\82«
\82Ü
\82·
\82©
\81H", invent,
1032 UNPAID_TYPES | ALL_TYPES | CHOOSE_ALL | BUC_BLESSED
1033 | BUC_CURSED | BUC_UNCURSED | BUC_UNKNOWN,
1034 &pick_list, PICK_ANY);
1037 for (i = 0; i < n; i++) {
1038 if (pick_list[i].item.a_int == ALL_TYPES_SELECTED)
1039 all_categories = TRUE;
1040 else if (pick_list[i].item.a_int == 'A')
1041 drop_everything = TRUE;
1043 add_valid_menu_class(pick_list[i].item.a_int);
1045 free((genericptr_t) pick_list);
1046 } else if (flags.menu_style == MENU_COMBINATION) {
1047 unsigned ggoresults = 0;
1049 all_categories = FALSE;
1050 /* Gather valid classes via traditional NetHack method */
1051 i = ggetobj("drop", drop, 0, TRUE, &ggoresults);
1053 all_categories = TRUE;
1054 if (ggoresults & ALL_FINISHED) {
1060 if (drop_everything) {
1062 * Dropping a burning potion of oil while levitating can cause
1063 * an explosion which might destroy some of hero's inventory,
1065 * for (otmp = invent; otmp; otmp = otmp2) {
1066 * otmp2 = otmp->nobj;
1067 * n_dropped += drop(otmp);
1069 * was unreliable and could lead to an "object lost" panic.
1071 * Use the bypass bit to mark items already processed (hence
1072 * not droppable) and rescan inventory until no unbypassed
1075 bypass_objlist(invent, FALSE); /* clear bypass bit for invent */
1076 while ((otmp = nxt_unbypassed_obj(invent)) != 0)
1077 n_dropped += drop(otmp);
1078 /* we might not have dropped everything (worn armor, welded weapon,
1079 cursed loadstones), so reset any remaining inventory to normal */
1080 bypass_objlist(invent, FALSE);
1082 /* should coordinate with perm invent, maybe not show worn items */
1084 n = query_objlist("What would you like to drop?", &invent,
1085 (USE_INVLET | INVORDER_SORT), &pick_list, PICK_ANY,
1086 all_categories ? allow_all : allow_category);
1088 n = query_objlist("
\82Ç
\82ê
\82ð
\92u
\82«
\82Ü
\82·
\82©
\81H", &invent,
1089 (USE_INVLET | INVORDER_SORT), &pick_list, PICK_ANY,
1090 all_categories ? allow_all : allow_category);
1094 * picklist[] contains a set of pointers into inventory, but
1095 * as soon as something gets dropped, they might become stale
1096 * (see the drop_everything code above for an explanation).
1097 * Just checking to see whether one is still in the invent
1098 * chain is not sufficient validation since destroyed items
1099 * will be freed and items we've split here might have already
1100 * reused that memory and put the same pointer value back into
1101 * invent. Ditto for using invlet to validate. So we start
1102 * by setting bypass on all of invent, then check each pointer
1103 * to verify that it is in invent and has that bit set.
1105 bypass_objlist(invent, TRUE);
1106 for (i = 0; i < n; i++) {
1107 otmp = pick_list[i].item.a_obj;
1108 for (otmp2 = invent; otmp2; otmp2 = otmp2->nobj)
1111 if (!otmp2 || !otmp2->bypass)
1113 /* found next selected invent item */
1114 cnt = pick_list[i].count;
1115 if (cnt < otmp->quan) {
1118 } else if (otmp->otyp == LOADSTONE && otmp->cursed) {
1119 /* same kludge as getobj(), for canletgo()'s use */
1120 otmp->corpsenm = (int) cnt; /* don't split */
1122 otmp = splitobj(otmp, cnt);
1125 n_dropped += drop(otmp);
1127 bypass_objlist(invent, FALSE); /* reset invent to normal */
1128 free((genericptr_t) pick_list);
1136 /* on a ladder, used in goto_level */
1137 static NEARDATA boolean at_ladder = FALSE;
1139 /* the '>' command */
1143 struct trap *trap = 0;
1144 boolean stairs_down = ((u.ux == xdnstair && u.uy == ydnstair)
1145 || (u.ux == sstairs.sx && u.uy == sstairs.sy
1147 ladder_down = (u.ux == xdnladder && u.uy == ydnladder);
1152 if (stucksteed(TRUE)) {
1155 /* Levitation might be blocked, but player can still use '>' to
1156 turn off controlled levitation */
1157 if (HLevitation || ELevitation) {
1158 if ((HLevitation & I_SPECIAL) || (ELevitation & W_ARTI)) {
1159 /* end controlled levitation */
1160 if (ELevitation & W_ARTI) {
1163 for (obj = invent; obj; obj = obj->nobj) {
1165 && artifact_has_invprop(obj, LEVITATION)) {
1166 if (obj->age < monstermoves)
1167 obj->age = monstermoves;
1168 obj->age += rnz(100);
1172 if (float_down(I_SPECIAL | TIMEOUT, W_ARTI)) {
1173 return 1; /* came down, so moved */
1174 } else if (!HLevitation && !ELevitation) {
1176 Your("latent levitation ceases.");
1178 pline("
\90ö
\8dÝ
\93I
\82È
\95\82\97V
\94\
\97Í
\82ª
\92\86\92f
\82µ
\82½
\81D");
1179 return 1; /* did something, effectively moved */
1183 ; /* weren't actually floating after all */
1185 /* Avoid alerting player to an unknown stair or ladder.
1186 * Changes the message for a covered, known staircase
1187 * too; staircase knowledge is not stored anywhere.
1191 (glyph_to_cmap(levl[u.ux][u.uy].glyph) == S_dnstair);
1192 else if (ladder_down)
1194 (glyph_to_cmap(levl[u.ux][u.uy].glyph) == S_dnladder);
1196 if (Is_airlevel(&u.uz))
1197 You("are floating in the %s.", surface(u.ux, u.uy));
1198 else if (Is_waterlevel(&u.uz))
1199 You("are floating in %s.",
1200 is_pool(u.ux, u.uy) ? "the water" : "a bubble of air");
1203 floating_above(stairs_down ? "stairs" : ladder_down
1205 : surface(u.ux, u.uy));
1207 floating_above(stairs_down ? "
\8aK
\92i" : ladder_down
1209 : surface(u.ux, u.uy));
1211 return 0; /* didn't move */
1213 if (!stairs_down && !ladder_down) {
1214 trap = t_at(u.ux, u.uy);
1215 if (trap && uteetering_at_seen_pit(trap)) {
1216 dotrap(trap, TOOKPLUNGE);
1218 } else if (!trap || (trap->ttyp != TRAPDOOR && trap->ttyp != HOLE)
1219 || !Can_fall_thru(&u.uz) || !trap->tseen) {
1220 if (flags.autodig && !context.nopick && uwep && is_pick(uwep)) {
1221 return use_pick_axe2(uwep);
1224 You_cant("go down here.");
1226 pline("
\82±
\82±
\82Å
\82Í
\8d~
\82è
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
1233 You("are %s, and cannot go down.",
1234 !u.uswallow ? "being held" : is_animal(u.ustuck->data)
1238 You("%s
\8d~
\82è
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1239 !u.uswallow ? "
\82Â
\82©
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82Ä" : is_animal(u.ustuck->data)
1240 ? "
\88ù
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä"
1241 : "
\8aª
\82«
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä");
1245 if (on_level(&valley_level, &u.uz) && !u.uevent.gehennom_entered) {
1247 You("are standing at the gate to Gehennom.");
1249 You("
\83Q
\83w
\83i
\82Ì
\96å
\82Ì
\91O
\82É
\97§
\82Á
\82Ä
\82¢
\82é
\81D");
1251 pline("Unspeakable cruelty and harm lurk down there.");
1253 pline("
\8c¾
\97t
\82É
\82·
\82ç
\82Å
\82«
\82È
\82¢
\8ec
\8bs
\82Æ
\8eS
\8e\96\82ª
\82±
\82Ì
\89º
\82É
\90ö
\82ñ
\82Å
\82¢
\82é
\81D");
1255 if (yn("Are you sure you want to enter?") != 'y')
1257 if (yn("
\96{
\93\96\82É
\93ü
\82è
\82Ü
\82·
\82©
\81H") != 'y')
1263 pline("
\82È
\82ç
\8dD
\82«
\82É
\82·
\82ê
\82Î
\82æ
\82¢
\81D");
1264 u.uevent.gehennom_entered = 1; /* don't ask again */
1269 You("are held back by your pet!");
1271 You("
\83y
\83b
\83g
\82É
\88ø
\82«
\82à
\82Ç
\82³
\82ê
\82½
\81I");
1277 You("%s %s.", Flying ? "fly" : locomotion(youmonst.data, "jump"),
1278 trap->ttyp == HOLE ? "down the hole" : "through the trap door");
1281 trap->ttyp == HOLE ? "
\8c\8a\82ð
\8d~
\82è
\82½" : "
\97\8e\82µ
\94à
\82ð
\92Ê
\82è
\94²
\82¯
\82½");
1284 if (trap && Is_stronghold(&u.uz)) {
1285 goto_hell(FALSE, TRUE);
1287 at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
1294 /* the '<' command */
1301 /* "up" to get out of a pit... */
1302 if (u.utrap && u.utraptype == TT_PIT) {
1307 if ((u.ux != xupstair || u.uy != yupstair)
1308 && (!xupladder || u.ux != xupladder || u.uy != yupladder)
1309 && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy
1312 You_cant("go up here.");
1314 You("
\82±
\82±
\82Å
\82Í
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
1317 if (stucksteed(TRUE)) {
1322 You("are %s, and cannot go up.",
1323 !u.uswallow ? "being held" : is_animal(u.ustuck->data)
1327 You("%s
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1328 !u.uswallow ? "
\82Â
\82©
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82Ä" : is_animal(u.ustuck->data)
1329 ? "
\88ù
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä"
1330 : "
\8aª
\82«
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä");
1334 if (near_capacity() > SLT_ENCUMBER) {
1335 /* No levitation check; inv_weight() already allows for it */
1337 Your("load is too heavy to climb the %s.",
1338 levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
1340 You("
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä%s
\82ð
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1341 levl[u.ux][u.uy].typ == STAIRS ? "
\8aK
\92i" : "
\82Í
\82µ
\82²");
1345 if (ledger_no(&u.uz) == 1) {
1347 if (yn("Beware, there will be no return! Still climb?") != 'y')
1349 if (yn("
\8bC
\82ð
\82Â
\82¯
\82ë
\81C
\96ß
\82ê
\82È
\82¢
\82¼
\81I
\82»
\82ê
\82Å
\82à
\8fã
\82é
\81H") != 'y')
1354 You("are held back by your pet!");
1356 You("
\83y
\83b
\83g
\82É
\88ø
\82«
\82à
\82Ç
\82³
\82ê
\82½
\81I");
1359 at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
1365 d_level save_dlevel = { 0, 0 };
1367 /* check that we can write out the current level */
1369 currentlevel_rewrite()
1374 /* since level change might be a bit slow, flush any buffered screen
1375 * output (like "you fall through a trap door") */
1378 fd = create_levelfile(ledger_no(&u.uz), whynot);
1381 * This is not quite impossible: e.g., we may have
1382 * exceeded our quota. If that is the case then we
1383 * cannot leave this level, and cannot save either.
1384 * Another possibility is that the directory was not
1392 if (!savelev(fd, ledger_no(&u.uz), COUNT_SAVE)) {
1394 delete_levelfile(ledger_no(&u.uz));
1396 pline("NetHack is out of disk space for making levels!");
1398 pline("
\90V
\82µ
\82¢
\83\8c\83x
\83\8b\82ð
\8dì
\82é
\82½
\82ß
\82Ì
\83f
\83B
\83X
\83N
\97e
\97Ê
\82ª
\91«
\82è
\82È
\82¢
\81I");
1400 You("can save, quit, or continue playing.");
1402 You("
\83Z
\81[
\83u
\82·
\82é
\82©
\8fI
\97¹
\82·
\82é
\82©
\81C
\82 \82é
\82¢
\82Í
\83v
\83\8c\83C
\82ð
\91±
\8ds
\82Å
\82«
\82é
\81D");
1415 if (flags.ins_chkpt) {
1416 /* write out just-attained level, with pets and everything */
1417 fd = currentlevel_rewrite();
1421 savelev(fd, ledger_no(&u.uz), WRITE_SAVE);
1425 /* write out non-level state */
1433 register xchar x, y;
1435 return (boolean) ((levl[x][y].typ != ROOM
1436 && levl[x][y].typ != AIR
1437 && levl[x][y].typ != CORR)
1443 goto_level(newlevel, at_stairs, falling, portal)
1445 boolean at_stairs, falling, portal;
1449 boolean cant_go_back, great_effort,
1450 up = (depth(newlevel) < depth(&u.uz)),
1451 newdungeon = (u.uz.dnum != newlevel->dnum),
1452 was_in_W_tower = In_W_tower(u.ux, u.uy, &u.uz),
1454 new = FALSE; /* made a new level? */
1459 if (dunlev(newlevel) > dunlevs_in_dungeon(newlevel))
1460 newlevel->dlevel = dunlevs_in_dungeon(newlevel);
1461 if (newdungeon && In_endgame(newlevel)) { /* 1st Endgame Level !!! */
1462 if (!u.uhave.amulet)
1463 return; /* must have the Amulet */
1464 if (!wizard) /* wizard ^V can bypass Earth level */
1465 assign_level(newlevel, &earth_level); /* (redundant) */
1467 new_ledger = ledger_no(newlevel);
1468 if (new_ledger <= 0)
1469 done(ESCAPED); /* in fact < 0 is impossible */
1471 /* If you have the amulet and are trying to get out of Gehennom,
1472 * going up a set of stairs sometimes does some very strange things!
1473 * Biased against law and towards chaos. (The chance to be sent
1474 * down multiple levels when attempting to go up are significantly
1475 * less than the corresponding comment in older versions indicated
1476 * due to overlooking the effect of the call to assign_rnd_lvl().)
1478 * Odds for making it to the next level up, or of being sent down:
1482 * -1 11.46 12.50 12.5
1486 if (Inhell && up && u.uhave.amulet && !newdungeon && !portal
1487 && (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz) - 3)) {
1489 int odds = 3 + (int) u.ualign.type, /* 2..4 */
1490 diff = odds <= 1 ? 0 : rn2(odds); /* paranoia */
1493 assign_rnd_level(newlevel, &u.uz, diff);
1494 /* if inside the tower, stay inside */
1495 if (was_in_W_tower && !On_W_tower_level(newlevel))
1499 assign_level(newlevel, &u.uz);
1501 new_ledger = ledger_no(newlevel);
1504 pline("A mysterious force momentarily surrounds you...");
1506 pline("
\88ê
\8fu
\8aï
\96
\82È
\97Í
\82ª
\82 \82È
\82½
\82ð
\95ï
\82ñ
\82¾
\81D
\81D
\81D");
1507 if (on_level(newlevel, &u.uz)) {
1508 (void) safe_teleds(FALSE);
1512 at_stairs = at_ladder = FALSE;
1516 /* Prevent the player from going past the first quest level unless
1517 * (s)he has been given the go-ahead by the leader.
1519 if (on_level(&u.uz, &qstart_level) && !newdungeon && !ok_to_quest()) {
1521 pline("A mysterious force prevents you from descending.");
1523 pline("
\8aï
\96
\82È
\97Í
\82ª
\82 \82È
\82½
\82ª
\8d~
\82è
\82é
\82Ì
\82ð
\96W
\82°
\82½
\81D");
1527 if (on_level(newlevel, &u.uz))
1528 return; /* this can happen */
1530 /* tethered movement makes level change while trapped feasible */
1531 if (u.utrap && u.utraptype == TT_BURIEDBALL)
1532 buried_ball_to_punishment(); /* (before we save/leave old level) */
1534 fd = currentlevel_rewrite();
1538 if (falling) /* assuming this is only trap door or hole */
1539 impact_drop((struct obj *) 0, u.ux, u.uy, newlevel->dlevel);
1541 check_special_room(TRUE); /* probably was a trap door */
1544 u.utrap = 0; /* needed in level_tele */
1545 fill_pit(u.ux, u.uy);
1546 u.ustuck = 0; /* idem */
1548 u.uundetected = 0; /* not hidden, even if means are available */
1550 if (u.uswallow) /* idem */
1551 u.uswldtim = u.uswallow = 0;
1552 recalc_mapseen(); /* recalculate map overview before we leave the level */
1554 * We no longer see anything on the level. Make sure that this
1555 * follows u.uswallow set to null since uswallow overrides all
1561 * Save the level we're leaving. If we're entering the endgame,
1562 * we can get rid of all existing levels because they cannot be
1563 * reached any more. We still need to use savelev()'s cleanup
1564 * for the level being left, to recover dynamic memory in use and
1565 * to avoid dangling timers and light sources.
1567 cant_go_back = (newdungeon && In_endgame(newlevel));
1568 if (!cant_go_back) {
1569 update_mlstmv(); /* current monsters are becoming inactive */
1570 bufon(fd); /* use buffered output */
1572 savelev(fd, ledger_no(&u.uz),
1573 cant_go_back ? FREE_SAVE : (WRITE_SAVE | FREE_SAVE));
1576 /* discard unreachable levels; keep #0 */
1577 for (l_idx = maxledgerno(); l_idx > 0; --l_idx)
1578 delete_levelfile(l_idx);
1579 /* mark #overview data for all dungeon branches as uninteresting */
1580 for (l_idx = 0; l_idx < n_dgns; ++l_idx)
1581 remdun_mapseen(l_idx);
1584 if (Is_rogue_level(newlevel) || Is_rogue_level(&u.uz))
1585 assign_graphics(Is_rogue_level(newlevel) ? ROGUESET : PRIMARY);
1587 substitute_tiles(newlevel);
1589 check_gold_symbol();
1590 /* record this level transition as a potential seen branch unless using
1591 * some non-standard means of transportation (level teleport).
1593 if ((at_stairs || falling || portal) && (u.uz.dnum != newlevel->dnum))
1594 recbranch_mapseen(&u.uz, newlevel);
1595 assign_level(&u.uz0, &u.uz);
1596 assign_level(&u.uz, newlevel);
1597 assign_level(&u.utolev, newlevel);
1599 if (!builds_up(&u.uz)) { /* usual case */
1600 if (dunlev(&u.uz) > dunlev_reached(&u.uz))
1601 dunlev_reached(&u.uz) = dunlev(&u.uz);
1603 if (dunlev_reached(&u.uz) == 0
1604 || dunlev(&u.uz) < dunlev_reached(&u.uz))
1605 dunlev_reached(&u.uz) = dunlev(&u.uz);
1607 reset_rndmonst(NON_PM); /* u.uz change affects monster generation */
1609 /* set default level change destination areas */
1610 /* the special level code may override these */
1611 (void) memset((genericptr_t) &updest, 0, sizeof updest);
1612 (void) memset((genericptr_t) &dndest, 0, sizeof dndest);
1614 if (!(level_info[new_ledger].flags & LFILE_EXISTS)) {
1615 /* entering this level for first time; make it now */
1616 if (level_info[new_ledger].flags & (FORGOTTEN | VISITED)) {
1617 impossible("goto_level: returning to discarded level?");
1618 level_info[new_ledger].flags &= ~(FORGOTTEN | VISITED);
1621 new = TRUE; /* made the level */
1623 /* returning to previously visited level; reload it */
1624 fd = open_levelfile(new_ledger, whynot);
1625 if (tricked_fileremoved(fd, whynot)) {
1626 /* we'll reach here if running in wizard mode */
1627 error("Cannot continue this game.");
1629 minit(); /* ZEROCOMP */
1630 getlev(fd, hackpid, new_ledger, FALSE);
1632 oinit(); /* reassign level dependent obj probabilities */
1635 /* do this prior to level-change pline messages */
1636 vision_reset(); /* clear old level's line-of-sight */
1637 vision_full_recalc = 0; /* don't let that reenable vision yet */
1638 flush_screen(-1); /* ensure all map flushes are postponed */
1640 if (portal && !In_endgame(&u.uz)) {
1641 /* find the portal on the new level */
1642 register struct trap *ttrap;
1644 for (ttrap = ftrap; ttrap; ttrap = ttrap->ntrap)
1645 if (ttrap->ttyp == MAGIC_PORTAL)
1649 panic("goto_level: no corresponding portal!");
1651 u_on_newpos(ttrap->tx, ttrap->ty);
1652 } else if (at_stairs && !In_endgame(&u.uz)) {
1655 u_on_newpos(xdnladder, ydnladder);
1656 else if (newdungeon)
1660 /* you climb up the {stairs|ladder};
1661 fly up the stairs; fly up along the ladder */
1662 great_effort = (Punished && !Levitation);
1663 if (flags.verbose || great_effort)
1665 pline("%s %s up%s the %s.",
1666 great_effort ? "With great effort, you" : "You",
1667 Levitation ? "float" : Flying ? "fly" : "climb",
1668 (Flying && at_ladder) ? " along" : "",
1669 at_ladder ? "ladder" : "stairs");
1670 #else /*
\94ò
\82ñ
\82¾
\82è
\82µ
\82Ä
\82¢
\82Ä
\82à
\81u
\8fã
\82Á
\82½
\81v */
1671 pline("%s%s
\82ð
\8fã
\82Á
\82½
\81D",
1672 great_effort ? "
\82â
\82Á
\82Æ
\82±
\82³" : "",
1673 at_ladder ? "
\82Í
\82µ
\82²" : "
\8aK
\92i");
1677 u_on_newpos(xupladder, yupladder);
1678 else if (newdungeon)
1683 ; /* stayed on same level? (no transit effects) */
1684 } else if (Flying) {
1688 at_ladder ? "along the ladder" : "the stairs");
1690 You("%s
\94ò
\82ñ
\82Å
\8d~
\82è
\82½
\81D",
1691 at_ladder ? "
\82Í
\82µ
\82²
\82É
\89\88\82Á
\82Ä" : "
\8aK
\92i
\82ð");
1693 } else if (near_capacity() > UNENCUMBERED
1694 || Punished || Fumbling) {
1696 You("fall down the %s.", at_ladder ? "ladder" : "stairs");
1698 You("%s
\82ð
\93]
\82°
\97\8e\82¿
\82½
\81D", at_ladder ? "
\82Í
\82µ
\82²" : "
\8aK
\92i");
1703 /* falling off steed has its own losehp() call */
1705 dismount_steed(DISMOUNT_FELL);
1707 losehp(Maybe_Half_Phys(rnd(3)),
1709 at_ladder ? "falling off a ladder"
1711 at_ladder ? "
\82Í
\82µ
\82²
\82©
\82ç
\97\8e\82¿
\82Ä"
1713 : "tumbling down a flight of stairs",
1715 : "
\8aK
\92i
\82ð
\93]
\82°
\97\8e\82¿
\82Ä",
1718 selftouch("Falling, you");
1720 selftouch("
\97\8e\82¿
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í");
1721 } else { /* ordinary descent */
1724 You("%s.", at_ladder ? "climb down the ladder"
1725 : "descend the stairs");
1727 You("%s
\82ð
\8d~
\82è
\82½
\81D", at_ladder ? "
\82Í
\82µ
\82²"
1732 } else { /* trap door or level_tele or In_endgame */
1733 u_on_rndspot((up ? 1 : 0) | (was_in_W_tower ? 2 : 0));
1738 selftouch("Falling, you");
1740 selftouch("
\97\8e\82¿
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í");
1746 obj_delivery(FALSE);
1748 kill_genocided_monsters(); /* for those wiped out while in limbo */
1750 * Expire all timers that have gone off while away. Must be
1751 * after migrating monsters and objects are delivered
1752 * (losedogs and obj_delivery).
1758 if ((mtmp = m_at(u.ux, u.uy)) != 0 && mtmp != u.usteed) {
1759 /* There's a monster at your target destination; it might be one
1760 which accompanied you--see mon_arrive(dogmove.c)--or perhaps
1761 it was already here. Randomly move you to an adjacent spot
1762 or else the monster to any nearby location. Prior to 3.3.0
1763 the latter was done unconditionally. */
1766 if (!rn2(2) && enexto(&cc, u.ux, u.uy, youmonst.data)
1767 && distu(cc.x, cc.y) <= 2)
1768 u_on_newpos(cc.x, cc.y); /*[maybe give message here?]*/
1772 if ((mtmp = m_at(u.ux, u.uy)) != 0) {
1773 /* there was an unconditional impossible("mnearto failed")
1774 here, but it's not impossible and we're prepared to cope
1775 with the situation, so only say something when debugging */
1777 pline("(monster in hero's way)");
1778 if (!rloc(mtmp, TRUE))
1779 /* no room to move it; send it away, to return later */
1780 migrate_to_level(mtmp, ledger_no(&u.uz), MIGR_RANDOM,
1785 /* initial movement of bubbles just before vision_recalc */
1786 if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
1788 else if (Is_firelevel(&u.uz))
1791 if (level_info[new_ledger].flags & FORGOTTEN) {
1792 forget_map(ALL_MAP); /* forget the map */
1793 forget_traps(); /* forget all traps too */
1795 level_info[new_ledger].flags &= ~FORGOTTEN;
1798 /* Reset the screen. */
1799 vision_reset(); /* reset the blockages */
1800 docrt(); /* does a full vision recalc */
1804 * Move all plines beyond the screen reset.
1807 /* special levels can have a custom arrival message */
1808 deliver_splev_message();
1810 /* give room entrance message, if any */
1811 check_special_room(FALSE);
1813 /* deliver objects traveling with player */
1816 /* Check whether we just entered Gehennom. */
1817 if (!In_hell(&u.uz0) && Inhell) {
1818 if (Is_valley(&u.uz)) {
1820 You("arrive at the Valley of the Dead...");
1822 You("
\8e\80\82Ì
\92J
\82É
\93\9e\92B
\82µ
\82½
\81D
\81D
\81D");
1824 pline_The("odor of burnt flesh and decay pervades the air.");
1826 pline("
\8fÅ
\82°
\82é
\8e\80\93÷
\82â
\95\85\93÷
\82Ì
\88«
\8fL
\82ª
\82½
\82¾
\82æ
\82Á
\82Ä
\82¢
\82é
\81D");
1828 display_nhwindow(WIN_MESSAGE, FALSE);
1831 You_hear("groans and moans everywhere.");
1833 You_hear("
\82»
\82±
\82©
\82µ
\82±
\82©
\82ç
\82Ì
\82¤
\82ß
\82«
\90º
\82â
\82¤
\82È
\82è
\90º
\82ð
\95·
\82¢
\82½
\81D");
1836 pline("It is hot here. You smell smoke...");
1838 pline("
\82±
\82±
\82Í
\8f\8b\82¢
\81D
\89\8c\82Ì
\93õ
\82¢
\82ª
\82·
\82é
\81D
\81D
\81D");
1839 u.uachieve.enter_gehennom = 1;
1841 /* in case we've managed to bypass the Valley's stairway down */
1842 if (Inhell && !Is_valley(&u.uz))
1843 u.uevent.gehennom_entered = 1;
1846 static const char *const fam_msgs[4] = {
1848 "You have a sense of deja vu.",
1850 "
\8aù
\8e\8b\8a´
\82É
\82¨
\82»
\82í
\82ê
\82½
\81D",
1852 "You feel like you've been here before.",
1854 "
\91O
\82É
\82±
\82±
\82É
\97\88\82½
\82±
\82Æ
\82ª
\82 \82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D",
1856 "This place %s familiar...", 0 /* no message */
1858 "
\82±
\82Ì
\8fê
\8f\8a\82Í
\89ù
\82©
\82µ
\82¢
\81D
\81D
\81D", 0 /* no message */
1861 static const char *const halu_fam_msgs[4] = {
1863 "Whoa! Everything %s different.",
1865 "
\83I
\83\8f\83b
\81I
\82Ü
\82Á
\82½
\82
\95Ï
\82í
\82Á
\82¿
\82Ü
\82Á
\82Ä
\82é
\81D",
1867 "You are surrounded by twisty little passages, all alike.",
1869 "
\82 \82È
\82½
\82Í
\82Ü
\82ª
\82è
\82
\82Ë
\82Á
\82½
\92Ê
\98H
\82É
\82©
\82±
\82Ü
\82ê
\82Ä
\82¢
\82½
\81D
\81D
\81D",
1871 "Gee, this %s like uncle Conan's place...", 0 /* no message */
1873 "
\83Q
\81[
\81I
\83R
\83i
\83\93\82¨
\82¶
\82³
\82ñ
\82Ì
\8fê
\8f\8a\82É
\8e\97\82Ä
\82¢
\82é
\81D
\81D
\81D", 0 /* no message */
1883 mesg = halu_fam_msgs[which];
1885 mesg = fam_msgs[which];
1886 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\82»
\82±
\82Ü
\82Å
\82µ
\82È
\82¢*/
1887 if (mesg && index(mesg, '%')) {
1888 Sprintf(buf, mesg, !Blind ? "looks" : "seems");
1896 /* special location arrival messages/events */
1897 if (In_endgame(&u.uz)) {
1898 if (new &&on_level(&u.uz, &astral_level))
1899 final_level(); /* guardian angel,&c */
1900 else if (newdungeon && u.uhave.amulet)
1901 resurrect(); /* force confrontation with Wizard */
1902 } else if (In_quest(&u.uz)) {
1903 onquest(); /* might be reaching locate|goal level */
1904 } else if (In_V_tower(&u.uz)) {
1905 if (newdungeon && In_hell(&u.uz0))
1907 pline_The("heat and smoke are gone.");
1909 pline("
\94M
\82Æ
\89\8c\82è
\82Í
\8fÁ
\82¦
\82³
\82Á
\82½
\81D");
1910 } else if (Is_knox(&u.uz)) {
1911 /* alarm stops working once Croesus has died */
1912 if (new || !mvitals[PM_CROESUS].died) {
1914 You("have penetrated a high security area!");
1916 You("
\8dÅ
\8d\82\8b@
\96§
\82Ì
\8fê
\8f\8a\82Ö
\93¥
\82Ý
\8d\9e\82ñ
\82¾
\81I");
1918 pline("An alarm sounds!");
1920 pline("
\8cx
\95ñ
\82ª
\82È
\82Á
\82½
\81I");
1921 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1922 if (DEADMONSTER(mtmp))
1924 mtmp->msleeping = 0;
1928 if (new && Is_rogue_level(&u.uz))
1930 You("enter what seems to be an older, more primitive world.");
1932 You("
\8cÃ
\82
\82³
\82
\81C
\82¸
\82¢
\82Ô
\82ñ
\92P
\8f\83\82È
\90¢
\8aE
\82É
\8c©
\82¦
\82é
\95\94\89®
\82É
\93ü
\82Á
\82½
\81D");
1933 /* main dungeon message from your quest leader */
1935 if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest")
1937 if (!In_quest(&u.uz0) && at_dgn_entrance("
\83N
\83G
\83X
\83g")
1938 && !(u.uevent.qcompleted || u.uevent.qexpelled
1939 || quest_status.leader_is_dead)) {
1940 if (!u.uevent.qcalled) {
1941 u.uevent.qcalled = 1;
1942 com_pager(2); /* main "leader needs help" message */
1943 } else { /* reminder message */
1944 com_pager(Role_if(PM_ROGUE) ? 4 : 3);
1949 assign_level(&u.uz0, &u.uz); /* reset u.uz0 */
1951 save_currentstate();
1954 if ((annotation = get_annotation(&u.uz)) != 0)
1956 You("remember this level as %s.", annotation);
1958 You("
\82±
\82Ì
\8aK
\82ª%s
\82Å
\82 \82é
\82±
\82Æ
\82ð
\8ev
\82¢
\8fo
\82µ
\82½
\81D", annotation);
1960 /* assume this will always return TRUE when changing level */
1961 (void) in_out_region(u.ux, u.uy);
1964 /* discard context which applied to previous level */
1965 maybe_reset_pick(); /* for door or for box not accompanying hero */
1966 reset_trapset(); /* even if to-be-armed trap obj is accompanying hero */
1967 iflags.travelcc.x = iflags.travelcc.y = -1; /* travel destination cache */
1968 context.polearm.hitmon = (struct monst *) 0; /* polearm target */
1969 /* digging context is level-aware and can actually be resumed if
1970 hero returns to the previous level without any intervening dig */
1978 /* reset monster hostility relative to player */
1979 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1980 if (DEADMONSTER(mtmp))
1982 reset_hostility(mtmp);
1985 /* create some player-monsters */
1986 create_mplayers(rn1(4, 3), TRUE);
1988 /* create a guardian angel next to player, if worthy */
1989 gain_guardian_angel();
1992 static char *dfr_pre_msg = 0, /* pline() before level change */
1993 *dfr_post_msg = 0; /* pline() after level change */
1995 /* change levels at the end of this turn, after monsters finish moving */
1997 schedule_goto(tolev, at_stairs, falling, portal_flag, pre_msg, post_msg)
1999 boolean at_stairs, falling;
2001 const char *pre_msg, *post_msg;
2003 int typmask = 0100; /* non-zero triggers `deferred_goto' */
2005 /* destination flags (`goto_level' args) */
2012 if (portal_flag < 0)
2013 typmask |= 0200; /* flag for portal removal */
2014 u.utotype = typmask;
2015 /* destination level */
2016 assign_level(&u.utolev, tolev);
2019 dfr_pre_msg = dupstr(pre_msg);
2021 dfr_post_msg = dupstr(post_msg);
2024 /* handle something like portal ejection */
2028 if (!on_level(&u.uz, &u.utolev)) {
2030 int typmask = u.utotype; /* save it; goto_level zeroes u.utotype */
2032 assign_level(&dest, &u.utolev);
2034 pline1(dfr_pre_msg);
2035 goto_level(&dest, !!(typmask & 1), !!(typmask & 2), !!(typmask & 4));
2036 if (typmask & 0200) { /* remove portal */
2037 struct trap *t = t_at(u.ux, u.uy);
2045 pline1(dfr_post_msg);
2047 u.utotype = 0; /* our caller keys off of this */
2049 free((genericptr_t) dfr_pre_msg), dfr_pre_msg = 0;
2051 free((genericptr_t) dfr_post_msg), dfr_post_msg = 0;
2055 * Return TRUE if we created a monster for the corpse. If successful, the
2059 revive_corpse(corpse)
2062 struct monst *mtmp, *mcarry;
2063 boolean is_uwep, chewed;
2066 struct obj *container = (struct obj *) 0;
2067 int container_where = 0;
2069 where = corpse->where;
2070 is_uwep = (corpse == uwep);
2071 chewed = (corpse->oeaten != 0);
2074 corpse_xname(corpse, chewed ? "bite-covered" : (const char *) 0,
2076 corpse_xname(corpse, chewed ? "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½" : (const char *) 0,
2078 mcarry = (where == OBJ_MINVENT) ? corpse->ocarry : 0;
2080 if (where == OBJ_CONTAINED) {
2081 struct monst *mtmp2;
2083 container = corpse->ocontainer;
2085 get_container_location(container, &container_where, (int *) 0);
2086 /* container_where is the outermost container's location even if
2088 if (container_where == OBJ_MINVENT && mtmp2)
2091 mtmp = revive(corpse, FALSE); /* corpse is gone if successful */
2098 pline_The("%s writhes out of your grasp!", cname);
2100 pline_The("%s
\82Í
\82à
\82ª
\82¢
\82½
\81I", cname);
2103 You_feel("squirming in your backpack!");
2105 pline("
\94w
\95\89\82¢
\91Ü
\82Å
\89½
\82©
\82ª
\82à
\82ª
\82¢
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I");
2109 if (cansee(mtmp->mx, mtmp->my))
2111 pline("%s rises from the dead!",
2112 chewed ? Adjmonnam(mtmp, "bite-covered")
2115 pline("%s
\82ª
\91h
\82Á
\82½
\81I",
2116 chewed ? Adjmonnam(mtmp, "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½")
2121 case OBJ_MINVENT: /* probably a nymph's */
2122 if (cansee(mtmp->mx, mtmp->my)) {
2123 if (canseemon(mcarry))
2125 pline("Startled, %s drops %s as it revives!",
2126 mon_nam(mcarry), an(cname));
2128 pline("%s
\82ª
\90¶
\82«
\82©
\82¦
\82Á
\82½
\82Ì
\82É
\82Ñ
\82Á
\82
\82è
\82µ
\82Ä
\81C%s
\82Í%s
\82ð
\97\8e\82µ
\82½
\81I",
2129 cname, mon_nam(mcarry), cname);
2133 pline("%s suddenly appears!",
2134 chewed ? Adjmonnam(mtmp, "bite-covered")
2137 pline("%s
\82ª
\93Ë
\91R
\8c»
\82í
\82ê
\82½
\81I",
2138 chewed ? Adjmonnam(mtmp, "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½")
2143 case OBJ_CONTAINED: {
2144 char sackname[BUFSZ];
2146 if (container_where == OBJ_MINVENT && cansee(mtmp->mx, mtmp->my)
2147 && mcarry && canseemon(mcarry) && container) {
2149 pline("%s writhes out of %s!", Amonnam(mtmp),
2151 pline("%s
\82Í%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\82à
\82ª
\82¢
\82½
\81I", Amonnam(mtmp),
2153 } else if (container_where == OBJ_INVENT && container) {
2154 Strcpy(sackname, an(xname(container)));
2156 pline("%s %s out of %s in your pack!",
2157 Blind ? Something : Amonnam(mtmp),
2158 locomotion(mtmp->data, "writhes"), sackname);
2160 pline("%s
\82Í
\91Ü
\82Ì
\92\86\82Å%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\82à
\82ª
\82¢
\82½
\81I",
2161 Blind ? Something : Amonnam(mtmp),
2164 } else if (container_where == OBJ_FLOOR && container
2165 && cansee(mtmp->mx, mtmp->my)) {
2166 Strcpy(sackname, an(xname(container)));
2168 pline("%s escapes from %s!", Amonnam(mtmp), sackname);
2170 pline("%s
\82Í%s
\82©
\82ç
\93¦
\82ê
\82½
\81I", Amonnam(mtmp), sackname);
2175 /* we should be able to handle the other cases... */
2176 impossible("revive_corpse: lost corpse @ %d", where);
2184 /* Revive the corpse via a timeout. */
2187 revive_mon(arg, timeout)
2189 long timeout UNUSED;
2191 struct obj *body = arg->a_obj;
2192 struct permonst *mptr = &mons[body->corpsenm];
2196 /* corpse will revive somewhere else if there is a monster in the way;
2197 Riders get a chance to try to bump the obstacle out of their way */
2198 if ((mptr->mflags3 & M3_DISPLACES) != 0 && body->where == OBJ_FLOOR
2199 && get_obj_location(body, &x, &y, 0) && (mtmp = m_at(x, y)) != 0) {
2200 boolean notice_it = canseemon(mtmp); /* before rloc() */
2201 char *monname = Monnam(mtmp);
2203 if (rloc(mtmp, TRUE)) {
2204 if (notice_it && !canseemon(mtmp))
2206 pline("%s vanishes.", monname);
2208 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81D", monname);
2209 else if (!notice_it && canseemon(mtmp))
2211 pline("%s appears.", Monnam(mtmp)); /* not pre-rloc monname */
2213 pline("%s
\82ª
\8c»
\82ê
\82½
\81D", Monnam(mtmp)); /* not pre-rloc monname */
2215 else if (notice_it && dist2(mtmp->mx, mtmp->my, x, y) > 2)
2217 pline("%s teleports.", monname); /* saw it and still see it */
2219 pline("%s
\82Í
\8fu
\8aÔ
\88Ú
\93®
\82µ
\82½
\81D", monname); /* saw it and still see it */
2224 /* if we succeed, the corpse is gone */
2225 if (!revive_corpse(body)) {
2229 if (is_rider(mptr) && rn2(99)) { /* Rider usually tries again */
2230 action = REVIVE_MON;
2231 for (when = 3L; when < 67L; when++)
2234 } else { /* rot this corpse away */
2236 You_feel("%sless hassled.", is_rider(mptr) ? "much " : "");
2238 You("
\94Y
\82Ý
\8e\96\82ª%s
\8c¸
\82Á
\82½
\8bC
\82ª
\82µ
\82½
\81D", is_rider(mptr) ? "
\82Æ
\82Ä
\82à" : "");
2239 action = ROT_CORPSE;
2240 when = 250L - (monstermoves - body->age);
2244 (void) start_timer(when, TIMER_OBJECT, action, arg);
2251 return 1; /* Do nothing, but let other things happen */
2267 pline("You've got the glop off.");
2269 You("%s
\82©
\82ç
\83l
\83o
\83l
\83o
\82ª
\82Æ
\82ê
\82½
\81D", body_part(FACE));
2271 if (!gulp_blnd_check()) {
2273 make_blinded(0L, TRUE);
2276 } else if (!u.ucreamed) {
2278 Your("%s feels clean now.", body_part(FACE));
2280 Your("%s
\82Í
\82«
\82ê
\82¢
\82É
\82È
\82Á
\82½
\81D", body_part(FACE));
2283 return 1; /* still busy */
2290 static NEARDATA char buf[39];
2293 Sprintf(buf, "wiping off your %s", body_part(FACE));
2295 Sprintf(buf, "%s
\82ð
\90@
\82¢
\82Ä
\82¢
\82é", body_part(FACE));
2296 set_occupation(wipeoff, buf, 0);
2297 /* Not totally correct; what if they change back after now
2298 * but before they're finished wiping?
2303 Your("%s is already clean.", body_part(FACE));
2305 Your("%s
\82Í
\89\98\82ê
\82Ä
\82¢
\82È
\82¢
\81D", body_part(FACE));
2310 set_wounded_legs(side, timex)
2315 * If you are riding, your steed gets the wounded legs instead.
2316 * You still call this function, but don't lose hp.
2317 * Caller is also responsible for adjusting messages.
2320 if (!Wounded_legs) {
2325 if (!Wounded_legs || (HWounded_legs & TIMEOUT))
2326 HWounded_legs = timex;
2327 EWounded_legs = side;
2328 (void) encumber_msg();
2335 if (ATEMP(A_DEX) < 0) {
2341 const char *legs = body_part(LEG);
2344 if ((EWounded_legs & BOTH_SIDES) == BOTH_SIDES)
2345 legs = makeplural(legs);
2346 /* this used to say "somewhat better" but that was
2347 misleading since legs are being fully healed */
2348 Your("%s %s better.", legs, vtense(legs, "feel"));
2350 Your("%s
\82Í
\89ñ
\95\9c\82µ
\82½
\81D", body_part(LEG));
2354 HWounded_legs = EWounded_legs = 0;
2356 /* Wounded_legs reduces carrying capacity, so we want
2357 an encumbrance check when they're healed. However,
2358 while dismounting, first steed's legs get healed,
2359 then hero is dropped to floor and a new encumbrance
2360 check is made [in dismount_steed()]. So don't give
2361 encumbrance feedback during the dismount stage
2362 because it could seem to be shown out of order and
2363 it might be immediately contradicted [able to carry
2364 more when steed becomes healthy, then possible floor
2365 feedback, then able to carry less when back on foot]. */
2366 if (!in_steed_dismounting)
2367 (void) encumber_msg();