1 /* NetHack 3.6 do.c $NHDT-Date: 1548978604 2019/01/31 23:50:04 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.189 $ */
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-2019 */
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, levl[rx][ry].flags = 0;
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];
189 if (obj->where != OBJ_FREE)
190 panic("flooreffects: obj not free");
192 /* make sure things like water_damage() have no pointers to follow */
193 obj->nobj = obj->nexthere = (struct obj *) 0;
195 if (obj->otyp == BOULDER && boulder_hits_pool(obj, x, y, FALSE)) {
197 } else if (obj->otyp == BOULDER && (t = t_at(x, y)) != 0
198 && (is_pit(t->ttyp) || is_hole(t->ttyp))) {
200 tseen = t->tseen ? TRUE : FALSE;
201 if (((mtmp = m_at(x, y)) && mtmp->mtrapped)
202 || (u.utrap && u.ux == x && u.uy == y)) {
203 if (*verb && (cansee(x, y) || distu(x, y) == 0))
205 pline("%s boulder %s into the pit%s.",
207 vtense((const char *) 0, verb),
208 mtmp ? "" : " with you");
210 pline("
\8aâ
\82Í%s
\97\8e\82µ
\8c\8a\82Ö%s
\81D",
211 mtmp ? "" : "
\82 \82È
\82½
\82Æ
\82¢
\82Á
\82µ
\82å
\82É",
215 if (!passes_walls(mtmp->data) && !throws_rocks(mtmp->data)) {
216 /* dieroll was rnd(20); 1: maximum chance to hit
217 since trapped target is a sitting duck */
218 int damage, dieroll = 1;
220 /* 3.6.2: this was calling hmon() unconditionally
221 so always credited/blamed the hero but the boulder
222 might have been thrown by a giant or launched by
223 a rolling boulder trap triggered by a monster or
224 dropped by a scroll of earth read by a monster */
225 if (context.mon_moving) {
226 /* normally we'd use ohitmon() but it can call
227 drop_throw() which calls flooreffects() */
228 damage = dmgval(obj, mtmp);
230 if (DEADMONSTER(mtmp)) {
231 if (canspotmon(mtmp))
233 pline("%s is %s!", Monnam(mtmp),
234 (nonliving(mtmp->data)
235 || is_vampshifter(mtmp))
236 ? "destroyed" : "killed");
238 pline("%s
\82Í%s
\81I", Monnam(mtmp),
239 (nonliving(mtmp->data)
240 || is_vampshifter(mtmp))
241 ? "
\93|
\82³
\82ê
\82½" : "
\8eE
\82³
\82ê
\82½");
246 (void) hmon(mtmp, obj, HMON_THROWN, dieroll);
248 if (!DEADMONSTER(mtmp) && !is_whirly(mtmp->data))
249 return FALSE; /* still alive */
253 if (!Passes_walls && !throws_rocks(youmonst.data)) {
255 losehp(Maybe_Half_Phys(rnd(15)),
256 "squished under a boulder", NO_KILLER_PREFIX);
258 losehp(Maybe_Half_Phys(rnd(15)),
259 "
\8aâ
\82Ì
\89º
\82Å
\92×
\82³
\82ê
\82Ä", KILLED_BY);
261 return FALSE; /* player remains trapped */
267 if (Blind && (x == u.ux) && (y == u.uy)) {
269 You_hear("a CRASH! beneath you.");
271 You_hear("
\91«
\8c³
\82Å
\89½
\82©
\82ª
\8dÓ
\82¯
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
272 } else if (!Blind && cansee(x, y)) {
274 pline_The("boulder %s%s.",
275 (ttyp == TRAPDOOR && !tseen)
276 ? "triggers and " : "",
278 ? "plugs a trap door"
279 : (ttyp == HOLE) ? "plugs a hole"
282 pline_The("
\8aâ
\82Í%s%s
\81D", t->tseen ? "" : "ã©
\82ð
\8bN
\93®
\82µ
\82Ä
\81C",
283 t->ttyp == TRAPDOOR ? "
\97\8e\82µ
\94à
\82ð
\96\84\82ß
\82½" :
284 t->ttyp == HOLE ? "
\8c\8a\82ð
\96\84\82ß
\82½" :
285 "
\97\8e\82µ
\8c\8a\82ð
\96\84\82ß
\82½");
289 You_hear("a boulder %s.", verb);
291 You_hear("
\8aâ
\82ª%s
\89¹
\82ð
\95·
\82¢
\82½
\81D", verb);
295 * Note: trap might have gone away via ((hmon -> killed -> xkilled)
296 * || mondied) -> mondead -> m_detach -> fill_pit.
298 if ((t = t_at(x, y)) != 0)
304 } else if (is_lava(x, y)) {
305 return lava_damage(obj, x, y);
306 } else if (is_pool(x, y)) {
307 /* Reasonably bulky objects (arbitrary) splash when dropped.
308 * If you're floating above the water even small things make
309 * noise. Stuff dropped near fountains always misses */
310 if ((Blind || (Levitation || Flying)) && !Deaf
311 && ((x == u.ux) && (y == u.uy))) {
313 if (weight(obj) > 9) {
317 pline("
\83o
\83V
\83\83\83b
\81I");
318 } else if (Levitation || Flying) {
322 pline("
\83|
\83`
\83\83\83\93\81I");
325 map_background(x, y, 0);
328 return water_damage(obj, NULL, FALSE) == ER_DESTROYED;
329 } else if (u.ux == x && u.uy == y && (t = t_at(x, y)) != 0
330 && uteetering_at_seen_pit(t)) {
333 You_hear("%s tumble downwards.", the(xname(obj)));
335 You_hear("%s
\82ª
\89º
\82Ì
\95û
\82Ö
\93]
\82ª
\82Á
\82Ä
\82¢
\82
\89¹
\82ð
\95·
\82¢
\82½
\81D", xname(obj));
338 pline("%s %s into %s pit.", The(xname(obj)),
339 otense(obj, "tumble"), the_your[t->madeby_u]);
341 pline("%s
\82Í%s
\97\8e\82Æ
\82µ
\8c\8a\82É
\93]
\82ª
\82è
\82¨
\82¿
\82½
\81D", xname(obj),
342 set_you[t->madeby_u]);
344 } else if (obj->globby) {
345 /* Globby things like puddings might stick together */
346 while (obj && (otmp = obj_nexto_xy(obj, x, y, TRUE)) != 0) {
347 pudding_merge_message(obj, otmp);
348 /* intentionally not getting the melded object; obj_meld may set
350 (void) obj_meld(&obj, &otmp);
352 return (boolean) !obj;
357 /* obj is an object dropped on an altar */
360 register struct obj *obj;
365 if (obj->oclass != COIN_CLASS) {
367 u.uconduct.gnostic++;
369 /* coins don't have bless/curse status */
370 obj->blessed = obj->cursed = 0;
373 if (obj->blessed || obj->cursed) {
375 There("is %s flash as %s %s the altar.",
376 an(hcolor(obj->blessed ? NH_AMBER : NH_BLACK)), doname(obj),
379 pline("%s
\82ª
\8dÕ
\92d
\82É
\90G
\82ê
\82é
\82Æ%s
\8cõ
\82Á
\82½
\81D",
381 jconj_adj(hcolor(obj->blessed ? NH_AMBER : NH_BLACK)));
387 pline("%s %s on the altar.", Doname2(obj), otense(obj, "land"));
389 pline("%s
\82ð
\8dÕ
\92d
\82Ì
\8fã
\82É
\92u
\82¢
\82½
\81D", Doname2(obj));
390 if (obj->oclass != COIN_CLASS)
397 register struct obj *obj;
399 if (!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname)
403 /* Transforms the sink at the player's position into
404 a fountain, throne, altar or grave. */
411 if (levl[u.ux][u.uy].typ != SINK)
414 sinklooted = levl[u.ux][u.uy].looted != 0;
415 level.flags.nsinks--;
416 levl[u.ux][u.uy].doormask = 0; /* levl[][].flags */
421 levl[u.ux][u.uy].typ = FOUNTAIN;
422 levl[u.ux][u.uy].blessedftn = 0;
424 SET_FOUNTAIN_LOOTED(u.ux, u.uy);
425 level.flags.nfountains++;
429 levl[u.ux][u.uy].typ = THRONE;
431 levl[u.ux][u.uy].looted = T_LOOTED;
435 levl[u.ux][u.uy].typ = ALTAR;
436 levl[u.ux][u.uy].altarmask = Align2amask(rn2((int) A_LAWFUL + 2) - 1);
440 levl[u.ux][u.uy].typ = ROOM;
441 make_grave(u.ux, u.uy, (char *) 0);
442 if (levl[u.ux][u.uy].typ == GRAVE)
446 /* give message even if blind; we know we're not levitating,
447 so can feel the outcome even if we can't directly see it */
448 if (levl[u.ux][u.uy].typ != ROOM)
450 pline_The("sink transforms into %s!", an(defsyms[sym].explanation));
452 pline_The("
\97¬
\82µ
\91ä
\82Í%s
\82É
\95Ï
\89»
\82µ
\82½
\81I", defsyms[sym].explanation);
455 pline_The("sink vanishes.");
457 pline("
\97¬
\82µ
\91ä
\82Í
\8fÁ
\82¦
\82½
\81D");
461 /* Teleports the sink at the player's position;
462 return True if sink teleported. */
475 eng = engr_at(cx, cy);
476 } while ((levl[cx][cy].typ != ROOM || trp || eng || cansee(cx, cy))
479 if (levl[cx][cy].typ == ROOM && !trp && !eng) {
480 /* create sink at new position */
481 levl[cx][cy].typ = SINK;
482 levl[cx][cy].looted = levl[u.ux][u.uy].looted;
484 /* remove old sink */
485 levl[u.ux][u.uy].typ = ROOM;
486 levl[u.ux][u.uy].looted = 0;
493 /* obj is a ring being dropped over a kitchen sink */
496 register struct obj *obj;
498 struct obj *otmp, *otmp2;
499 boolean ideed = TRUE;
500 boolean nosink = FALSE;
503 You("drop %s down the drain.", doname(obj));
505 You("%s
\82ð
\94r
\90\85\8cû
\82É
\97\8e\82µ
\82½
\81D", doname(obj));
506 obj->in_use = TRUE; /* block free identification via interrupt */
507 switch (obj->otyp) { /* effects that can be noticed without eyes */
510 You("thought %s got lost in the sink, but there it is!", yname(obj));
512 You("%s
\82ð
\8e¸
\82Á
\82½
\8bC
\82ª
\82µ
\82½
\82ª
\81C
\8bC
\82Ì
\82¹
\82¢
\82¾
\82Á
\82½
\81I", yname(obj));
514 case RIN_SLOW_DIGESTION:
516 pline_The("ring is regurgitated!");
518 pline("
\8ew
\97Ö
\82Í
\8bt
\97¬
\82µ
\82½
\81I");
526 pline_The("sink quivers upward for a moment.");
528 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu
\81C
\8fã
\89º
\82É
\90k
\82¦
\82½
\81D");
530 case RIN_POISON_RESISTANCE:
532 You("smell rotten %s.", makeplural(fruitname(FALSE)));
534 pline("
\95\85\82Á
\82½%s
\82Ì
\82æ
\82¤
\82È
\93õ
\82¢
\82ª
\82µ
\82½
\81D", fruitname(FALSE));
536 case RIN_AGGRAVATE_MONSTER:
538 pline("Several %s buzz angrily around the sink.",
539 Hallucination ? makeplural(rndmonnam(NULL)) : "flies");
541 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",
542 Hallucination ? rndmonnam(NULL) : "
\83n
\83G");
545 case RIN_SHOCK_RESISTANCE:
547 pline("Static electricity surrounds the sink.");
549 pline("
\97¬
\82µ
\91ä
\82ª
\83s
\83\8a\83s
\83\8a\82µ
\82Í
\82¶
\82ß
\82½
\81D");
553 You_hear("loud noises coming from the drain.");
555 You_hear("
\94r
\90\85\8cû
\82©
\82ç
\82Ì
\91å
\82«
\82È
\89¹
\82ð
\95·
\82¢
\82½
\81D");
557 case RIN_SUSTAIN_ABILITY: /* KMH */
559 pline_The("%s flow seems fixed.", hliquid("water"));
561 pline("%s
\82Ì
\97¬
\82ê
\82ª
\88ê
\92è
\82É
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D", hliquid("
\90\85"));
563 case RIN_GAIN_STRENGTH:
565 pline_The("%s flow seems %ser now.",
567 (obj->spe < 0) ? "weak" : "strong");
569 pline("%s
\82Ì
\97¬
\82ê
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
571 (obj->spe < 0) ? "
\8eã" : "
\8b");
574 case RIN_GAIN_CONSTITUTION:
576 pline_The("%s flow seems %ser now.",
578 (obj->spe < 0) ? "less" : "great");
580 pline("
\97¬
\82ê
\82é%s
\82Ì
\97Ê
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
582 (obj->spe < 0) ? "
\8f
\82È" : "
\91½");
585 case RIN_INCREASE_ACCURACY: /* KMH */
587 pline_The("%s flow %s the drain.",
589 (obj->spe < 0) ? "misses" : "hits");
591 pline("%s
\82ª
\94r
\90\85\8cû%s
\82æ
\82¤
\82É
\82È
\82Á
\82½
\81D",
593 (obj->spe < 0) ? "
\82©
\82ç
\94½
\82ê
\82é" : "
\82ß
\82ª
\82¯
\82Ä
\97¬
\82ê
\82é");
596 case RIN_INCREASE_DAMAGE:
598 pline_The("water's force seems %ser now.",
599 (obj->spe < 0) ? "small" : "great");
601 pline("
\90\85\82Ì
\90¨
\82¢
\82ª%s
\82
\82È
\82Á
\82½
\82æ
\82¤
\82¾
\81D",
602 (obj->spe < 0) ? "
\8eã" : "
\8b");
607 for (otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp2) {
608 otmp2 = otmp->nexthere;
609 if (otmp != uball && otmp != uchain
610 && !obj_resists(otmp, 1, 99)) {
613 pline("Suddenly, %s %s from the sink!", doname(otmp),
614 otense(otmp, "vanish"));
616 pline("
\93Ë
\91R
\81C%s
\82Í
\97¬
\82µ
\91ä
\82©
\82ç
\8fÁ
\82¦
\82½
\81I", doname(otmp));
625 /* Not the same as aggravate monster; besides, it's obvious. */
627 pline("Several flies buzz around the sink.");
629 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");
631 case RIN_TELEPORTATION:
632 nosink = teleport_sink();
633 /* give message even if blind; we know we're not levitating,
634 so can feel the outcome even if we can't directly see it */
636 pline_The("sink %svanishes.", nosink ? "" : "momentarily ");
638 pline_The("
\97¬
\82µ
\91ä
\82Í%s
\8fÁ
\82¦
\82½
\81D", nosink ? "" : "
\88ê
\8fu");
644 /* for S_room case, same message as for teleportation is given */
645 ideed = (levl[u.ux][u.uy].typ != ROOM);
651 if (!Blind && !ideed) {
653 switch (obj->otyp) { /* effects that need eyes */
656 pline_The("faucets flash brightly for a moment.");
658 pline("
\8eÖ
\8cû
\82Í
\88ê
\8fu
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
660 case RIN_REGENERATION:
662 pline_The("sink looks as good as new.");
664 pline("
\97¬
\82µ
\91ä
\82ª
\90V
\95i
\82Ì
\82æ
\82¤
\82É
\82È
\82Á
\82½
\81D");
666 case RIN_INVISIBILITY:
668 You("don't see anything happen to the sink.");
670 pline("
\97¬
\82µ
\91ä
\82É
\89½
\82ª
\8bN
\82«
\82½
\82Ì
\82©
\8c©
\82¦
\82È
\82©
\82Á
\82½
\81D");
672 case RIN_FREE_ACTION:
674 You_see("the ring slide right down the drain!");
676 pline("
\8ew
\97Ö
\82ª
\94r
\90\85\8cû
\82ð
\82·
\82é
\82è
\82Æ
\94ð
\82¯
\82é
\82Ì
\82ð
\8c©
\82½
\81I");
678 case RIN_SEE_INVISIBLE:
680 You_see("some %s in the sink.",
681 Hallucination ? "oxygen molecules" : "air");
683 pline("
\97¬
\82µ
\91ä
\82Ì
\8fã
\82Ì%s
\82ª
\8c©
\82¦
\82½
\81D",
684 Hallucination ? "
\8e_
\91f
\95ª
\8eq" : "
\8bó
\8bC");
689 pline_The("sink seems to blend into the floor for a moment.");
691 pline("
\88ê
\8fu
\81C
\97¬
\82µ
\91ä
\82ª
\8f°
\82É
\97n
\82¯
\82±
\82ñ
\82¾
\82æ
\82¤
\82É
\8c©
\82¦
\82½
\81D");
693 case RIN_FIRE_RESISTANCE:
695 pline_The("hot %s faucet flashes brightly for a moment.",
697 #else /*
\82Æ
\82è
\82 \82¦
\82¸hliquid()
\82Í
\8eg
\82í
\82È
\82¢
\8c`
\82É*/
698 pline("
\88ê
\8fu
\81C
\94M
\93\92\82Ì
\8eÖ
\8cû
\82ª
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
701 case RIN_COLD_RESISTANCE:
703 pline_The("cold %s faucet flashes brightly for a moment.",
705 #else /*
\82Æ
\82è
\82 \82¦
\82¸hliquid()
\82Í
\8eg
\82í
\82È
\82¢
\8c`
\82É*/
706 pline("
\88ê
\8fu
\81C
\97â
\90\85\82Ì
\8eÖ
\8cû
\82ª
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D");
709 case RIN_PROTECTION_FROM_SHAPE_CHAN:
711 pline_The("sink looks nothing like a fountain.");
713 pline("
\97¬
\82µ
\91ä
\82Í
\90ò
\82Æ
\82Í
\82Ü
\82Á
\82½
\82
\88á
\82¤
\82à
\82Ì
\82Ì
\82æ
\82¤
\82É
\8c©
\82¦
\82½
\81D");
717 pline_The("sink glows %s for a moment.",
718 hcolor((obj->spe < 0) ? NH_BLACK : NH_SILVER));
720 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu%s
\8bP
\82¢
\82½
\81D",
721 jconj_adj(hcolor((obj->spe < 0) ? NH_BLACK : NH_SILVER)));
726 pline_The("sink glows %s for a moment.", hcolor(NH_WHITE));
728 pline("
\97¬
\82µ
\91ä
\82Í
\88ê
\8fu%s
\8bP
\82¢
\82½
\81D", jconj_adj(hcolor(NH_WHITE)));
730 case RIN_TELEPORT_CONTROL:
731 /*JP: "beam aboard"
\82Í
\83X
\83^
\81[
\83g
\83\8c\83b
\83N
\82Ì
\81u
\93]
\91\97\81v*/
733 pline_The("sink looks like it is being beamed aboard somewhere.");
735 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");
737 case RIN_POLYMORPH_CONTROL:
740 "sink momentarily looks like a regularly erupting geyser.");
742 "
\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");
752 You_hear("the ring bouncing down the drainpipe.");
754 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");
756 if (!rn2(20) && !nosink) {
758 pline_The("sink backs up, leaving %s.", doname(obj));
760 pline("
\97¬
\82µ
\91ä
\82ª
\8bt
\97¬
\82µ
\82Ä
\81C%s
\82ª
\96ß
\82Á
\82Ä
\82«
\82½
\81D", doname(obj));
763 } else if (!rn2(5)) {
773 /* some common tests when trying to drop or throw items */
779 if (obj->owornmask & (W_ARMOR | W_ACCESSORY)) {
782 Norep("You cannot %s %s you are wearing.", word, something);
784 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);
787 if (obj->otyp == LOADSTONE && obj->cursed) {
788 /* getobj() kludge sets corpsenm to user's specified count
789 when refusing to split a stack of cursed loadstones */
791 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
792 /* getobj() ignores a count for throwing since that is
793 implicitly forced to be 1; replicate its kludge... */
794 if (!strcmp(word, "throw") && obj->quan > 1L)
798 pline("For some reason, you cannot %s%s the stone%s!", word,
799 obj->corpsenm ? " any of" : "", plur(obj->quan));
801 pline("
\82Ç
\82¤
\82¢
\82¤
\82í
\82¯
\82©
\81C
\82 \82È
\82½
\82Í
\90Î
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81I",
805 obj->corpsenm = 0; /* reset */
809 if (obj->otyp == LEASH && obj->leashmon != 0) {
812 pline_The("leash is tied around your %s.", body_part(HAND));
814 pline("
\95R
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D", body_part(HAND));
817 if (obj->owornmask & W_SADDLE) {
820 You("cannot %s %s you are sitting on.", word, something);
822 You("
\8fæ
\82Á
\82Ä
\82¢
\82é
\8aÔ
\82Í%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", word);
830 register struct obj *obj;
835 if (!canletgo(obj, "drop"))
837 if (!canletgo(obj, "
\92u
\82"))
844 setuwep((struct obj *) 0);
846 if (obj == uquiver) {
847 setuqwep((struct obj *) 0);
849 if (obj == uswapwep) {
850 setuswapwep((struct obj *) 0);
854 /* barrier between you and the floor */
856 char *onam_p, monbuf[BUFSZ];
858 /* doname can call s_suffix, reusing its buffer */
859 Strcpy(monbuf, s_suffix(mon_nam(u.ustuck)));
860 onam_p = is_unpaid(obj) ? yobjnam(obj, (char *) 0) : doname(obj);
862 You("drop %s into %s %s.", onam_p, monbuf,
863 mbodypart(u.ustuck, STOMACH));
865 You("%s
\82ð%s%s
\82É
\92u
\82¢
\82½
\81D", onam_p, monbuf,
866 mbodypart(u.ustuck, STOMACH));
870 if ((obj->oclass == RING_CLASS || obj->otyp == MEAT_RING)
871 && IS_SINK(levl[u.ux][u.uy].typ)) {
875 if (!can_reach_floor(TRUE)) {
876 /* we might be levitating due to #invoke Heart of Ahriman;
877 if so, levitation would end during call to freeinv()
878 and we want hitfloor() to happen before float_down() */
879 boolean levhack = finesse_ahriman(obj);
882 ELevitation = W_ART; /* other than W_ARTI */
885 You("drop %s.", doname(obj));
887 You("%s
\82ð
\92u
\82¢
\82½
\81D", doname(obj));
888 /* Ensure update when we drop gold objects */
889 if (obj->oclass == COIN_CLASS)
894 float_down(I_SPECIAL | TIMEOUT, W_ARTI | W_ART);
897 if (!IS_ALTAR(levl[u.ux][u.uy].typ) && flags.verbose)
899 You("drop %s.", doname(obj));
901 You("%s
\82ð
\92u
\82¢
\82½
\81D", doname(obj));
907 /* dropx - take dropped item out of inventory;
908 called in several places - may produce output
909 (eg ship_object() and dropy() -> sellobj() both produce output) */
912 register struct obj *obj;
914 /* Ensure update when we drop gold objects */
915 if (obj->oclass == COIN_CLASS)
919 if (ship_object(obj, u.ux, u.uy, FALSE))
921 if (IS_ALTAR(levl[u.ux][u.uy].typ))
922 doaltarobj(obj); /* set bknown */
927 /* dropy - put dropped object at destination; called from lots of places */
935 /* dropz - really put dropped object at its destination... */
937 dropz(obj, with_impact)
942 setuwep((struct obj *) 0);
944 setuqwep((struct obj *) 0);
946 setuswapwep((struct obj *) 0);
949 if (!u.uswallow && flooreffects(obj, u.ux, u.uy, "drop"))
951 if (!u.uswallow && flooreffects(obj,u.ux,u.uy, "
\97\8e\82¿
\82é"))
953 /* uswallow check done by GAN 01/29/87 */
955 boolean could_petrify = FALSE;
956 boolean could_poly = FALSE;
957 boolean could_slime = FALSE;
958 boolean could_grow = FALSE;
959 boolean could_heal = FALSE;
961 if (obj != uball) { /* mon doesn't pick up ball */
962 if (obj->otyp == CORPSE) {
963 could_petrify = touch_petrifies(&mons[obj->corpsenm]);
964 could_poly = polyfodder(obj);
965 could_slime = (obj->corpsenm == PM_GREEN_SLIME);
966 could_grow = (obj->corpsenm == PM_WRAITH);
967 could_heal = (obj->corpsenm == PM_NURSE);
970 (void) stolen_value(obj, u.ux, u.uy, TRUE, FALSE);
971 (void) mpickobj(u.ustuck, obj);
972 if (is_animal(u.ustuck->data)) {
973 if (could_poly || could_slime) {
974 (void) newcham(u.ustuck,
975 could_poly ? (struct permonst *) 0
976 : &mons[PM_GREEN_SLIME],
978 delobj(obj); /* corpse is digested */
979 } else if (could_petrify) {
980 minstapetrify(u.ustuck, TRUE);
981 /* Don't leave a cockatrice corpse in a statue */
984 } else if (could_grow) {
985 (void) grow_up(u.ustuck, (struct monst *) 0);
986 delobj(obj); /* corpse is digested */
987 } else if (could_heal) {
988 u.ustuck->mhp = u.ustuck->mhpmax;
989 delobj(obj); /* corpse is digested */
994 place_object(obj, u.ux, u.uy);
996 container_impact_dmg(obj, u.ux, u.uy);
998 drop_ball(u.ux, u.uy);
999 else if (level.flags.has_shop)
1000 sellobj(obj, u.ux, u.uy);
1002 if (Blind && Levitation)
1004 newsym(u.ux, u.uy); /* remap location under self */
1008 /* things that must change when not held; recurse into containers.
1009 Called for both player and monsters */
1011 obj_no_longer_held(obj)
1016 } else if (Has_contents(obj)) {
1017 struct obj *contents;
1019 for (contents = obj->cobj; contents; contents = contents->nobj)
1020 obj_no_longer_held(contents);
1022 switch (obj->otyp) {
1024 /* Normal crysknife reverts to worm tooth when not held by hero
1025 * or monster; fixed crysknife has only 10% chance of reverting.
1026 * When a stack of the latter is involved, it could be worthwhile
1027 * to give each individual crysknife its own separate 10% chance,
1028 * but we aren't in any position to handle stack splitting here.
1030 if (!obj->oerodeproof || !rn2(10)) {
1031 /* if monsters aren't moving, assume player is responsible */
1032 if (!context.mon_moving && !program_state.gameover)
1033 costly_alteration(obj, COST_DEGRD);
1034 obj->otyp = WORM_TOOTH;
1035 obj->oerodeproof = 0;
1041 /* 'D' command: drop several things */
1049 You("have nothing to drop.");
1051 You("
\97\8e\82Æ
\82·
\82à
\82Ì
\82ð
\89½
\82à
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D");
1054 add_valid_menu_class(0); /* clear any classes already there */
1056 sellobj_state(SELL_DELIBERATE);
1057 if (flags.menu_style != MENU_TRADITIONAL
1058 || (result = ggetobj("drop", drop, 0, FALSE, (unsigned *) 0)) < -1)
1059 result = menu_drop(result);
1061 sellobj_state(SELL_NORMAL);
1063 reset_occupations();
1068 /* Drop things from the hero's inventory, using a menu. */
1073 int n, i, n_dropped = 0;
1075 struct obj *otmp, *otmp2;
1076 menu_item *pick_list;
1077 boolean all_categories = TRUE;
1078 boolean drop_everything = FALSE;
1081 all_categories = (retry == -2);
1082 } else if (flags.menu_style == MENU_FULL) {
1083 all_categories = FALSE;
1085 n = query_category("Drop what type of items?", invent,
1087 n = query_category("
\82Ç
\82Ì
\8eí
\97Þ
\82Ì
\83A
\83C
\83e
\83\80\82ð
\92u
\82«
\82Ü
\82·
\82©
\81H", invent,
1088 UNPAID_TYPES | ALL_TYPES | CHOOSE_ALL | BUC_BLESSED
1089 | BUC_CURSED | BUC_UNCURSED | BUC_UNKNOWN,
1090 &pick_list, PICK_ANY);
1093 for (i = 0; i < n; i++) {
1094 if (pick_list[i].item.a_int == ALL_TYPES_SELECTED)
1095 all_categories = TRUE;
1096 else if (pick_list[i].item.a_int == 'A')
1097 drop_everything = TRUE;
1099 add_valid_menu_class(pick_list[i].item.a_int);
1101 free((genericptr_t) pick_list);
1102 } else if (flags.menu_style == MENU_COMBINATION) {
1103 unsigned ggoresults = 0;
1105 all_categories = FALSE;
1106 /* Gather valid classes via traditional NetHack method */
1107 i = ggetobj("drop", drop, 0, TRUE, &ggoresults);
1109 all_categories = TRUE;
1110 if (ggoresults & ALL_FINISHED) {
1116 if (drop_everything) {
1118 * Dropping a burning potion of oil while levitating can cause
1119 * an explosion which might destroy some of hero's inventory,
1121 * for (otmp = invent; otmp; otmp = otmp2) {
1122 * otmp2 = otmp->nobj;
1123 * n_dropped += drop(otmp);
1125 * was unreliable and could lead to an "object lost" panic.
1127 * Use the bypass bit to mark items already processed (hence
1128 * not droppable) and rescan inventory until no unbypassed
1131 bypass_objlist(invent, FALSE); /* clear bypass bit for invent */
1132 while ((otmp = nxt_unbypassed_obj(invent)) != 0)
1133 n_dropped += drop(otmp);
1134 /* we might not have dropped everything (worn armor, welded weapon,
1135 cursed loadstones), so reset any remaining inventory to normal */
1136 bypass_objlist(invent, FALSE);
1138 /* should coordinate with perm invent, maybe not show worn items */
1140 n = query_objlist("What would you like to drop?", &invent,
1141 (USE_INVLET | INVORDER_SORT), &pick_list, PICK_ANY,
1142 all_categories ? allow_all : allow_category);
1144 n = query_objlist("
\82Ç
\82ê
\82ð
\92u
\82«
\82Ü
\82·
\82©
\81H", &invent,
1145 (USE_INVLET | INVORDER_SORT), &pick_list, PICK_ANY,
1146 all_categories ? allow_all : allow_category);
1150 * picklist[] contains a set of pointers into inventory, but
1151 * as soon as something gets dropped, they might become stale
1152 * (see the drop_everything code above for an explanation).
1153 * Just checking to see whether one is still in the invent
1154 * chain is not sufficient validation since destroyed items
1155 * will be freed and items we've split here might have already
1156 * reused that memory and put the same pointer value back into
1157 * invent. Ditto for using invlet to validate. So we start
1158 * by setting bypass on all of invent, then check each pointer
1159 * to verify that it is in invent and has that bit set.
1161 bypass_objlist(invent, TRUE);
1162 for (i = 0; i < n; i++) {
1163 otmp = pick_list[i].item.a_obj;
1164 for (otmp2 = invent; otmp2; otmp2 = otmp2->nobj)
1167 if (!otmp2 || !otmp2->bypass)
1169 /* found next selected invent item */
1170 cnt = pick_list[i].count;
1171 if (cnt < otmp->quan) {
1174 } else if (otmp->otyp == LOADSTONE && otmp->cursed) {
1175 /* same kludge as getobj(), for canletgo()'s use */
1176 otmp->corpsenm = (int) cnt; /* don't split */
1178 otmp = splitobj(otmp, cnt);
1181 n_dropped += drop(otmp);
1183 bypass_objlist(invent, FALSE); /* reset invent to normal */
1184 free((genericptr_t) pick_list);
1192 /* on a ladder, used in goto_level */
1193 static NEARDATA boolean at_ladder = FALSE;
1195 /* the '>' command */
1199 struct trap *trap = 0;
1200 boolean stairs_down = ((u.ux == xdnstair && u.uy == ydnstair)
1201 || (u.ux == sstairs.sx && u.uy == sstairs.sy
1203 ladder_down = (u.ux == xdnladder && u.uy == ydnladder);
1208 if (stucksteed(TRUE)) {
1211 /* Levitation might be blocked, but player can still use '>' to
1212 turn off controlled levitation */
1213 if (HLevitation || ELevitation) {
1214 if ((HLevitation & I_SPECIAL) || (ELevitation & W_ARTI)) {
1215 /* end controlled levitation */
1216 if (ELevitation & W_ARTI) {
1219 for (obj = invent; obj; obj = obj->nobj) {
1221 && artifact_has_invprop(obj, LEVITATION)) {
1222 if (obj->age < monstermoves)
1223 obj->age = monstermoves;
1224 obj->age += rnz(100);
1228 if (float_down(I_SPECIAL | TIMEOUT, W_ARTI)) {
1229 return 1; /* came down, so moved */
1230 } else if (!HLevitation && !ELevitation) {
1232 Your("latent levitation ceases.");
1234 pline("
\90ö
\8dÝ
\93I
\82È
\95\82\97V
\94\
\97Í
\82ª
\92\86\92f
\82µ
\82½
\81D");
1235 return 1; /* did something, effectively moved */
1239 ; /* weren't actually floating after all */
1241 /* Avoid alerting player to an unknown stair or ladder.
1242 * Changes the message for a covered, known staircase
1243 * too; staircase knowledge is not stored anywhere.
1247 (glyph_to_cmap(levl[u.ux][u.uy].glyph) == S_dnstair);
1248 else if (ladder_down)
1250 (glyph_to_cmap(levl[u.ux][u.uy].glyph) == S_dnladder);
1252 if (Is_airlevel(&u.uz))
1254 You("are floating in the %s.", surface(u.ux, u.uy));
1256 You("%s
\82Ì
\92\86\82É
\95\82\82¢
\82Ä
\82¢
\82é
\81D", surface(u.ux, u.uy));
1257 else if (Is_waterlevel(&u.uz))
1259 You("are floating in %s.",
1260 is_pool(u.ux, u.uy) ? "the water" : "a bubble of air");
1262 You("%s
\82Ì
\92\86\82É
\95\82\82¢
\82Ä
\82¢
\82é
\81D",
1263 is_pool(u.ux, u.uy) ? "
\90\85" : "
\8bó
\8bC
\82Ì
\96A");
1267 floating_above(stairs_down ? "stairs" : ladder_down
1269 : surface(u.ux, u.uy));
1271 floating_above(stairs_down ? "
\8aK
\92i" : ladder_down
1273 : surface(u.ux, u.uy));
1275 return 0; /* didn't move */
1277 if (!stairs_down && !ladder_down) {
1278 trap = t_at(u.ux, u.uy);
1279 if (trap && uteetering_at_seen_pit(trap)) {
1280 dotrap(trap, TOOKPLUNGE);
1282 } else if (!trap || !is_hole(trap->ttyp)
1283 || !Can_fall_thru(&u.uz) || !trap->tseen) {
1284 if (flags.autodig && !context.nopick && uwep && is_pick(uwep)) {
1285 return use_pick_axe2(uwep);
1288 You_cant("go down here.");
1290 pline("
\82±
\82±
\82Å
\82Í
\8d~
\82è
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
1297 You("are %s, and cannot go down.",
1298 !u.uswallow ? "being held" : is_animal(u.ustuck->data)
1302 You("%s
\8d~
\82è
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1303 !u.uswallow ? "
\82Â
\82©
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82Ä" : is_animal(u.ustuck->data)
1304 ? "
\88ù
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä"
1305 : "
\8aª
\82«
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä");
1309 if (on_level(&valley_level, &u.uz) && !u.uevent.gehennom_entered) {
1311 You("are standing at the gate to Gehennom.");
1313 You("
\83Q
\83w
\83i
\82Ì
\96å
\82Ì
\91O
\82É
\97§
\82Á
\82Ä
\82¢
\82é
\81D");
1315 pline("Unspeakable cruelty and harm lurk down there.");
1317 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");
1319 if (yn("Are you sure you want to enter?") != 'y')
1321 if (yn("
\96{
\93\96\82É
\93ü
\82è
\82Ü
\82·
\82©
\81H") != 'y')
1327 pline("
\82È
\82ç
\8dD
\82«
\82É
\82·
\82ê
\82Î
\82æ
\82¢
\81D");
1328 u.uevent.gehennom_entered = 1; /* don't ask again */
1333 You("are held back by your pet!");
1335 You("
\83y
\83b
\83g
\82É
\88ø
\82«
\82à
\82Ç
\82³
\82ê
\82½
\81I");
1340 const char *down_or_thru = trap->ttyp == HOLE ? "down" : "through";
1342 const char *actn = Flying ? "fly" : locomotion(youmonst.data, "jump");
1344 const char *actn = "";
1347 if (youmonst.data->msize >= MZ_HUGE) {
1351 You("don't fit %s easily.", down_or_thru);
1352 Sprintf(qbuf, "Try to squeeze %s?", down_or_thru);
1354 pline("
\82±
\82±
\82Í
\8b·
\82
\82Ä
\8aÈ
\92P
\82É
\82Í
\92Ê
\82è
\94²
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
1355 Sprintf(qbuf, "
\91Ì
\82ð
\89\9f\82µ
\8d\9e\82Ý
\82Ü
\82·
\82©?");
1357 if (yn(qbuf) == 'y') {
1360 actn = "manage to squeeze";
1362 actn = "
\82È
\82ñ
\82Æ
\82©";
1365 losehp(Maybe_Half_Phys(rnd(4)),
1366 "contusion from a small passage", KILLED_BY);
1368 losehp(Maybe_Half_Phys(rnd(4)),
1369 "
\8b·
\82¢
\93¹
\82Å
\82Ì
\91Å
\82¿
\90g
\82Å", KILLED_BY);
1373 You("were unable to fit %s.", down_or_thru);
1375 You("
\92Ê
\82è
\94²
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
1383 You("%s %s the %s.", actn, down_or_thru,
1384 trap->ttyp == HOLE ? "hole" : "trap door");
1386 You("%s%s
\81D", actn,
1387 trap->ttyp == HOLE ? "
\8c\8a\82ð
\8d~
\82è
\82½" : "
\97\8e\82µ
\94à
\82ð
\92Ê
\82è
\94²
\82¯
\82½");
1390 if (trap && Is_stronghold(&u.uz)) {
1391 goto_hell(FALSE, TRUE);
1393 at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
1400 /* the '<' command */
1407 /* "up" to get out of a pit... */
1408 if (u.utrap && u.utraptype == TT_PIT) {
1413 if ((u.ux != xupstair || u.uy != yupstair)
1414 && (!xupladder || u.ux != xupladder || u.uy != yupladder)
1415 && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy
1418 You_cant("go up here.");
1420 You("
\82±
\82±
\82Å
\82Í
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
1423 if (stucksteed(TRUE)) {
1428 You("are %s, and cannot go up.",
1429 !u.uswallow ? "being held" : is_animal(u.ustuck->data)
1433 You("%s
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1434 !u.uswallow ? "
\82Â
\82©
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82Ä" : is_animal(u.ustuck->data)
1435 ? "
\88ù
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä"
1436 : "
\8aª
\82«
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82Ä");
1440 if (near_capacity() > SLT_ENCUMBER) {
1441 /* No levitation check; inv_weight() already allows for it */
1443 Your("load is too heavy to climb the %s.",
1444 levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
1446 You("
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä%s
\82ð
\8fã
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1447 levl[u.ux][u.uy].typ == STAIRS ? "
\8aK
\92i" : "
\82Í
\82µ
\82²");
1451 if (ledger_no(&u.uz) == 1) {
1452 if (iflags.debug_fuzzer)
1455 if (yn("Beware, there will be no return! Still climb?") != 'y')
1457 if (yn("
\8bC
\82ð
\82Â
\82¯
\82ë
\81C
\96ß
\82ê
\82È
\82¢
\82¼
\81I
\82»
\82ê
\82Å
\82à
\8fã
\82é
\81H") != 'y')
1462 You("are held back by your pet!");
1464 You("
\83y
\83b
\83g
\82É
\88ø
\82«
\82à
\82Ç
\82³
\82ê
\82½
\81I");
1467 at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
1473 d_level save_dlevel = { 0, 0 };
1475 /* check that we can write out the current level */
1477 currentlevel_rewrite()
1482 /* since level change might be a bit slow, flush any buffered screen
1483 * output (like "you fall through a trap door") */
1486 fd = create_levelfile(ledger_no(&u.uz), whynot);
1489 * This is not quite impossible: e.g., we may have
1490 * exceeded our quota. If that is the case then we
1491 * cannot leave this level, and cannot save either.
1492 * Another possibility is that the directory was not
1500 if (!savelev(fd, ledger_no(&u.uz), COUNT_SAVE)) {
1502 delete_levelfile(ledger_no(&u.uz));
1504 pline("NetHack is out of disk space for making levels!");
1506 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");
1508 You("can save, quit, or continue playing.");
1510 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");
1523 if (flags.ins_chkpt) {
1524 /* write out just-attained level, with pets and everything */
1525 fd = currentlevel_rewrite();
1529 savelev(fd, ledger_no(&u.uz), WRITE_SAVE);
1533 /* write out non-level state */
1541 register xchar x, y;
1543 return (boolean) ((levl[x][y].typ != ROOM
1544 && levl[x][y].typ != AIR
1545 && levl[x][y].typ != CORR)
1550 /* when arriving on a level, if hero and a monster are trying to share same
1551 spot, move one; extracted from goto_level(); also used by wiz_makemap() */
1558 if (!mtmp || mtmp == u.usteed || mtmp != m_at(u.ux, u.uy)) {
1559 impossible("level arrival collision: %s?",
1560 !mtmp ? "no monster"
1561 : (mtmp == u.usteed) ? "steed is on map"
1562 : "monster not co-located");
1566 /* There's a monster at your target destination; it might be one
1567 which accompanied you--see mon_arrive(dogmove.c)--or perhaps
1568 it was already here. Randomly move you to an adjacent spot
1569 or else the monster to any nearby location. Prior to 3.3.0
1570 the latter was done unconditionally. */
1571 if (!rn2(2) && enexto(&cc, u.ux, u.uy, youmonst.data)
1572 && distu(cc.x, cc.y) <= 2)
1573 u_on_newpos(cc.x, cc.y); /*[maybe give message here?]*/
1577 if ((mtmp = m_at(u.ux, u.uy)) != 0) {
1578 /* there was an unconditional impossible("mnexto failed")
1579 here, but it's not impossible and we're prepared to cope
1580 with the situation, so only say something when debugging */
1582 pline("(monster in hero's way)");
1583 if (!rloc(mtmp, TRUE) || (mtmp = m_at(u.ux, u.uy)) != 0)
1584 /* no room to move it; send it away, to return later */
1590 goto_level(newlevel, at_stairs, falling, portal)
1592 boolean at_stairs, falling, portal;
1596 boolean cant_go_back, great_effort,
1597 up = (depth(newlevel) < depth(&u.uz)),
1598 newdungeon = (u.uz.dnum != newlevel->dnum),
1599 was_in_W_tower = In_W_tower(u.ux, u.uy, &u.uz),
1601 new = FALSE; /* made a new level? */
1606 if (dunlev(newlevel) > dunlevs_in_dungeon(newlevel))
1607 newlevel->dlevel = dunlevs_in_dungeon(newlevel);
1608 if (newdungeon && In_endgame(newlevel)) { /* 1st Endgame Level !!! */
1609 if (!u.uhave.amulet)
1610 return; /* must have the Amulet */
1611 if (!wizard) /* wizard ^V can bypass Earth level */
1612 assign_level(newlevel, &earth_level); /* (redundant) */
1614 new_ledger = ledger_no(newlevel);
1615 if (new_ledger <= 0)
1616 done(ESCAPED); /* in fact < 0 is impossible */
1618 /* If you have the amulet and are trying to get out of Gehennom,
1619 * going up a set of stairs sometimes does some very strange things!
1620 * Biased against law and towards chaos. (The chance to be sent
1621 * down multiple levels when attempting to go up are significantly
1622 * less than the corresponding comment in older versions indicated
1623 * due to overlooking the effect of the call to assign_rnd_lvl().)
1625 * Odds for making it to the next level up, or of being sent down:
1629 * -1 11.46 12.50 12.5
1633 if (Inhell && up && u.uhave.amulet && !newdungeon && !portal
1634 && (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz) - 3)) {
1636 int odds = 3 + (int) u.ualign.type, /* 2..4 */
1637 diff = odds <= 1 ? 0 : rn2(odds); /* paranoia */
1640 assign_rnd_level(newlevel, &u.uz, diff);
1641 /* if inside the tower, stay inside */
1642 if (was_in_W_tower && !On_W_tower_level(newlevel))
1646 assign_level(newlevel, &u.uz);
1648 new_ledger = ledger_no(newlevel);
1651 pline("A mysterious force momentarily surrounds you...");
1653 pline("
\88ê
\8fu
\8aï
\96
\82È
\97Í
\82ª
\82 \82È
\82½
\82ð
\95ï
\82ñ
\82¾
\81D
\81D
\81D");
1654 if (on_level(newlevel, &u.uz)) {
1655 (void) safe_teleds(FALSE);
1659 at_stairs = at_ladder = FALSE;
1663 /* Prevent the player from going past the first quest level unless
1664 * (s)he has been given the go-ahead by the leader.
1666 if (on_level(&u.uz, &qstart_level) && !newdungeon && !ok_to_quest()) {
1668 pline("A mysterious force prevents you from descending.");
1670 pline("
\8aï
\96
\82È
\97Í
\82ª
\82 \82È
\82½
\82ª
\8d~
\82è
\82é
\82Ì
\82ð
\96W
\82°
\82½
\81D");
1674 if (on_level(newlevel, &u.uz))
1675 return; /* this can happen */
1677 /* tethered movement makes level change while trapped feasible */
1678 if (u.utrap && u.utraptype == TT_BURIEDBALL)
1679 buried_ball_to_punishment(); /* (before we save/leave old level) */
1681 fd = currentlevel_rewrite();
1685 /* discard context which applies to the level we're leaving;
1686 for lock-picking, container may be carried, in which case we
1687 keep context; if on the floor, it's about to be saved+freed and
1688 maybe_reset_pick() needs to do its carried() check before that */
1689 maybe_reset_pick((struct obj *) 0);
1690 reset_trapset(); /* even if to-be-armed trap obj is accompanying hero */
1691 iflags.travelcc.x = iflags.travelcc.y = 0; /* travel destination cache */
1692 context.polearm.hitmon = (struct monst *) 0; /* polearm target */
1693 /* digging context is level-aware and can actually be resumed if
1694 hero returns to the previous level without any intervening dig */
1696 if (falling) /* assuming this is only trap door or hole */
1697 impact_drop((struct obj *) 0, u.ux, u.uy, newlevel->dlevel);
1699 check_special_room(TRUE); /* probably was a trap door */
1702 reset_utrap(FALSE); /* needed in level_tele */
1703 fill_pit(u.ux, u.uy);
1704 u.ustuck = 0; /* idem */
1706 u.uundetected = 0; /* not hidden, even if means are available */
1708 if (u.uswallow) /* idem */
1709 u.uswldtim = u.uswallow = 0;
1710 recalc_mapseen(); /* recalculate map overview before we leave the level */
1712 * We no longer see anything on the level. Make sure that this
1713 * follows u.uswallow set to null since uswallow overrides all
1719 * Save the level we're leaving. If we're entering the endgame,
1720 * we can get rid of all existing levels because they cannot be
1721 * reached any more. We still need to use savelev()'s cleanup
1722 * for the level being left, to recover dynamic memory in use and
1723 * to avoid dangling timers and light sources.
1725 cant_go_back = (newdungeon && In_endgame(newlevel));
1726 if (!cant_go_back) {
1727 update_mlstmv(); /* current monsters are becoming inactive */
1728 bufon(fd); /* use buffered output */
1730 savelev(fd, ledger_no(&u.uz),
1731 cant_go_back ? FREE_SAVE : (WRITE_SAVE | FREE_SAVE));
1734 /* discard unreachable levels; keep #0 */
1735 for (l_idx = maxledgerno(); l_idx > 0; --l_idx)
1736 delete_levelfile(l_idx);
1737 /* mark #overview data for all dungeon branches as uninteresting */
1738 for (l_idx = 0; l_idx < n_dgns; ++l_idx)
1739 remdun_mapseen(l_idx);
1742 if (Is_rogue_level(newlevel) || Is_rogue_level(&u.uz))
1743 assign_graphics(Is_rogue_level(newlevel) ? ROGUESET : PRIMARY);
1745 substitute_tiles(newlevel);
1747 check_gold_symbol();
1748 /* record this level transition as a potential seen branch unless using
1749 * some non-standard means of transportation (level teleport).
1751 if ((at_stairs || falling || portal) && (u.uz.dnum != newlevel->dnum))
1752 recbranch_mapseen(&u.uz, newlevel);
1753 assign_level(&u.uz0, &u.uz);
1754 assign_level(&u.uz, newlevel);
1755 assign_level(&u.utolev, newlevel);
1757 if (!builds_up(&u.uz)) { /* usual case */
1758 if (dunlev(&u.uz) > dunlev_reached(&u.uz))
1759 dunlev_reached(&u.uz) = dunlev(&u.uz);
1761 if (dunlev_reached(&u.uz) == 0
1762 || dunlev(&u.uz) < dunlev_reached(&u.uz))
1763 dunlev_reached(&u.uz) = dunlev(&u.uz);
1765 reset_rndmonst(NON_PM); /* u.uz change affects monster generation */
1767 /* set default level change destination areas */
1768 /* the special level code may override these */
1769 (void) memset((genericptr_t) &updest, 0, sizeof updest);
1770 (void) memset((genericptr_t) &dndest, 0, sizeof dndest);
1772 if (!(level_info[new_ledger].flags & LFILE_EXISTS)) {
1773 /* entering this level for first time; make it now */
1774 if (level_info[new_ledger].flags & (FORGOTTEN | VISITED)) {
1775 impossible("goto_level: returning to discarded level?");
1776 level_info[new_ledger].flags &= ~(FORGOTTEN | VISITED);
1779 new = TRUE; /* made the level */
1781 /* returning to previously visited level; reload it */
1782 fd = open_levelfile(new_ledger, whynot);
1783 if (tricked_fileremoved(fd, whynot)) {
1784 /* we'll reach here if running in wizard mode */
1785 error("Cannot continue this game.");
1788 reseed_random(rn2_on_display_rng);
1789 minit(); /* ZEROCOMP */
1790 getlev(fd, hackpid, new_ledger, FALSE);
1792 oinit(); /* reassign level dependent obj probabilities */
1795 /* do this prior to level-change pline messages */
1796 vision_reset(); /* clear old level's line-of-sight */
1797 vision_full_recalc = 0; /* don't let that reenable vision yet */
1798 flush_screen(-1); /* ensure all map flushes are postponed */
1800 if (portal && !In_endgame(&u.uz)) {
1801 /* find the portal on the new level */
1802 register struct trap *ttrap;
1804 for (ttrap = ftrap; ttrap; ttrap = ttrap->ntrap)
1805 if (ttrap->ttyp == MAGIC_PORTAL)
1809 panic("goto_level: no corresponding portal!");
1811 u_on_newpos(ttrap->tx, ttrap->ty);
1812 } else if (at_stairs && !In_endgame(&u.uz)) {
1815 u_on_newpos(xdnladder, ydnladder);
1816 else if (newdungeon)
1820 /* you climb up the {stairs|ladder};
1821 fly up the stairs; fly up along the ladder */
1822 great_effort = (Punished && !Levitation);
1823 if (flags.verbose || great_effort)
1825 pline("%s %s up%s the %s.",
1826 great_effort ? "With great effort, you" : "You",
1827 Levitation ? "float" : Flying ? "fly" : "climb",
1828 (Flying && at_ladder) ? " along" : "",
1829 at_ladder ? "ladder" : "stairs");
1830 #else /*
\94ò
\82ñ
\82¾
\82è
\82µ
\82Ä
\82¢
\82Ä
\82à
\81u
\8fã
\82Á
\82½
\81v */
1831 pline("%s%s
\82ð
\8fã
\82Á
\82½
\81D",
1832 great_effort ? "
\82â
\82Á
\82Æ
\82±
\82³" : "",
1833 at_ladder ? "
\82Í
\82µ
\82²" : "
\8aK
\92i");
1837 u_on_newpos(xupladder, yupladder);
1838 else if (newdungeon)
1843 ; /* stayed on same level? (no transit effects) */
1844 } else if (Flying) {
1848 at_ladder ? "along the ladder" : "the stairs");
1850 You("%s
\94ò
\82ñ
\82Å
\8d~
\82è
\82½
\81D",
1851 at_ladder ? "
\82Í
\82µ
\82²
\82É
\89\88\82Á
\82Ä" : "
\8aK
\92i
\82ð");
1853 } else if (near_capacity() > UNENCUMBERED
1854 || Punished || Fumbling) {
1856 You("fall down the %s.", at_ladder ? "ladder" : "stairs");
1858 You("%s
\82ð
\93]
\82°
\97\8e\82¿
\82½
\81D", at_ladder ? "
\82Í
\82µ
\82²" : "
\8aK
\92i");
1863 /* falling off steed has its own losehp() call */
1865 dismount_steed(DISMOUNT_FELL);
1867 losehp(Maybe_Half_Phys(rnd(3)),
1869 at_ladder ? "falling off a ladder"
1871 at_ladder ? "
\82Í
\82µ
\82²
\82©
\82ç
\97\8e\82¿
\82Ä"
1873 : "tumbling down a flight of stairs",
1875 : "
\8aK
\92i
\82ð
\93]
\82°
\97\8e\82¿
\82Ä",
1878 selftouch("Falling, you");
1880 selftouch("
\97\8e\82¿
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í");
1881 } else { /* ordinary descent */
1884 You("%s.", at_ladder ? "climb down the ladder"
1885 : "descend the stairs");
1887 You("%s
\82ð
\8d~
\82è
\82½
\81D", at_ladder ? "
\82Í
\82µ
\82²"
1892 } else { /* trap door or level_tele or In_endgame */
1893 u_on_rndspot((up ? 1 : 0) | (was_in_W_tower ? 2 : 0));
1898 selftouch("Falling, you");
1900 selftouch("
\97\8e\82¿
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í");
1906 obj_delivery(FALSE);
1908 kill_genocided_monsters(); /* for those wiped out while in limbo */
1910 * Expire all timers that have gone off while away. Must be
1911 * after migrating monsters and objects are delivered
1912 * (losedogs and obj_delivery).
1916 /* hero might be arriving at a spot containing a monster;
1917 if so, move one or the other to another location */
1918 if ((mtmp = m_at(u.ux, u.uy)) != 0)
1923 /* initial movement of bubbles just before vision_recalc */
1924 if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
1926 else if (Is_firelevel(&u.uz))
1929 if (level_info[new_ledger].flags & FORGOTTEN) {
1930 forget_map(ALL_MAP); /* forget the map */
1931 forget_traps(); /* forget all traps too */
1933 level_info[new_ledger].flags &= ~FORGOTTEN;
1936 /* Reset the screen. */
1937 vision_reset(); /* reset the blockages */
1938 docrt(); /* does a full vision recalc */
1942 * Move all plines beyond the screen reset.
1945 /* special levels can have a custom arrival message */
1946 deliver_splev_message();
1948 /* give room entrance message, if any */
1949 check_special_room(FALSE);
1951 /* deliver objects traveling with player */
1954 /* Check whether we just entered Gehennom. */
1955 if (!In_hell(&u.uz0) && Inhell) {
1956 if (Is_valley(&u.uz)) {
1958 You("arrive at the Valley of the Dead...");
1960 You("
\8e\80\82Ì
\92J
\82É
\93\9e\92B
\82µ
\82½
\81D
\81D
\81D");
1962 pline_The("odor of burnt flesh and decay pervades the air.");
1964 pline("
\8fÅ
\82°
\82é
\8e\80\93÷
\82â
\95\85\93÷
\82Ì
\88«
\8fL
\82ª
\82½
\82¾
\82æ
\82Á
\82Ä
\82¢
\82é
\81D");
1966 display_nhwindow(WIN_MESSAGE, FALSE);
1969 You_hear("groans and moans everywhere.");
1971 You_hear("
\82»
\82±
\82©
\82µ
\82±
\82©
\82ç
\82Ì
\82¤
\82ß
\82«
\90º
\82â
\82¤
\82È
\82è
\90º
\82ð
\95·
\82¢
\82½
\81D");
1974 pline("It is hot here. You smell smoke...");
1976 pline("
\82±
\82±
\82Í
\8f\8b\82¢
\81D
\89\8c\82Ì
\93õ
\82¢
\82ª
\82·
\82é
\81D
\81D
\81D");
1977 u.uachieve.enter_gehennom = 1;
1979 /* in case we've managed to bypass the Valley's stairway down */
1980 if (Inhell && !Is_valley(&u.uz))
1981 u.uevent.gehennom_entered = 1;
1984 static const char *const fam_msgs[4] = {
1986 "You have a sense of deja vu.",
1988 "
\8aù
\8e\8b\8a´
\82É
\82¨
\82»
\82í
\82ê
\82½
\81D",
1990 "You feel like you've been here before.",
1992 "
\91O
\82É
\82±
\82±
\82É
\97\88\82½
\82±
\82Æ
\82ª
\82 \82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D",
1994 "This place %s familiar...", 0 /* no message */
1996 "
\82±
\82Ì
\8fê
\8f\8a\82Í
\89ù
\82©
\82µ
\82¢
\81D
\81D
\81D", 0 /* no message */
1999 static const char *const halu_fam_msgs[4] = {
2001 "Whoa! Everything %s different.",
2003 "
\83I
\83\8f\83b
\81I
\82Ü
\82Á
\82½
\82
\95Ï
\82í
\82Á
\82¿
\82Ü
\82Á
\82Ä
\82é
\81D",
2005 "You are surrounded by twisty little passages, all alike.",
2007 "
\82 \82È
\82½
\82Í
\82Ü
\82ª
\82è
\82
\82Ë
\82Á
\82½
\92Ê
\98H
\82É
\82©
\82±
\82Ü
\82ê
\82Ä
\82¢
\82½
\81D
\81D
\81D",
2009 "Gee, this %s like uncle Conan's place...", 0 /* no message */
2011 "
\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 */
2021 mesg = halu_fam_msgs[which];
2023 mesg = fam_msgs[which];
2024 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\82»
\82±
\82Ü
\82Å
\82µ
\82È
\82¢*/
2025 if (mesg && index(mesg, '%')) {
2026 Sprintf(buf, mesg, !Blind ? "looks" : "seems");
2034 /* special location arrival messages/events */
2035 if (In_endgame(&u.uz)) {
2036 if (new &&on_level(&u.uz, &astral_level))
2037 final_level(); /* guardian angel,&c */
2038 else if (newdungeon && u.uhave.amulet)
2039 resurrect(); /* force confrontation with Wizard */
2040 } else if (In_quest(&u.uz)) {
2041 onquest(); /* might be reaching locate|goal level */
2042 } else if (In_V_tower(&u.uz)) {
2043 if (newdungeon && In_hell(&u.uz0))
2045 pline_The("heat and smoke are gone.");
2047 pline("
\94M
\82Æ
\89\8c\82è
\82Í
\8fÁ
\82¦
\82³
\82Á
\82½
\81D");
2048 } else if (Is_knox(&u.uz)) {
2049 /* alarm stops working once Croesus has died */
2050 if (new || !mvitals[PM_CROESUS].died) {
2052 You("have penetrated a high security area!");
2054 You("
\8dÅ
\8d\82\8b@
\96§
\82Ì
\8fê
\8f\8a\82Ö
\93¥
\82Ý
\8d\9e\82ñ
\82¾
\81I");
2056 pline("An alarm sounds!");
2058 pline("
\8cx
\95ñ
\82ª
\82È
\82Á
\82½
\81I");
2059 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
2060 if (DEADMONSTER(mtmp))
2062 mtmp->msleeping = 0;
2066 if (new && Is_rogue_level(&u.uz))
2068 You("enter what seems to be an older, more primitive world.");
2070 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");
2071 /* main dungeon message from your quest leader */
2073 if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest")
2075 if (!In_quest(&u.uz0) && at_dgn_entrance("
\83N
\83G
\83X
\83g")
2076 && !(u.uevent.qcompleted || u.uevent.qexpelled
2077 || quest_status.leader_is_dead)) {
2078 if (!u.uevent.qcalled) {
2079 u.uevent.qcalled = 1;
2080 com_pager(2); /* main "leader needs help" message */
2081 } else { /* reminder message */
2082 com_pager(Role_if(PM_ROGUE) ? 4 : 3);
2087 assign_level(&u.uz0, &u.uz); /* reset u.uz0 */
2089 save_currentstate();
2092 if ((annotation = get_annotation(&u.uz)) != 0)
2094 You("remember this level as %s.", annotation);
2096 You("
\82±
\82Ì
\8aK
\82ª%s
\82Å
\82 \82é
\82±
\82Æ
\82ð
\8ev
\82¢
\8fo
\82µ
\82½
\81D", annotation);
2098 /* assume this will always return TRUE when changing level */
2099 (void) in_out_region(u.ux, u.uy);
2108 /* reset monster hostility relative to player */
2109 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
2110 if (DEADMONSTER(mtmp))
2112 reset_hostility(mtmp);
2115 /* create some player-monsters */
2116 create_mplayers(rn1(4, 3), TRUE);
2118 /* create a guardian angel next to player, if worthy */
2119 gain_guardian_angel();
2122 static char *dfr_pre_msg = 0, /* pline() before level change */
2123 *dfr_post_msg = 0; /* pline() after level change */
2125 /* change levels at the end of this turn, after monsters finish moving */
2127 schedule_goto(tolev, at_stairs, falling, portal_flag, pre_msg, post_msg)
2129 boolean at_stairs, falling;
2131 const char *pre_msg, *post_msg;
2133 int typmask = 0100; /* non-zero triggers `deferred_goto' */
2135 /* destination flags (`goto_level' args) */
2142 if (portal_flag < 0)
2143 typmask |= 0200; /* flag for portal removal */
2144 u.utotype = typmask;
2145 /* destination level */
2146 assign_level(&u.utolev, tolev);
2149 dfr_pre_msg = dupstr(pre_msg);
2151 dfr_post_msg = dupstr(post_msg);
2154 /* handle something like portal ejection */
2158 if (!on_level(&u.uz, &u.utolev)) {
2160 int typmask = u.utotype; /* save it; goto_level zeroes u.utotype */
2162 assign_level(&dest, &u.utolev);
2164 pline1(dfr_pre_msg);
2165 goto_level(&dest, !!(typmask & 1), !!(typmask & 2), !!(typmask & 4));
2166 if (typmask & 0200) { /* remove portal */
2167 struct trap *t = t_at(u.ux, u.uy);
2175 pline1(dfr_post_msg);
2177 u.utotype = 0; /* our caller keys off of this */
2179 free((genericptr_t) dfr_pre_msg), dfr_pre_msg = 0;
2181 free((genericptr_t) dfr_post_msg), dfr_post_msg = 0;
2185 * Return TRUE if we created a monster for the corpse. If successful, the
2189 revive_corpse(corpse)
2192 struct monst *mtmp, *mcarry;
2193 boolean is_uwep, chewed;
2196 struct obj *container = (struct obj *) 0;
2197 int container_where = 0;
2199 where = corpse->where;
2200 is_uwep = (corpse == uwep);
2201 chewed = (corpse->oeaten != 0);
2203 Strcpy(cname, corpse_xname(corpse,
2204 chewed ? "bite-covered" : (const char *) 0,
2207 Strcpy(cname, corpse_xname(corpse,
2208 chewed ? "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½" : (const char *) 0,
2211 mcarry = (where == OBJ_MINVENT) ? corpse->ocarry : 0;
2213 if (where == OBJ_CONTAINED) {
2214 struct monst *mtmp2;
2216 container = corpse->ocontainer;
2217 mtmp2 = get_container_location(container, &container_where, (int *) 0);
2218 /* container_where is the outermost container's location even if
2220 if (container_where == OBJ_MINVENT && mtmp2)
2223 mtmp = revive(corpse, FALSE); /* corpse is gone if successful */
2230 pline_The("%s writhes out of your grasp!", cname);
2232 pline_The("%s
\82Í
\82à
\82ª
\82¢
\82½
\81I", cname);
2235 You_feel("squirming in your backpack!");
2237 pline("
\94w
\95\89\82¢
\91Ü
\82Å
\89½
\82©
\82ª
\82à
\82ª
\82¢
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I");
2241 if (cansee(mtmp->mx, mtmp->my))
2243 pline("%s rises from the dead!",
2244 chewed ? Adjmonnam(mtmp, "bite-covered")
2247 pline("%s
\82ª
\91h
\82Á
\82½
\81I",
2248 chewed ? Adjmonnam(mtmp, "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½")
2253 case OBJ_MINVENT: /* probably a nymph's */
2254 if (cansee(mtmp->mx, mtmp->my)) {
2255 if (canseemon(mcarry))
2257 pline("Startled, %s drops %s as it revives!",
2258 mon_nam(mcarry), an(cname));
2260 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",
2261 cname, mon_nam(mcarry), cname);
2265 pline("%s suddenly appears!",
2266 chewed ? Adjmonnam(mtmp, "bite-covered")
2269 pline("%s
\82ª
\93Ë
\91R
\8c»
\82í
\82ê
\82½
\81I",
2270 chewed ? Adjmonnam(mtmp, "
\8e\95\8c^
\82Ì
\82Â
\82¢
\82½")
2275 case OBJ_CONTAINED: {
2276 char sackname[BUFSZ];
2278 if (container_where == OBJ_MINVENT && cansee(mtmp->mx, mtmp->my)
2279 && mcarry && canseemon(mcarry) && container) {
2281 pline("%s writhes out of %s!", Amonnam(mtmp),
2283 pline("%s
\82Í%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\82à
\82ª
\82¢
\82½
\81I", Amonnam(mtmp),
2285 } else if (container_where == OBJ_INVENT && container) {
2286 Strcpy(sackname, an(xname(container)));
2288 pline("%s %s out of %s in your pack!",
2289 Blind ? Something : Amonnam(mtmp),
2290 locomotion(mtmp->data, "writhes"), sackname);
2292 pline("%s
\82Í
\91Ü
\82Ì
\92\86\82Å%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\82à
\82ª
\82¢
\82½
\81I",
2293 Blind ? Something : Amonnam(mtmp),
2296 } else if (container_where == OBJ_FLOOR && container
2297 && cansee(mtmp->mx, mtmp->my)) {
2298 Strcpy(sackname, an(xname(container)));
2300 pline("%s escapes from %s!", Amonnam(mtmp), sackname);
2302 pline("%s
\82Í%s
\82©
\82ç
\93¦
\82ê
\82½
\81I", Amonnam(mtmp), sackname);
2307 /* we should be able to handle the other cases... */
2308 impossible("revive_corpse: lost corpse @ %d", where);
2316 /* Revive the corpse via a timeout. */
2319 revive_mon(arg, timeout)
2321 long timeout UNUSED;
2323 struct obj *body = arg->a_obj;
2324 struct permonst *mptr = &mons[body->corpsenm];
2328 /* corpse will revive somewhere else if there is a monster in the way;
2329 Riders get a chance to try to bump the obstacle out of their way */
2330 if ((mptr->mflags3 & M3_DISPLACES) != 0 && body->where == OBJ_FLOOR
2331 && get_obj_location(body, &x, &y, 0) && (mtmp = m_at(x, y)) != 0) {
2332 boolean notice_it = canseemon(mtmp); /* before rloc() */
2333 char *monname = Monnam(mtmp);
2335 if (rloc(mtmp, TRUE)) {
2336 if (notice_it && !canseemon(mtmp))
2338 pline("%s vanishes.", monname);
2340 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81D", monname);
2341 else if (!notice_it && canseemon(mtmp))
2343 pline("%s appears.", Monnam(mtmp)); /* not pre-rloc monname */
2345 pline("%s
\82ª
\8c»
\82ê
\82½
\81D", Monnam(mtmp)); /* not pre-rloc monname */
2347 else if (notice_it && dist2(mtmp->mx, mtmp->my, x, y) > 2)
2349 pline("%s teleports.", monname); /* saw it and still see it */
2351 pline("%s
\82Í
\8fu
\8aÔ
\88Ú
\93®
\82µ
\82½
\81D", monname); /* saw it and still see it */
2356 /* if we succeed, the corpse is gone */
2357 if (!revive_corpse(body)) {
2361 if (is_rider(mptr) && rn2(99)) { /* Rider usually tries again */
2362 action = REVIVE_MON;
2363 for (when = 3L; when < 67L; when++)
2366 } else { /* rot this corpse away */
2368 You_feel("%sless hassled.", is_rider(mptr) ? "much " : "");
2370 You("
\94Y
\82Ý
\8e\96\82ª%s
\8c¸
\82Á
\82½
\8bC
\82ª
\82µ
\82½
\81D", is_rider(mptr) ? "
\82Æ
\82Ä
\82à" : "");
2371 action = ROT_CORPSE;
2372 when = 250L - (monstermoves - body->age);
2376 (void) start_timer(when, TIMER_OBJECT, action, arg);
2383 return 1; /* Do nothing, but let other things happen */
2399 pline("You've got the glop off.");
2401 You("%s
\82©
\82ç
\83l
\83o
\83l
\83o
\82ª
\82Æ
\82ê
\82½
\81D", body_part(FACE));
2403 if (!gulp_blnd_check()) {
2405 make_blinded(0L, TRUE);
2408 } else if (!u.ucreamed) {
2410 Your("%s feels clean now.", body_part(FACE));
2412 Your("%s
\82Í
\82«
\82ê
\82¢
\82É
\82È
\82Á
\82½
\81D", body_part(FACE));
2415 return 1; /* still busy */
2422 static NEARDATA char buf[39];
2425 Sprintf(buf, "wiping off your %s", body_part(FACE));
2427 Sprintf(buf, "%s
\82ð
\90@
\82¢
\82Ä
\82¢
\82é", body_part(FACE));
2428 set_occupation(wipeoff, buf, 0);
2429 /* Not totally correct; what if they change back after now
2430 * but before they're finished wiping?
2435 Your("%s is already clean.", body_part(FACE));
2437 Your("%s
\82Í
\89\98\82ê
\82Ä
\82¢
\82È
\82¢
\81D", body_part(FACE));
2442 set_wounded_legs(side, timex)
2447 * If you are riding, your steed gets the wounded legs instead.
2448 * You still call this function, but don't lose hp.
2449 * Caller is also responsible for adjusting messages.
2452 if (!Wounded_legs) {
2457 if (!Wounded_legs || (HWounded_legs & TIMEOUT))
2458 HWounded_legs = timex;
2459 EWounded_legs = side;
2460 (void) encumber_msg();
2465 int how; /* 0: ordinary, 1: dismounting steed, 2: limbs turn to stone */
2468 if (ATEMP(A_DEX) < 0) {
2473 /* when mounted, wounded legs applies to the steed;
2474 during petrification countdown, "your limbs turn to stone"
2475 before the final stages and that calls us (how==2) to cure
2476 wounded legs, but we want to suppress the feel better message */
2477 if (!u.usteed && how != 2) {
2479 const char *legs = body_part(LEG);
2481 if ((EWounded_legs & BOTH_SIDES) == BOTH_SIDES)
2482 legs = makeplural(legs);
2483 /* this used to say "somewhat better" but that was
2484 misleading since legs are being fully healed */
2485 Your("%s %s better.", legs, vtense(legs, "feel"));
2487 Your("%s
\82Í
\89ñ
\95\9c\82µ
\82½
\81D", body_part(LEG));
2491 HWounded_legs = EWounded_legs = 0L;
2493 /* Wounded_legs reduces carrying capacity, so we want
2494 an encumbrance check when they're healed. However,
2495 while dismounting, first steed's legs get healed,
2496 then hero is dropped to floor and a new encumbrance
2497 check is made [in dismount_steed()]. So don't give
2498 encumbrance feedback during the dismount stage
2499 because it could seem to be shown out of order and
2500 it might be immediately contradicted [able to carry
2501 more when steed becomes healthy, then possible floor
2502 feedback, then able to carry less when back on foot]. */
2504 (void) encumber_msg();