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-2018 */
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);
408 pline_The("sink vanishes.");
410 pline("
\97¬
\82µ
\91ä
\82Í
\8fÁ
\82¦
\82½
\81D");
414 /* Teleports the sink at the player's position;
415 return True if sink teleported. */
428 eng = engr_at(cx, cy);
429 } while ((levl[cx][cy].typ != ROOM || trp || eng || cansee(cx, cy))
432 if (levl[cx][cy].typ == ROOM && !trp && !eng) {
433 /* create sink at new position */
434 levl[cx][cy].typ = SINK;
435 levl[cx][cy].looted = levl[u.ux][u.uy].looted;
437 /* remove old sink */
438 levl[u.ux][u.uy].typ = ROOM;
439 levl[u.ux][u.uy].looted = 0;
446 /* obj is a ring being dropped over a kitchen sink */
449 register struct obj *obj;
451 struct obj *otmp, *otmp2;
452 boolean ideed = TRUE;
453 boolean nosink = FALSE;
456 You("drop %s down the drain.", doname(obj));
458 You("%s
\82ð
\94r
\90\85\8cû
\82É
\97\8e\82µ
\82½
\81D", doname(obj));
459 obj->in_use = TRUE; /* block free identification via interrupt */
460 switch (obj->otyp) { /* effects that can be noticed without eyes */
463 You("thought %s got lost in the sink, but there it is!", yname(obj));
465 You("%s
\82ð
\8e¸
\82Á
\82½
\8bC
\82ª
\82µ
\82½
\82ª
\81C
\8bC
\82Ì
\82¹
\82¢
\82¾
\82Á
\82½
\81I", yname(obj));
467 case RIN_SLOW_DIGESTION:
469 pline_The("ring is regurgitated!");
471 pline("
\8ew
\97Ö
\82Í
\8bt
\97¬
\82µ
\82½
\81I");
479 pline_The("sink quivers upward for a moment.");
481 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu
\81C
\8fã
\89º
\82É
\90k
\82¦
\82½
\81D");
483 case RIN_POISON_RESISTANCE:
485 You("smell rotten %s.", makeplural(fruitname(FALSE)));
487 pline("
\95\85\82Á
\82½%s
\82Ì
\82æ
\82¤
\82È
\93õ
\82¢
\82ª
\82µ
\82½
\81D", fruitname(FALSE));
489 case RIN_AGGRAVATE_MONSTER:
491 pline("Several %s buzz angrily around the sink.",
492 Hallucination ? makeplural(rndmonnam(NULL)) : "flies");
494 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",
495 Hallucination ? rndmonnam(NULL) : "
\83n
\83G");
498 case RIN_SHOCK_RESISTANCE:
500 pline("Static electricity surrounds the sink.");
502 pline("
\97¬
\82µ
\91ä
\82ª
\83s
\83\8a\83s
\83\8a\82µ
\82Í
\82¶
\82ß
\82½
\81D");
506 You_hear("loud noises coming from the drain.");
508 You_hear("
\94r
\90\85\8cû
\82©
\82ç
\82Ì
\91å
\82«
\82È
\89¹
\82ð
\95·
\82¢
\82½
\81D");
510 case RIN_SUSTAIN_ABILITY: /* KMH */
512 pline_The("%s flow seems fixed.", hliquid("water"));
514 pline("%s
\82Ì
\97¬
\82ê
\82ª
\88ê
\92è
\82É
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D", hliquid("
\90\85"));
516 case RIN_GAIN_STRENGTH:
518 pline_The("%s flow seems %ser now.",
520 (obj->spe < 0) ? "weak" : "strong");
522 pline("%s
\82Ì
\97¬
\82ê
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
524 (obj->spe < 0) ? "
\8eã" : "
\8b");
527 case RIN_GAIN_CONSTITUTION:
529 pline_The("%s flow seems %ser now.",
531 (obj->spe < 0) ? "less" : "great");
533 pline("
\97¬
\82ê
\82é%s
\82Ì
\97Ê
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
535 (obj->spe < 0) ? "
\8f
\82È" : "
\91½");
538 case RIN_INCREASE_ACCURACY: /* KMH */
540 pline_The("%s flow %s the drain.",
542 (obj->spe < 0) ? "misses" : "hits");
544 pline("%s
\82ª
\94r
\90\85\8cû%s
\82æ
\82¤
\82É
\82È
\82Á
\82½
\81D",
546 (obj->spe < 0) ? "
\82©
\82ç
\94½
\82ê
\82é" : "
\82ß
\82ª
\82¯
\82Ä
\97¬
\82ê
\82é");
549 case RIN_INCREASE_DAMAGE:
551 pline_The("water's force seems %ser now.",
552 (obj->spe < 0) ? "small" : "great");
554 pline("
\90\85\82Ì
\90¨
\82¢
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
555 (obj->spe < 0) ? "
\8eã" : "
\8b");
560 for (otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp2) {
561 otmp2 = otmp->nexthere;
562 if (otmp != uball && otmp != uchain
563 && !obj_resists(otmp, 1, 99)) {
566 pline("Suddenly, %s %s from the sink!", doname(otmp),
567 otense(otmp, "vanish"));
569 pline("
\93Ë
\91R
\81C%s
\82Í
\97¬
\82µ
\91ä
\82©
\82ç
\8fÁ
\82¦
\82½
\81I", doname(otmp));
578 /* Not the same as aggravate monster; besides, it's obvious. */
580 pline("Several flies buzz around the sink.");
582 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");
584 case RIN_TELEPORTATION:
585 nosink = teleport_sink();
586 /* give message even if blind; we know we're not levitating,
587 so can feel the outcome even if we can't directly see it */
589 pline_The("sink %svanishes.", nosink ? "" : "momentarily ");
591 pline_The("
\97¬
\82µ
\91ä
\82Í%s
\8fÁ
\82¦
\82½
\81D", nosink ? "" : "
\88ê
\8fu");
597 /* for S_room case, same message as for teleportation is given */
598 ideed = (levl[u.ux][u.uy].typ != ROOM);
604 if (!Blind && !ideed) {
606 switch (obj->otyp) { /* effects that need eyes */
609 pline_The("faucets flash brightly for a moment.");
611 pline("
\8eÖ
\8cû
\82Í
\88ê
\8fu
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
613 case RIN_REGENERATION:
615 pline_The("sink looks as good as new.");
617 pline("
\97¬
\82µ
\91ä
\82ª
\90V
\95i
\82Ì
\82æ
\82¤
\82É
\82È
\82Á
\82½
\81D");
619 case RIN_INVISIBILITY:
621 You("don't see anything happen to the sink.");
623 pline("
\97¬
\82µ
\91ä
\82É
\89½
\82ª
\8bN
\82«
\82½
\82Ì
\82©
\8c©
\82¦
\82È
\82©
\82Á
\82½
\81D");
625 case RIN_FREE_ACTION:
627 You_see("the ring slide right down the drain!");
629 pline("
\8ew
\97Ö
\82ª
\94r
\90\85\8cû
\82ð
\82·
\82é
\82è
\82Æ
\94ð
\82¯
\82é
\82Ì
\82ð
\8c©
\82½
\81I");
631 case RIN_SEE_INVISIBLE:
633 You_see("some %s in the sink.",
634 Hallucination ? "oxygen molecules" : "air");
636 pline("
\97¬
\82µ
\91ä
\82Ì
\8fã
\82Ì%s
\82ª
\8c©
\82¦
\82½
\81D",
637 Hallucination ? "
\8e_
\91f
\95ª
\8eq" : "
\8bó
\8bC");
642 pline_The("sink seems to blend into the floor for a moment.");
644 pline("
\88ê
\8fu
\81C
\97¬
\82µ
\91ä
\82ª
\8f°
\82É
\97n
\82¯
\82±
\82ñ
\82¾
\82æ
\82¤
\82É
\8c©
\82¦
\82½
\81D");
646 case RIN_FIRE_RESISTANCE:
648 pline_The("hot %s faucet flashes brightly for a moment.",
650 #else /*
\82Æ
\82è
\82 \82¦
\82¸hliquid()
\82Í
\8eg
\82í
\82È
\82¢
\8c`
\82É*/
651 pline("
\88ê
\8fu
\81C
\94M
\93\92\82Ì
\8eÖ
\8cû
\82ª
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
654 case RIN_COLD_RESISTANCE:
656 pline_The("cold %s faucet flashes brightly for a moment.",
658 #else /*
\82Æ
\82è
\82 \82¦
\82¸hliquid()
\82Í
\8eg
\82í
\82È
\82¢
\8c`
\82É*/
659 pline("
\88ê
\8fu
\81C
\97â
\90\85\82Ì
\8eÖ
\8cû
\82ª
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
662 case RIN_PROTECTION_FROM_SHAPE_CHAN:
664 pline_The("sink looks nothing like a fountain.");
666 pline("
\97¬
\82µ
\91ä
\82Í
\90ò
\82Æ
\82Í
\82Ü
\82Á
\82½
\82
\88á
\82¤
\82à
\82Ì
\82Ì
\82æ
\82¤
\82É
\8c©
\82¦
\82½
\81D");
670 pline_The("sink glows %s for a moment.",
671 hcolor((obj->spe < 0) ? NH_BLACK : NH_SILVER));
673 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu%s
\8bP
\82¢
\82½
\81D",
674 jconj_adj(hcolor((obj->spe < 0) ? NH_BLACK : NH_SILVER)));
679 pline_The("sink glows %s for a moment.", hcolor(NH_WHITE));
681 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu%s
\8bP
\82¢
\82½
\81D", jconj_adj(hcolor(NH_WHITE)));
683 case RIN_TELEPORT_CONTROL:
684 /*JP: "beam aboard"
\82Í
\83X
\83^
\81[
\83g
\83\8c\83b
\83N
\82Ì
\81u
\93]
\91\97\81v*/
686 pline_The("sink looks like it is being beamed aboard somewhere.");
688 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");
690 case RIN_POLYMORPH_CONTROL:
693 "sink momentarily looks like a regularly erupting geyser.");
695 "
\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");
705 You_hear("the ring bouncing down the drainpipe.");
707 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");
709 if (!rn2(20) && !nosink) {
711 pline_The("sink backs up, leaving %s.", doname(obj));
713 pline("
\97¬
\82µ
\91ä
\82ª
\8bt
\97¬
\82µ
\82Ä
\81C%s
\82ª
\96ß
\82Á
\82Ä
\82«
\82½
\81D", doname(obj));
716 } else if (!rn2(5)) {
726 /* some common tests when trying to drop or throw items */
732 if (obj->owornmask & (W_ARMOR | W_ACCESSORY)) {
735 Norep("You cannot %s %s you are wearing.", word, something);
737 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);
740 if (obj->otyp == LOADSTONE && obj->cursed) {
741 /* getobj() kludge sets corpsenm to user's specified count
742 when refusing to split a stack of cursed loadstones */
744 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
745 /* getobj() ignores a count for throwing since that is
746 implicitly forced to be 1; replicate its kludge... */
747 if (!strcmp(word, "throw") && obj->quan > 1L)
751 pline("For some reason, you cannot %s%s the stone%s!", word,
752 obj->corpsenm ? " any of" : "", plur(obj->quan));
754 pline("
\82Ç
\82¤
\82¢
\82¤
\82í
\82¯
\82©
\81C
\82 \82È
\82½
\82Í
\90Î
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81I",
758 obj->corpsenm = 0; /* reset */
762 if (obj->otyp == LEASH && obj->leashmon != 0) {
765 pline_The("leash is tied around your %s.", body_part(HAND));
767 pline("
\95R
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D", body_part(HAND));
770 if (obj->owornmask & W_SADDLE) {
773 You("cannot %s %s you are sitting on.", word, something);
775 You("
\8fæ
\82Á
\82Ä
\82¢
\82é
\8aÔ
\82Í%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", word);
783 register struct obj *obj;
788 if (!canletgo(obj, "drop"))
790 if (!canletgo(obj, "
\92u
\82"))
797 setuwep((struct obj *) 0);
799 if (obj == uquiver) {
800 setuqwep((struct obj *) 0);
802 if (obj == uswapwep) {
803 setuswapwep((struct obj *) 0);
807 /* barrier between you and the floor */
811 /* doname can call s_suffix, reusing its buffer */
812 Strcpy(buf, s_suffix(mon_nam(u.ustuck)));
814 You("drop %s into %s %s.", doname(obj), buf,
815 mbodypart(u.ustuck, STOMACH));
817 You("%s
\82ð%s%s
\82É
\92u
\82¢
\82½
\81D", doname(obj), buf,
818 mbodypart(u.ustuck, STOMACH));
822 if ((obj->oclass == RING_CLASS || obj->otyp == MEAT_RING)
823 && IS_SINK(levl[u.ux][u.uy].typ)) {
827 if (!can_reach_floor(TRUE)) {
828 /* we might be levitating due to #invoke Heart of Ahriman;
829 if so, levitation would end during call to freeinv()
830 and we want hitfloor() to happen before float_down() */
831 boolean levhack = finesse_ahriman(obj);
834 ELevitation = W_ART; /* other than W_ARTI */
837 You("drop %s.", doname(obj));
839 You("%s
\82ð
\92u
\82¢
\82½
\81D", doname(obj));
840 /* Ensure update when we drop gold objects */
841 if (obj->oclass == COIN_CLASS)
846 float_down(I_SPECIAL | TIMEOUT, W_ARTI | W_ART);
849 if (!IS_ALTAR(levl[u.ux][u.uy].typ) && flags.verbose)
851 You("drop %s.", doname(obj));
853 You("%s
\82ð
\92u
\82¢
\82½
\81D", doname(obj));
859 /* dropx - take dropped item out of inventory;
860 called in several places - may produce output
861 (eg ship_object() and dropy() -> sellobj() both produce output) */
864 register struct obj *obj;
866 /* Ensure update when we drop gold objects */
867 if (obj->oclass == COIN_CLASS)
871 if (ship_object(obj, u.ux, u.uy, FALSE))
873 if (IS_ALTAR(levl[u.ux][u.uy].typ))
874 doaltarobj(obj); /* set bknown */
879 /* dropy - put dropped object at destination; called from lots of places */
887 /* dropz - really put dropped object at its destination... */
889 dropz(obj, with_impact)
894 setuwep((struct obj *) 0);
896 setuqwep((struct obj *) 0);
898 setuswapwep((struct obj *) 0);
901 if (!u.uswallow && flooreffects(obj, u.ux, u.uy, "drop"))
903 if (!u.uswallow && flooreffects(obj,u.ux,u.uy, "
\97\8e\82¿
\82é"))
905 /* uswallow check done by GAN 01/29/87 */
907 boolean could_petrify = FALSE;
908 boolean could_poly = FALSE;
909 boolean could_slime = FALSE;
910 boolean could_grow = FALSE;
911 boolean could_heal = FALSE;
913 if (obj != uball) { /* mon doesn't pick up ball */
914 if (obj->otyp == CORPSE) {
915 could_petrify = touch_petrifies(&mons[obj->corpsenm]);
916 could_poly = polyfodder(obj);
917 could_slime = (obj->corpsenm == PM_GREEN_SLIME);
918 could_grow = (obj->corpsenm == PM_WRAITH);
919 could_heal = (obj->corpsenm == PM_NURSE);
921 (void) mpickobj(u.ustuck, obj);
922 if (is_animal(u.ustuck->data)) {
923 if (could_poly || could_slime) {
924 (void) newcham(u.ustuck,
925 could_poly ? (struct permonst *) 0
926 : &mons[PM_GREEN_SLIME],
928 delobj(obj); /* corpse is digested */
929 } else if (could_petrify) {
930 minstapetrify(u.ustuck, TRUE);
931 /* Don't leave a cockatrice corpse in a statue */
934 } else if (could_grow) {
935 (void) grow_up(u.ustuck, (struct monst *) 0);
936 delobj(obj); /* corpse is digested */
937 } else if (could_heal) {
938 u.ustuck->mhp = u.ustuck->mhpmax;
939 delobj(obj); /* corpse is digested */
944 place_object(obj, u.ux, u.uy);
946 container_impact_dmg(obj, u.ux, u.uy);
948 drop_ball(u.ux, u.uy);
949 else if (level.flags.has_shop)
950 sellobj(obj, u.ux, u.uy);
952 if (Blind && Levitation)
954 newsym(u.ux, u.uy); /* remap location under self */
958 /* things that must change when not held; recurse into containers.
959 Called for both player and monsters */
961 obj_no_longer_held(obj)
966 } else if (Has_contents(obj)) {
967 struct obj *contents;
969 for (contents = obj->cobj; contents; contents = contents->nobj)
970 obj_no_longer_held(contents);
974 /* Normal crysknife reverts to worm tooth when not held by hero
975 * or monster; fixed crysknife has only 10% chance of reverting.
976 * When a stack of the latter is involved, it could be worthwhile
977 * to give each individual crysknife its own separate 10% chance,
978 * but we aren't in any position to handle stack splitting here.
980 if (!obj->oerodeproof || !rn2(10)) {
981 /* if monsters aren't moving, assume player is responsible */
982 if (!context.mon_moving && !program_state.gameover)
983 costly_alteration(obj, COST_DEGRD);
984 obj->otyp = WORM_TOOTH;
985 obj->oerodeproof = 0;
991 /* 'D' command: drop several things */
999 You("have nothing to drop.");
1001 You("
\97\8e\82Æ
\82·
\82à
\82Ì
\82ð
\89½
\82à
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D");
1004 add_valid_menu_class(0); /* clear any classes already there */
1006 sellobj_state(SELL_DELIBERATE);
1007 if (flags.menu_style != MENU_TRADITIONAL
1008 || (result = ggetobj("drop", drop, 0, FALSE, (unsigned *) 0)) < -1)
1009 result = menu_drop(result);
1011 sellobj_state(SELL_NORMAL);
1013 reset_occupations();
1018 /* Drop things from the hero's inventory, using a menu. */
1023 int n, i, n_dropped = 0;
1025 struct obj *otmp, *otmp2;
1026 menu_item *pick_list;
1027 boolean all_categories = TRUE;
1028 boolean drop_everything = FALSE;
1031 all_categories = (retry == -2);
1032 } else if (flags.menu_style == MENU_FULL) {
1033 all_categories = FALSE;
1035 n = query_category("Drop what type of items?", invent,
1037 n = query_category("
\82Ç
\82Ì
\8eí
\97Þ
\82Ì
\83A
\83C
\83e
\83\80\82ð
\92u
\82«
\82Ü
\82·
\82©
\81H", invent,
1038 UNPAID_TYPES | ALL_TYPES | CHOOSE_ALL | BUC_BLESSED
1039 | BUC_CURSED | BUC_UNCURSED | BUC_UNKNOWN,
1040 &pick_list, PICK_ANY);
1043 for (i = 0; i < n; i++) {
1044 if (pick_list[i].item.a_int == ALL_TYPES_SELECTED)
1045 all_categories = TRUE;
1046 else if (pick_list[i].item.a_int == 'A')
1047 drop_everything = TRUE;
1049 add_valid_menu_class(pick_list[i].item.a_int);
1051 free((genericptr_t) pick_list);
1052 } else if (flags.menu_style == MENU_COMBINATION) {
1053 unsigned ggoresults = 0;
1055 all_categories = FALSE;
1056 /* Gather valid classes via traditional NetHack method */
1057 i = ggetobj("drop", drop, 0, TRUE, &ggoresults);
1059 all_categories = TRUE;
1060 if (ggoresults & ALL_FINISHED) {
1066 if (drop_everything) {
1068 * Dropping a burning potion of oil while levitating can cause
1069 * an explosion which might destroy some of hero's inventory,
1071 * for (otmp = invent; otmp; otmp = otmp2) {
1072 * otmp2 = otmp->nobj;
1073 * n_dropped += drop(otmp);
1075 * was unreliable and could lead to an "object lost" panic.
1077 * Use the bypass bit to mark items already processed (hence
1078 * not droppable) and rescan inventory until no unbypassed
1081 bypass_objlist(invent, FALSE); /* clear bypass bit for invent */
1082 while ((otmp = nxt_unbypassed_obj(invent)) != 0)
1083 n_dropped += drop(otmp);
1084 /* we might not have dropped everything (worn armor, welded weapon,
1085 cursed loadstones), so reset any remaining inventory to normal */
1086 bypass_objlist(invent, FALSE);
1088 /* should coordinate with perm invent, maybe not show worn items */
1090 n = query_objlist("What would you like to drop?", &invent,
1091 (USE_INVLET | INVORDER_SORT), &pick_list, PICK_ANY,
1092 all_categories ? allow_all : allow_category);
1094 n = query_objlist("
\82Ç
\82ê
\82ð
\92u
\82«
\82Ü
\82·
\82©
\81H", &invent,
1095 (USE_INVLET | INVORDER_SORT), &pick_list, PICK_ANY,
1096 all_categories ? allow_all : allow_category);
1100 * picklist[] contains a set of pointers into inventory, but
1101 * as soon as something gets dropped, they might become stale
1102 * (see the drop_everything code above for an explanation).
1103 * Just checking to see whether one is still in the invent
1104 * chain is not sufficient validation since destroyed items
1105 * will be freed and items we've split here might have already
1106 * reused that memory and put the same pointer value back into
1107 * invent. Ditto for using invlet to validate. So we start
1108 * by setting bypass on all of invent, then check each pointer
1109 * to verify that it is in invent and has that bit set.
1111 bypass_objlist(invent, TRUE);
1112 for (i = 0; i < n; i++) {
1113 otmp = pick_list[i].item.a_obj;
1114 for (otmp2 = invent; otmp2; otmp2 = otmp2->nobj)
1117 if (!otmp2 || !otmp2->bypass)
1119 /* found next selected invent item */
1120 cnt = pick_list[i].count;
1121 if (cnt < otmp->quan) {
1124 } else if (otmp->otyp == LOADSTONE && otmp->cursed) {
1125 /* same kludge as getobj(), for canletgo()'s use */
1126 otmp->corpsenm = (int) cnt; /* don't split */
1128 otmp = splitobj(otmp, cnt);
1131 n_dropped += drop(otmp);
1133 bypass_objlist(invent, FALSE); /* reset invent to normal */
1134 free((genericptr_t) pick_list);
1142 /* on a ladder, used in goto_level */
1143 static NEARDATA boolean at_ladder = FALSE;
1145 /* the '>' command */
1149 struct trap *trap = 0;
1150 boolean stairs_down = ((u.ux == xdnstair && u.uy == ydnstair)
1151 || (u.ux == sstairs.sx && u.uy == sstairs.sy
1153 ladder_down = (u.ux == xdnladder && u.uy == ydnladder);
1158 if (stucksteed(TRUE)) {
1161 /* Levitation might be blocked, but player can still use '>' to
1162 turn off controlled levitation */
1163 if (HLevitation || ELevitation) {
1164 if ((HLevitation & I_SPECIAL) || (ELevitation & W_ARTI)) {
1165 /* end controlled levitation */
1166 if (ELevitation & W_ARTI) {
1169 for (obj = invent; obj; obj = obj->nobj) {
1171 && artifact_has_invprop(obj, LEVITATION)) {
1172 if (obj->age < monstermoves)
1173 obj->age = monstermoves;
1174 obj->age += rnz(100);
1178 if (float_down(I_SPECIAL | TIMEOUT, W_ARTI)) {
1179 return 1; /* came down, so moved */
1180 } else if (!HLevitation && !ELevitation) {
1182 Your("latent levitation ceases.");
1184 pline("
\90ö
\8dÝ
\93I
\82È
\95\82\97V
\94\
\97Í
\82ª
\92\86\92f
\82µ
\82½
\81D");
1185 return 1; /* did something, effectively moved */
1189 ; /* weren't actually floating after all */
1191 /* Avoid alerting player to an unknown stair or ladder.
1192 * Changes the message for a covered, known staircase
1193 * too; staircase knowledge is not stored anywhere.
1197 (glyph_to_cmap(levl[u.ux][u.uy].glyph) == S_dnstair);
1198 else if (ladder_down)
1200 (glyph_to_cmap(levl[u.ux][u.uy].glyph) == S_dnladder);
1202 if (Is_airlevel(&u.uz))
1204 You("are floating in the %s.", surface(u.ux, u.uy));
1206 You("%s
\82Ì
\92\86\82É
\95\82\82¢
\82Ä
\82¢
\82é
\81D", surface(u.ux, u.uy));
1207 else if (Is_waterlevel(&u.uz))
1209 You("are floating in %s.",
1210 is_pool(u.ux, u.uy) ? "the water" : "a bubble of air");
1212 You("%s
\82Ì
\92\86\82É
\95\82\82¢
\82Ä
\82¢
\82é
\81D",
1213 is_pool(u.ux, u.uy) ? "
\90\85" : "
\8bó
\8bC
\82Ì
\96A");
1217 floating_above(stairs_down ? "stairs" : ladder_down
1219 : surface(u.ux, u.uy));
1221 floating_above(stairs_down ? "
\8aK
\92i" : ladder_down
1223 : surface(u.ux, u.uy));
1225 return 0; /* didn't move */
1227 if (!stairs_down && !ladder_down) {
1228 trap = t_at(u.ux, u.uy);
1229 if (trap && uteetering_at_seen_pit(trap)) {
1230 dotrap(trap, TOOKPLUNGE);
1232 } else if (!trap || (trap->ttyp != TRAPDOOR && trap->ttyp != HOLE)
1233 || !Can_fall_thru(&u.uz) || !trap->tseen) {
1234 if (flags.autodig && !context.nopick && uwep && is_pick(uwep)) {
1235 return use_pick_axe2(uwep);
1238 You_cant("go down here.");
1240 pline("
\82±
\82±
\82Å
\82Í
\8d~
\82è
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
1247 You("are %s, and cannot go down.",
1248 !u.uswallow ? "being held" : is_animal(u.ustuck->data)
1252 You("%s
\8d~
\82è
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1253 !u.uswallow ? "
\82Â
\82©
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82Ä" : is_animal(u.ustuck->data)
1254 ? "
\88ù
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä"
1255 : "
\8aª
\82«
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä");
1259 if (on_level(&valley_level, &u.uz) && !u.uevent.gehennom_entered) {
1261 You("are standing at the gate to Gehennom.");
1263 You("
\83Q
\83w
\83i
\82Ì
\96å
\82Ì
\91O
\82É
\97§
\82Á
\82Ä
\82¢
\82é
\81D");
1265 pline("Unspeakable cruelty and harm lurk down there.");
1267 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");
1269 if (yn("Are you sure you want to enter?") != 'y')
1271 if (yn("
\96{
\93\96\82É
\93ü
\82è
\82Ü
\82·
\82©
\81H") != 'y')
1277 pline("
\82È
\82ç
\8dD
\82«
\82É
\82·
\82ê
\82Î
\82æ
\82¢
\81D");
1278 u.uevent.gehennom_entered = 1; /* don't ask again */
1283 You("are held back by your pet!");
1285 You("
\83y
\83b
\83g
\82É
\88ø
\82«
\82à
\82Ç
\82³
\82ê
\82½
\81I");
1291 You("%s %s.", Flying ? "fly" : locomotion(youmonst.data, "jump"),
1292 trap->ttyp == HOLE ? "down the hole" : "through the trap door");
1295 trap->ttyp == HOLE ? "
\8c\8a\82ð
\8d~
\82è
\82½" : "
\97\8e\82µ
\94à
\82ð
\92Ê
\82è
\94²
\82¯
\82½");
1298 if (trap && Is_stronghold(&u.uz)) {
1299 goto_hell(FALSE, TRUE);
1301 at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
1308 /* the '<' command */
1315 /* "up" to get out of a pit... */
1316 if (u.utrap && u.utraptype == TT_PIT) {
1321 if ((u.ux != xupstair || u.uy != yupstair)
1322 && (!xupladder || u.ux != xupladder || u.uy != yupladder)
1323 && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy
1326 You_cant("go up here.");
1328 You("
\82±
\82±
\82Å
\82Í
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
1331 if (stucksteed(TRUE)) {
1336 You("are %s, and cannot go up.",
1337 !u.uswallow ? "being held" : is_animal(u.ustuck->data)
1341 You("%s
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1342 !u.uswallow ? "
\82Â
\82©
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82Ä" : is_animal(u.ustuck->data)
1343 ? "
\88ù
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä"
1344 : "
\8aª
\82«
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä");
1348 if (near_capacity() > SLT_ENCUMBER) {
1349 /* No levitation check; inv_weight() already allows for it */
1351 Your("load is too heavy to climb the %s.",
1352 levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
1354 You("
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä%s
\82ð
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1355 levl[u.ux][u.uy].typ == STAIRS ? "
\8aK
\92i" : "
\82Í
\82µ
\82²");
1359 if (ledger_no(&u.uz) == 1) {
1361 if (yn("Beware, there will be no return! Still climb?") != 'y')
1363 if (yn("
\8bC
\82ð
\82Â
\82¯
\82ë
\81C
\96ß
\82ê
\82È
\82¢
\82¼
\81I
\82»
\82ê
\82Å
\82à
\8fã
\82é
\81H") != 'y')
1368 You("are held back by your pet!");
1370 You("
\83y
\83b
\83g
\82É
\88ø
\82«
\82à
\82Ç
\82³
\82ê
\82½
\81I");
1373 at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
1379 d_level save_dlevel = { 0, 0 };
1381 /* check that we can write out the current level */
1383 currentlevel_rewrite()
1388 /* since level change might be a bit slow, flush any buffered screen
1389 * output (like "you fall through a trap door") */
1392 fd = create_levelfile(ledger_no(&u.uz), whynot);
1395 * This is not quite impossible: e.g., we may have
1396 * exceeded our quota. If that is the case then we
1397 * cannot leave this level, and cannot save either.
1398 * Another possibility is that the directory was not
1406 if (!savelev(fd, ledger_no(&u.uz), COUNT_SAVE)) {
1408 delete_levelfile(ledger_no(&u.uz));
1410 pline("NetHack is out of disk space for making levels!");
1412 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");
1414 You("can save, quit, or continue playing.");
1416 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");
1429 if (flags.ins_chkpt) {
1430 /* write out just-attained level, with pets and everything */
1431 fd = currentlevel_rewrite();
1435 savelev(fd, ledger_no(&u.uz), WRITE_SAVE);
1439 /* write out non-level state */
1447 register xchar x, y;
1449 return (boolean) ((levl[x][y].typ != ROOM
1450 && levl[x][y].typ != AIR
1451 && levl[x][y].typ != CORR)
1457 goto_level(newlevel, at_stairs, falling, portal)
1459 boolean at_stairs, falling, portal;
1463 boolean cant_go_back, great_effort,
1464 up = (depth(newlevel) < depth(&u.uz)),
1465 newdungeon = (u.uz.dnum != newlevel->dnum),
1466 was_in_W_tower = In_W_tower(u.ux, u.uy, &u.uz),
1468 new = FALSE; /* made a new level? */
1473 if (dunlev(newlevel) > dunlevs_in_dungeon(newlevel))
1474 newlevel->dlevel = dunlevs_in_dungeon(newlevel);
1475 if (newdungeon && In_endgame(newlevel)) { /* 1st Endgame Level !!! */
1476 if (!u.uhave.amulet)
1477 return; /* must have the Amulet */
1478 if (!wizard) /* wizard ^V can bypass Earth level */
1479 assign_level(newlevel, &earth_level); /* (redundant) */
1481 new_ledger = ledger_no(newlevel);
1482 if (new_ledger <= 0)
1483 done(ESCAPED); /* in fact < 0 is impossible */
1485 /* If you have the amulet and are trying to get out of Gehennom,
1486 * going up a set of stairs sometimes does some very strange things!
1487 * Biased against law and towards chaos. (The chance to be sent
1488 * down multiple levels when attempting to go up are significantly
1489 * less than the corresponding comment in older versions indicated
1490 * due to overlooking the effect of the call to assign_rnd_lvl().)
1492 * Odds for making it to the next level up, or of being sent down:
1496 * -1 11.46 12.50 12.5
1500 if (Inhell && up && u.uhave.amulet && !newdungeon && !portal
1501 && (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz) - 3)) {
1503 int odds = 3 + (int) u.ualign.type, /* 2..4 */
1504 diff = odds <= 1 ? 0 : rn2(odds); /* paranoia */
1507 assign_rnd_level(newlevel, &u.uz, diff);
1508 /* if inside the tower, stay inside */
1509 if (was_in_W_tower && !On_W_tower_level(newlevel))
1513 assign_level(newlevel, &u.uz);
1515 new_ledger = ledger_no(newlevel);
1518 pline("A mysterious force momentarily surrounds you...");
1520 pline("
\88ê
\8fu
\8aï
\96
\82È
\97Í
\82ª
\82 \82È
\82½
\82ð
\95ï
\82ñ
\82¾
\81D
\81D
\81D");
1521 if (on_level(newlevel, &u.uz)) {
1522 (void) safe_teleds(FALSE);
1526 at_stairs = at_ladder = FALSE;
1530 /* Prevent the player from going past the first quest level unless
1531 * (s)he has been given the go-ahead by the leader.
1533 if (on_level(&u.uz, &qstart_level) && !newdungeon && !ok_to_quest()) {
1535 pline("A mysterious force prevents you from descending.");
1537 pline("
\8aï
\96
\82È
\97Í
\82ª
\82 \82È
\82½
\82ª
\8d~
\82è
\82é
\82Ì
\82ð
\96W
\82°
\82½
\81D");
1541 if (on_level(newlevel, &u.uz))
1542 return; /* this can happen */
1544 /* tethered movement makes level change while trapped feasible */
1545 if (u.utrap && u.utraptype == TT_BURIEDBALL)
1546 buried_ball_to_punishment(); /* (before we save/leave old level) */
1548 fd = currentlevel_rewrite();
1552 if (falling) /* assuming this is only trap door or hole */
1553 impact_drop((struct obj *) 0, u.ux, u.uy, newlevel->dlevel);
1555 check_special_room(TRUE); /* probably was a trap door */
1558 u.utrap = 0; /* needed in level_tele */
1559 fill_pit(u.ux, u.uy);
1560 u.ustuck = 0; /* idem */
1562 u.uundetected = 0; /* not hidden, even if means are available */
1564 if (u.uswallow) /* idem */
1565 u.uswldtim = u.uswallow = 0;
1566 recalc_mapseen(); /* recalculate map overview before we leave the level */
1568 * We no longer see anything on the level. Make sure that this
1569 * follows u.uswallow set to null since uswallow overrides all
1575 * Save the level we're leaving. If we're entering the endgame,
1576 * we can get rid of all existing levels because they cannot be
1577 * reached any more. We still need to use savelev()'s cleanup
1578 * for the level being left, to recover dynamic memory in use and
1579 * to avoid dangling timers and light sources.
1581 cant_go_back = (newdungeon && In_endgame(newlevel));
1582 if (!cant_go_back) {
1583 update_mlstmv(); /* current monsters are becoming inactive */
1584 bufon(fd); /* use buffered output */
1586 savelev(fd, ledger_no(&u.uz),
1587 cant_go_back ? FREE_SAVE : (WRITE_SAVE | FREE_SAVE));
1590 /* discard unreachable levels; keep #0 */
1591 for (l_idx = maxledgerno(); l_idx > 0; --l_idx)
1592 delete_levelfile(l_idx);
1593 /* mark #overview data for all dungeon branches as uninteresting */
1594 for (l_idx = 0; l_idx < n_dgns; ++l_idx)
1595 remdun_mapseen(l_idx);
1598 if (Is_rogue_level(newlevel) || Is_rogue_level(&u.uz))
1599 assign_graphics(Is_rogue_level(newlevel) ? ROGUESET : PRIMARY);
1601 substitute_tiles(newlevel);
1603 check_gold_symbol();
1604 /* record this level transition as a potential seen branch unless using
1605 * some non-standard means of transportation (level teleport).
1607 if ((at_stairs || falling || portal) && (u.uz.dnum != newlevel->dnum))
1608 recbranch_mapseen(&u.uz, newlevel);
1609 assign_level(&u.uz0, &u.uz);
1610 assign_level(&u.uz, newlevel);
1611 assign_level(&u.utolev, newlevel);
1613 if (!builds_up(&u.uz)) { /* usual case */
1614 if (dunlev(&u.uz) > dunlev_reached(&u.uz))
1615 dunlev_reached(&u.uz) = dunlev(&u.uz);
1617 if (dunlev_reached(&u.uz) == 0
1618 || dunlev(&u.uz) < dunlev_reached(&u.uz))
1619 dunlev_reached(&u.uz) = dunlev(&u.uz);
1621 reset_rndmonst(NON_PM); /* u.uz change affects monster generation */
1623 /* set default level change destination areas */
1624 /* the special level code may override these */
1625 (void) memset((genericptr_t) &updest, 0, sizeof updest);
1626 (void) memset((genericptr_t) &dndest, 0, sizeof dndest);
1628 if (!(level_info[new_ledger].flags & LFILE_EXISTS)) {
1629 /* entering this level for first time; make it now */
1630 if (level_info[new_ledger].flags & (FORGOTTEN | VISITED)) {
1631 impossible("goto_level: returning to discarded level?");
1632 level_info[new_ledger].flags &= ~(FORGOTTEN | VISITED);
1635 new = TRUE; /* made the level */
1637 /* returning to previously visited level; reload it */
1638 fd = open_levelfile(new_ledger, whynot);
1639 if (tricked_fileremoved(fd, whynot)) {
1640 /* we'll reach here if running in wizard mode */
1641 error("Cannot continue this game.");
1643 minit(); /* ZEROCOMP */
1644 getlev(fd, hackpid, new_ledger, FALSE);
1646 oinit(); /* reassign level dependent obj probabilities */
1649 /* do this prior to level-change pline messages */
1650 vision_reset(); /* clear old level's line-of-sight */
1651 vision_full_recalc = 0; /* don't let that reenable vision yet */
1652 flush_screen(-1); /* ensure all map flushes are postponed */
1654 if (portal && !In_endgame(&u.uz)) {
1655 /* find the portal on the new level */
1656 register struct trap *ttrap;
1658 for (ttrap = ftrap; ttrap; ttrap = ttrap->ntrap)
1659 if (ttrap->ttyp == MAGIC_PORTAL)
1663 panic("goto_level: no corresponding portal!");
1665 u_on_newpos(ttrap->tx, ttrap->ty);
1666 } else if (at_stairs && !In_endgame(&u.uz)) {
1669 u_on_newpos(xdnladder, ydnladder);
1670 else if (newdungeon)
1674 /* you climb up the {stairs|ladder};
1675 fly up the stairs; fly up along the ladder */
1676 great_effort = (Punished && !Levitation);
1677 if (flags.verbose || great_effort)
1679 pline("%s %s up%s the %s.",
1680 great_effort ? "With great effort, you" : "You",
1681 Levitation ? "float" : Flying ? "fly" : "climb",
1682 (Flying && at_ladder) ? " along" : "",
1683 at_ladder ? "ladder" : "stairs");
1684 #else /*
\94ò
\82ñ
\82¾
\82è
\82µ
\82Ä
\82¢
\82Ä
\82à
\81u
\8fã
\82Á
\82½
\81v */
1685 pline("%s%s
\82ð
\8fã
\82Á
\82½
\81D",
1686 great_effort ? "
\82â
\82Á
\82Æ
\82±
\82³" : "",
1687 at_ladder ? "
\82Í
\82µ
\82²" : "
\8aK
\92i");
1691 u_on_newpos(xupladder, yupladder);
1692 else if (newdungeon)
1697 ; /* stayed on same level? (no transit effects) */
1698 } else if (Flying) {
1702 at_ladder ? "along the ladder" : "the stairs");
1704 You("%s
\94ò
\82ñ
\82Å
\8d~
\82è
\82½
\81D",
1705 at_ladder ? "
\82Í
\82µ
\82²
\82É
\89\88\82Á
\82Ä" : "
\8aK
\92i
\82ð");
1707 } else if (near_capacity() > UNENCUMBERED
1708 || Punished || Fumbling) {
1710 You("fall down the %s.", at_ladder ? "ladder" : "stairs");
1712 You("%s
\82ð
\93]
\82°
\97\8e\82¿
\82½
\81D", at_ladder ? "
\82Í
\82µ
\82²" : "
\8aK
\92i");
1717 /* falling off steed has its own losehp() call */
1719 dismount_steed(DISMOUNT_FELL);
1721 losehp(Maybe_Half_Phys(rnd(3)),
1723 at_ladder ? "falling off a ladder"
1725 at_ladder ? "
\82Í
\82µ
\82²
\82©
\82ç
\97\8e\82¿
\82Ä"
1727 : "tumbling down a flight of stairs",
1729 : "
\8aK
\92i
\82ð
\93]
\82°
\97\8e\82¿
\82Ä",
1732 selftouch("Falling, you");
1734 selftouch("
\97\8e\82¿
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í");
1735 } else { /* ordinary descent */
1738 You("%s.", at_ladder ? "climb down the ladder"
1739 : "descend the stairs");
1741 You("%s
\82ð
\8d~
\82è
\82½
\81D", at_ladder ? "
\82Í
\82µ
\82²"
1746 } else { /* trap door or level_tele or In_endgame */
1747 u_on_rndspot((up ? 1 : 0) | (was_in_W_tower ? 2 : 0));
1752 selftouch("Falling, you");
1754 selftouch("
\97\8e\82¿
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í");
1760 obj_delivery(FALSE);
1762 kill_genocided_monsters(); /* for those wiped out while in limbo */
1764 * Expire all timers that have gone off while away. Must be
1765 * after migrating monsters and objects are delivered
1766 * (losedogs and obj_delivery).
1772 if ((mtmp = m_at(u.ux, u.uy)) != 0 && mtmp != u.usteed) {
1773 /* There's a monster at your target destination; it might be one
1774 which accompanied you--see mon_arrive(dogmove.c)--or perhaps
1775 it was already here. Randomly move you to an adjacent spot
1776 or else the monster to any nearby location. Prior to 3.3.0
1777 the latter was done unconditionally. */
1780 if (!rn2(2) && enexto(&cc, u.ux, u.uy, youmonst.data)
1781 && distu(cc.x, cc.y) <= 2)
1782 u_on_newpos(cc.x, cc.y); /*[maybe give message here?]*/
1786 if ((mtmp = m_at(u.ux, u.uy)) != 0) {
1787 /* there was an unconditional impossible("mnearto failed")
1788 here, but it's not impossible and we're prepared to cope
1789 with the situation, so only say something when debugging */
1791 pline("(monster in hero's way)");
1792 if (!rloc(mtmp, TRUE))
1793 /* no room to move it; send it away, to return later */
1794 migrate_to_level(mtmp, ledger_no(&u.uz), MIGR_RANDOM,
1799 /* initial movement of bubbles just before vision_recalc */
1800 if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
1802 else if (Is_firelevel(&u.uz))
1805 if (level_info[new_ledger].flags & FORGOTTEN) {
1806 forget_map(ALL_MAP); /* forget the map */
1807 forget_traps(); /* forget all traps too */
1809 level_info[new_ledger].flags &= ~FORGOTTEN;
1812 /* Reset the screen. */
1813 vision_reset(); /* reset the blockages */
1814 docrt(); /* does a full vision recalc */
1818 * Move all plines beyond the screen reset.
1821 /* special levels can have a custom arrival message */
1822 deliver_splev_message();
1824 /* give room entrance message, if any */
1825 check_special_room(FALSE);
1827 /* deliver objects traveling with player */
1830 /* Check whether we just entered Gehennom. */
1831 if (!In_hell(&u.uz0) && Inhell) {
1832 if (Is_valley(&u.uz)) {
1834 You("arrive at the Valley of the Dead...");
1836 You("
\8e\80\82Ì
\92J
\82É
\93\9e\92B
\82µ
\82½
\81D
\81D
\81D");
1838 pline_The("odor of burnt flesh and decay pervades the air.");
1840 pline("
\8fÅ
\82°
\82é
\8e\80\93÷
\82â
\95\85\93÷
\82Ì
\88«
\8fL
\82ª
\82½
\82¾
\82æ
\82Á
\82Ä
\82¢
\82é
\81D");
1842 display_nhwindow(WIN_MESSAGE, FALSE);
1845 You_hear("groans and moans everywhere.");
1847 You_hear("
\82»
\82±
\82©
\82µ
\82±
\82©
\82ç
\82Ì
\82¤
\82ß
\82«
\90º
\82â
\82¤
\82È
\82è
\90º
\82ð
\95·
\82¢
\82½
\81D");
1850 pline("It is hot here. You smell smoke...");
1852 pline("
\82±
\82±
\82Í
\8f\8b\82¢
\81D
\89\8c\82Ì
\93õ
\82¢
\82ª
\82·
\82é
\81D
\81D
\81D");
1853 u.uachieve.enter_gehennom = 1;
1855 /* in case we've managed to bypass the Valley's stairway down */
1856 if (Inhell && !Is_valley(&u.uz))
1857 u.uevent.gehennom_entered = 1;
1860 static const char *const fam_msgs[4] = {
1862 "You have a sense of deja vu.",
1864 "
\8aù
\8e\8b\8a´
\82É
\82¨
\82»
\82í
\82ê
\82½
\81D",
1866 "You feel like you've been here before.",
1868 "
\91O
\82É
\82±
\82±
\82É
\97\88\82½
\82±
\82Æ
\82ª
\82 \82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D",
1870 "This place %s familiar...", 0 /* no message */
1872 "
\82±
\82Ì
\8fê
\8f\8a\82Í
\89ù
\82©
\82µ
\82¢
\81D
\81D
\81D", 0 /* no message */
1875 static const char *const halu_fam_msgs[4] = {
1877 "Whoa! Everything %s different.",
1879 "
\83I
\83\8f\83b
\81I
\82Ü
\82Á
\82½
\82
\95Ï
\82í
\82Á
\82¿
\82Ü
\82Á
\82Ä
\82é
\81D",
1881 "You are surrounded by twisty little passages, all alike.",
1883 "
\82 \82È
\82½
\82Í
\82Ü
\82ª
\82è
\82
\82Ë
\82Á
\82½
\92Ê
\98H
\82É
\82©
\82±
\82Ü
\82ê
\82Ä
\82¢
\82½
\81D
\81D
\81D",
1885 "Gee, this %s like uncle Conan's place...", 0 /* no message */
1887 "
\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 */
1897 mesg = halu_fam_msgs[which];
1899 mesg = fam_msgs[which];
1900 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\82»
\82±
\82Ü
\82Å
\82µ
\82È
\82¢*/
1901 if (mesg && index(mesg, '%')) {
1902 Sprintf(buf, mesg, !Blind ? "looks" : "seems");
1910 /* special location arrival messages/events */
1911 if (In_endgame(&u.uz)) {
1912 if (new &&on_level(&u.uz, &astral_level))
1913 final_level(); /* guardian angel,&c */
1914 else if (newdungeon && u.uhave.amulet)
1915 resurrect(); /* force confrontation with Wizard */
1916 } else if (In_quest(&u.uz)) {
1917 onquest(); /* might be reaching locate|goal level */
1918 } else if (In_V_tower(&u.uz)) {
1919 if (newdungeon && In_hell(&u.uz0))
1921 pline_The("heat and smoke are gone.");
1923 pline("
\94M
\82Æ
\89\8c\82è
\82Í
\8fÁ
\82¦
\82³
\82Á
\82½
\81D");
1924 } else if (Is_knox(&u.uz)) {
1925 /* alarm stops working once Croesus has died */
1926 if (new || !mvitals[PM_CROESUS].died) {
1928 You("have penetrated a high security area!");
1930 You("
\8dÅ
\8d\82\8b@
\96§
\82Ì
\8fê
\8f\8a\82Ö
\93¥
\82Ý
\8d\9e\82ñ
\82¾
\81I");
1932 pline("An alarm sounds!");
1934 pline("
\8cx
\95ñ
\82ª
\82È
\82Á
\82½
\81I");
1935 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1936 if (DEADMONSTER(mtmp))
1938 mtmp->msleeping = 0;
1942 if (new && Is_rogue_level(&u.uz))
1944 You("enter what seems to be an older, more primitive world.");
1946 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");
1947 /* main dungeon message from your quest leader */
1949 if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest")
1951 if (!In_quest(&u.uz0) && at_dgn_entrance("
\83N
\83G
\83X
\83g")
1952 && !(u.uevent.qcompleted || u.uevent.qexpelled
1953 || quest_status.leader_is_dead)) {
1954 if (!u.uevent.qcalled) {
1955 u.uevent.qcalled = 1;
1956 com_pager(2); /* main "leader needs help" message */
1957 } else { /* reminder message */
1958 com_pager(Role_if(PM_ROGUE) ? 4 : 3);
1963 assign_level(&u.uz0, &u.uz); /* reset u.uz0 */
1965 save_currentstate();
1968 if ((annotation = get_annotation(&u.uz)) != 0)
1970 You("remember this level as %s.", annotation);
1972 You("
\82±
\82Ì
\8aK
\82ª%s
\82Å
\82 \82é
\82±
\82Æ
\82ð
\8ev
\82¢
\8fo
\82µ
\82½
\81D", annotation);
1974 /* assume this will always return TRUE when changing level */
1975 (void) in_out_region(u.ux, u.uy);
1978 /* discard context which applied to previous level */
1979 maybe_reset_pick(); /* for door or for box not accompanying hero */
1980 reset_trapset(); /* even if to-be-armed trap obj is accompanying hero */
1981 iflags.travelcc.x = iflags.travelcc.y = -1; /* travel destination cache */
1982 context.polearm.hitmon = (struct monst *) 0; /* polearm target */
1983 /* digging context is level-aware and can actually be resumed if
1984 hero returns to the previous level without any intervening dig */
1992 /* reset monster hostility relative to player */
1993 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1994 if (DEADMONSTER(mtmp))
1996 reset_hostility(mtmp);
1999 /* create some player-monsters */
2000 create_mplayers(rn1(4, 3), TRUE);
2002 /* create a guardian angel next to player, if worthy */
2003 gain_guardian_angel();
2006 static char *dfr_pre_msg = 0, /* pline() before level change */
2007 *dfr_post_msg = 0; /* pline() after level change */
2009 /* change levels at the end of this turn, after monsters finish moving */
2011 schedule_goto(tolev, at_stairs, falling, portal_flag, pre_msg, post_msg)
2013 boolean at_stairs, falling;
2015 const char *pre_msg, *post_msg;
2017 int typmask = 0100; /* non-zero triggers `deferred_goto' */
2019 /* destination flags (`goto_level' args) */
2026 if (portal_flag < 0)
2027 typmask |= 0200; /* flag for portal removal */
2028 u.utotype = typmask;
2029 /* destination level */
2030 assign_level(&u.utolev, tolev);
2033 dfr_pre_msg = dupstr(pre_msg);
2035 dfr_post_msg = dupstr(post_msg);
2038 /* handle something like portal ejection */
2042 if (!on_level(&u.uz, &u.utolev)) {
2044 int typmask = u.utotype; /* save it; goto_level zeroes u.utotype */
2046 assign_level(&dest, &u.utolev);
2048 pline1(dfr_pre_msg);
2049 goto_level(&dest, !!(typmask & 1), !!(typmask & 2), !!(typmask & 4));
2050 if (typmask & 0200) { /* remove portal */
2051 struct trap *t = t_at(u.ux, u.uy);
2059 pline1(dfr_post_msg);
2061 u.utotype = 0; /* our caller keys off of this */
2063 free((genericptr_t) dfr_pre_msg), dfr_pre_msg = 0;
2065 free((genericptr_t) dfr_post_msg), dfr_post_msg = 0;
2069 * Return TRUE if we created a monster for the corpse. If successful, the
2073 revive_corpse(corpse)
2076 struct monst *mtmp, *mcarry;
2077 boolean is_uwep, chewed;
2080 struct obj *container = (struct obj *) 0;
2081 int container_where = 0;
2083 where = corpse->where;
2084 is_uwep = (corpse == uwep);
2085 chewed = (corpse->oeaten != 0);
2088 corpse_xname(corpse, chewed ? "bite-covered" : (const char *) 0,
2090 corpse_xname(corpse, chewed ? "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½" : (const char *) 0,
2092 mcarry = (where == OBJ_MINVENT) ? corpse->ocarry : 0;
2094 if (where == OBJ_CONTAINED) {
2095 struct monst *mtmp2;
2097 container = corpse->ocontainer;
2099 get_container_location(container, &container_where, (int *) 0);
2100 /* container_where is the outermost container's location even if
2102 if (container_where == OBJ_MINVENT && mtmp2)
2105 mtmp = revive(corpse, FALSE); /* corpse is gone if successful */
2112 pline_The("%s writhes out of your grasp!", cname);
2114 pline_The("%s
\82Í
\82à
\82ª
\82¢
\82½
\81I", cname);
2117 You_feel("squirming in your backpack!");
2119 pline("
\94w
\95\89\82¢
\91Ü
\82Å
\89½
\82©
\82ª
\82à
\82ª
\82¢
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I");
2123 if (cansee(mtmp->mx, mtmp->my))
2125 pline("%s rises from the dead!",
2126 chewed ? Adjmonnam(mtmp, "bite-covered")
2129 pline("%s
\82ª
\91h
\82Á
\82½
\81I",
2130 chewed ? Adjmonnam(mtmp, "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½")
2135 case OBJ_MINVENT: /* probably a nymph's */
2136 if (cansee(mtmp->mx, mtmp->my)) {
2137 if (canseemon(mcarry))
2139 pline("Startled, %s drops %s as it revives!",
2140 mon_nam(mcarry), an(cname));
2142 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",
2143 cname, mon_nam(mcarry), cname);
2147 pline("%s suddenly appears!",
2148 chewed ? Adjmonnam(mtmp, "bite-covered")
2151 pline("%s
\82ª
\93Ë
\91R
\8c»
\82í
\82ê
\82½
\81I",
2152 chewed ? Adjmonnam(mtmp, "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½")
2157 case OBJ_CONTAINED: {
2158 char sackname[BUFSZ];
2160 if (container_where == OBJ_MINVENT && cansee(mtmp->mx, mtmp->my)
2161 && mcarry && canseemon(mcarry) && container) {
2163 pline("%s writhes out of %s!", Amonnam(mtmp),
2165 pline("%s
\82Í%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\82à
\82ª
\82¢
\82½
\81I", Amonnam(mtmp),
2167 } else if (container_where == OBJ_INVENT && container) {
2168 Strcpy(sackname, an(xname(container)));
2170 pline("%s %s out of %s in your pack!",
2171 Blind ? Something : Amonnam(mtmp),
2172 locomotion(mtmp->data, "writhes"), sackname);
2174 pline("%s
\82Í
\91Ü
\82Ì
\92\86\82Å%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\82à
\82ª
\82¢
\82½
\81I",
2175 Blind ? Something : Amonnam(mtmp),
2178 } else if (container_where == OBJ_FLOOR && container
2179 && cansee(mtmp->mx, mtmp->my)) {
2180 Strcpy(sackname, an(xname(container)));
2182 pline("%s escapes from %s!", Amonnam(mtmp), sackname);
2184 pline("%s
\82Í%s
\82©
\82ç
\93¦
\82ê
\82½
\81I", Amonnam(mtmp), sackname);
2189 /* we should be able to handle the other cases... */
2190 impossible("revive_corpse: lost corpse @ %d", where);
2198 /* Revive the corpse via a timeout. */
2201 revive_mon(arg, timeout)
2203 long timeout UNUSED;
2205 struct obj *body = arg->a_obj;
2206 struct permonst *mptr = &mons[body->corpsenm];
2210 /* corpse will revive somewhere else if there is a monster in the way;
2211 Riders get a chance to try to bump the obstacle out of their way */
2212 if ((mptr->mflags3 & M3_DISPLACES) != 0 && body->where == OBJ_FLOOR
2213 && get_obj_location(body, &x, &y, 0) && (mtmp = m_at(x, y)) != 0) {
2214 boolean notice_it = canseemon(mtmp); /* before rloc() */
2215 char *monname = Monnam(mtmp);
2217 if (rloc(mtmp, TRUE)) {
2218 if (notice_it && !canseemon(mtmp))
2220 pline("%s vanishes.", monname);
2222 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81D", monname);
2223 else if (!notice_it && canseemon(mtmp))
2225 pline("%s appears.", Monnam(mtmp)); /* not pre-rloc monname */
2227 pline("%s
\82ª
\8c»
\82ê
\82½
\81D", Monnam(mtmp)); /* not pre-rloc monname */
2229 else if (notice_it && dist2(mtmp->mx, mtmp->my, x, y) > 2)
2231 pline("%s teleports.", monname); /* saw it and still see it */
2233 pline("%s
\82Í
\8fu
\8aÔ
\88Ú
\93®
\82µ
\82½
\81D", monname); /* saw it and still see it */
2238 /* if we succeed, the corpse is gone */
2239 if (!revive_corpse(body)) {
2243 if (is_rider(mptr) && rn2(99)) { /* Rider usually tries again */
2244 action = REVIVE_MON;
2245 for (when = 3L; when < 67L; when++)
2248 } else { /* rot this corpse away */
2250 You_feel("%sless hassled.", is_rider(mptr) ? "much " : "");
2252 You("
\94Y
\82Ý
\8e\96\82ª%s
\8c¸
\82Á
\82½
\8bC
\82ª
\82µ
\82½
\81D", is_rider(mptr) ? "
\82Æ
\82Ä
\82à" : "");
2253 action = ROT_CORPSE;
2254 when = 250L - (monstermoves - body->age);
2258 (void) start_timer(when, TIMER_OBJECT, action, arg);
2265 return 1; /* Do nothing, but let other things happen */
2281 pline("You've got the glop off.");
2283 You("%s
\82©
\82ç
\83l
\83o
\83l
\83o
\82ª
\82Æ
\82ê
\82½
\81D", body_part(FACE));
2285 if (!gulp_blnd_check()) {
2287 make_blinded(0L, TRUE);
2290 } else if (!u.ucreamed) {
2292 Your("%s feels clean now.", body_part(FACE));
2294 Your("%s
\82Í
\82«
\82ê
\82¢
\82É
\82È
\82Á
\82½
\81D", body_part(FACE));
2297 return 1; /* still busy */
2304 static NEARDATA char buf[39];
2307 Sprintf(buf, "wiping off your %s", body_part(FACE));
2309 Sprintf(buf, "%s
\82ð
\90@
\82¢
\82Ä
\82¢
\82é", body_part(FACE));
2310 set_occupation(wipeoff, buf, 0);
2311 /* Not totally correct; what if they change back after now
2312 * but before they're finished wiping?
2317 Your("%s is already clean.", body_part(FACE));
2319 Your("%s
\82Í
\89\98\82ê
\82Ä
\82¢
\82È
\82¢
\81D", body_part(FACE));
2324 set_wounded_legs(side, timex)
2329 * If you are riding, your steed gets the wounded legs instead.
2330 * You still call this function, but don't lose hp.
2331 * Caller is also responsible for adjusting messages.
2334 if (!Wounded_legs) {
2339 if (!Wounded_legs || (HWounded_legs & TIMEOUT))
2340 HWounded_legs = timex;
2341 EWounded_legs = side;
2342 (void) encumber_msg();
2349 if (ATEMP(A_DEX) < 0) {
2355 const char *legs = body_part(LEG);
2358 if ((EWounded_legs & BOTH_SIDES) == BOTH_SIDES)
2359 legs = makeplural(legs);
2360 /* this used to say "somewhat better" but that was
2361 misleading since legs are being fully healed */
2362 Your("%s %s better.", legs, vtense(legs, "feel"));
2364 Your("%s
\82Í
\89ñ
\95\9c\82µ
\82½
\81D", body_part(LEG));
2368 HWounded_legs = EWounded_legs = 0;
2370 /* Wounded_legs reduces carrying capacity, so we want
2371 an encumbrance check when they're healed. However,
2372 while dismounting, first steed's legs get healed,
2373 then hero is dropped to floor and a new encumbrance
2374 check is made [in dismount_steed()]. So don't give
2375 encumbrance feedback during the dismount stage
2376 because it could seem to be shown out of order and
2377 it might be immediately contradicted [able to carry
2378 more when steed becomes healthy, then possible floor
2379 feedback, then able to carry less when back on foot]. */
2380 if (!in_steed_dismounting)
2381 (void) encumber_msg();