1 /* NetHack 3.6 apply.c $NHDT-Date: 1553363415 2019/03/23 17:50:15 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.272 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2012. */
4 /* NetHack may be freely redistributed. See license for details. */
6 /* JNetHack Copyright */
7 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
8 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2019 */
9 /* JNetHack may be freely redistributed. See license for details. */
13 extern boolean notonhead; /* for long worms */
15 STATIC_DCL int FDECL(use_camera, (struct obj *));
16 STATIC_DCL int FDECL(use_towel, (struct obj *));
17 STATIC_DCL boolean FDECL(its_dead, (int, int, int *));
18 STATIC_DCL int FDECL(use_stethoscope, (struct obj *));
19 STATIC_DCL void FDECL(use_whistle, (struct obj *));
20 STATIC_DCL void FDECL(use_magic_whistle, (struct obj *));
21 STATIC_DCL int FDECL(use_leash, (struct obj *));
22 STATIC_DCL int FDECL(use_mirror, (struct obj *));
23 STATIC_DCL void FDECL(use_bell, (struct obj **));
24 STATIC_DCL void FDECL(use_candelabrum, (struct obj *));
25 STATIC_DCL void FDECL(use_candle, (struct obj **));
26 STATIC_DCL void FDECL(use_lamp, (struct obj *));
27 STATIC_DCL void FDECL(light_cocktail, (struct obj **));
28 STATIC_PTR void FDECL(display_jump_positions, (int));
29 STATIC_DCL void FDECL(use_tinning_kit, (struct obj *));
30 STATIC_DCL void FDECL(use_figurine, (struct obj **));
31 STATIC_DCL void FDECL(use_grease, (struct obj *));
32 STATIC_DCL void FDECL(use_trap, (struct obj *));
33 STATIC_DCL void FDECL(use_stone, (struct obj *));
34 STATIC_PTR int NDECL(set_trap); /* occupation callback */
35 STATIC_DCL int FDECL(use_whip, (struct obj *));
36 STATIC_PTR void FDECL(display_polearm_positions, (int));
37 STATIC_DCL int FDECL(use_pole, (struct obj *));
38 STATIC_DCL int FDECL(use_cream_pie, (struct obj *));
39 STATIC_DCL int FDECL(use_grapple, (struct obj *));
40 STATIC_DCL int FDECL(do_break_wand, (struct obj *));
41 STATIC_DCL boolean FDECL(figurine_location_checks, (struct obj *,
43 STATIC_DCL void FDECL(add_class, (char *, CHAR_P));
44 STATIC_DCL void FDECL(setapplyclasses, (char *));
45 STATIC_PTR boolean FDECL(check_jump, (genericptr_t, int, int));
46 STATIC_DCL boolean FDECL(is_valid_jump_pos, (int, int, int, BOOLEAN_P));
47 STATIC_DCL boolean FDECL(get_valid_jump_position, (int, int));
48 STATIC_DCL boolean FDECL(get_valid_polearm_position, (int, int));
49 STATIC_DCL boolean FDECL(find_poleable_mon, (coord *, int, int));
52 void FDECL(amii_speaker, (struct obj *, char *, int));
55 static const char no_elbow_room[] =
57 "don't have enough elbow-room to maneuver.";
59 "
\82»
\82ê
\82ð
\82·
\82é
\82¾
\82¯
\82Ì
\82ä
\82Æ
\82è
\82ª
\82È
\82¢
\81D";
69 pline("Using your camera underwater would void the warranty.");
71 pline("
\90\85\96Ê
\89º
\82Å
\82Ì
\83J
\83\81\83\89\82Ì
\8eg
\97p
\82Í
\95Û
\8fØ
\82Ì
\91Î
\8fÛ
\8aO
\82Å
\82·
\81D");
74 if (!getdir((char *) 0))
78 pline1(nothing_happens);
81 consume_obj_charge(obj, TRUE);
83 if (obj->cursed && !rn2(2)) {
84 (void) zapyourself(obj, TRUE);
85 } else if (u.uswallow) {
87 You("take a picture of %s %s.", s_suffix(mon_nam(u.ustuck)),
88 mbodypart(u.ustuck, STOMACH));
90 You("%s
\82Ì%s
\82Ì
\8eÊ
\90^
\82ð
\8eB
\82Á
\82½
\81D", mon_nam(u.ustuck),
91 mbodypart(u.ustuck, STOMACH));
95 You("take a picture of the %s.",
97 You("%s
\82Ì
\8eÊ
\90^
\82ð
\8eB
\82Á
\82½
\81D",
98 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
99 } else if (!u.dx && !u.dy) {
100 (void) zapyourself(obj, TRUE);
101 } else if ((mtmp = bhit(u.dx, u.dy, COLNO, FLASHED_LIGHT,
102 (int FDECL((*), (MONST_P, OBJ_P))) 0,
103 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj)) != 0) {
104 obj->ox = u.ux, obj->oy = u.uy;
105 (void) flash_hits_mon(mtmp, obj);
114 boolean drying_feedback = (obj == uwep);
118 You("have no free %s!", body_part(HAND));
120 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81I", body_part(HAND));
122 } else if (obj == ublindf) {
124 You("cannot use it while you're wearing it!");
126 You("
\82»
\82ê
\82ð
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\82Ì
\82Å
\8eg
\97p
\82Å
\82«
\82È
\82¢
\81I");
128 } else if (obj->cursed) {
134 incr_itimeout(&Glib, rn1(10, 3));
136 Your("%s %s!", makeplural(body_part(HAND)),
137 (old ? "are filthier than ever" : "get slimy"));
139 Your("%s
\82Í%s
\81I", makeplural(body_part(HAND)),
140 (old ? "
\82Ü
\82·
\82Ü
\82·
\89\98\82È
\82
\82È
\82Á
\82½" : "
\82Ê
\82é
\82Ê
\82é
\82É
\82È
\82Á
\82½"));
142 if (is_wet_towel(obj))
143 dry_a_towel(obj, -1, drying_feedback);
148 u.ucreamed += rn1(10, 3);
150 pline("Yecch! Your %s %s gunk on it!", body_part(FACE),
151 (old ? "has more" : "now has"));
153 pline("
\83Q
\83F
\81[
\81I
\82 \82È
\82½
\82Ì%s
\82Í%s
\82×
\82Æ
\82×
\82Æ
\82É
\82È
\82Á
\82½
\81I", body_part(FACE),
154 (old ? "
\82à
\82Á
\82Æ" : ""));
156 make_blinded(Blinded + (long) u.ucreamed - old, TRUE);
161 what = (ublindf->otyp == LENSES)
163 : (obj->otyp == ublindf->otyp) ? "other towel"
166 what = (ublindf->otyp == LENSES)
168 : (obj->otyp == ublindf->otyp) ? "
\83^
\83I
\83\8b"
171 if (ublindf->cursed) {
173 You("push your %s %s.", what,
174 rn2(2) ? "cock-eyed" : "crooked");
176 pline("%s
\82ª%s
\81D", what,
177 rn2(2) ? "
\82¸
\82ê
\82½" : "
\82ä
\82ª
\82ñ
\82¾");
180 struct obj *saved_ublindf = ublindf;
182 You("push your %s off.", what);
184 pline("%s
\82ª
\82¸
\82è
\97\8e\82¿
\82½
\81D", what);
186 dropx(saved_ublindf);
189 if (is_wet_towel(obj))
190 dry_a_towel(obj, -1, drying_feedback);
200 You("wipe off your %s.", makeplural(body_part(HAND)));
202 You("%s
\82ð
\90@
\82¢
\82½
\81D", makeplural(body_part(HAND)));
203 if (is_wet_towel(obj))
204 dry_a_towel(obj, -1, drying_feedback);
206 } else if (u.ucreamed) {
207 Blinded -= u.ucreamed;
211 pline("You've got the glop off.");
213 You("
\82³
\82Á
\82Ï
\82è
\82µ
\82½
\81D");
214 if (!gulp_blnd_check()) {
216 make_blinded(0L, TRUE);
220 Your("%s feels clean now.", body_part(FACE));
222 pline("%s
\82Ì
\89\98\82ê
\82ð
\90@
\82«
\82Æ
\82Á
\82½
\81D", body_part(FACE));
224 if (is_wet_towel(obj))
225 dry_a_towel(obj, -1, drying_feedback);
230 Your("%s and %s are already clean.", body_part(FACE),
231 makeplural(body_part(HAND)));
233 Your("%s
\82â%s
\82Í
\89\98\82ê
\82Ä
\82¢
\82È
\82¢
\81D", body_part(FACE),
234 makeplural(body_part(HAND)));
240 /* maybe give a stethoscope message based on floor objects */
242 its_dead(rx, ry, resp)
247 boolean more_corpses;
248 struct permonst *mptr;
250 struct obj *corpse = sobj_at(CORPSE, rx, ry),
251 *statue = sobj_at(STATUE, rx, ry);
253 if (!can_reach_floor(TRUE)) { /* levitation or unskilled riding */
254 corpse = 0; /* can't reach corpse on floor */
255 /* you can't reach tiny statues (even though you can fight
256 tiny monsters while levitating--consistency, what's that?) */
257 while (statue && mons[statue->corpsenm].msize == MZ_TINY)
258 statue = nxtobj(statue, STATUE, TRUE);
260 /* when both corpse and statue are present, pick the uppermost one */
261 if (corpse && statue) {
262 if (nxtobj(statue, CORPSE, TRUE) == corpse)
263 corpse = 0; /* corpse follows statue; ignore it */
265 statue = 0; /* corpse precedes statue; ignore statue */
268 more_corpses = (corpse && nxtobj(corpse, CORPSE, TRUE));
271 /* additional stethoscope messages from jyoung@apanix.apana.org.au */
272 if (!corpse && !statue) {
273 ; /* nothing to do */
275 } else if (Hallucination) {
279 Strcpy(buf, "You're both stoned");
281 Strcpy(buf, "
\90Î
\82¾");
282 #if 0 /*JP*//*
\91ã
\96¼
\8e\8c\8f\88\97\9d\82Í
\95s
\97v*/
283 } else if (corpse->quan == 1L && !more_corpses) {
284 int gndr = 2; /* neuter: "it" */
285 struct monst *mtmp = get_mtraits(corpse, FALSE);
287 /* (most corpses don't retain the monster's sex, so
288 we're usually forced to use generic pronoun here) */
290 mptr = mtmp->data = &mons[mtmp->mnum];
291 /* TRUE: override visibility check--it's not on the map */
292 gndr = pronoun_gender(mtmp, TRUE);
294 mptr = &mons[corpse->corpsenm];
297 else if (is_male(mptr))
300 Sprintf(buf, "%s's dead", genders[gndr].he); /* "he"/"she"/"it" */
301 buf[0] = highc(buf[0]);
303 } else { /* plural */
305 Strcpy(buf, "They're dead");
307 Strcpy(buf, "
\8e\80\82ñ
\82Å
\82é
\82º");
309 /* variations on "He's dead, Jim." (Star Trek's Dr McCoy) */
311 You_hear("a voice say, \"%s, Jim.\"", buf);
313 You_hear("
\81u
\82»
\82¢
\82Â
\82Í%s
\81C
\83W
\83\80\81v
\82Æ
\82¢
\82¤
\90º
\82ª
\95·
\82±
\82¦
\82½
\81D", buf);
319 boolean here = (rx == u.ux && ry == u.uy),
320 one = (corpse->quan == 1L && !more_corpses), reviver = FALSE;
322 boolean here = (rx == u.ux && ry == u.uy), reviver = FALSE;
324 int visglyph, corpseglyph;
326 visglyph = glyph_at(rx, ry);
327 corpseglyph = obj_to_glyph(corpse, rn2);
329 if (Blind && (visglyph != corpseglyph))
330 map_object(corpse, TRUE);
332 if (Role_if(PM_HEALER)) {
333 /* ok to reset `corpse' here; we're done with it */
335 if (obj_has_timer(corpse, REVIVE_MON))
338 corpse = nxtobj(corpse, CORPSE, TRUE);
339 } while (corpse && !reviver);
342 You("determine that %s unfortunate being%s %s%s dead.",
343 one ? (here ? "this" : "that") : (here ? "these" : "those"),
344 one ? "" : "s", one ? "is" : "are", reviver ? " mostly" : "");
346 You("%s
\95s
\8dK
\82È
\90¶
\82«
\95¨
\82Í%s
\8e\80\82ñ
\82Å
\82¢
\82é
\82Æ
\8c\8b\98_
\82µ
\82½
\81D",
347 here ? "
\82±
\82Ì" : "
\82»
\82Ì",
348 reviver ? "
\82Ù
\82Ú" : "");
352 } else { /* statue */
353 const char *what, *how;
356 mptr = &mons[statue->corpsenm];
357 if (Blind) { /* ignore statue->dknown; it'll always be set */
358 Sprintf(buf, "%s %s",
359 (rx == u.ux && ry == u.uy) ? "This" : "That",
360 humanoid(mptr) ? "person" : "creature");
364 if (!type_is_pname(mptr))
367 #else /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\83V
\83\93\83v
\83\8b\82É*/
368 if (Blind) { /* ignore statue->dknown; it'll always be set */
369 what = (rx == u.ux && ry == u.uy) ? "
\82±
\82ê" : "
\82 \82ê";
371 what = mons[statue->corpsenm].mname;
378 if (Role_if(PM_HEALER)) {
379 struct trap *ttmp = t_at(rx, ry);
381 if (ttmp && ttmp->ttyp == STATUE_TRAP)
383 how = "extraordinary";
385 how = "
\95À
\8aO
\82ê
\82½";
386 else if (Has_contents(statue))
390 how = "
\92\8d\96Ú
\82·
\82×
\82«";
394 pline("%s is in %s health for a statue.", what, how);
396 pline("
\92¤
\91\9c\82Æ
\82µ
\82Ä
\82Ì%s
\82Í%s
\8dì
\95i
\82¾
\81D", what, how);
399 return FALSE; /* no corpse or statue */
403 static const char hollow_str[] = "a hollow sound. This must be a secret %s!";
405 static const char hollow_str[] = "
\82¤
\82Â
\82ë
\82È
\89¹
\82ð
\95·
\82¢
\82½
\81D
\94é
\96§
\82Ì%s
\82É
\88á
\82¢
\82È
\82¢
\81I";
407 /* Strictly speaking it makes no sense for usage of a stethoscope to
408 not take any time; however, unless it did, the stethoscope would be
409 almost useless. As a compromise, one use per turn is free, another
410 uses up the turn; this makes curse status have a tangible effect. */
413 register struct obj *obj;
418 boolean interference = (u.uswallow && is_whirly(u.ustuck->data)
419 && !rn2(Role_if(PM_HEALER) ? 10 : 3));
421 if (nohands(youmonst.data)) {
423 You("have no hands!"); /* not `body_part(HAND)' */
425 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I");
430 You_cant("hear anything!");
432 You("
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81I");
434 } else if (!freehand()) {
436 You("have no free %s.", body_part(HAND));
438 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81D", body_part(HAND));
441 if (!getdir((char *) 0))
444 res = (moves == context.stethoscope_move)
445 && (youmonst.movement == context.stethoscope_movement);
446 context.stethoscope_move = moves;
447 context.stethoscope_movement = youmonst.movement;
449 bhitpos.x = u.ux, bhitpos.y = u.uy; /* tentative, reset below */
450 notonhead = u.uswallow;
451 if (u.usteed && u.dz > 0) {
454 pline("%s interferes.", Monnam(u.ustuck));
456 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
457 mstatusline(u.ustuck);
459 mstatusline(u.usteed);
461 } else if (u.uswallow && (u.dx || u.dy || u.dz)) {
462 mstatusline(u.ustuck);
464 } else if (u.uswallow && interference) {
466 pline("%s interferes.", Monnam(u.ustuck));
468 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
469 mstatusline(u.ustuck);
474 You_hear("faint splashing.");
476 You_hear("
\82©
\82·
\82©
\82É
\83o
\83V
\83\83\83o
\83V
\83\83\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
477 else if (u.dz < 0 || !can_reach_floor(TRUE))
478 cant_reach_floor(u.ux, u.uy, (u.dz < 0), TRUE);
479 else if (its_dead(u.ux, u.uy, &res))
480 ; /* message already given */
481 else if (Is_stronghold(&u.uz))
483 You_hear("the crackling of hellfire.");
485 You_hear("
\92n
\8d\96\82Ì
\89\8a\82ª
\83p
\83`
\83p
\83`
\94R
\82¦
\82Ä
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
488 pline_The("%s seems healthy enough.", surface(u.ux, u.uy));
490 pline("%s
\82Í
\8f[
\95ª
\8c\92\8dN
\82Ì
\82æ
\82¤
\82¾
\81D", surface(u.ux,u.uy));
492 } else if (obj->cursed && !rn2(2)) {
494 You_hear("your heart beat.");
496 You_hear("
\8e©
\95ª
\82Ì
\90S
\91\9f\82Ì
\8cÛ
\93®
\82ð
\95·
\82¢
\82½
\81D");
499 if (Stunned || (Confusion && !rn2(5)))
501 if (!u.dx && !u.dy) {
509 You_hear("a faint typing noise.");
511 You_hear("
\82©
\82·
\82©
\82É
\82¾
\82ê
\82©
\82ª
\83^
\83C
\83s
\83\93\83O
\82µ
\82Ä
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
514 if ((mtmp = m_at(rx, ry)) != 0) {
515 const char *mnm = x_monnam(mtmp, ARTICLE_A, (const char *) 0,
516 SUPPRESS_IT | SUPPRESS_INVISIBLE, FALSE);
518 /* bhitpos needed by mstatusline() iff mtmp is a long worm */
519 bhitpos.x = rx, bhitpos.y = ry;
520 notonhead = (mtmp->mx != rx || mtmp->my != ry);
522 if (mtmp->mundetected) {
523 if (!canspotmon(mtmp))
525 There("is %s hidden there.", mnm);
527 pline("
\82±
\82±
\82É%s
\82ª
\89B
\82ê
\82Ä
\82¢
\82é
\81D", mnm);
528 mtmp->mundetected = 0;
529 newsym(mtmp->mx, mtmp->my);
530 } else if (mtmp->mappearance) {
531 const char *what = "thing";
533 switch (M_AP_TYPE(mtmp)) {
535 what = simple_typename(mtmp->mappearance);
537 case M_AP_MONSTER: /* ignore Hallucination here */
538 what = mons[mtmp->mappearance].mname;
541 what = defsyms[mtmp->mappearance].explanation;
546 pline("That %s is really %s.", what, mnm);
548 pline("
\82±
\82Ì%s
\82Í
\8eÀ
\8dÛ
\82É
\82Í%s
\81D", what, mnm);
549 } else if (flags.verbose && !canspotmon(mtmp)) {
551 There("is %s there.", mnm);
553 pline("
\82±
\82±
\82É
\82Í%s
\82ª
\82¢
\82é
\81D", mnm);
557 if (!canspotmon(mtmp))
558 map_invisible(rx, ry);
561 if (unmap_invisible(rx,ry))
563 pline_The("invisible monster must have moved.");
565 pline_The("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82Í
\88Ú
\93®
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
571 You_hear(hollow_str, "door");
573 You_hear(hollow_str, "
\94à");
574 cvt_sdoor_to_door(lev); /* ->typ = DOOR */
579 You_hear(hollow_str, "passage");
581 You_hear(hollow_str, "
\92Ê
\98H");
582 lev->typ = CORR, lev->flags = 0;
583 unblock_point(rx, ry);
588 if (!its_dead(rx, ry, &res))
590 You("hear nothing special."); /* not You_hear() */
592 pline("
\93Á
\82É
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81D");
598 static const char whistle_str[] = "produce a %s whistling sound.";
600 static const char whistle_str[] = "
\93J
\82ð
\90\81\82¢
\82Ä%s
\89¹
\82ð
\82½
\82Ä
\82½
\81D";
606 if (!can_blow(&youmonst)) {
608 You("are incapable of using the whistle.");
610 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
611 } else if (Underwater) {
613 You("blow bubbles through %s.", yname(obj));
615 You("%s
\82ð
\92Ê
\82µ
\82Ä
\96A
\82ð
\8fo
\82µ
\82½
\81D", xname(obj));
619 You_feel("rushing air tickle your %s.",
622 You_feel("
\8bó
\8bC
\82Ì
\97¬
\82ê
\82ª%s
\82ð
\82
\82·
\82®
\82Á
\82½
\81D",
627 You(whistle_str, obj->cursed ? "shrill" : "high");
629 You(whistle_str, obj->cursed ? "
\95s
\8bC
\96¡
\82È" : "
\82©
\82ñ
\8d\82\82¢");
637 use_magic_whistle(obj)
640 register struct monst *mtmp, *nextmon;
642 if (!can_blow(&youmonst)) {
644 You("are incapable of using the whistle.");
646 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
647 } else if (obj->cursed && !rn2(2)) {
649 You("produce a %shigh-pitched humming noise.",
650 Underwater ? "very " : "");
652 You("%s
\8d\82\82¢
\92²
\8eq
\82Ì
\82¤
\82È
\82é
\82æ
\82¤
\82È
\89¹
\82ð
\82½
\82Ä
\82½
\81D",
653 Underwater ? "
\82Æ
\82Ä
\82à" : "");
657 int pet_cnt = 0, omx, omy;
659 /* it's magic! it works underwater too (at a higher pitch) */
662 Hallucination ? "normal" : Underwater ? "strange, high-pitched"
666 Hallucination ? "
\93J
\82Ì
\82æ
\82¤
\82È" : Underwater ? "
\95s
\8ev
\8bc
\82È
\8d\82\82¢
\92²
\8eq
\82Ì"
667 : "
\95s
\8ev
\8bc
\82È");
669 for (mtmp = fmon; mtmp; mtmp = nextmon) {
670 nextmon = mtmp->nmon; /* trap might kill mon */
671 if (DEADMONSTER(mtmp))
673 /* steed is already at your location, so not affected;
674 this avoids trap issues if you're on a trap location */
675 if (mtmp == u.usteed)
678 if (mtmp->mtrapped) {
679 /* no longer in previous trap (affects mintrap) */
681 fill_pit(mtmp->mx, mtmp->my);
683 /* mimic must be revealed before we know whether it
684 actually moves because line-of-sight may change */
687 omx = mtmp->mx, omy = mtmp->my;
689 if (mtmp->mx != omx || mtmp->my != omy) {
690 mtmp->mundetected = 0; /* reveal non-mimic hider */
691 if (canspotmon(mtmp))
693 if (mintrap(mtmp) == 2)
699 makeknown(obj->otyp);
707 return (boolean) (abs(u.ux - x) > n || abs(u.uy - y) > n);
716 for (obj = invent; obj; obj = obj->nobj)
717 if (obj->otyp == LEASH && obj->leashmon != 0)
722 /* otmp is about to be destroyed or stolen */
725 register struct obj *otmp;
727 register struct monst *mtmp;
729 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
730 if (mtmp->m_id == (unsigned) otmp->leashmon)
735 /* mtmp is about to die, or become untame */
737 m_unleash(mtmp, feedback)
738 register struct monst *mtmp;
741 register struct obj *otmp;
746 pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp));
748 pline("%s
\82Í
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82Ä
\93¦
\82ê
\82½
\81I", Monnam(mtmp));
751 Your("leash falls slack.");
753 Your("
\95R
\82ª
\82½
\82é
\82ñ
\82Å
\97\8e\82¿
\82½
\81D");
755 for (otmp = invent; otmp; otmp = otmp->nobj)
756 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
761 /* player is about to die (for bones) */
765 register struct obj *otmp;
766 register struct monst *mtmp;
768 for (otmp = invent; otmp; otmp = otmp->nobj)
769 if (otmp->otyp == LEASH)
771 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
778 * This ought to exclude various other things, such as lights and gas
779 * spore, is_whirly() critters, ethereal creatures, possibly others.
785 return (boolean) (mtmp->mnum != PM_LONG_WORM);
798 /* if the leash isn't in use, assume we're trying to leash
799 the engulfer; if it is use, distinguish between removing
800 it from the engulfer versus from some other creature
801 (note: the two in-use cases can't actually occur; all
802 leashes are released when the hero gets engulfed) */
804 You_cant((!obj->leashmon
805 ? "leash %s from inside."
806 : (obj->leashmon == (int) u.ustuck->m_id)
807 ? "unleash %s from inside."
808 : "unleash anything from inside %s."),
809 noit_mon_nam(u.ustuck));
811 You_cant((!obj->leashmon
812 ? "
\93à
\91¤
\82©
\82ç%s
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"
813 : (obj->leashmon == (int) u.ustuck->m_id)
814 ? "
\93à
\91¤
\82©
\82ç%s
\82ð
\8aO
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"
815 : "%s
\82Ì
\93à
\91¤
\82©
\82ç
\8aO
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"),
816 noit_mon_nam(u.ustuck));
820 if (!obj->leashmon && number_leashed() >= MAXLEASHED) {
822 You("cannot leash any more pets.");
824 You("
\82±
\82ê
\88È
\8fã
\83y
\83b
\83g
\82É
\95R
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
828 if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
831 if (cc.x == u.ux && cc.y == u.uy) {
832 if (u.usteed && u.dz > 0) {
838 pline("Leash yourself? Very funny...");
840 pline("
\8e©
\95ª
\82ð
\94\9b\82é
\81H
\95Ï
\82È
\82Ì
\81D
\81D
\81D");
845 * From here on out, return value is 1 == a move is used.
848 if (!(mtmp = m_at(cc.x, cc.y))) {
850 There("is no creature there.");
852 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
853 (void) unmap_invisible(cc.x, cc.y);
857 spotmon = canspotmon(mtmp);
860 if (!spotmon && !glyph_is_invisible(levl[cc.x][cc.y].glyph)) {
861 /* for the unleash case, we don't verify whether this unseen
862 monster is the creature attached to the current leash */
864 You("fail to %sleash something.", obj->leashmon ? "un" : "");
866 You("%s
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D", obj->leashmon ? "
\8aO
\82·" : "
\8c\8b\82Ñ
\82Â
\82¯
\82é");
867 /* trying again will work provided the monster is tame
868 (and also that it doesn't change location by retry time) */
869 map_invisible(cc.x, cc.y);
870 } else if (!mtmp->mtame) {
872 pline("%s %s leashed!", Monnam(mtmp),
873 (!obj->leashmon) ? "cannot be" : "is not");
875 pline("%s
\82Í
\95R
\82Å%s
\81I", Monnam(mtmp),
876 (!obj->leashmon) ? "
\8c\8b\82×
\82È
\82¢" : "
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢");
878 } else if (!obj->leashmon) {
879 /* applying a leash which isn't currently in use */
880 if (mtmp->mleashed) {
882 pline("This %s is already leashed.",
883 spotmon ? l_monnam(mtmp) : "creature");
885 pline("%s
\82Í
\82·
\82Å
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D",
886 spotmon ? l_monnam(mtmp) : "
\89ö
\95¨");
888 } else if (!leashable(mtmp)) {
890 pline("The leash won't fit onto %s%s.", spotmon ? "your " : "",
893 pline("
\95R
\82Í%s
\82É
\8d\87\82í
\82È
\82¢
\81D",
898 You("slip the leash around %s%s.", spotmon ? "your " : "",
901 You("%s
\82ð
\95R
\82Å
\8c\8b\82Ñ
\82Â
\82¯
\82½
\81D",
905 obj->leashmon = (int) mtmp->m_id;
909 /* applying a leash which is currently in use */
910 if (obj->leashmon != (int) mtmp->m_id) {
912 pline("This leash is not attached to that creature.");
914 pline("
\82±
\82Ì
\95R
\82Í
\82»
\82ê
\82É
\82Í
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢
\81D");
915 } else if (obj->cursed) {
917 pline_The("leash would not come off!");
919 pline("
\95R
\82ª
\82Í
\82¸
\82ê
\82È
\82¢
\81I");
925 You("remove the leash from %s%s.",
926 spotmon ? "your " : "", l_monnam(mtmp));
928 You("%s
\82©
\82ç
\95R
\82ð
\82Í
\82¸
\82µ
\82½
\81D",
936 /* assuming mtmp->mleashed has been checked */
945 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
949 return (struct obj *) 0;
955 register struct monst *mtmp;
956 register struct obj *otmp;
958 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
959 if (DEADMONSTER(mtmp))
961 if (mtmp->mleashed) {
962 if (distu(mtmp->mx, mtmp->my) > 2)
964 if (distu(mtmp->mx, mtmp->my) > 2) {
965 for (otmp = invent; otmp; otmp = otmp->nobj)
966 if (otmp->otyp == LEASH
967 && otmp->leashmon == (int) mtmp->m_id) {
971 You_feel("%s leash go slack.",
972 (number_leashed() > 1) ? "a" : "the");
974 You("
\95R
\82ª
\82½
\82é
\82ñ
\82¾
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
982 /* no pack mules for the Amulet */
983 if (u.usteed && mon_has_amulet(u.usteed))
992 register struct obj *otmp;
993 register struct monst *mtmp;
995 for (otmp = invent; otmp; otmp = otmp->nobj) {
996 if (otmp->otyp != LEASH || otmp->leashmon == 0)
998 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
999 if (DEADMONSTER(mtmp))
1001 if ((int) mtmp->m_id == otmp->leashmon)
1005 impossible("leash in use isn't attached to anything?");
1009 if (dist2(u.ux, u.uy, mtmp->mx, mtmp->my)
1010 > dist2(x, y, mtmp->mx, mtmp->my)) {
1011 if (!um_dist(mtmp->mx, mtmp->my, 3)) {
1012 ; /* still close enough */
1013 } else if (otmp->cursed && !breathless(mtmp->data)) {
1014 if (um_dist(mtmp->mx, mtmp->my, 5)
1015 || (mtmp->mhp -= rnd(2)) <= 0) {
1016 long save_pacifism = u.uconduct.killer;
1019 Your("leash chokes %s to death!", mon_nam(mtmp));
1021 pline("%s
\82Í
\8di
\82ß
\8eE
\82³
\82ê
\82½
\81I",mon_nam(mtmp));
1022 /* hero might not have intended to kill pet, but
1023 that's the result of his actions; gain experience,
1024 lose pacifism, take alignment and luck hit, make
1025 corpse less likely to remain tame after revival */
1026 xkilled(mtmp, XKILL_NOMSG);
1027 /* life-saving doesn't ordinarily reset this */
1028 if (!DEADMONSTER(mtmp))
1029 u.uconduct.killer = save_pacifism;
1032 pline("%s is choked by the leash!", Monnam(mtmp));
1034 pline("%s
\82Í
\95R
\82Å
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82½
\81I", Monnam(mtmp));
1035 /* tameness eventually drops to 1 here (never 0) */
1036 if (mtmp->mtame && rn2(mtmp->mtame))
1040 if (um_dist(mtmp->mx, mtmp->my, 5)) {
1042 pline("%s leash snaps loose!", s_suffix(Monnam(mtmp)));
1044 pline("%s
\82Ì
\95R
\82Í
\83p
\83`
\83\93\82Æ
\8aO
\82ê
\82½
\81I", Monnam(mtmp));
1045 m_unleash(mtmp, FALSE);
1048 You("pull on the leash.");
1050 You("
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\81D");
1051 if (mtmp->data->msound != MS_SILENT)
1072 return ((ACURR(A_CHA) > 14)
1073 ? ((poly_gender() == 1)
1079 /*JP
\8cê
\8a²
\82Å
\8eg
\82¤ */
1087 static const char look_str[] = "look %s.";
1089 static const char look_str[] = "%s
\8c©
\82¦
\82é
\81D";
1095 const char *mirror, *uvisage;
1099 boolean vis, invis_mirror, useeit, monable;
1101 if (!getdir((char *) 0))
1103 invis_mirror = Invis;
1104 useeit = !Blind && (!invis_mirror || See_invisible);
1105 uvisage = beautiful();
1106 mirror = simpleonames(obj); /* "mirror" or "looking glass" */
1107 if (obj->cursed && !rn2(2)) {
1110 pline_The("%s fogs up and doesn't reflect!", mirror);
1112 pline("%s
\82Í
\93Ü
\82è
\81C
\89f
\82ç
\82È
\82
\82È
\82Á
\82½
\81I", mirror);
1115 if (!u.dx && !u.dy && !u.dz) {
1118 You_cant("see your %s %s.", uvisage, body_part(FACE));
1120 You_cant("
\8e©
\95ª
\82Ì%s
\82¢%s
\82ð
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", uvisage, body_part(FACE));
1122 if (u.umonnum == PM_FLOATING_EYE) {
1125 You("stiffen momentarily under your gaze.");
1127 pline("
\88ê
\8fu
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82½
\81D");
1131 pline("Yow! The %s stares back!", mirror);
1133 pline("
\82¨
\82ì
\81I%s
\82ª
\82 \82È
\82½
\82ð
\82É
\82ç
\82Ý
\95Ô
\82µ
\82½
\81I", mirror);
1136 pline("Yikes! You've frozen yourself!");
1138 pline("
\82¨
\82ì
\81I
\82 \82È
\82½
\82Í
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I");
1139 if (!Hallucination || !rn2(4)) {
1140 nomul(-rnd(MAXULEV + 6 - u.ulevel));
1142 multi_reason = "gazing into a mirror";
1144 multi_reason = "
\8b¾
\82É
\94½
\8eË
\82µ
\82½
\8e\8b\90ü
\82Å
\8dd
\92¼
\82µ
\82Ä
\82¢
\82é
\8aÔ
\82É";
1146 nomovemsg = 0; /* default, "you can move again" */
1148 } else if (youmonst.data->mlet == S_VAMPIRE)
1150 You("don't have a reflection.");
1152 You("
\8b¾
\82É
\89f
\82ç
\82È
\82©
\82Á
\82½
\81D");
1153 else if (u.umonnum == PM_UMBER_HULK) {
1155 pline("Huh? That doesn't look like you!");
1157 pline("
\82Ù
\82¦
\81H
\8eÊ
\82Á
\82Ä
\82é
\82Ì
\82Í
\82 \82È
\82½
\82¶
\82á
\82È
\82¢
\82Ý
\82½
\82¢
\82¾
\81I");
1158 make_confused(HConfusion + d(3, 4), FALSE);
1159 } else if (Hallucination)
1160 You(look_str, hcolor((char *) 0));
1163 You(look_str, "peaked");
1165 You(look_str, "
\8aç
\90F
\82ª
\88«
\82");
1166 else if (u.uhs >= WEAK)
1168 You(look_str, "undernourished");
1170 You(look_str, "
\89h
\97{
\8e¸
\92²
\82Ì
\82æ
\82¤
\82É");
1173 You("look as %s as ever.", uvisage);
1175 You("
\82 \82¢
\82©
\82í
\82ç
\82¸%s
\82
\8c©
\82¦
\82é
\81D", uvisage);
1182 You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)),
1183 mbodypart(u.ustuck, STOMACH));
1185 You("%s
\82Ì%s
\82ð
\89f
\82µ
\82½
\81D", mon_nam(u.ustuck),
1186 mbodypart(u.ustuck, STOMACH));
1193 You(Hallucination ? "give the fish a chance to fix their makeup."
1194 : "reflect the murky water.");
1196 You(Hallucination ? "
\8b\9b\82É
\89»
\8fÏ
\92¼
\82µ
\82Ì
\8b@
\89ï
\82ð
\97^
\82¦
\82½
\81D"
1197 : "
\82 \82È
\82½
\82Í
\97\84\82ñ
\82¾
\90\85\82ð
\89f
\82µ
\82½
\81D");
1204 You("reflect the %s.",
1206 You("%s
\82ð
\89f
\82µ
\82½
\81D",
1207 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
1210 mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM,
1211 (int FDECL((*), (MONST_P, OBJ_P))) 0,
1212 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1213 if (!mtmp || !haseyes(mtmp->data) || notonhead)
1216 /* couldsee(mtmp->mx, mtmp->my) is implied by the fact that bhit()
1217 targetted it, so we can ignore possibility of X-ray vision */
1218 vis = canseemon(mtmp);
1219 /* ways to directly see monster (excludes X-ray vision, telepathy,
1220 extended detection, type-specific warning) */
1221 #define SEENMON (MONSEEN_NORMAL | MONSEEN_SEEINVIS | MONSEEN_INFRAVIS)
1222 how_seen = vis ? howmonseen(mtmp) : 0;
1223 /* whether monster is able to use its vision-based capabilities */
1224 monable = !mtmp->mcan && (!mtmp->minvis || perceives(mtmp->data));
1225 mlet = mtmp->data->mlet;
1226 if (mtmp->msleeping) {
1229 pline("%s is too tired to look at your %s.", Monnam(mtmp),
1231 pline("%s
\82Í
\82Æ
\82Ä
\82à
\94æ
\82ê
\82Ä
\82¢
\82Ä%s
\82ð
\8c©
\82é
\82Ç
\82±
\82ë
\82¶
\82á
\82È
\82¢
\81D", Monnam(mtmp),
1233 } else if (!mtmp->mcansee) {
1236 pline("%s can't see anything right now.", Monnam(mtmp));
1238 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\89½
\82à
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", Monnam(mtmp));
1239 } else if (invis_mirror && !perceives(mtmp->data)) {
1242 pline("%s fails to notice your %s.", Monnam(mtmp), mirror);
1244 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8bC
\95t
\82©
\82È
\82©
\82Á
\82½
\81D", Monnam(mtmp), mirror);
1245 /* infravision doesn't produce an image in the mirror */
1246 } else if ((how_seen & SEENMON) == MONSEEN_INFRAVIS) {
1247 if (vis) /* (redundant) */
1249 pline("%s is too far away to see %sself in the dark.",
1250 Monnam(mtmp), mhim(mtmp));
1252 pline("%s
\82Í
\88Ã
\88Å
\82Å
\8e©
\95ª
\8e©
\90g
\82ð
\8c©
\82é
\82É
\82Í
\89\93\82·
\82¬
\82é
\81D", Monnam(mtmp));
1254 /* some monsters do special things */
1255 } else if (mlet == S_VAMPIRE || mlet == S_GHOST || is_vampshifter(mtmp)) {
1258 pline("%s doesn't have a reflection.", Monnam(mtmp));
1260 pline("%s
\82Í%s
\82É
\89f
\82ç
\82È
\82¢
\81D", Monnam(mtmp), mirror);
1261 } else if (monable && mtmp->data == &mons[PM_MEDUSA]) {
1263 if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!"))
1265 if (mon_reflects(mtmp, "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81I"))
1269 pline("%s is turned to stone!", Monnam(mtmp));
1271 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1274 } else if (monable && mtmp->data == &mons[PM_FLOATING_EYE]) {
1275 int tmp = d((int) mtmp->m_lev, (int) mtmp->data->mattk[0].damd);
1280 pline("%s is frozen by its reflection.", Monnam(mtmp));
1282 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
1285 You_hear("%s stop moving.", something);
1287 You_hear("
\89½
\82©
\82ª
\93®
\82«
\82ð
\82Æ
\82ß
\82½
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1288 paralyze_monst(mtmp, (int) mtmp->mfrozen + tmp);
1289 } else if (monable && mtmp->data == &mons[PM_UMBER_HULK]) {
1292 pline("%s confuses itself!", Monnam(mtmp));
1294 pline("%s
\82Í
\8d¬
\97\90\82µ
\82½
\81I", Monnam(mtmp));
1296 } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
1297 || mtmp->data == &mons[PM_INCUBUS])) {
1299 char buf[BUFSZ]; /* "She" or "He" */
1302 pline("%s admires %sself in your %s.", Monnam(mtmp), mhim(mtmp),
1305 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\82¤
\82Á
\82Æ
\82è
\82µ
\82½
\81D", Monnam(mtmp));
1308 pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
1310 pline("%s
\82Í
\82»
\82ê
\82ð
\92D
\82Á
\82½
\81I", upstart(strcpy(buf, mhe(mtmp))));
1313 pline("It steals your %s!", mirror);
1315 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\93\90\82ñ
\82¾
\81I", mirror);
1316 setnotworn(obj); /* in case mirror was wielded */
1318 (void) mpickobj(mtmp, obj);
1319 if (!tele_restrict(mtmp))
1320 (void) rloc(mtmp, TRUE);
1321 } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
1322 && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
1323 boolean do_react = TRUE;
1325 if (mtmp->mfrozen) {
1327 You("discern no obvious reaction from %s.", mon_nam(mtmp));
1329 You_feel("a bit silly gesturing the mirror in that direction.");
1335 pline("%s is frightened by its reflection.", Monnam(mtmp));
1337 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\95|
\82ª
\82Á
\82½
\81D", Monnam(mtmp));
1338 monflee(mtmp, d(2, 4), FALSE, FALSE);
1340 } else if (!Blind) {
1341 if (mtmp->minvis && !See_invisible)
1343 else if ((mtmp->minvis && !perceives(mtmp->data))
1344 /* redundant: can't get here if these are true */
1345 || !haseyes(mtmp->data) || notonhead || !mtmp->mcansee)
1347 pline("%s doesn't seem to notice %s reflection.", Monnam(mtmp),
1350 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1354 pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp));
1356 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\96³
\8e\8b\82µ
\82½
\81D", Monnam(mtmp));
1365 register struct obj *obj = *optr;
1367 boolean wakem = FALSE, learno = FALSE,
1368 ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe),
1370 (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy)
1371 && !On_stairs(u.ux, u.uy));
1374 You("ring %s.", the(xname(obj)));
1376 You("%s
\82ð
\96Â
\82ç
\82µ
\82½
\81D", the(xname(obj)));
1378 if (Underwater || (u.uswallow && ordinary)) {
1380 amii_speaker(obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME);
1383 pline("But the sound is muffled.");
1385 pline("
\82µ
\82©
\82µ
\89¹
\82Í
\82©
\82«
\8fÁ
\82³
\82ê
\82½
\81D");
1387 } else if (invoking && ordinary) {
1388 /* needs to be recharged... */
1390 pline("But it makes no sound.");
1392 pline("
\82µ
\82©
\82µ
\81C
\89¹
\82Í
\96Â
\82ç
\82È
\82©
\82Á
\82½
\81D");
1393 learno = TRUE; /* help player figure out why */
1395 } else if (ordinary) {
1397 amii_speaker(obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME);
1399 if (obj->cursed && !rn2(4)
1400 /* note: once any of them are gone, we stop all of them */
1401 && !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE)
1402 && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE)
1403 && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE)
1404 && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT))
1407 You("summon %s!", a_monnam(mtmp));
1409 You("%s
\82ð
\8f¢
\8a«
\82µ
\82½
\81I", a_monnam(mtmp));
1410 if (!obj_resists(obj, 93, 100)) {
1412 pline("%s shattered!", Tobjnam(obj, "have"));
1414 pline("%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81I", xname(obj));
1422 mon_adjust_speed(mtmp, 2, (struct obj *) 0);
1424 case 2: /* no explanation; it just happens... */
1426 multi_reason = NULL;
1434 /* charged Bell of Opening */
1435 consume_obj_charge(obj, TRUE);
1441 pline1(nothing_happens);
1443 } else if (obj->cursed) {
1448 mkundead(&mm, FALSE, NO_MINVENT);
1451 } else if (invoking) {
1453 pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue"));
1455 pline("%s
\82Í
\95s
\8bC
\96¡
\82È
\89s
\82¢
\89¹
\82ð
\8fo
\82µ
\82½
\81D
\81D
\81D", xname(obj));
1457 amii_speaker(obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME);
1463 } else if (obj->blessed) {
1467 amii_speaker(obj, "ahahahDhEhCw", AMII_SOFT_VOLUME);
1472 } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1473 buried_ball_to_freedom();
1479 pline1(nothing_happens);
1483 pline("%s opens...", Something);
1485 pline("
\89½
\82©
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1490 pline("Things open around you...");
1492 pline("
\82Ü
\82í
\82è
\82Ì
\95¨
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1497 } else { /* uncursed */
1499 amii_speaker(obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME);
1504 pline1(nothing_happens);
1507 } /* charged BofO */
1510 makeknown(BELL_OF_OPENING);
1518 use_candelabrum(obj)
1519 register struct obj *obj;
1521 #if 0 /*JP*//* not used */
1522 const char *s = (obj->spe != 1) ? "candles" : "candle";
1527 You("snuff the %s.", s);
1529 You("
\82ë
\82¤
\82»
\82
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1530 end_burn(obj, TRUE);
1533 if (obj->spe <= 0) {
1535 pline("This %s has no %s.", xname(obj), s);
1537 pline("
\82±
\82Ì%s
\82É
\82Í
\82ë
\82¤
\82»
\82
\82ª
\82È
\82¢
\81D", xname(obj));
1542 You("cannot make fire under water.");
1544 You("
\90\85\92\86\82Å
\89Î
\82ð
\82¨
\82±
\82¹
\82È
\82¢
\81D");
1547 if (u.uswallow || obj->cursed) {
1550 pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"),
1553 pline("
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\82µ
\82Î
\82ç
\82
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D");
1559 There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s,
1562 pline("%s
\82É
\82Í
\82½
\82Á
\82½%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82µ
\82©
\82È
\82¢
\81D",
1563 xname(obj), obj->spe);
1567 pline("%s lit. %s dimly.", obj->spe == 1 ? "It is" : "They are",
1568 Tobjnam(obj, "shine"));
1570 pline("%s
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s
\82Í
\82Ù
\82Ì
\82©
\82É
\8bP
\82¢
\82½
\81D",
1571 xname(obj), xname(obj));
1575 pline("%s's %s burn%s", The(xname(obj)), s,
1576 (Blind ? "." : " brightly!"));
1578 pline("%s
\82Ì
\82ë
\82¤
\82»
\82
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I", The(xname(obj)),
1579 (Blind ? "" : "
\96¾
\82é
\82"));
1582 if (!invocation_pos(u.ux, u.uy) || On_stairs(u.ux, u.uy)) {
1584 pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
1586 pline("
\82ë
\82¤
\82»
\82
\82Í
\82·
\82²
\82¢
\91¬
\82³
\82Å
\94R
\82¦
\8en
\82ß
\82½
\81I");
1587 /* this used to be obj->age /= 2, rounding down; an age of
1588 1 would yield 0, confusing begin_burn() and producing an
1589 unlightable, unrefillable candelabrum; round up instead */
1590 obj->age = (obj->age + 1L) / 2L;
1592 if (obj->spe == 7) {
1595 pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
1597 pline("
\8aï
\96
\82È
\92g
\82©
\82³
\82ð%s
\82É
\8a´
\82¶
\82½
\81I", xname(obj));
1600 pline("%s with a strange light!", Tobjnam(obj, "glow"));
1602 pline("%s
\82Í
\8aï
\96
\82È
\8cõ
\82ð
\94
\82µ
\82Ä
\82¢
\82é
\81I", xname(obj));
1606 begin_burn(obj, FALSE);
1613 register struct obj *obj = *optr;
1614 register struct obj *otmp;
1616 const char *s = (obj->quan != 1) ? "candles" : "candle";
1618 const char *s = "
\82ë
\82¤
\82»
\82";
1619 char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
1626 otmp = carrying(CANDELABRUM_OF_INVOCATION);
1627 if (!otmp || otmp->spe == 7) {
1632 /*JP:
\8dÅ
\8fI
\93I
\82É
\82Í
\81u
\82ë
\82¤
\82»
\82
\82ð
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1633 /* first, minimal candelabrum suffix for formatting candles */
1635 Sprintf(qsfx, " to\033%s?", thesimpleoname(otmp));
1637 Sprintf(qsfx, "
\82ð\033%s
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", thesimpleoname(otmp));
1638 /* next, format the candles as a prefix for the candelabrum */
1640 (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1642 (void) safe_qbuf(qbuf, "", qsfx, obj, xname, thesimpleoname, s);
1643 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð\033
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1644 /* strip temporary candelabrum suffix */
1646 if ((q = strstri(qbuf, " to\033")) != 0)
1649 if ((q = strchr(qbuf, '\033')) != 0)
1651 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð
\81v*/
1653 /* last, format final "attach candles to candelabrum?" query */
1655 if (yn(safe_qbuf(qbuf, qbuf, "?", otmp, yname, thesimpleoname, "it"))
1657 if (yn(safe_qbuf(qbuf, qbuf, "
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", otmp, xname, thesimpleoname, "
\82»
\82ê"))
1662 if ((long) otmp->spe + obj->quan > 7L) {
1663 obj = splitobj(obj, 7L - (long) otmp->spe);
1664 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
1665 /* avoid a grammatical error if obj->quan gets
1666 reduced to 1 candle from more than one */
1667 s = (obj->quan != 1) ? "candles" : "candle";
1672 You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
1675 You("%ld
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ð%s%s
\82Ö
\8eæ
\82è
\82Â
\82¯
\82½
\81D",
1676 obj->quan, !otmp->spe ? "" : "
\82³
\82ç
\82É",
1679 if (!otmp->spe || otmp->age > obj->age)
1680 otmp->age = obj->age;
1681 otmp->spe += (int) obj->quan;
1682 if (otmp->lamplit && !obj->lamplit)
1684 pline_The("new %s magically %s!", s, vtense(s, "ignite"));
1686 pline("
\90V
\82µ
\82¢
\82ë
\82¤
\82»
\82
\82Í
\95s
\8ev
\8bc
\82È
\89\8a\82ð
\82 \82°
\82½
\81I");
1687 else if (!otmp->lamplit && obj->lamplit)
1689 pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
1691 pline("
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D");
1694 verbalize("You %s %s, you bought %s!",
1695 otmp->lamplit ? "burn" : "use",
1696 (obj->quan > 1L) ? "them" : "it",
1697 (obj->quan > 1L) ? "them" : "it");
1699 verbalize("
\89Î
\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1701 if (obj->quan < 7L && otmp->spe == 7)
1703 pline("%s now has seven%s candles attached.", The(xname(otmp)),
1704 otmp->lamplit ? " lit" : "");
1706 pline("%s
\82É
\82Í
\82·
\82Å
\82É7
\96{
\82Ì%s
\82ë
\82¤
\82»
\82
\82ª
\8eæ
\82è
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D",
1707 The(xname(otmp)), otmp->lamplit ? "
\89Î
\82Ì
\82Â
\82¢
\82½" : "");
1709 /* candelabrum's light range might increase */
1711 obj_merge_light_sources(otmp, otmp);
1712 /* candles are no longer a separate light source */
1714 end_burn(obj, TRUE);
1715 /* candles are now gone */
1717 /* candelabrum's weight is changing */
1718 otmp->owt = weight(otmp);
1723 /* call in drop, throw, and put in box, etc. */
1728 boolean candle = Is_candle(otmp);
1730 if ((candle || otmp->otyp == CANDELABRUM_OF_INVOCATION)
1734 #if 0 /*JP*//* not used */
1735 boolean many = candle ? (otmp->quan > 1L) : (otmp->spe > 1);
1738 (void) get_obj_location(otmp, &x, &y, 0);
1739 if (otmp->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1741 pline("%s%scandle%s flame%s extinguished.", Shk_Your(buf, otmp),
1742 (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"),
1743 (many ? "s are" : " is"));
1745 pline("%s%s
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, otmp),
1746 candle ? "" : "
\90C
\91ä
\82Ì");
1748 end_burn(otmp, TRUE);
1754 /* called when lit lamp is hit by water or put into a container or
1755 you've been swallowed by a monster; obj might be in transit while
1756 being thrown or dropped so don't assume that its location is valid */
1764 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1765 || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
1766 (void) get_obj_location(obj, &x, &y, 0);
1767 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1769 pline("%s %s out!", Yname2(obj), otense(obj, "go"));
1771 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", Yname2(obj));
1772 end_burn(obj, TRUE);
1775 if (snuff_candle(obj))
1781 /* Called when potentially lightable object is affected by fire_damage().
1782 Return TRUE if object was lit and FALSE otherwise --ALI */
1789 if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) {
1790 if ((obj->otyp == MAGIC_LAMP
1791 || obj->otyp == CANDELABRUM_OF_INVOCATION) && obj->spe == 0)
1793 else if (obj->otyp != MAGIC_LAMP && obj->age == 0)
1795 if (!get_obj_location(obj, &x, &y, 0))
1797 if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed)
1799 if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1800 || obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2))
1802 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1804 pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
1806 pline("%s
\82Ì
\96¾
\82©
\82è
\82ª
\82Â
\82¢
\82½
\81I", Yname2(obj));
1807 if (obj->otyp == POT_OIL)
1808 makeknown(obj->otyp);
1809 if (carried(obj) && obj->unpaid && costly_spot(u.ux, u.uy)) {
1810 /* if it catches while you have it, then it's your tough luck */
1813 verbalize("That's in addition to the cost of %s %s, of course.",
1814 yname(obj), obj->quan == 1L ? "itself" : "themselves");
1816 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ%s
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D", xname(obj));
1818 bill_dummy_object(obj);
1820 begin_burn(obj, FALSE);
1833 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1834 || obj->otyp == BRASS_LANTERN)
1836 pline("%slamp is now off.", Shk_Your(buf, obj));
1838 pline("%s
\83\89\83\93\83v
\82Ì
\93\94\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, obj));
1841 You("snuff out %s.", yname(obj));
1843 You("%s
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D", xname(obj));
1844 end_burn(obj, TRUE);
1849 pline(!Is_candle(obj) ? "This is not a diving lamp"
1850 : "Sorry, fire and water don't mix.");
1852 pline(!Is_candle(obj) ? "
\82±
\82ê
\82Í
\90ö
\90\85\97p
\82Ì
\83\89\83\93\83v
\82¶
\82á
\82È
\82¢
\81D"
1853 : "
\8ec
\94O
\82È
\82ª
\82ç
\81C
\89Î
\82Æ
\90\85\82Í
\82Ü
\82´
\82ç
\82È
\82¢
\81D");
1857 /* magic lamps with an spe == 0 (wished for) cannot be lit */
1858 if ((!Is_candle(obj) && obj->age == 0)
1859 || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
1860 if (obj->otyp == BRASS_LANTERN)
1862 Your("lamp has run out of power.");
1864 Your("
\83\89\83\93\83v
\82Ì
\93d
\97Í
\82ð
\8eg
\82¢
\90Ø
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1867 pline("This %s has no oil.", xname(obj));
1869 pline("
\82±
\82Ì%s
\82É
\82Í
\82à
\82¤
\83I
\83C
\83\8b\82ª
\82È
\82¢
\81D", xname(obj));
1872 if (obj->cursed && !rn2(2)) {
1875 pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"),
1876 otense(obj, "die"));
1878 pline("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D",
1882 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1883 || obj->otyp == BRASS_LANTERN) {
1886 pline("%slamp is now on.", Shk_Your(buf, obj));
1888 pline("%s
\83\89\83\93\83v
\82É
\93\94\82ª
\93\94\82Á
\82½
\81D", Shk_Your(buf, obj));
1889 } else { /* candle(s) */
1891 pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan),
1892 otense(obj, "burn"), Blind ? "." : " brightly!");
1894 pline("%s
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I",
1895 xname(obj), Blind ? "" : "
\96¾
\82é
\82");
1897 if (obj->unpaid && costly_spot(u.ux, u.uy)
1898 && obj->age == 20L * (long) objects[obj->otyp].oc_cost) {
1900 const char *ithem = (obj->quan > 1L) ? "them" : "it";
1902 verbalize("You burn %s, you bought %s!", ithem, ithem);
1904 verbalize("
\93\94\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1906 bill_dummy_object(obj);
1909 begin_burn(obj, FALSE);
1914 light_cocktail(optr)
1917 struct obj *obj = *optr; /* obj is a potion of oil */
1928 You("snuff the lit potion.");
1930 You("
\96û
\95r
\82Ì
\89Î
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1931 end_burn(obj, TRUE);
1933 * Free & add to re-merge potion. This will average the
1934 * age of the potions. Not exactly the best solution,
1938 *optr = addinv(obj);
1940 } else if (Underwater) {
1942 There("is not enough oxygen to sustain a fire.");
1944 pline("
\89Î
\82ð
\82Â
\82¯
\82é
\82Ì
\82É
\8f\
\95ª
\82È
\8e_
\91f
\82ª
\82È
\82¢
\81D");
1948 split1off = (obj->quan > 1L);
1950 obj = splitobj(obj, 1L);
1953 You("light %spotion.%s", shk_your(buf, obj),
1954 Blind ? "" : " It gives off a dim light.");
1956 You("%s
\96û
\95r
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s", shk_your(buf, obj),
1957 Blind ? "" : "
\96û
\95r
\82Í
\88Ã
\82¢
\8cõ
\82ð
\82Í
\82È
\82Á
\82½
\81D");
1960 if (obj->unpaid && costly_spot(u.ux, u.uy)) {
1961 /* Normally, we shouldn't both partially and fully charge
1962 * for an item, but (Yendorian Fuel) Taxes are inevitable...
1966 verbalize("That's in addition to the cost of the potion, of course.");
1968 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ
\96û
\95r
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D");
1969 bill_dummy_object(obj);
1971 makeknown(obj->otyp);
1973 begin_burn(obj, FALSE); /* after shop billing */
1975 obj_extract_self(obj); /* free from inv */
1978 obj = hold_another_object(obj, "You drop %s!", doname(obj),
1980 obj = hold_another_object(obj, "
\82 \82È
\82½
\82Í%s
\82ð
\97\8e\82µ
\82½
\81I", doname(obj),
1988 static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 };
1993 struct obj *obj = getobj(cuddly, "rub");
1995 if (obj && obj->oclass == GEM_CLASS) {
1996 if (is_graystone(obj)) {
2001 pline("Sorry, I don't know how to use that.");
2003 pline("
\8ec
\94O
\81D
\8eg
\82¢
\95û
\82ª
\82í
\82©
\82ç
\82È
\82¢
\81D");
2008 if (!obj || !wield_tool(obj, "rub"))
2011 /* now uwep is obj */
2012 if (uwep->otyp == MAGIC_LAMP) {
2013 if (uwep->spe > 0 && !rn2(3)) {
2014 check_unpaid_usage(uwep, TRUE); /* unusual item use */
2015 /* bones preparation: perform the lamp transformation
2016 before releasing the djinni in case the latter turns out
2017 to be fatal (a hostile djinni has no chance to attack yet,
2018 but an indebted one who grants a wish might bestow an
2019 artifact which blasts the hero with lethal results) */
2020 uwep->otyp = OIL_LAMP;
2021 uwep->spe = 0; /* for safety */
2022 uwep->age = rn1(500, 1000);
2024 begin_burn(uwep, TRUE);
2025 djinni_from_bottle(uwep);
2026 makeknown(MAGIC_LAMP);
2028 } else if (rn2(2)) {
2030 You("%s smoke.", !Blind ? "see a puff of" : "smell");
2032 pline("
\82¯
\82Þ
\82è%s
\81D", !Blind ? "
\82ª
\95\91\82¢
\82 \82ª
\82Á
\82½" : "
\82Ì
\93õ
\82¢
\82ª
\82µ
\82½");
2034 pline1(nothing_happens);
2035 } else if (obj->otyp == BRASS_LANTERN) {
2036 /* message from Adventure */
2038 pline("Rubbing the electric lamp is not particularly rewarding.");
2040 pline("
\93d
\8bC
\83\89\83\93\83v
\82ð
\82±
\82·
\82Á
\82Ä
\82à
\88Ó
\96¡
\82Í
\82È
\82¢
\82Æ
\8ev
\82¤
\82ª
\81D
\81D
\81D");
2042 pline("Anyway, nothing exciting happens.");
2044 pline("
\82â
\82Á
\82Ï
\82è
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
2046 pline1(nothing_happens);
2057 enum jump_trajectory {
2058 jAny = 0, /* any direction => magical jump */
2061 jDiag = 3 /* jHorz|jVert */
2064 /* callback routine for walk_path() */
2066 check_jump(arg, x, y)
2070 int traj = *(int *) arg;
2071 struct rm *lev = &levl[x][y];
2075 if (IS_STWALL(lev->typ))
2077 if (IS_DOOR(lev->typ)) {
2078 if (closed_door(x, y))
2080 if ((lev->doormask & D_ISOPEN) != 0 && traj != jAny
2081 /* reject diagonal jump into or out-of or through open door */
2083 /* reject horizontal jump through horizontal open door
2084 and non-horizontal (ie, vertical) jump through
2085 non-horizontal (vertical) open door */
2086 || ((traj & jHorz) != 0) == (lev->horizontal != 0)))
2088 /* empty doorways aren't restricted */
2090 /* let giants jump over boulders (what about Flying?
2091 and is there really enough head room for giants to jump
2092 at all, let alone over something tall?) */
2093 if (sobj_at(BOULDER, x, y) && !throws_rocks(youmonst.data))
2099 is_valid_jump_pos(x, y, magic, showmsg)
2103 if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(x, y) != 5) {
2104 /* The Knight jumping restriction still applies when riding a
2105 * horse. After all, what shape is the knight piece in chess?
2109 pline("Illegal move!");
2111 pline("
\82»
\82Ì
\88Ú
\93®
\82Í
\8cj
\94n
\92µ
\82Ñ
\82¶
\82á
\82È
\82¢
\81I");
2113 } else if (distu(x, y) > (magic ? 6 + magic * 3 : 9)) {
2118 pline("
\89\93\82·
\82¬
\82é
\81I");
2120 } else if (!isok(x, y)) {
2123 You("cannot jump there!");
2125 You("
\82»
\82±
\82É
\82Í
\94ò
\82×
\82È
\82¢
\81I");
2127 } else if (!cansee(x, y)) {
2130 You("cannot see where to land!");
2132 You("
\92\85\92n
\93_
\82ª
\8c©
\82¦
\82È
\82¢
\81I");
2136 struct rm *lev = &levl[u.ux][u.uy];
2137 /* we want to categorize trajectory for use in determining
2138 passage through doorways: horizonal, vertical, or diagonal;
2139 since knight's jump and other irregular directions are
2140 possible, we flatten those out to simplify door checks */
2142 dx = x - u.ux, dy = y - u.uy,
2143 ax = abs(dx), ay = abs(dy);
2145 /* diag: any non-orthogonal destination classifed as diagonal */
2146 diag = (magic || Passes_walls || (!dx && !dy)) ? jAny
2147 : !dy ? jHorz : !dx ? jVert : jDiag;
2148 /* traj: flatten out the trajectory => some diagonals re-classified */
2151 else if (ay >= 2 * ax)
2153 traj = (magic || Passes_walls || (!ax && !ay)) ? jAny
2154 : !ay ? jHorz : !ax ? jVert : jDiag;
2155 /* walk_path doesn't process the starting spot;
2156 this is iffy: if you're starting on a closed door spot,
2157 you _can_ jump diagonally from doorway (without needing
2158 Passes_walls); that's intentional but is it correct? */
2159 if (diag == jDiag && IS_DOOR(lev->typ)
2160 && (lev->doormask & D_ISOPEN) != 0
2162 || ((traj & jHorz) != 0) == (lev->horizontal != 0))) {
2165 You_cant("jump diagonally out of a doorway.");
2167 You_cant("
\8fo
\93ü
\82è
\8cû
\82©
\82ç
\8eÎ
\82ß
\82É
\94ò
\82Ñ
\8fo
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2170 uc.x = u.ux, uc.y = u.uy;
2171 tc.x = x, tc.y = y; /* target */
2172 if (!walk_path(&uc, &tc, check_jump, (genericptr_t) &traj)) {
2175 There("is an obstacle preventing that jump.");
2177 pline("
\94ò
\82Ô
\82Ì
\82ð
\8e×
\96\82\82·
\82é
\89½
\82©
\82ª
\82 \82é
\81D");
2184 static int jumping_is_magic;
2187 get_valid_jump_position(x,y)
2191 && (ACCESSIBLE(levl[x][y].typ) || Passes_walls)
2192 && is_valid_jump_pos(x, y, jumping_is_magic, FALSE));
2196 display_jump_positions(state)
2200 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
2201 } else if (state == 1) {
2204 for (dx = -4; dx <= 4; dx++)
2205 for (dy = -4; dy <= 4; dy++) {
2206 x = dx + (int) u.ux;
2207 y = dy + (int) u.uy;
2208 if (get_valid_jump_position(x, y))
2212 tmp_at(DISP_END, 0);
2218 int magic; /* 0=Physical, otherwise skill level */
2222 /* attempt "jumping" spell if hero has no innate jumping ability */
2223 if (!magic && !Jumping) {
2226 for (sp_no = 0; sp_no < MAXSPELL; ++sp_no)
2227 if (spl_book[sp_no].sp_id == NO_SPELL)
2229 else if (spl_book[sp_no].sp_id == SPE_JUMPING)
2230 return spelleffects(sp_no, FALSE);
2233 if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
2234 /* normally (nolimbs || slithy) implies !Jumping,
2235 but that isn't necessarily the case for knights */
2237 You_cant("jump; you have no legs!");
2239 pline("
\91«
\82ª
\96³
\82
\82Ä
\82Í
\92µ
\82×
\82È
\82¢
\81I");
2241 } else if (!magic && !Jumping) {
2243 You_cant("jump very far.");
2245 You_cant("
\82»
\82ñ
\82È
\89\93\82
\82Ü
\82Å
\92µ
\82×
\82È
\82¢
\81D");
2247 /* if steed is immobile, can't do physical jump but can do spell one */
2248 } else if (!magic && u.usteed && stucksteed(FALSE)) {
2249 /* stucksteed gave "<steed> won't move" message */
2251 } else if (u.uswallow) {
2254 You("bounce around a little.");
2256 pline("
\94½
\93®
\82ð
\82Â
\82¯
\82½
\81D");
2260 pline("You've got to be kidding!");
2262 pline("
\8fç
\92k
\82Í
\82æ
\82µ
\82±
\82³
\82ñ
\81I");
2264 } else if (u.uinwater) {
2267 You("swish around a little.");
2269 pline("
\83X
\83C
\83X
\83C
\82Æ
\89j
\82¢
\82¾
\81D");
2273 pline("This calls for swimming, not jumping!");
2275 pline("
\82»
\82ê
\82Í
\81w
\89j
\82®
\81x
\82Å
\82 \82Á
\82Ä
\81C
\81w
\92µ
\82Ô
\81x
\82¶
\82á
\82È
\82¢
\81I");
2277 } else if (u.ustuck) {
2278 if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
2280 You("pull free from %s.", mon_nam(u.ustuck));
2282 You("%s
\82©
\82ç
\97£
\82ê
\82½
\81D", mon_nam(u.ustuck));
2288 You("writhe a little in the grasp of %s!", mon_nam(u.ustuck));
2290 You("%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\83W
\83^
\83o
\83^
\82µ
\82½
\81I", mon_nam(u.ustuck));
2294 You("cannot escape from %s!", mon_nam(u.ustuck));
2296 You("%s
\82©
\82ç
\93¦
\82ê
\82ç
\82ê
\82È
\82¢
\81I", mon_nam(u.ustuck));
2298 } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
2301 You("flail around a little.");
2303 You("
\83o
\83^
\83o
\83^
\92µ
\82ñ
\82¾
\81D");
2307 You("don't have enough traction to jump.");
2309 You("
\92µ
\82Ô
\82½
\82ß
\82Ì
\94½
\93®
\82ª
\82Â
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
2311 } else if (!magic && near_capacity() > UNENCUMBERED) {
2313 You("are carrying too much to jump!");
2315 You("
\82½
\82
\82³
\82ñ
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\92µ
\82×
\82È
\82¢
\81I");
2317 } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
2319 You("lack the strength to jump!");
2321 You("
\92µ
\82Ô
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I");
2323 } else if (!magic && Wounded_legs) {
2324 long wl = (Wounded_legs & BOTH_SIDES);
2325 const char *bp = body_part(LEG);
2327 if (wl == BOTH_SIDES)
2328 bp = makeplural(bp);
2331 pline("%s is in no shape for jumping.", Monnam(u.usteed));
2333 pline("%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D", Monnam(u.usteed));
2336 Your("%s%s %s in no shape for jumping.",
2337 (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right "
2339 bp, (wl == BOTH_SIDES) ? "are" : "is");
2341 Your("%s%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D",
2342 (wl == LEFT_SIDE) ? "
\8d¶" :
2343 (wl == RIGHT_SIDE) ? "
\89E" : "", bp);
2346 } else if (u.usteed && u.utrap) {
2348 pline("%s is stuck in a trap.", Monnam(u.usteed));
2350 pline("%s
\82Íã©
\82É
\82Ð
\82Á
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", Monnam(u.usteed));
2355 pline("Where do you want to jump?");
2357 pline("
\82Ç
\82±
\82É
\92µ
\82Ñ
\82Ü
\82·
\82©
\81H");
2360 jumping_is_magic = magic;
2361 getpos_sethilite(display_jump_positions, get_valid_jump_position);
2363 if (getpos(&cc, TRUE, "the desired position") < 0)
2365 if (getpos(&cc, TRUE, "
\92µ
\82Ñ
\82½
\82¢
\8fê
\8f\8a") < 0)
2366 return 0; /* user pressed ESC */
2367 if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
2374 switch (u.utraptype) {
2376 long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
2379 You("rip yourself free of the bear trap! Ouch!");
2381 You("
\8e©
\95ª
\82ð
\8cF
\82Ìã©
\82©
\82ç
\82Ð
\82«
\82Í
\82ª
\82µ
\82½
\81C
\82¢
\82Ä
\82Á
\81I");
2383 losehp(Maybe_Half_Phys(rnd(10)), "jumping out of a bear trap",
2385 losehp(Maybe_Half_Phys(rnd(10)), "
\8cF
\82Ìã©
\82©
\82ç
\94ò
\82Ñ
\8fo
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2387 set_wounded_legs(side, rn1(1000, 500));
2392 You("leap from the pit!");
2394 You("
\97\8e\82µ
\8c\8a\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2398 You("tear the web apart as you pull yourself free!");
2400 You("
\82
\82à
\82Ì
\91\83\82ð
\88ø
\82«
\97ô
\82«
\81C
\8e©
\97R
\82É
\82È
\82Á
\82½
\81I");
2401 deltrap(t_at(u.ux, u.uy));
2405 You("pull yourself above the %s!", hliquid("lava"));
2407 You("%s
\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I", hliquid("
\97n
\8aâ"));
2413 You("strain your %s, but you're still %s.",
2414 makeplural(body_part(LEG)),
2415 (u.utraptype == TT_INFLOOR)
2416 ? "stuck in the floor"
2417 : "attached to the buried ball");
2419 You("%s
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\82ª
\81C
\82 \82È
\82½
\82Í
\82Ü
\82¾%s
\81D",
2420 makeplural(body_part(LEG)),
2421 (u.utraptype == TT_INFLOOR)
2422 ? "
\8f°
\82É
\82¤
\82Ü
\82Á
\82Ä
\82¢
\82é"
2423 : "
\82¤
\82Ü
\82Á
\82½
\8b\85\82Æ
\82Â
\82È
\82ª
\82Á
\82Ä
\82¢
\82é");
2425 set_wounded_legs(LEFT_SIDE, rn1(10, 11));
2426 set_wounded_legs(RIGHT_SIDE, rn1(10, 11));
2431 * Check the path from uc to cc, calling hurtle_step at each
2432 * location. The final position actually reached will be
2437 /* calculate max(abs(dx), abs(dy)) as the range */
2438 range = cc.x - uc.x;
2446 (void) walk_path(&uc, &cc, hurtle_jump, (genericptr_t) &range);
2447 /* hurtle_jump -> hurtle_step results in <u.ux,u.uy> == <cc.x,cc.y>
2448 * and usually moves the ball if punished, but does not handle all
2449 * the effects of landing on the final position.
2451 teleds(cc.x, cc.y, FALSE);
2455 multi_reason = "jumping around";
2457 multi_reason = "
\92µ
\82Ë
\89ñ
\82Á
\82Ä
\82¢
\82é
\8e\9e\82É";
2459 morehungry(rnd(25));
2470 if (!mons[corpse->corpsenm].cnutrit)
2476 use_tinning_kit(obj)
2479 struct obj *corpse, *can;
2481 /* This takes only 1 move. If this is to be changed to take many
2482 * moves, we've got to deal with decaying corpses...
2484 if (obj->spe <= 0) {
2486 You("seem to be out of tins.");
2488 pline("
\8aÊ
\8bl
\82ð
\8dì
\82é
\82½
\82ß
\82Ì
\8aÊ
\82ª
\90Ø
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
2491 if (!(corpse = floorfood("tin", 2)))
2493 if (corpse->oeaten) {
2495 You("cannot tin %s which is partly eaten.", something);
2497 You("
\90H
\82×
\82©
\82¯
\82Ì
\82à
\82Ì
\82ð
\8aÊ
\8bl
\82É
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2500 if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance
2504 if (poly_when_stoned(youmonst.data))
2506 You("tin %s without wearing gloves.",
2507 an(mons[corpse->corpsenm].mname));
2509 You("
\8f¬
\8eè
\82È
\82µ
\82Å%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
2510 mons[corpse->corpsenm].mname);
2514 pline("Tinning %s without wearing gloves is a fatal mistake...",
2515 an(mons[corpse->corpsenm].mname));
2517 pline("%s
\82ð
\8f¬
\8eè
\82È
\82µ
\82Å
\8aÊ
\8bl
\82É
\82·
\82é
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D
\81D
\81D",
2518 mons[corpse->corpsenm].mname);
2521 Sprintf(kbuf, "trying to tin %s without gloves",
2522 an(mons[corpse->corpsenm].mname));
2524 Sprintf(kbuf, "
\8f¬
\8eè
\82ð
\82Â
\82¯
\82¸
\82É%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2525 mons[corpse->corpsenm].mname);
2530 if (is_rider(&mons[corpse->corpsenm])) {
2531 if (revive_corpse(corpse))
2533 verbalize("Yes... But War does not preserve its enemies...");
2535 verbalize("
\82»
\82¤
\82¾
\81D
\81D
\81D
\82µ
\82©
\82µ
\81u
\90í
\91\88\81v
\82Í
\93G
\82É
\88À
\82ç
\82¬
\82ð
\97^
\82¦
\82Ê
\81D
\81D
\81D");
2538 pline_The("corpse evades your grasp.");
2540 pline("
\8e\80\91Ì
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82ð
\93¦
\82ê
\82½
\81D");
2543 if (mons[corpse->corpsenm].cnutrit == 0) {
2545 pline("That's too insubstantial to tin.");
2547 pline("
\8eÀ
\91Ì
\82ª
\82È
\82¢
\82Ì
\82Å
\8aÊ
\8bl
\82É
\82Å
\82«
\82È
\82¢
\81D");
2550 consume_obj_charge(obj, TRUE);
2552 if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
2554 static const char you_buy_it[] = "You tin it, you bought it!";
2556 static const char you_buy_it[] = "
\8aÊ
\8bl
\82É
\82µ
\82½
\82Ì
\82È
\82ç
\94\83\82Á
\82Ä
\82à
\82ç
\82¤
\82æ
\81I";
2558 can->corpsenm = corpse->corpsenm;
2559 can->cursed = obj->cursed;
2560 can->blessed = obj->blessed;
2561 can->owt = weight(can);
2563 /* Mark tinned tins. No spinach allowed... */
2564 set_tin_variety(can, HOMEMADE_TIN);
2565 if (carried(corpse)) {
2567 verbalize(you_buy_it);
2570 if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
2571 verbalize(you_buy_it);
2575 (void) hold_another_object(can, "You make, but cannot pick up, %s.",
2576 doname(can), (const char *) 0);
2578 (void) hold_another_object(can, "
\8aÊ
\8bl
\82É
\82Å
\82«
\82½
\82ª
\81C%s
\82ð
\8e\9d\82Â
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
2579 doname(can), (const char *) 0);
2582 impossible("Tinning failed.");
2586 use_unicorn_horn(obj)
2589 #define PROP_COUNT 7 /* number of properties we're dealing with */
2590 #define ATTR_COUNT (A_MAX * 3) /* number of attribute points we might fix */
2591 int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop,
2593 int trouble_list[PROP_COUNT + ATTR_COUNT];
2595 if (obj && obj->cursed) {
2596 long lcount = (long) rn1(90, 10);
2598 switch (rn2(13) / 2) { /* case 6 is half as likely as the others */
2600 make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L
2601 : (long) rn1(ACURR(A_CON), 20),
2602 xname(obj), TRUE, SICK_NONVOMITABLE);
2605 make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
2610 You("suddenly feel %s.",
2611 Hallucination ? "trippy" : "confused");
2613 You("
\93Ë
\91R%s
\81D",
2614 Hallucination ? "
\82Ö
\82ë
\82Ö
\82ë
\82É
\82È
\82Á
\82½" : "
\8d¬
\97\90\82µ
\82½");
2616 make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
2619 make_stunned((HStun & TIMEOUT) + lcount, TRUE);
2622 (void) adjattrib(rn2(A_MAX), -1, FALSE);
2625 (void) make_hallucinated((HHallucination & TIMEOUT) + lcount,
2629 if (Deaf) /* make_deaf() won't give feedback when already deaf */
2631 pline("Nothing seems to happen.");
2633 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2634 make_deaf((HDeaf & TIMEOUT) + lcount, TRUE);
2641 * Entries in the trouble list use a very simple encoding scheme.
2643 #define prop2trbl(X) ((X) + A_MAX)
2644 #define attr2trbl(Y) (Y)
2645 #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
2646 #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
2647 #define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
2649 trouble_count = unfixable_trbl = did_prop = did_attr = 0;
2651 /* collect property troubles */
2652 if (TimedTrouble(Sick))
2654 if (TimedTrouble(Blinded) > (long) u.ucreamed
2656 && attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
2657 prop_trouble(BLINDED);
2658 if (TimedTrouble(HHallucination))
2659 prop_trouble(HALLUC);
2660 if (TimedTrouble(Vomiting))
2661 prop_trouble(VOMITING);
2662 if (TimedTrouble(HConfusion))
2663 prop_trouble(CONFUSION);
2664 if (TimedTrouble(HStun))
2665 prop_trouble(STUNNED);
2666 if (TimedTrouble(HDeaf))
2669 unfixable_trbl = unfixable_trouble_count(TRUE);
2671 /* collect attribute troubles */
2672 for (idx = 0; idx < A_MAX; idx++) {
2673 if (ABASE(idx) >= AMAX(idx))
2675 val_limit = AMAX(idx);
2676 /* this used to adjust 'val_limit' for A_STR when u.uhs was
2677 WEAK or worse, but that's handled via ATEMP(A_STR) now */
2679 /* potion/spell of restore ability override sustain ability
2680 intrinsic but unicorn horn usage doesn't */
2681 unfixable_trbl += val_limit - ABASE(idx);
2684 /* don't recover more than 3 points worth of any attribute */
2685 if (val_limit > ABASE(idx) + 3)
2686 val_limit = ABASE(idx) + 3;
2688 for (val = ABASE(idx); val < val_limit; val++)
2690 /* keep track of unfixed trouble, for message adjustment below */
2691 unfixable_trbl += (AMAX(idx) - val_limit);
2694 if (trouble_count == 0) {
2695 pline1(nothing_happens);
2697 } else if (trouble_count > 1) { /* shuffle */
2700 for (i = trouble_count - 1; i > 0; i--)
2701 if ((j = rn2(i + 1)) != i) {
2702 k = trouble_list[j];
2703 trouble_list[j] = trouble_list[i];
2704 trouble_list[i] = k;
2709 * Chances for number of troubles to be fixed
2711 * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8%
2712 * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0
2714 val_limit = rn2(d(2, (obj && obj->blessed) ? 4 : 2));
2715 if (val_limit > trouble_count)
2716 val_limit = trouble_count;
2718 /* fix [some of] the troubles */
2719 for (val = 0; val < val_limit; val++) {
2720 idx = trouble_list[val];
2723 case prop2trbl(SICK):
2724 make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2727 case prop2trbl(BLINDED):
2728 make_blinded((long) u.ucreamed, TRUE);
2731 case prop2trbl(HALLUC):
2732 (void) make_hallucinated(0L, TRUE, 0L);
2735 case prop2trbl(VOMITING):
2736 make_vomiting(0L, TRUE);
2739 case prop2trbl(CONFUSION):
2740 make_confused(0L, TRUE);
2743 case prop2trbl(STUNNED):
2744 make_stunned(0L, TRUE);
2747 case prop2trbl(DEAF):
2748 make_deaf(0L, TRUE);
2752 if (idx >= 0 && idx < A_MAX) {
2756 panic("use_unicorn_horn: bad trouble? (%d)", idx);
2761 if (did_attr || did_prop)
2762 context.botl = TRUE;
2765 pline("This makes you feel %s!",
2766 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2770 pline("
\8bC
\95ª
\82ª%s
\82æ
\82
\82È
\82Á
\82½
\81I",
2771 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2777 pline("Nothing seems to happen.");
2779 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2791 * Timer callback routine: turn figurine into monster
2794 fig_transform(arg, timeout)
2798 struct obj *figurine = arg->a_obj;
2801 boolean cansee_spot, silent, okay_spot;
2802 boolean redraw = FALSE;
2803 boolean suppress_see = FALSE;
2804 char monnambuf[BUFSZ], carriedby[BUFSZ];
2807 debugpline0("null figurine in fig_transform()");
2810 silent = (timeout != monstermoves); /* happened while away */
2811 okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0);
2812 if (figurine->where == OBJ_INVENT || figurine->where == OBJ_MINVENT)
2813 okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]);
2814 if (!okay_spot || !figurine_location_checks(figurine, &cc, TRUE)) {
2815 /* reset the timer to try again later */
2816 (void) start_timer((long) rnd(5000), TIMER_OBJECT, FIG_TRANSFORM,
2817 obj_to_any(figurine));
2821 cansee_spot = cansee(cc.x, cc.y);
2822 mtmp = make_familiar(figurine, cc.x, cc.y, TRUE);
2824 char and_vanish[BUFSZ];
2825 struct obj *mshelter = level.objects[mtmp->mx][mtmp->my];
2827 /* [m_monnam() yields accurate mon type, overriding hallucination] */
2828 Sprintf(monnambuf, "%s", an(m_monnam(mtmp)));
2829 /*JP:TODO:and_vanish
\82Í
\96¢
\8f\88\97\9d*/
2830 and_vanish[0] = '\0';
2831 if ((mtmp->minvis && !See_invisible)
2832 || (mtmp->data->mlet == S_MIMIC
2833 && M_AP_TYPE(mtmp) != M_AP_NOTHING))
2834 suppress_see = TRUE;
2836 if (mtmp->mundetected) {
2837 if (hides_under(mtmp->data) && mshelter) {
2838 Sprintf(and_vanish, " and %s under %s",
2839 locomotion(mtmp->data, "crawl"), doname(mshelter));
2840 } else if (mtmp->data->mlet == S_MIMIC
2841 || mtmp->data->mlet == S_EEL) {
2842 suppress_see = TRUE;
2844 Strcpy(and_vanish, " and vanish");
2847 switch (figurine->where) {
2849 if (Blind || suppress_see)
2851 You_feel("%s %s from your pack!", something,
2852 locomotion(mtmp->data, "drop"));
2854 You_feel("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82æ
\82¤
\82¾
\81I", something,
2855 jpast(locomotion(mtmp->data, "
\97\8e\82¿
\82é")));
2859 You_see("%s %s out of your pack%s!", monnambuf,
2860 locomotion(mtmp->data, "drop"), and_vanish);
2862 You("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2863 jpast(locomotion(mtmp->data,"
\97\8e\82¿
\82é")));
2868 if (cansee_spot && !silent) {
2871 pline("%s suddenly vanishes!", an(xname(figurine)));
2873 pline("%s
\82Í
\93Ë
\91R
\8fÁ
\82¦
\82½
\81I", xname(figurine));
2876 You_see("a figurine transform into %s%s!", monnambuf,
2879 You("
\90l
\8c`
\82ª
\93Ë
\91R%s
\82É
\82È
\82Á
\82½
\82Ì
\82ð
\8c©
\82½
\81I",
2882 redraw = TRUE; /* update figurine's map location */
2887 if (cansee_spot && !silent && !suppress_see) {
2890 mon = figurine->ocarry;
2891 /* figurine carrying monster might be invisible */
2892 if (canseemon(figurine->ocarry)
2893 && (!mon->wormno || cansee(mon->mx, mon->my)))
2895 Sprintf(carriedby, "%s pack", s_suffix(a_monnam(mon)));
2897 Sprintf(carriedby, "%s
\82Ì
\8a\93", a_monnam(mon));
2898 else if (is_pool(mon->mx, mon->my))
2900 Strcpy(carriedby, "empty water");
2902 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\90\85\92\86");
2905 Strcpy(carriedby, "thin air");
2907 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\8bó
\92\86");
2909 You_see("%s %s out of %s%s!", monnambuf,
2910 locomotion(mtmp->data, "drop"), carriedby,
2913 You("%s
\82ª%s
\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2914 carriedby, locomotion(mtmp->data, "
\97\8e\82¿
\82é"));
2924 impossible("figurine came to life where? (%d)",
2925 (int) figurine->where);
2929 /* free figurine now */
2930 if (carried(figurine)) {
2933 obj_extract_self(figurine);
2934 obfree(figurine, (struct obj *) 0);
2941 figurine_location_checks(obj, cc, quietly)
2948 if (carried(obj) && u.uswallow) {
2951 You("don't have enough room in here.");
2953 pline("
\82±
\82±
\82É
\82Í
\8f\
\95ª
\82È
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
2956 x = cc ? cc->x : u.ux;
2957 y = cc ? cc->y : u.uy;
2961 You("cannot put the figurine there.");
2963 You("
\82±
\82±
\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81D");
2966 if (IS_ROCK(levl[x][y].typ)
2967 && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x, y))) {
2970 You("cannot place a figurine in %s!",
2971 IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock");
2973 You("%s
\82Ì
\92\86\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81I",
2974 IS_TREE(levl[x][y].typ) ? "
\96Ø" : "
\8cÅ
\82¢
\90Î");
2978 if (sobj_at(BOULDER, x, y) && !passes_walls(&mons[obj->corpsenm])
2979 && !throws_rocks(&mons[obj->corpsenm])) {
2982 You("cannot fit the figurine on the boulder.");
2984 You("
\8aâ
\82É
\90l
\8c`
\82ð
\89\9f\82µ
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2994 register struct obj *obj = *optr;
2999 /* can't activate a figurine while swallowed */
3000 if (!figurine_location_checks(obj, (coord *) 0, FALSE))
3003 if (!getdir((char *) 0)) {
3004 context.move = multi = 0;
3011 /* Passing FALSE arg here will result in messages displayed */
3012 if (!figurine_location_checks(obj, &cc, FALSE))
3015 You("%s and it %stransforms.",
3016 (u.dx || u.dy) ? "set the figurine beside you"
3017 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3018 || is_pool(cc.x, cc.y))
3019 ? "release the figurine"
3020 : (u.dz < 0 ? "toss the figurine into the air"
3021 : "set the figurine on the ground"),
3022 Blind ? "supposedly " : "");
3024 You("%s
\81D
\82·
\82é
\82Æ
\82»
\82ê
\82Í
\95Ï
\8c`
\82µ
\82½
\81D",
3025 (u.dx || u.dy) ? "
\82»
\82Î
\82É
\90l
\8c`
\82ð
\92u
\82¢
\82½"
3026 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3027 || is_pool(cc.x, cc.y))
3028 ? "
\90l
\8c`
\82ð
\95ú
\82Á
\82½"
3029 : (u.dz < 0 ? "
\90l
\8c`
\82ð
\8bó
\92\86\82É
\93\8a\82°
\82½"
3030 : "
\90l
\8c`
\82ð
\92n
\96Ê
\82É
\92u
\82¢
\82½"));
3032 (void) make_familiar(obj, cc.x, cc.y, FALSE);
3033 (void) stop_timer(FIG_TRANSFORM, obj_to_any(obj));
3036 map_invisible(cc.x, cc.y);
3040 static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 };
3050 pline("%s from your %s.", Tobjnam(obj, "slip"),
3051 makeplural(body_part(FINGER)));
3053 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
3061 if ((obj->cursed || Fumbling) && !rn2(2)) {
3062 consume_obj_charge(obj, TRUE);
3065 pline("%s from your %s.", Tobjnam(obj, "slip"),
3066 makeplural(body_part(FINGER)));
3068 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
3074 otmp = getobj(lubricables, "grease");
3078 if (inaccessible_equipment(otmp, "grease", FALSE))
3080 if (inaccessible_equipment(otmp, "
\82É
\8e\89\82ð
\93h
\82é", FALSE))
3082 consume_obj_charge(obj, TRUE);
3084 if (otmp != &zeroobj) {
3086 You("cover %s with a thick layer of grease.", yname(otmp));
3088 You("%s
\82É
\8e\89\82ð
\92O
\94O
\82É
\93h
\82Á
\82½
\81D", xname(otmp));
3090 if (obj->cursed && !nohands(youmonst.data)) {
3091 incr_itimeout(&Glib, rnd(15));
3093 pline("Some of the grease gets all over your %s.",
3095 pline("
\8e\89\82ª
\8f
\82µ%s
\82É
\82Â
\82¢
\82½
\81D",
3096 makeplural(body_part(HAND)));
3099 incr_itimeout(&Glib, rnd(15));
3101 You("coat your %s with grease.", makeplural(body_part(FINGER)));
3103 You("%s
\82É
\8e\89\82ð
\93h
\82Á
\82½
\81D", makeplural(body_part(FINGER)));
3108 pline("%s empty.", Tobjnam(obj, "are"));
3110 pline("%s
\82Í
\8bó
\82Á
\82Û
\82¾
\81D", xname(obj));
3113 pline("%s to be empty.", Tobjnam(obj, "seem"));
3115 pline("%s
\82Í
\8bó
\82Á
\82Û
\82Ì
\82æ
\82¤
\82¾
\81D", xname(obj));
3120 /* touchstones - by Ken Arnold */
3127 const char *streak_color, *choices;
3128 char stonebuf[QBUFSZ];
3130 static const char scritch[] = "\"scritch, scritch\"";
3132 static const char scritch[] = "
\81u
\83S
\83V
\81C
\83S
\83V
\81v";
3133 static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 };
3134 static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 };
3136 /* in case it was acquired while blinded */
3139 /* when the touchstone is fully known, don't bother listing extra
3140 junk as likely candidates for rubbing */
3141 choices = (tstone->otyp == TOUCHSTONE && tstone->dknown
3142 && objects[TOUCHSTONE].oc_name_known)
3146 Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan));
3148 Sprintf(stonebuf, "rub on the stone");
3149 if ((obj = getobj(choices, stonebuf)) == 0)
3152 if (obj == tstone && obj->quan == 1L) {
3154 You_cant("rub %s on itself.", the(xname(obj)));
3156 You("%s
\82ð
\82»
\82ê
\8e©
\91Ì
\82Å
\82±
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", the(xname(obj)));
3160 if (tstone->otyp == TOUCHSTONE && tstone->cursed
3161 && obj->oclass == GEM_CLASS && !is_graystone(obj)
3162 && !obj_resists(obj, 80, 100)) {
3165 pline("You feel something shatter.");
3167 You("
\89½
\82©
\82ª
\95²
\81X
\82É
\82È
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81D");
3168 else if (Hallucination)
3170 pline("Oh, wow, look at the pretty shards.");
3172 pline("
\83\8f\81[
\83H
\81I
\82È
\82ñ
\82Ä
\82«
\82ê
\82¢
\82È
\94j
\95Ð
\82È
\82ñ
\82¾
\81D");
3175 pline("A sharp crack shatters %s%s.",
3176 (obj->quan > 1L) ? "one of " : "", the(xname(obj)));
3178 pline("
\8b
\82
\82±
\82·
\82è
\82·
\82¬
\82Ä%s%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
3179 the(xname(obj)), (obj->quan > 1) ? "
\82Ì
\82Ð
\82Æ
\82Â" : "");
3188 } else if (Hallucination) {
3190 pline("Oh wow, man: Fractals!");
3192 pline("
\83\8f\81[
\83H
\81I
\83t
\83\89\83N
\83^
\83\8b\96Í
\97l
\82¾
\81I");
3200 switch (obj->oclass) {
3201 case GEM_CLASS: /* these have class-specific handling below */
3203 if (tstone->otyp != TOUCHSTONE) {
3205 } else if (obj->oclass == GEM_CLASS
3207 || (!tstone->cursed && (Role_if(PM_ARCHEOLOGIST)
3208 || Race_if(PM_GNOME))))) {
3209 makeknown(TOUCHSTONE);
3210 makeknown(obj->otyp);
3211 prinv((char *) 0, obj, 0L);
3214 /* either a ring or the touchstone was not effective */
3215 if (objects[obj->otyp].oc_material == GLASS) {
3220 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3221 break; /* gem or ring */
3224 switch (objects[obj->otyp].oc_material) {
3227 pline("%s a little more polished now.", Tobjnam(tstone, "look"));
3229 pline("%s
\82Í
\82³
\82ç
\82É
\82Â
\82â
\82ª
\8fo
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D", xname(tstone));
3233 if (!obj->known) /* note: not "whetstone" */
3235 You("must think this is a wetstone, do you?");
3237 You("
\82±
\82ê
\82Í
\93u
\90Î
\82¾
\82Æ
\8ev
\82Á
\82½
\81H");
3241 pline("%s a little wetter now.", Tobjnam(tstone, "are"));
3243 pline("%s
\82Í
\8f
\82µ
\82Ê
\82ê
\82½
\81D", xname(tstone));
3248 streak_color = "waxy";
3250 streak_color = "
\8e\89\82Á
\82Û
\82¢";
3252 break; /* okay even if not touchstone */
3255 streak_color = "wooden";
3257 streak_color = "
\82¨
\82ª
\82
\82¸
\82Ì
\82æ
\82¤
\82È";
3259 break; /* okay even if not touchstone */
3261 do_scratch = TRUE; /* scratching and streaks */
3263 streak_color = "golden";
3265 streak_color = "
\8bà
\90F
\82Ì";
3269 do_scratch = TRUE; /* scratching and streaks */
3271 streak_color = "silvery";
3273 streak_color = "
\8bâ
\90F
\82Ì";
3277 /* Objects passing the is_flimsy() test will not
3278 scratch a stone. They will leave streaks on
3279 non-touchstones and touchstones alike. */
3281 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3283 do_scratch = (tstone->otyp != TOUCHSTONE);
3286 break; /* default oclass */
3289 #if 0 /*JP*//* not used */
3290 Sprintf(stonebuf, "stone%s", plur(tstone->quan));
3294 You("make %s%sscratch marks on the %s.",
3295 streak_color ? streak_color : (const char *) "",
3296 streak_color ? " " : "", stonebuf);
3298 You("%s
\82±
\82·
\82è
\90Õ
\82ð
\90Î
\82É
\82Â
\82¯
\82½
\81D",
3299 streak_color ? streak_color : (const char *)"");
3301 else if (streak_color)
3303 You_see("%s streaks on the %s.", streak_color, stonebuf);
3305 pline("
\90Î
\82É%s
\8bØ
\82ª
\82Â
\82¢
\82½
\81D", streak_color);
3311 static struct trapinfo {
3315 boolean force_bungle;
3322 trapinfo.force_bungle = 0;
3325 /* Place a landmine/bear trap. Helge Hafting */
3331 const char *what = (char *) 0;
3333 int levtyp = levl[u.ux][u.uy].typ;
3335 const char *occutext = "setting the trap";
3337 const char *occutext = "ã©
\82ð
\8ed
\8a|
\82¯
\82Ä
\82¢
\82é";
3340 if (nohands(youmonst.data))
3342 what = "without hands";
3344 what = "
\8eè
\82ª
\82È
\82¢
\82Ì
\82Å";
3347 what = "while stunned";
3349 what = "
\82
\82ç
\82
\82ç
\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å";
3350 else if (u.uswallow)
3353 is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed";
3355 is_animal(u.ustuck->data) ? "
\88ù
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\8aÔ
\82Í" : "
\8aª
\82«
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\8aÔ
\82Í";
3356 else if (Underwater)
3358 what = "underwater";
3360 what = "
\90\85\96Ê
\89º
\82Å
\82Í";
3361 else if (Levitation)
3363 what = "while levitating";
3365 what = "
\95\82\82¢
\82Ä
\82¢
\82é
\8aÔ
\82Í";
3366 else if (is_pool(u.ux, u.uy))
3370 what = "
\90\85\92\86\82Å
\82Í";
3371 else if (is_lava(u.ux, u.uy))
3375 what = "
\97n
\8aâ
\82Ì
\92\86\82Å
\82Í";
3376 else if (On_stairs(u.ux, u.uy))
3378 what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder"
3381 what = (u.ux == xdnladder || u.ux == xupladder) ? "
\82Í
\82µ
\82²
\82Ì
\8fã
\82Å
\82Í"
3382 : "
\8aK
\92i
\82Ì
\8fã
\82Å
\82Í";
3384 else if (IS_FURNITURE(levtyp) || IS_ROCK(levtyp)
3385 || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy))
3389 what = "
\82±
\82±
\82Å
\82Í";
3390 else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
3392 what = (levtyp == AIR)
3396 : "in this place"; /* Air/Water Plane catch-all */
3398 what = (levtyp == AIR)
3399 ? "
\8bó
\92\86\82Å
\82Í"
3401 ? "
\89_
\82Ì
\92\86\82Å
\82Í"
3402 : "
\82±
\82±
\82Å
\82Í"; /* Air/Water Plane catch-all */
3406 You_cant("set a trap %s!", what);
3408 pline("%sã©
\82ð
\8ed
\8a|
\82¯
\82ç
\82ê
\82È
\82¢
\81I",what);
3412 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3413 if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) {
3415 You("resume setting %s%s.", shk_your(buf, otmp),
3417 You("%s
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D",
3418 defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
3419 set_occupation(set_trap, occutext, 0);
3422 trapinfo.tobj = otmp;
3423 trapinfo.tx = u.ux, trapinfo.ty = u.uy;
3425 trapinfo.time_needed =
3426 (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5;
3428 trapinfo.time_needed *= 2;
3430 if (ttyp == BEAR_TRAP && tmp < 18)
3431 trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4;
3432 /*[fumbling and/or confusion and/or cursed object check(s)
3433 should be incorporated here instead of in set_trap]*/
3434 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) {
3437 if (Fumbling || otmp->cursed)
3438 chance = (rnl(10) > 3);
3440 chance = (rnl(10) > 5);
3442 You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
3444 pline("%s
\82Ì
\8fã
\82©
\82ç
\82Å
\82Í
\82¤
\82Ü
\82
\8ed
\8a|
\82¯
\82ç
\82ê
\82È
\82¢
\82©
\82à
\82µ
\82ê
\82È
\82¢
\81D", mon_nam(u.usteed));
3446 Sprintf(buf, "Continue your attempt to set %s?",
3448 Sprintf(buf, "%s
\82Ì
\8ed
\8a|
\82¯
\82ð
\91±
\82¯
\82é
\81H",
3449 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
3451 if (yn(buf) == 'y') {
3454 case LANDMINE: /* set it off */
3455 trapinfo.time_needed = 0;
3456 trapinfo.force_bungle = TRUE;
3458 case BEAR_TRAP: /* drop it without arming it */
3463 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I",
3464 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
3476 You("begin setting %s%s.", shk_your(buf, otmp),
3478 You("%s%s
\82ð
\8ed
\8a|
\82¯
\82Í
\82¶
\82ß
\82½
\81D", shk_your(buf, otmp),
3479 defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
3480 set_occupation(set_trap, occutext, 0);
3488 struct obj *otmp = trapinfo.tobj;
3492 if (!otmp || !carried(otmp) || u.ux != trapinfo.tx
3493 || u.uy != trapinfo.ty) {
3499 if (--trapinfo.time_needed > 0)
3500 return 1; /* still busy */
3502 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3503 ttmp = maketrap(u.ux, u.uy, ttyp);
3507 if (*in_rooms(u.ux, u.uy, SHOPBASE)) {
3508 add_damage(u.ux, u.uy, 0L); /* schedule removal */
3510 if (!trapinfo.force_bungle)
3512 You("finish arming %s.",
3514 You("%s
\82ð
\8ed
\8a|
\82¯
\8fI
\82¦
\82½
\81D",
3515 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation));
3516 if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
3517 || trapinfo.force_bungle)
3519 (unsigned) (trapinfo.force_bungle ? FORCEBUNGLE : 0));
3521 /* this shouldn't happen */
3523 Your("trap setting attempt fails.");
3525 You("ã©
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D");
3539 int rx, ry, proficient, res = 0;
3541 const char *msg_slipsfree = "The bullwhip slips free.";
3543 const char *msg_slipsfree = "
\95Ú
\82Í
\82Ù
\82Ç
\82¯
\82½
\81D";
3545 const char *msg_snap = "Snap!";
3547 const char *msg_snap = "
\83s
\83V
\83b
\81I";
3550 if (!wield_tool(obj, "lash"))
3555 if (!getdir((char *) 0))
3563 if (Stunned || (Confusion && !rn2(5)))
3567 if (!isok(rx, ry)) {
3571 You("
\82Í
\82¸
\82µ
\82½
\81D");
3574 mtmp = m_at(rx, ry);
3577 /* fake some proficiency checks */
3579 if (Role_if(PM_ARCHEOLOGIST))
3581 if (ACURR(A_DEX) < 6)
3583 else if (ACURR(A_DEX) >= 14)
3584 proficient += (ACURR(A_DEX) - 14);
3592 if (u.uswallow && attack(u.ustuck)) {
3594 There("is not enough room to flick your bullwhip.");
3596 pline("
\95Ú
\82ð
\91Å
\82Â
\82Ù
\82Ç
\8dL
\82
\82È
\82¢
\81D");
3598 } else if (Underwater) {
3600 There("is too much resistance to flick your bullwhip.");
3602 pline("
\90\85\82Ì
\92ï
\8dR
\82ª
\82 \82è
\82·
\82¬
\82Ä
\95Ú
\82ð
\91Å
\82Â
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
3604 } else if (u.dz < 0) {
3606 You("flick a bug off of the %s.", ceiling(u.ux, u.uy));
3608 You("%s
\82Ì
\92\8e\82ð
\91Å
\82¿
\97\8e\82µ
\82½
\81D",ceiling(u.ux,u.uy));
3610 } else if ((!u.dx && !u.dy) || (u.dz > 0)) {
3613 /* Sometimes you hit your steed by mistake */
3614 if (u.usteed && !rn2(proficient + 2)) {
3616 You("whip %s!", mon_nam(u.usteed));
3618 You("%s
\82ð
\95Ú
\91Å
\82Á
\82½
\81I", mon_nam(u.usteed));
3622 if (Levitation || u.usteed) {
3623 /* Have a shot at snaring something on the floor */
3624 otmp = level.objects[u.ux][u.uy];
3625 if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) {
3627 pline("Why beat a dead horse?");
3629 pline("
\82Ç
\82¤
\82µ
\82Ä
\8e\80\82ñ
\82¾
\94n
\82ð
\95Ú
\91Å
\82Â
\82æ
\82¤
\82È
\82±
\82Æ
\82ð
\82·
\82é
\82Ì
\81H");
3632 if (otmp && proficient) {
3634 You("wrap your bullwhip around %s on the %s.",
3635 an(singular(otmp, xname)), surface(u.ux, u.uy));
3637 You("
\95Ú
\82ð%s
\82Ì
\8fã
\82Ì%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D",
3638 surface(u.ux, u.uy), an(singular(otmp, xname)));
3640 if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1)
3641 pline1(msg_slipsfree);
3645 dam = rnd(2) + dbon() + obj->spe;
3649 You("hit your %s with your bullwhip.", body_part(FOOT));
3651 You("
\8e©
\95ª
\82Ì%s
\82ð
\8e©
\95ª
\82Å
\91Å
\82¿
\82Â
\82¯
\82½
\81D", body_part(FOOT));
3653 Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis());
3654 losehp(Maybe_Half_Phys(dam), buf, NO_KILLER_PREFIX);
3656 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82ð
\95Ú
\91Å
\82Á
\82Ä");
3657 losehp(Maybe_Half_Phys(dam), buf, KILLED_BY);
3661 } else if ((Fumbling || Glib) && !rn2(5)) {
3663 pline_The("bullwhip slips out of your %s.", body_part(HAND));
3665 pline("
\95Ú
\82ª%s
\82©
\82ç
\82·
\82×
\82è
\97\8e\82¿
\82½
\81D", body_part(HAND));
3668 } else if (u.utrap && u.utraptype == TT_PIT) {
3672 * if you're in a pit
3673 * - you are attempting to get out of the pit
3674 * or, if you are applying it towards a small monster
3675 * - then it is assumed that you are trying to hit it
3676 * else if the monster is wielding a weapon
3677 * - you are attempting to disarm a monster
3679 * - you are attempting to hit the monster.
3681 * if you're confused (and thus off the mark)
3682 * - you only end up hitting.
3685 const char *wrapped_what = (char *) 0;
3688 if (bigmonst(mtmp->data)) {
3689 wrapped_what = strcpy(buf, mon_nam(mtmp));
3690 } else if (proficient) {
3697 if (!wrapped_what) {
3698 if (IS_FURNITURE(levl[rx][ry].typ))
3699 wrapped_what = something;
3700 else if (sobj_at(BOULDER, rx, ry))
3702 wrapped_what = "a boulder";
3704 wrapped_what = "
\8aâ";
3712 You("wrap your bullwhip around %s.", wrapped_what);
3714 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", wrapped_what);
3715 if (proficient && rn2(proficient + 2)) {
3716 if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) {
3718 You("yank yourself out of the pit!");
3720 You("
\82®
\82¢
\82Æ
\88ø
\82Á
\82Ï
\82Á
\82Ä
\8c\8a\82©
\82ç
\94²
\82¯
\8fo
\82µ
\82½
\81I");
3721 teleds(cc.x, cc.y, TRUE);
3723 vision_full_recalc = 1;
3726 pline1(msg_slipsfree);
3734 if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) {
3736 pline("A monster is there that you couldn't see.");
3738 pline("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82ª
\82¢
\82é
\81D");
3739 map_invisible(rx, ry);
3741 otmp = MON_WEP(mtmp); /* can be null */
3743 char onambuf[BUFSZ];
3744 const char *mon_hand;
3745 boolean gotit = proficient && (!Fumbling || !rn2(10));
3747 Strcpy(onambuf, cxname(otmp));
3749 mon_hand = mbodypart(mtmp, HAND);
3751 mon_hand = makeplural(mon_hand);
3753 mon_hand = 0; /* lint suppression */
3756 You("wrap your bullwhip around %s.", yname(otmp));
3758 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", xname(otmp));
3759 if (gotit && mwelded(otmp)) {
3761 pline("%s welded to %s %s%c",
3762 (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp),
3763 mon_hand, !otmp->bknown ? '!' : '.');
3765 pline("%s
\82Í%s
\82Ì%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82µ
\82Ü
\82Á
\82Ä
\82¢
\82é%s",
3767 mon_nam(mtmp), mon_hand,
3768 !otmp->bknown ? "
\81I" : "
\81D");
3771 gotit = FALSE; /* can't pull it free */
3774 obj_extract_self(otmp);
3775 possibly_unwield(mtmp, FALSE);
3776 setmnotwielded(mtmp, otmp);
3778 switch (rn2(proficient + 1)) {
3780 /* to floor near you */
3782 You("yank %s to the %s!", yname(otmp),
3784 You("%s
\82ð%s
\82É
\88ø
\82«
\97\8e\82µ
\82½
\81I", xname(otmp),
3785 surface(u.ux, u.uy));
3786 place_object(otmp, u.ux, u.uy);
3793 /* proficient with whip, but maybe not
3794 so proficient at catching weapons */
3797 hitvalu = 8 + otmp->spe;
3798 hitu = thitu(hitvalu, dmgval(otmp, &youmonst),
3802 pline_The("%s hits you as you try to snatch it!",
3804 pline_The("%s
\82ð
\92D
\82¨
\82¤
\82Æ
\82µ
\82½
\82ç
\82 \82È
\82½
\82É
\93\96\82½
\82Á
\82½
\81I",
3807 place_object(otmp, u.ux, u.uy);
3812 /* right into your inventory */
3814 You("snatch %s!", yname(otmp));
3816 You("%s
\82ð
\92D
\82Á
\82½
\81I", xname(otmp));
3817 if (otmp->otyp == CORPSE
3818 && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg
3819 && !Stone_resistance
3820 && !(poly_when_stoned(youmonst.data)
3821 && polymon(PM_STONE_GOLEM))) {
3825 Sprintf(kbuf, "%s corpse",
3826 an(mons[otmp->corpsenm].mname));
3827 pline("Snatching %s is a fatal mistake.", kbuf);
3829 pline("%s
\82Ì
\8e\80\91Ì
\82ð
\92D
\82Á
\82½
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
3830 mons[otmp->corpsenm].mname);
3831 Sprintf(kbuf, "%s
\82Ì
\8e\80\91Ì
\82É
\90G
\82ê
\82Ä",
3832 mons[otmp->corpsenm].mname);
3837 (void) hold_another_object(otmp, "You drop %s!",
3838 doname(otmp), (const char *) 0);
3840 (void) hold_another_object(otmp, "%s
\82ð
\97\8e\82µ
\82½
\81I",
3841 doname(otmp), (const char *) 0);
3845 /* to floor beneath mon */
3847 You("yank %s from %s %s!", the(onambuf),
3848 s_suffix(mon_nam(mtmp)), mon_hand);
3850 You("%s
\82ð%s
\82Ì%s
\82©
\82ç
\82Ð
\82Á
\82Ï
\82Á
\82½
\81I", the(xname(otmp)),
3851 mon_nam(mtmp), mon_hand);
3853 obj_no_longer_held(otmp);
3854 place_object(otmp, mtmp->mx, mtmp->my);
3859 pline1(msg_slipsfree);
3863 if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers
3865 stumble_onto_mimic(mtmp);
3868 You("flick your bullwhip towards %s.", mon_nam(mtmp));
3870 You("%s
\82É
\8cü
\82Á
\82Ä
\95Ú
\82ð
\91Å
\82Á
\82½
\81D", mon_nam(mtmp));
3879 } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
3880 /* it must be air -- water checked above */
3882 You("snap your whip through thin air.");
3884 You("
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë
\82Å
\95Ú
\82ð
\91Å
\82Á
\82½
\81D");
3894 not_enough_room[] = "There's not enough room here to use that.",
3896 not_enough_room[] = "
\82»
\82ê
\82ð
\8eg
\82¤
\82¾
\82¯
\82Ì
\8dL
\82³
\82ª
\82È
\82¢
\81D",
3898 where_to_hit[] = "Where do you want to hit?",
3900 where_to_hit[] = "
\82Ç
\82ê
\82ð
\91_
\82¤
\81H",
3902 cant_see_spot[] = "won't hit anything if you can't see that spot.",
3904 cant_see_spot[] = "
\8fê
\8f\8a\82ª
\8c©
\82¦
\82È
\82¯
\82ê
\82Î
\91_
\82¦
\82È
\82¢
\81D",
3906 cant_reach[] = "can't reach that spot from here.";
3908 cant_reach[] = "
\82±
\82±
\82©
\82ç
\82»
\82±
\82Ö
\82Í
\93Í
\82©
\82È
\82¢
\81D";
3910 /* find pos of monster in range, if only one monster */
3912 find_poleable_mon(pos, min_range, max_range)
3914 int min_range, max_range;
3919 int x, y, lo_x, hi_x, lo_y, hi_y, rt, glyph;
3922 return FALSE; /* must be able to see target location */
3923 impaired = (Confusion || Stunned || Hallucination);
3924 mpos.x = mpos.y = 0; /* no candidate location yet */
3925 rt = isqrt(max_range);
3926 lo_x = max(u.ux - rt, 1), hi_x = min(u.ux + rt, COLNO - 1);
3927 lo_y = max(u.uy - rt, 0), hi_y = min(u.uy + rt, ROWNO - 1);
3928 for (x = lo_x; x <= hi_x; ++x) {
3929 for (y = lo_y; y <= hi_y; ++y) {
3930 if (distu(x, y) < min_range || distu(x, y) > max_range
3931 || !isok(x, y) || !cansee(x, y))
3933 glyph = glyph_at(x, y);
3935 && glyph_is_monster(glyph)
3936 && (mtmp = m_at(x, y)) != 0
3937 && (mtmp->mtame || (mtmp->mpeaceful && flags.confirm)))
3939 if (glyph_is_monster(glyph)
3940 || glyph_is_warning(glyph)
3941 || glyph_is_invisible(glyph)
3942 || (glyph_is_statue(glyph) && impaired)) {
3944 return FALSE; /* more than one candidate location */
3945 mpos.x = x, mpos.y = y;
3950 return FALSE; /* no candidate location */
3955 static int polearm_range_min = -1;
3956 static int polearm_range_max = -1;
3959 get_valid_polearm_position(x, y)
3962 return (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
3963 && distu(x, y) >= polearm_range_min
3964 && distu(x, y) <= polearm_range_max);
3968 display_polearm_positions(state)
3972 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
3973 } else if (state == 1) {
3976 for (dx = -4; dx <= 4; dx++)
3977 for (dy = -4; dy <= 4; dy++) {
3978 x = dx + (int) u.ux;
3979 y = dy + (int) u.uy;
3980 if (get_valid_polearm_position(x, y)) {
3985 tmp_at(DISP_END, 0);
3989 /* Distance attacks by pole-weapons */
3994 int res = 0, typ, max_range, min_range, glyph;
3997 struct monst *hitm = context.polearm.hitmon;
3999 /* Are you allowed to use the pole? */
4001 pline(not_enough_room);
4005 if (!wield_tool(obj, "swing"))
4010 /* assert(obj == uwep); */
4013 * Calculate allowable range (pole's reach is always 2 steps):
4014 * unskilled and basic: orthogonal direction, 4..4;
4015 * skilled: as basic, plus knight's jump position, 4..5;
4016 * expert: as skilled, plus diagonal, 4..8.
4024 * (Note: no roles in nethack can become expert or better
4025 * for polearm skill; Yeoman in slash'em can become expert.)
4028 typ = uwep_skill_type();
4029 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4031 else if (P_SKILL(typ) == P_SKILLED)
4034 max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
4036 polearm_range_min = min_range;
4037 polearm_range_max = max_range;
4039 /* Prompt for a location */
4040 pline(where_to_hit);
4043 if (!find_poleable_mon(&cc, min_range, max_range) && hitm
4044 && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)
4045 && distu(hitm->mx, hitm->my) <= max_range
4046 && distu(hitm->mx, hitm->my) >= min_range) {
4050 getpos_sethilite(display_polearm_positions, get_valid_polearm_position);
4052 if (getpos(&cc, TRUE, "the spot to hit") < 0)
4054 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
4055 return res; /* ESC; uses turn iff polearm became wielded */
4057 glyph = glyph_at(cc.x, cc.y);
4058 if (distu(cc.x, cc.y) > max_range) {
4062 pline("
\89\93\82·
\82¬
\82é
\81I");
4064 } else if (distu(cc.x, cc.y) < min_range) {
4066 pline("Too close!");
4068 pline("
\8bß
\82·
\82¬
\82é
\81I");
4070 } else if (!cansee(cc.x, cc.y) && !glyph_is_monster(glyph)
4071 && !glyph_is_invisible(glyph) && !glyph_is_statue(glyph)) {
4074 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4079 context.polearm.hitmon = (struct monst *) 0;
4080 /* Attack the monster there */
4082 if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *) 0) {
4083 if (attack_checks(mtmp, uwep))
4086 return 1; /* burn nutrition; maybe pass out */
4087 context.polearm.hitmon = mtmp;
4088 check_caitiff(mtmp);
4089 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4090 (void) thitmonst(mtmp, uwep);
4091 } else if (glyph_is_statue(glyph) /* might be hallucinatory */
4092 && sobj_at(STATUE, bhitpos.x, bhitpos.y)) {
4093 struct trap *t = t_at(bhitpos.x, bhitpos.y);
4095 if (t && t->ttyp == STATUE_TRAP
4096 && activate_statue_trap(t, t->tx, t->ty, FALSE)) {
4097 ; /* feedback has been give by animate_statue() */
4099 /* Since statues look like monsters now, we say something
4100 different from "you miss" or "there's nobody there".
4101 Note: we only do this when a statue is displayed here,
4102 because the player is probably attempting to attack it;
4103 other statues obscured by anything are just ignored. */
4105 pline("Thump! Your blow bounces harmlessly off the statue.");
4107 pline("
\83S
\83c
\83\93\81I
\92¤
\91\9c\82Í
\8f\9d\82Â
\82©
\82È
\82©
\82Á
\82½
\81D");
4108 wake_nearto(bhitpos.x, bhitpos.y, 25);
4111 /* no monster here and no statue seen or remembered here */
4112 (void) unmap_invisible(bhitpos.x, bhitpos.y);
4114 You("miss; there is no one there to hit.");
4116 You("
\8aO
\82ê
\82½
\81D
\82»
\82±
\82É
\82Í
\89½
\82à
\82È
\82¢
\81D");
4118 u_wipe_engr(2); /* same as for melee or throwing */
4126 boolean wasblind = Blind;
4127 boolean wascreamed = u.ucreamed;
4128 boolean several = FALSE;
4130 if (obj->quan > 1L) {
4132 obj = splitobj(obj, 1L);
4136 You("give yourself a facial.");
4138 You("
\83N
\83\8a\81[
\83\80\83p
\83b
\83N
\82ð
\82µ
\82½
\81D");
4141 pline("You immerse your %s in %s%s.", body_part(FACE),
4142 several ? "one of " : "",
4143 several ? makeplural(the(xname(obj))) : the(xname(obj)));
4145 pline("%s%s
\82É%s
\82ð
\92¾
\82ß
\82½
\81D",
4147 several ? "
\82Ì
\82Ð
\82Æ
\82Â" : "", body_part(FACE));
4149 if (can_blnd((struct monst *) 0, &youmonst, AT_WEAP, obj)) {
4150 int blindinc = rnd(25);
4151 u.ucreamed += blindinc;
4152 make_blinded(Blinded + (long) blindinc, FALSE);
4153 if (!Blind || (Blind && wasblind))
4155 pline("There's %ssticky goop all over your %s.",
4156 wascreamed ? "more " : "", body_part(FACE));
4158 pline("
\82â
\82Á
\82©
\82¢
\82È
\82Ë
\82Î
\82Ë
\82Î
\82ª%s
\91S
\91Ì
\82É%s
\82Â
\82¢
\82½
\81D",
4159 body_part(FACE), wascreamed ? "
\82³
\82ç
\82É" : "");
4161 else /* Blind && !wasblind */
4163 You_cant("see through all the sticky goop on your %s.",
4165 pline("
\82â
\82Á
\82©
\82¢
\82È
\82Ë
\82Î
\82Ë
\82Î
\82ª%s
\91S
\91Ì
\82É
\82Â
\82¢
\82Ä
\89½
\82à
\8c©
\82¦
\82È
\82
\82È
\82Á
\82½
\81D",
4170 /* useup() is appropriate, but we want costly_alteration()'s message */
4171 costly_alteration(obj, COST_SPLAT);
4172 obj_extract_self(obj);
4181 int res = 0, typ, max_range = 4, tohit;
4182 boolean save_confirm;
4187 /* Are you allowed to use the hook? */
4189 pline(not_enough_room);
4193 if (!wield_tool(obj, "cast"))
4198 /* assert(obj == uwep); */
4200 /* Prompt for a location */
4201 pline(where_to_hit);
4205 if (getpos(&cc, TRUE, "the spot to hit") < 0)
4207 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
4208 return res; /* ESC; uses turn iff grapnel became wielded */
4210 /* Calculate range; unlike use_pole(), there's no minimum for range */
4211 typ = uwep_skill_type();
4212 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4214 else if (P_SKILL(typ) == P_SKILLED)
4218 if (distu(cc.x, cc.y) > max_range) {
4222 pline("
\89\93\82·
\82¬
\82é
\81I");
4224 } else if (!cansee(cc.x, cc.y)) {
4227 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4232 /* What do you want to hit? */
4234 if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) {
4235 winid tmpwin = create_nhwindow(NHW_MENU);
4238 menu_item *selected;
4240 any = zeroany; /* set all bits to zero */
4241 any.a_int = 1; /* use index+1 (cant use 0) as identifier */
4245 Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
4247 Sprintf(buf, "%s
\82É
\82 \82é
\95¨
\91Ì", surface(cc.x, cc.y));
4248 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4252 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
4255 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "
\89ö
\95¨",
4260 Sprintf(buf, "the %s", surface(cc.x, cc.y));
4262 Sprintf(buf, "%s", surface(cc.x, cc.y));
4263 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4266 end_menu(tmpwin, "Aim for what?");
4268 end_menu(tmpwin, "
\89½
\82ð
\91_
\82¤
\81H");
4270 if (select_menu(tmpwin, PICK_ONE, &selected) > 0
4271 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2))
4272 tohit = selected[0].item.a_int - 1;
4273 free((genericptr_t) selected);
4274 destroy_nhwindow(tmpwin);
4277 /* possibly scuff engraving at your feet;
4278 any engraving at the target location is unaffected */
4279 if (tohit == 2 || !rn2(2))
4280 u_wipe_engr(rnd(2));
4282 /* What did you hit? */
4285 /* FIXME -- untrap needs to deal with non-adjacent traps */
4287 case 1: /* Object */
4288 if ((otmp = level.objects[cc.x][cc.y]) != 0) {
4290 You("snag an object from the %s!", surface(cc.x, cc.y));
4292 You("%s
\82Ì
\82à
\82Ì
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I", surface(cc.x, cc.y));
4293 (void) pickup_object(otmp, 1L, FALSE);
4294 /* If pickup fails, leave it alone */
4299 case 2: /* Monster */
4301 if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *) 0)
4303 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4304 save_confirm = flags.confirm;
4305 if (verysmall(mtmp->data) && !rn2(4)
4306 && enexto(&cc, u.ux, u.uy, (struct permonst *) 0)) {
4307 flags.confirm = FALSE;
4308 (void) attack_checks(mtmp, uwep);
4309 flags.confirm = save_confirm;
4310 check_caitiff(mtmp); /* despite fact there's no damage */
4312 You("pull in %s!", mon_nam(mtmp));
4314 You("%s
\82ð
\88ø
\82Á
\92£
\82Á
\82½
\81I", mon_nam(mtmp));
4315 mtmp->mundetected = 0;
4316 rloc_to(mtmp, cc.x, cc.y);
4318 } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data))
4320 flags.confirm = FALSE;
4321 (void) attack_checks(mtmp, uwep);
4322 flags.confirm = save_confirm;
4323 check_caitiff(mtmp);
4324 (void) thitmonst(mtmp, uwep);
4328 case 3: /* Surface */
4329 if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y))
4331 pline_The("hook slices through the %s.", surface(cc.x, cc.y));
4333 pline("
\83t
\83b
\83N
\82Í%s
\82ð
\82³
\82Á
\82Æ
\90Ø
\82Á
\82½
\81D", surface(cc.x, cc.y));
4336 You("are yanked toward the %s!", surface(cc.x, cc.y));
4338 You("%s
\82Ö
\88ø
\82Á
\82Ï
\82ç
\82ê
\82½
\81I", surface(cc.x, cc.y));
4339 hurtle(sgn(cc.x - u.ux), sgn(cc.y - u.uy), 1, FALSE);
4343 default: /* Yourself (oops!) */
4344 if (P_SKILL(typ) <= P_BASIC) {
4346 You("hook yourself!");
4348 You("
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I");
4350 losehp(Maybe_Half_Phys(rn1(10, 10)), "a grappling hook",
4352 losehp(Maybe_Half_Phys(rn1(10, 10)), "
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82Ä",
4358 pline1(nothing_happens);
4362 #define BY_OBJECT ((struct monst *) 0)
4364 /* return 1 if the wand is broken, hence some time elapsed */
4370 static const char nothing_else_happens[] = "But nothing else happens...";
4372 static const char nothing_else_happens[] = "
\82µ
\82©
\82µ
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D
\81D
\81D";
4373 register int i, x, y;
4374 register struct monst *mon;
4376 boolean affects_objects;
4377 boolean shop_damage = FALSE;
4378 boolean fillmsg = FALSE;
4379 int expltype = EXPL_MAGICAL;
4380 char confirm[QBUFSZ], buf[BUFSZ];
4382 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
4384 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "
\83o
\83\8b\83T
\82Ì
\8fñ"));
4387 if (!paranoid_query(ParanoidBreakwand,
4389 "Are you really sure you want to break ",
4390 "?", obj, yname, ysimple_name, "the wand")))
4392 if (!paranoid_query(ParanoidBreakwand,
4394 "
\96{
\93\96\82É", "
\82ð
\89ó
\82·
\82Ì
\81H",
4395 obj, xname, ysimple_name, "
\8fñ")))
4399 if (nohands(youmonst.data)) {
4401 You_cant("break %s without hands!", yname(obj));
4403 You("
\8eè
\82ª
\96³
\82¢
\82Ì
\82Å%s
\82ð
\89ó
\82¹
\82È
\82¢
\81I", xname(obj));
4405 } else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
4407 You("don't have the strength to break %s!", yname(obj));
4409 You("%s
\82ð
\89ó
\82·
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I", xname(obj));
4413 pline("Raising %s high above your %s, you %s it in two!", yname(obj),
4414 body_part(HEAD), is_fragile ? "snap" : "break");
4416 pline("%s
\82ð%s
\82Ì
\8fã
\82É
\8d\82\82
\8cf
\82°
\81C
\93ñ
\82Â
\82É
\82Ö
\82µ
\90Ü
\82Á
\82½
\81I", yname(obj),
4420 /* [ALI] Do this first so that wand is removed from bill. Otherwise,
4421 * the freeinv() below also hides it from setpaid() which causes problems.
4424 check_unpaid(obj); /* Extra charge for use */
4425 costly_alteration(obj, COST_DSTROY);
4428 current_wand = obj; /* destroy_item might reset this */
4429 freeinv(obj); /* hide it from destroy_item instead... */
4430 setnotworn(obj); /* so we need to do this ourselves */
4432 if (!zappable(obj)) {
4433 pline(nothing_else_happens);
4434 goto discard_broken_wand;
4436 /* successful call to zappable() consumes a charge; put it back */
4438 /* might have "wrested" a final charge, taking it from 0 to -1;
4439 if so, we just brought it back up to 0, which wouldn't do much
4440 below so give it 1..3 charges now, usually making it stronger
4441 than an ordinary last charge (the wand is already gone from
4442 inventory, so perm_invent can't accidentally reveal this) */
4449 affects_objects = FALSE;
4451 switch (obj->otyp) {
4456 case WAN_ENLIGHTENMENT:
4458 case WAN_SECRET_DOOR_DETECTION:
4459 pline(nothing_else_happens);
4460 goto discard_broken_wand;
4466 expltype = EXPL_FIERY;
4469 if (expltype == EXPL_MAGICAL)
4470 expltype = EXPL_FROSTY;
4473 case WAN_MAGIC_MISSILE:
4475 explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
4476 makeknown(obj->otyp); /* explode describes the effect */
4477 goto discard_broken_wand;
4479 /* we want this before the explosion instead of at the very end */
4481 pline("A wall of force smashes down around you!");
4483 pline("
\82 \82È
\82½
\82Í
\96\82\97Í
\82Ì
\95Ç
\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81I");
4484 dmg = d(1 + obj->spe, 6); /* normally 2d12 */
4486 case WAN_CANCELLATION:
4488 case WAN_TELEPORTATION:
4489 case WAN_UNDEAD_TURNING:
4490 affects_objects = TRUE;
4496 /* magical explosion and its visual effect occur before specific effects
4498 /* [TODO? This really ought to prevent the explosion from being
4499 fatal so that we never leave a bones file where none of the
4500 surrounding targets (or underlying objects) got affected yet.] */
4501 explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS,
4504 /* prepare for potential feedback from polymorph... */
4507 /* this makes it hit us last, so that we can see the action first */
4508 for (i = 0; i <= 8; i++) {
4509 bhitpos.x = x = obj->ox + xdir[i];
4510 bhitpos.y = y = obj->oy + ydir[i];
4514 if (obj->otyp == WAN_DIGGING) {
4517 if (dig_check(BY_OBJECT, FALSE, x, y)) {
4518 if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) {
4519 /* normally, pits and holes don't anger guards, but they
4520 * do if it's a wall or door that's being dug */
4521 watch_dig((struct monst *) 0, x, y, TRUE);
4522 if (*in_rooms(x, y, SHOPBASE))
4526 * Let liquid flow into the newly created pits.
4527 * Adjust corresponding code in music.c for
4528 * drum of earthquake if you alter this sequence.
4530 typ = fillholetyp(x, y, FALSE);
4532 levl[x][y].typ = typ, levl[x][y].flags = 0;
4533 liquid_flow(x, y, typ, t_at(x, y),
4537 : "Some holes are quickly filled with %s!");
4539 : "
\8c\8a\82Í
\82·
\82®
\82É%s
\82Å
\96\84\82Ü
\82Á
\82½
\81I");
4542 digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3
4543 || (!Can_dig_down(&u.uz)
4544 && !levl[x][y].candig))
4549 } else if (obj->otyp == WAN_CREATE_MONSTER) {
4550 /* u.ux,u.uy creates it near you--x,y might create it in rock */
4551 (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS);
4553 } else if (x != u.ux || y != u.uy) {
4555 * Wand breakage is targetting a square adjacent to the hero,
4556 * which might contain a monster or a pile of objects or both.
4557 * Handle objects last; avoids having undead turning raise an
4558 * undead's corpse and then attack resulting undead monster.
4559 * obj->bypass in bhitm() prevents the polymorphing of items
4560 * dropped due to monster's polymorph and prevents undead
4561 * turning that kills an undead from raising resulting corpse.
4563 if ((mon = m_at(x, y)) != 0) {
4564 (void) bhitm(mon, obj);
4565 /* if (context.botl) bot(); */
4567 if (affects_objects && level.objects[x][y]) {
4568 (void) bhitpile(obj, bhito, x, y, 0);
4570 bot(); /* potion effects */
4574 * Wand breakage is targetting the hero. Using xdir[]+ydir[]
4575 * deltas for location selection causes this case to happen
4576 * after all the surrounding squares have been handled.
4577 * Process objects first, in case damage is fatal and leaves
4578 * bones, or teleportation sends one or more of the objects to
4579 * same destination as hero (lookhere/autopickup); also avoids
4580 * the polymorphing of gear dropped due to hero's transformation.
4581 * (Unlike with monsters being hit by zaps, we can't rely on use
4582 * of obj->bypass in the zap code to accomplish that last case
4583 * since it's also used by retouch_equipment() for polyself.)
4585 if (affects_objects && level.objects[x][y]) {
4586 (void) bhitpile(obj, bhito, x, y, 0);
4588 bot(); /* potion effects */
4590 damage = zapyourself(obj, FALSE);
4593 Sprintf(buf, "killed %sself by breaking a wand", uhim());
4594 losehp(Maybe_Half_Phys(damage), buf, NO_KILLER_PREFIX);
4596 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82Å
\8fñ
\82ð
\89ó
\82µ
\82Ä
\83_
\83\81\81[
\83W
\82ð
\8eó
\82¯");
4597 losehp(Maybe_Half_Phys(damage), buf, KILLED_BY);
4601 bot(); /* blindness */
4605 /* potentially give post zap/break feedback */
4608 /* Note: if player fell thru, this call is a no-op.
4609 Damage is handled in digactualhole in that case */
4612 pay_for_damage("dig into", FALSE);
4614 pay_for_damage("
\8c\8a\82ð
\82 \82¯
\82é", FALSE);
4616 if (obj->otyp == WAN_LIGHT)
4617 litroom(TRUE, obj); /* only needs to be done once */
4619 discard_broken_wand:
4620 obj = current_wand; /* [see dozap() and destroy_item()] */
4629 add_class(cl, class)
4640 static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 };
4642 /* augment tools[] if various items are carried */
4644 setapplyclasses(class_list)
4647 register struct obj *otmp;
4649 boolean knowoil, knowtouchstone, addpotions, addstones, addfood;
4651 knowoil = objects[POT_OIL].oc_name_known;
4652 knowtouchstone = objects[TOUCHSTONE].oc_name_known;
4653 addpotions = addstones = addfood = FALSE;
4654 for (otmp = invent; otmp; otmp = otmp->nobj) {
4657 || (otmp->oclass == POTION_CLASS
4659 || (!knowoil && !objects[otyp].oc_name_known))))
4661 if (otyp == TOUCHSTONE
4662 || (is_graystone(otmp)
4664 || (!knowtouchstone && !objects[otyp].oc_name_known))))
4666 if (otyp == CREAM_PIE || otyp == EUCALYPTUS_LEAF)
4670 class_list[0] = '\0';
4671 if (addpotions || addstones)
4672 add_class(class_list, ALL_CLASSES);
4673 Strcat(class_list, tools);
4675 add_class(class_list, POTION_CLASS);
4677 add_class(class_list, GEM_CLASS);
4679 add_class(class_list, FOOD_CLASS);
4682 /* the 'a' command */
4687 register int res = 1;
4688 char class_list[MAXOCLASSES + 2];
4690 if (check_capacity((char *) 0))
4693 setapplyclasses(class_list); /* tools[] */
4694 obj = getobj(class_list, "use or apply");
4698 if (!retouch_object(&obj, FALSE))
4699 return 1; /* evading your grasp costs a turn; just be
4700 grateful that you don't drop it as well */
4702 if (obj->oclass == WAND_CLASS)
4703 return do_break_wand(obj);
4705 switch (obj->otyp) {
4708 if (obj == ublindf) {
4711 } else if (!ublindf) {
4715 You("are already %s.", ublindf->otyp == TOWEL
4716 ? "covered by a towel"
4717 : ublindf->otyp == BLINDFOLD
4718 ? "wearing a blindfold"
4719 : "wearing lenses");
4721 You("
\82à
\82¤%s
\82Ä
\82¢
\82é
\81D", ublindf->otyp == TOWEL
4722 ? "
\83^
\83I
\83\8b\82ð
\8aª
\82¢"
4723 : ublindf->otyp == BLINDFOLD
4724 ? "
\96Ú
\89B
\82µ
\82ð
\82Â
\82¯"
4725 : "
\83\8c\83\93\83Y
\82ð
\82Â
\82¯");
4730 res = use_cream_pie(obj);
4733 res = use_whip(obj);
4735 case GRAPPLING_HOOK:
4736 res = use_grapple(obj);
4742 case BAG_OF_HOLDING:
4744 res = use_container(&obj, 1, FALSE);
4747 (void) bagotricks(obj, FALSE, (int *) 0);
4755 res = (pick_lock(obj) != 0);
4758 case DWARVISH_MATTOCK:
4759 res = use_pick_axe(obj);
4762 use_tinning_kit(obj);
4765 res = use_leash(obj);
4768 res = use_saddle(obj);
4771 use_magic_whistle(obj);
4776 case EUCALYPTUS_LEAF:
4777 /* MRKR: Every Australian knows that a gum leaf makes an excellent
4778 * whistle, especially if your pet is a tame kangaroo named Skippy.
4781 use_magic_whistle(obj);
4782 /* sometimes the blessing will be worn off */
4786 pline("%s %s.", Yobjnam2(obj, "glow"), hcolor("brown"));
4788 pline("%s
\82Í%s
\8bP
\82¢
\82½
\81D", xname(obj), jconj_adj(hcolor("
\92\83\90F
\82Ì")));
4798 res = use_stethoscope(obj);
4801 res = use_mirror(obj);
4804 case BELL_OF_OPENING:
4807 case CANDELABRUM_OF_INVOCATION:
4808 use_candelabrum(obj);
4820 light_cocktail(&obj);
4822 case EXPENSIVE_CAMERA:
4823 res = use_camera(obj);
4826 res = use_towel(obj);
4829 use_crystal_ball(&obj);
4835 res = use_tin_opener(obj);
4841 use_unicorn_horn(obj);
4852 case DRUM_OF_EARTHQUAKE:
4853 res = do_play_instrument(obj);
4855 case HORN_OF_PLENTY: /* not a musical instrument */
4856 (void) hornoplenty(obj, FALSE);
4869 /* Pole-weapons can strike at a distance */
4871 res = use_pole(obj);
4873 } else if (is_pick(obj) || is_axe(obj)) {
4874 res = use_pick_axe(obj);
4878 pline("Sorry, I don't know how to use that.");
4880 pline("
\82»
\82ê
\82ð
\82Ç
\82¤
\82â
\82Á
\82Ä
\8eg
\82¤
\82ñ
\82¾
\82¢
\81H");
4884 if (res && obj && obj->oartifact)
4890 /* Keep track of unfixable troubles for purposes of messages saying you feel
4894 unfixable_trouble_count(is_horn)
4897 int unfixable_trbl = 0;
4903 if (Wounded_legs && !u.usteed)
4907 /* lycanthropy is undesirable, but it doesn't actually make you feel bad */
4909 if (!is_horn || (Confusion & ~TIMEOUT))
4911 if (!is_horn || (Sick & ~TIMEOUT))
4913 if (!is_horn || (HHallucination & ~TIMEOUT))
4915 if (!is_horn || (Vomiting & ~TIMEOUT))
4917 if (!is_horn || (HStun & ~TIMEOUT))
4919 if (!is_horn || (HDeaf & ~TIMEOUT))
4922 return unfixable_trbl;