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) {
532 const char *what = "thing";
534 const char *what = "
\95¨
\91Ì";
536 switch (M_AP_TYPE(mtmp)) {
538 what = simple_typename(mtmp->mappearance);
540 case M_AP_MONSTER: /* ignore Hallucination here */
541 what = mons[mtmp->mappearance].mname;
544 what = defsyms[mtmp->mappearance].explanation;
549 pline("That %s is really %s.", what, mnm);
551 pline("
\82±
\82Ì%s
\82Í
\8eÀ
\8dÛ
\82É
\82Í%s
\81D", what, mnm);
552 } else if (flags.verbose && !canspotmon(mtmp)) {
554 There("is %s there.", mnm);
556 pline("
\82±
\82±
\82É
\82Í%s
\82ª
\82¢
\82é
\81D", mnm);
560 if (!canspotmon(mtmp))
561 map_invisible(rx, ry);
564 if (unmap_invisible(rx,ry))
566 pline_The("invisible monster must have moved.");
568 pline_The("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82Í
\88Ú
\93®
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
574 You_hear(hollow_str, "door");
576 You_hear(hollow_str, "
\94à");
577 cvt_sdoor_to_door(lev); /* ->typ = DOOR */
582 You_hear(hollow_str, "passage");
584 You_hear(hollow_str, "
\92Ê
\98H");
585 lev->typ = CORR, lev->flags = 0;
586 unblock_point(rx, ry);
591 if (!its_dead(rx, ry, &res))
593 You("hear nothing special."); /* not You_hear() */
595 pline("
\93Á
\82É
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81D");
601 static const char whistle_str[] = "produce a %s whistling sound.";
603 static const char whistle_str[] = "
\93J
\82ð
\90\81\82¢
\82Ä%s
\89¹
\82ð
\82½
\82Ä
\82½
\81D";
609 if (!can_blow(&youmonst)) {
611 You("are incapable of using the whistle.");
613 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
614 } else if (Underwater) {
616 You("blow bubbles through %s.", yname(obj));
618 You("%s
\82ð
\92Ê
\82µ
\82Ä
\96A
\82ð
\8fo
\82µ
\82½
\81D", xname(obj));
622 You_feel("rushing air tickle your %s.",
625 You_feel("
\8bó
\8bC
\82Ì
\97¬
\82ê
\82ª%s
\82ð
\82
\82·
\82®
\82Á
\82½
\81D",
630 You(whistle_str, obj->cursed ? "shrill" : "high");
632 You(whistle_str, obj->cursed ? "
\95s
\8bC
\96¡
\82È" : "
\82©
\82ñ
\8d\82\82¢");
640 use_magic_whistle(obj)
643 register struct monst *mtmp, *nextmon;
645 if (!can_blow(&youmonst)) {
647 You("are incapable of using the whistle.");
649 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
650 } else if (obj->cursed && !rn2(2)) {
652 You("produce a %shigh-pitched humming noise.",
653 Underwater ? "very " : "");
655 You("%s
\8d\82\82¢
\92²
\8eq
\82Ì
\82¤
\82È
\82é
\82æ
\82¤
\82È
\89¹
\82ð
\82½
\82Ä
\82½
\81D",
656 Underwater ? "
\82Æ
\82Ä
\82à" : "");
660 int pet_cnt = 0, omx, omy;
662 /* it's magic! it works underwater too (at a higher pitch) */
665 Hallucination ? "normal" : Underwater ? "strange, high-pitched"
669 Hallucination ? "
\93J
\82Ì
\82æ
\82¤
\82È" : Underwater ? "
\95s
\8ev
\8bc
\82È
\8d\82\82¢
\92²
\8eq
\82Ì"
670 : "
\95s
\8ev
\8bc
\82È");
672 for (mtmp = fmon; mtmp; mtmp = nextmon) {
673 nextmon = mtmp->nmon; /* trap might kill mon */
674 if (DEADMONSTER(mtmp))
676 /* steed is already at your location, so not affected;
677 this avoids trap issues if you're on a trap location */
678 if (mtmp == u.usteed)
681 if (mtmp->mtrapped) {
682 /* no longer in previous trap (affects mintrap) */
684 fill_pit(mtmp->mx, mtmp->my);
686 /* mimic must be revealed before we know whether it
687 actually moves because line-of-sight may change */
690 omx = mtmp->mx, omy = mtmp->my;
692 if (mtmp->mx != omx || mtmp->my != omy) {
693 mtmp->mundetected = 0; /* reveal non-mimic hider */
694 if (canspotmon(mtmp))
696 if (mintrap(mtmp) == 2)
702 makeknown(obj->otyp);
710 return (boolean) (abs(u.ux - x) > n || abs(u.uy - y) > n);
719 for (obj = invent; obj; obj = obj->nobj)
720 if (obj->otyp == LEASH && obj->leashmon != 0)
725 /* otmp is about to be destroyed or stolen */
728 register struct obj *otmp;
730 register struct monst *mtmp;
732 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
733 if (mtmp->m_id == (unsigned) otmp->leashmon)
738 /* mtmp is about to die, or become untame */
740 m_unleash(mtmp, feedback)
741 register struct monst *mtmp;
744 register struct obj *otmp;
749 pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp));
751 pline("%s
\82Í
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82Ä
\93¦
\82ê
\82½
\81I", Monnam(mtmp));
754 Your("leash falls slack.");
756 Your("
\95R
\82ª
\82½
\82é
\82ñ
\82Å
\97\8e\82¿
\82½
\81D");
758 for (otmp = invent; otmp; otmp = otmp->nobj)
759 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
764 /* player is about to die (for bones) */
768 register struct obj *otmp;
769 register struct monst *mtmp;
771 for (otmp = invent; otmp; otmp = otmp->nobj)
772 if (otmp->otyp == LEASH)
774 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
781 * This ought to exclude various other things, such as lights and gas
782 * spore, is_whirly() critters, ethereal creatures, possibly others.
788 return (boolean) (mtmp->mnum != PM_LONG_WORM);
801 /* if the leash isn't in use, assume we're trying to leash
802 the engulfer; if it is use, distinguish between removing
803 it from the engulfer versus from some other creature
804 (note: the two in-use cases can't actually occur; all
805 leashes are released when the hero gets engulfed) */
807 You_cant((!obj->leashmon
808 ? "leash %s from inside."
809 : (obj->leashmon == (int) u.ustuck->m_id)
810 ? "unleash %s from inside."
811 : "unleash anything from inside %s."),
812 noit_mon_nam(u.ustuck));
814 You_cant((!obj->leashmon
815 ? "
\93à
\91¤
\82©
\82ç%s
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"
816 : (obj->leashmon == (int) u.ustuck->m_id)
817 ? "
\93à
\91¤
\82©
\82ç%s
\82ð
\8aO
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"
818 : "%s
\82Ì
\93à
\91¤
\82©
\82ç
\8aO
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"),
819 noit_mon_nam(u.ustuck));
823 if (!obj->leashmon && number_leashed() >= MAXLEASHED) {
825 You("cannot leash any more pets.");
827 You("
\82±
\82ê
\88È
\8fã
\83y
\83b
\83g
\82É
\95R
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
831 if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
834 if (cc.x == u.ux && cc.y == u.uy) {
835 if (u.usteed && u.dz > 0) {
841 pline("Leash yourself? Very funny...");
843 pline("
\8e©
\95ª
\82ð
\94\9b\82é
\81H
\95Ï
\82È
\82Ì
\81D
\81D
\81D");
848 * From here on out, return value is 1 == a move is used.
851 if (!(mtmp = m_at(cc.x, cc.y))) {
853 There("is no creature there.");
855 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
856 (void) unmap_invisible(cc.x, cc.y);
860 spotmon = canspotmon(mtmp);
863 if (!spotmon && !glyph_is_invisible(levl[cc.x][cc.y].glyph)) {
864 /* for the unleash case, we don't verify whether this unseen
865 monster is the creature attached to the current leash */
867 You("fail to %sleash something.", obj->leashmon ? "un" : "");
869 You("%s
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D", obj->leashmon ? "
\8aO
\82·" : "
\8c\8b\82Ñ
\82Â
\82¯
\82é");
870 /* trying again will work provided the monster is tame
871 (and also that it doesn't change location by retry time) */
872 map_invisible(cc.x, cc.y);
873 } else if (!mtmp->mtame) {
875 pline("%s %s leashed!", Monnam(mtmp),
876 (!obj->leashmon) ? "cannot be" : "is not");
878 pline("%s
\82Í
\95R
\82Å%s
\81I", Monnam(mtmp),
879 (!obj->leashmon) ? "
\8c\8b\82×
\82È
\82¢" : "
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢");
881 } else if (!obj->leashmon) {
882 /* applying a leash which isn't currently in use */
883 if (mtmp->mleashed) {
885 pline("This %s is already leashed.",
886 spotmon ? l_monnam(mtmp) : "creature");
888 pline("%s
\82Í
\82·
\82Å
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D",
889 spotmon ? l_monnam(mtmp) : "
\89ö
\95¨");
891 } else if (!leashable(mtmp)) {
893 pline("The leash won't fit onto %s%s.", spotmon ? "your " : "",
896 pline("
\95R
\82Í%s
\82É
\8d\87\82í
\82È
\82¢
\81D",
901 You("slip the leash around %s%s.", spotmon ? "your " : "",
904 You("%s
\82ð
\95R
\82Å
\8c\8b\82Ñ
\82Â
\82¯
\82½
\81D",
908 obj->leashmon = (int) mtmp->m_id;
912 /* applying a leash which is currently in use */
913 if (obj->leashmon != (int) mtmp->m_id) {
915 pline("This leash is not attached to that creature.");
917 pline("
\82±
\82Ì
\95R
\82Í
\82»
\82ê
\82É
\82Í
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢
\81D");
918 } else if (obj->cursed) {
920 pline_The("leash would not come off!");
922 pline("
\95R
\82ª
\82Í
\82¸
\82ê
\82È
\82¢
\81I");
928 You("remove the leash from %s%s.",
929 spotmon ? "your " : "", l_monnam(mtmp));
931 You("%s
\82©
\82ç
\95R
\82ð
\82Í
\82¸
\82µ
\82½
\81D",
939 /* assuming mtmp->mleashed has been checked */
948 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
952 return (struct obj *) 0;
958 register struct monst *mtmp;
959 register struct obj *otmp;
961 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
962 if (DEADMONSTER(mtmp))
964 if (mtmp->mleashed) {
965 if (distu(mtmp->mx, mtmp->my) > 2)
967 if (distu(mtmp->mx, mtmp->my) > 2) {
968 for (otmp = invent; otmp; otmp = otmp->nobj)
969 if (otmp->otyp == LEASH
970 && otmp->leashmon == (int) mtmp->m_id) {
974 You_feel("%s leash go slack.",
975 (number_leashed() > 1) ? "a" : "the");
977 You("
\95R
\82ª
\82½
\82é
\82ñ
\82¾
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
985 /* no pack mules for the Amulet */
986 if (u.usteed && mon_has_amulet(u.usteed))
995 register struct obj *otmp;
996 register struct monst *mtmp;
998 for (otmp = invent; otmp; otmp = otmp->nobj) {
999 if (otmp->otyp != LEASH || otmp->leashmon == 0)
1001 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1002 if (DEADMONSTER(mtmp))
1004 if ((int) mtmp->m_id == otmp->leashmon)
1008 impossible("leash in use isn't attached to anything?");
1012 if (dist2(u.ux, u.uy, mtmp->mx, mtmp->my)
1013 > dist2(x, y, mtmp->mx, mtmp->my)) {
1014 if (!um_dist(mtmp->mx, mtmp->my, 3)) {
1015 ; /* still close enough */
1016 } else if (otmp->cursed && !breathless(mtmp->data)) {
1017 if (um_dist(mtmp->mx, mtmp->my, 5)
1018 || (mtmp->mhp -= rnd(2)) <= 0) {
1019 long save_pacifism = u.uconduct.killer;
1022 Your("leash chokes %s to death!", mon_nam(mtmp));
1024 pline("%s
\82Í
\8di
\82ß
\8eE
\82³
\82ê
\82½
\81I",mon_nam(mtmp));
1025 /* hero might not have intended to kill pet, but
1026 that's the result of his actions; gain experience,
1027 lose pacifism, take alignment and luck hit, make
1028 corpse less likely to remain tame after revival */
1029 xkilled(mtmp, XKILL_NOMSG);
1030 /* life-saving doesn't ordinarily reset this */
1031 if (!DEADMONSTER(mtmp))
1032 u.uconduct.killer = save_pacifism;
1035 pline("%s is choked by the leash!", Monnam(mtmp));
1037 pline("%s
\82Í
\95R
\82Å
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82½
\81I", Monnam(mtmp));
1038 /* tameness eventually drops to 1 here (never 0) */
1039 if (mtmp->mtame && rn2(mtmp->mtame))
1043 if (um_dist(mtmp->mx, mtmp->my, 5)) {
1045 pline("%s leash snaps loose!", s_suffix(Monnam(mtmp)));
1047 pline("%s
\82Ì
\95R
\82Í
\83p
\83`
\83\93\82Æ
\8aO
\82ê
\82½
\81I", Monnam(mtmp));
1048 m_unleash(mtmp, FALSE);
1051 You("pull on the leash.");
1053 You("
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\81D");
1054 if (mtmp->data->msound != MS_SILENT)
1075 return ((ACURR(A_CHA) > 14)
1076 ? ((poly_gender() == 1)
1082 /*JP
\8cê
\8a²
\82Å
\8eg
\82¤ */
1090 static const char look_str[] = "look %s.";
1092 static const char look_str[] = "%s
\8c©
\82¦
\82é
\81D";
1098 const char *mirror, *uvisage;
1102 boolean vis, invis_mirror, useeit, monable;
1104 if (!getdir((char *) 0))
1106 invis_mirror = Invis;
1107 useeit = !Blind && (!invis_mirror || See_invisible);
1108 uvisage = beautiful();
1109 mirror = simpleonames(obj); /* "mirror" or "looking glass" */
1110 if (obj->cursed && !rn2(2)) {
1113 pline_The("%s fogs up and doesn't reflect!", mirror);
1115 pline("%s
\82Í
\93Ü
\82è
\81C
\89f
\82ç
\82È
\82
\82È
\82Á
\82½
\81I", mirror);
1118 if (!u.dx && !u.dy && !u.dz) {
1121 You_cant("see your %s %s.", uvisage, body_part(FACE));
1123 You_cant("
\8e©
\95ª
\82Ì%s
\82¢%s
\82ð
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", uvisage, body_part(FACE));
1125 if (u.umonnum == PM_FLOATING_EYE) {
1128 You("stiffen momentarily under your gaze.");
1130 pline("
\88ê
\8fu
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82½
\81D");
1134 pline("Yow! The %s stares back!", mirror);
1136 pline("
\82¨
\82ì
\81I%s
\82ª
\82 \82È
\82½
\82ð
\82É
\82ç
\82Ý
\95Ô
\82µ
\82½
\81I", mirror);
1139 pline("Yikes! You've frozen yourself!");
1141 pline("
\82¨
\82ì
\81I
\82 \82È
\82½
\82Í
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I");
1142 if (!Hallucination || !rn2(4)) {
1143 nomul(-rnd(MAXULEV + 6 - u.ulevel));
1145 multi_reason = "gazing into a mirror";
1147 multi_reason = "
\8b¾
\82É
\94½
\8eË
\82µ
\82½
\8e\8b\90ü
\82Å
\8dd
\92¼
\82µ
\82Ä
\82¢
\82é
\8aÔ
\82É";
1149 nomovemsg = 0; /* default, "you can move again" */
1151 } else if (youmonst.data->mlet == S_VAMPIRE)
1153 You("don't have a reflection.");
1155 You("
\8b¾
\82É
\89f
\82ç
\82È
\82©
\82Á
\82½
\81D");
1156 else if (u.umonnum == PM_UMBER_HULK) {
1158 pline("Huh? That doesn't look like you!");
1160 pline("
\82Ù
\82¦
\81H
\8eÊ
\82Á
\82Ä
\82é
\82Ì
\82Í
\82 \82È
\82½
\82¶
\82á
\82È
\82¢
\82Ý
\82½
\82¢
\82¾
\81I");
1161 make_confused(HConfusion + d(3, 4), FALSE);
1162 } else if (Hallucination)
1163 You(look_str, hcolor((char *) 0));
1166 You(look_str, "peaked");
1168 You(look_str, "
\8aç
\90F
\82ª
\88«
\82");
1169 else if (u.uhs >= WEAK)
1171 You(look_str, "undernourished");
1173 You(look_str, "
\89h
\97{
\8e¸
\92²
\82Ì
\82æ
\82¤
\82É");
1176 You("look as %s as ever.", uvisage);
1178 You("
\82 \82¢
\82©
\82í
\82ç
\82¸%s
\82
\8c©
\82¦
\82é
\81D", uvisage);
1185 You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)),
1186 mbodypart(u.ustuck, STOMACH));
1188 You("%s
\82Ì%s
\82ð
\89f
\82µ
\82½
\81D", mon_nam(u.ustuck),
1189 mbodypart(u.ustuck, STOMACH));
1196 You(Hallucination ? "give the fish a chance to fix their makeup."
1197 : "reflect the murky water.");
1199 You(Hallucination ? "
\8b\9b\82É
\89»
\8fÏ
\92¼
\82µ
\82Ì
\8b@
\89ï
\82ð
\97^
\82¦
\82½
\81D"
1200 : "
\82 \82È
\82½
\82Í
\97\84\82ñ
\82¾
\90\85\82ð
\89f
\82µ
\82½
\81D");
1207 You("reflect the %s.",
1209 You("%s
\82ð
\89f
\82µ
\82½
\81D",
1210 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
1213 mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM,
1214 (int FDECL((*), (MONST_P, OBJ_P))) 0,
1215 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1216 if (!mtmp || !haseyes(mtmp->data) || notonhead)
1219 /* couldsee(mtmp->mx, mtmp->my) is implied by the fact that bhit()
1220 targetted it, so we can ignore possibility of X-ray vision */
1221 vis = canseemon(mtmp);
1222 /* ways to directly see monster (excludes X-ray vision, telepathy,
1223 extended detection, type-specific warning) */
1224 #define SEENMON (MONSEEN_NORMAL | MONSEEN_SEEINVIS | MONSEEN_INFRAVIS)
1225 how_seen = vis ? howmonseen(mtmp) : 0;
1226 /* whether monster is able to use its vision-based capabilities */
1227 monable = !mtmp->mcan && (!mtmp->minvis || perceives(mtmp->data));
1228 mlet = mtmp->data->mlet;
1229 if (mtmp->msleeping) {
1232 pline("%s is too tired to look at your %s.", Monnam(mtmp),
1234 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),
1236 } else if (!mtmp->mcansee) {
1239 pline("%s can't see anything right now.", Monnam(mtmp));
1241 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\89½
\82à
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", Monnam(mtmp));
1242 } else if (invis_mirror && !perceives(mtmp->data)) {
1245 pline("%s fails to notice your %s.", Monnam(mtmp), mirror);
1247 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8bC
\95t
\82©
\82È
\82©
\82Á
\82½
\81D", Monnam(mtmp), mirror);
1248 /* infravision doesn't produce an image in the mirror */
1249 } else if ((how_seen & SEENMON) == MONSEEN_INFRAVIS) {
1250 if (vis) /* (redundant) */
1252 pline("%s is too far away to see %sself in the dark.",
1253 Monnam(mtmp), mhim(mtmp));
1255 pline("%s
\82Í
\88Ã
\88Å
\82Å
\8e©
\95ª
\8e©
\90g
\82ð
\8c©
\82é
\82É
\82Í
\89\93\82·
\82¬
\82é
\81D", Monnam(mtmp));
1257 /* some monsters do special things */
1258 } else if (mlet == S_VAMPIRE || mlet == S_GHOST || is_vampshifter(mtmp)) {
1261 pline("%s doesn't have a reflection.", Monnam(mtmp));
1263 pline("%s
\82Í%s
\82É
\89f
\82ç
\82È
\82¢
\81D", Monnam(mtmp), mirror);
1264 } else if (monable && mtmp->data == &mons[PM_MEDUSA]) {
1266 if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!"))
1268 if (mon_reflects(mtmp, "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81I"))
1272 pline("%s is turned to stone!", Monnam(mtmp));
1274 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1277 } else if (monable && mtmp->data == &mons[PM_FLOATING_EYE]) {
1278 int tmp = d((int) mtmp->m_lev, (int) mtmp->data->mattk[0].damd);
1283 pline("%s is frozen by its reflection.", Monnam(mtmp));
1285 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
1288 You_hear("%s stop moving.", something);
1290 You_hear("
\89½
\82©
\82ª
\93®
\82«
\82ð
\82Æ
\82ß
\82½
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1291 paralyze_monst(mtmp, (int) mtmp->mfrozen + tmp);
1292 } else if (monable && mtmp->data == &mons[PM_UMBER_HULK]) {
1295 pline("%s confuses itself!", Monnam(mtmp));
1297 pline("%s
\82Í
\8d¬
\97\90\82µ
\82½
\81I", Monnam(mtmp));
1299 } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
1300 || mtmp->data == &mons[PM_INCUBUS])) {
1302 char buf[BUFSZ]; /* "She" or "He" */
1305 pline("%s admires %sself in your %s.", Monnam(mtmp), mhim(mtmp),
1308 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\82¤
\82Á
\82Æ
\82è
\82µ
\82½
\81D", Monnam(mtmp));
1311 pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
1313 pline("%s
\82Í
\82»
\82ê
\82ð
\92D
\82Á
\82½
\81I", upstart(strcpy(buf, mhe(mtmp))));
1316 pline("It steals your %s!", mirror);
1318 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\93\90\82ñ
\82¾
\81I", mirror);
1319 setnotworn(obj); /* in case mirror was wielded */
1321 (void) mpickobj(mtmp, obj);
1322 if (!tele_restrict(mtmp))
1323 (void) rloc(mtmp, TRUE);
1324 } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
1325 && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
1326 boolean do_react = TRUE;
1328 if (mtmp->mfrozen) {
1331 You("discern no obvious reaction from %s.", mon_nam(mtmp));
1333 You("%s
\82©
\82ç
\82Ì
\96¾
\82ç
\82©
\82È
\94½
\89\9e\82Í
\8e¯
\95Ê
\82Å
\82«
\82È
\82©
\82Á
\82½
\81D", mon_nam(mtmp));
1336 You_feel("a bit silly gesturing the mirror in that direction.");
1338 You_feel("
\8b¾
\82ð
\82»
\82Ì
\95û
\8cü
\82É
\8cü
\82¯
\82é
\82Ì
\82Í
\82¿
\82å
\82Á
\82Æ
\82¨
\82©
\82µ
\82È
\8ds
\93®
\82¾
\82Æ
\8a´
\82¶
\82½
\81D");
1344 pline("%s is frightened by its reflection.", Monnam(mtmp));
1346 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\95|
\82ª
\82Á
\82½
\81D", Monnam(mtmp));
1347 monflee(mtmp, d(2, 4), FALSE, FALSE);
1349 } else if (!Blind) {
1350 if (mtmp->minvis && !See_invisible)
1352 else if ((mtmp->minvis && !perceives(mtmp->data))
1353 /* redundant: can't get here if these are true */
1354 || !haseyes(mtmp->data) || notonhead || !mtmp->mcansee)
1356 pline("%s doesn't seem to notice %s reflection.", Monnam(mtmp),
1359 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1363 pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp));
1365 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\96³
\8e\8b\82µ
\82½
\81D", Monnam(mtmp));
1374 register struct obj *obj = *optr;
1376 boolean wakem = FALSE, learno = FALSE,
1377 ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe),
1379 (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy)
1380 && !On_stairs(u.ux, u.uy));
1383 You("ring %s.", the(xname(obj)));
1385 You("%s
\82ð
\96Â
\82ç
\82µ
\82½
\81D", the(xname(obj)));
1387 if (Underwater || (u.uswallow && ordinary)) {
1389 amii_speaker(obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME);
1392 pline("But the sound is muffled.");
1394 pline("
\82µ
\82©
\82µ
\89¹
\82Í
\82©
\82«
\8fÁ
\82³
\82ê
\82½
\81D");
1396 } else if (invoking && ordinary) {
1397 /* needs to be recharged... */
1399 pline("But it makes no sound.");
1401 pline("
\82µ
\82©
\82µ
\81C
\89¹
\82Í
\96Â
\82ç
\82È
\82©
\82Á
\82½
\81D");
1402 learno = TRUE; /* help player figure out why */
1404 } else if (ordinary) {
1406 amii_speaker(obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME);
1408 if (obj->cursed && !rn2(4)
1409 /* note: once any of them are gone, we stop all of them */
1410 && !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE)
1411 && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE)
1412 && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE)
1413 && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT))
1416 You("summon %s!", a_monnam(mtmp));
1418 You("%s
\82ð
\8f¢
\8a«
\82µ
\82½
\81I", a_monnam(mtmp));
1419 if (!obj_resists(obj, 93, 100)) {
1421 pline("%s shattered!", Tobjnam(obj, "have"));
1423 pline("%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81I", xname(obj));
1431 mon_adjust_speed(mtmp, 2, (struct obj *) 0);
1433 case 2: /* no explanation; it just happens... */
1435 multi_reason = NULL;
1443 /* charged Bell of Opening */
1444 consume_obj_charge(obj, TRUE);
1450 pline1(nothing_happens);
1452 } else if (obj->cursed) {
1457 mkundead(&mm, FALSE, NO_MINVENT);
1460 } else if (invoking) {
1462 pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue"));
1464 pline("%s
\82Í
\95s
\8bC
\96¡
\82È
\89s
\82¢
\89¹
\82ð
\8fo
\82µ
\82½
\81D
\81D
\81D", xname(obj));
1466 amii_speaker(obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME);
1472 } else if (obj->blessed) {
1476 amii_speaker(obj, "ahahahDhEhCw", AMII_SOFT_VOLUME);
1481 } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1482 buried_ball_to_freedom();
1488 pline1(nothing_happens);
1492 pline("%s opens...", Something);
1494 pline("
\89½
\82©
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1499 pline("Things open around you...");
1501 pline("
\82Ü
\82í
\82è
\82Ì
\95¨
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1506 } else { /* uncursed */
1508 amii_speaker(obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME);
1513 pline1(nothing_happens);
1516 } /* charged BofO */
1519 makeknown(BELL_OF_OPENING);
1527 use_candelabrum(obj)
1528 register struct obj *obj;
1530 #if 0 /*JP*//* not used */
1531 const char *s = (obj->spe != 1) ? "candles" : "candle";
1536 You("snuff the %s.", s);
1538 You("
\82ë
\82¤
\82»
\82
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1539 end_burn(obj, TRUE);
1542 if (obj->spe <= 0) {
1544 pline("This %s has no %s.", xname(obj), s);
1546 pline("
\82±
\82Ì%s
\82É
\82Í
\82ë
\82¤
\82»
\82
\82ª
\82È
\82¢
\81D", xname(obj));
1551 You("cannot make fire under water.");
1553 You("
\90\85\92\86\82Å
\89Î
\82ð
\82¨
\82±
\82¹
\82È
\82¢
\81D");
1556 if (u.uswallow || obj->cursed) {
1559 pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"),
1562 pline("
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\82µ
\82Î
\82ç
\82
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D");
1568 There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s,
1571 pline("%s
\82É
\82Í
\82½
\82Á
\82½%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82µ
\82©
\82È
\82¢
\81D",
1572 xname(obj), obj->spe);
1576 pline("%s lit. %s dimly.", obj->spe == 1 ? "It is" : "They are",
1577 Tobjnam(obj, "shine"));
1579 pline("%s
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s
\82Í
\82Ù
\82Ì
\82©
\82É
\8bP
\82¢
\82½
\81D",
1580 xname(obj), xname(obj));
1584 pline("%s's %s burn%s", The(xname(obj)), s,
1585 (Blind ? "." : " brightly!"));
1587 pline("%s
\82Ì
\82ë
\82¤
\82»
\82
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I", The(xname(obj)),
1588 (Blind ? "" : "
\96¾
\82é
\82"));
1591 if (!invocation_pos(u.ux, u.uy) || On_stairs(u.ux, u.uy)) {
1593 pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
1595 pline("
\82ë
\82¤
\82»
\82
\82Í
\82·
\82²
\82¢
\91¬
\82³
\82Å
\94R
\82¦
\8en
\82ß
\82½
\81I");
1596 /* this used to be obj->age /= 2, rounding down; an age of
1597 1 would yield 0, confusing begin_burn() and producing an
1598 unlightable, unrefillable candelabrum; round up instead */
1599 obj->age = (obj->age + 1L) / 2L;
1601 if (obj->spe == 7) {
1604 pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
1606 pline("
\8aï
\96
\82È
\92g
\82©
\82³
\82ð%s
\82É
\8a´
\82¶
\82½
\81I", xname(obj));
1609 pline("%s with a strange light!", Tobjnam(obj, "glow"));
1611 pline("%s
\82Í
\8aï
\96
\82È
\8cõ
\82ð
\94
\82µ
\82Ä
\82¢
\82é
\81I", xname(obj));
1615 begin_burn(obj, FALSE);
1622 register struct obj *obj = *optr;
1623 register struct obj *otmp;
1625 const char *s = (obj->quan != 1) ? "candles" : "candle";
1627 const char *s = "
\82ë
\82¤
\82»
\82";
1628 char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
1635 otmp = carrying(CANDELABRUM_OF_INVOCATION);
1636 if (!otmp || otmp->spe == 7) {
1641 /*JP:
\8dÅ
\8fI
\93I
\82É
\82Í
\81u
\82ë
\82¤
\82»
\82
\82ð
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1642 /* first, minimal candelabrum suffix for formatting candles */
1644 Sprintf(qsfx, " to\033%s?", thesimpleoname(otmp));
1646 Sprintf(qsfx, "
\82ð\033%s
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", thesimpleoname(otmp));
1647 /* next, format the candles as a prefix for the candelabrum */
1649 (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1651 (void) safe_qbuf(qbuf, "", qsfx, obj, xname, thesimpleoname, s);
1652 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð\033
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1653 /* strip temporary candelabrum suffix */
1655 if ((q = strstri(qbuf, " to\033")) != 0)
1658 if ((q = strchr(qbuf, '\033')) != 0)
1660 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð
\81v*/
1662 /* last, format final "attach candles to candelabrum?" query */
1664 if (yn(safe_qbuf(qbuf, qbuf, "?", otmp, yname, thesimpleoname, "it"))
1666 if (yn(safe_qbuf(qbuf, qbuf, "
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", otmp, xname, thesimpleoname, "
\82»
\82ê"))
1671 if ((long) otmp->spe + obj->quan > 7L) {
1672 obj = splitobj(obj, 7L - (long) otmp->spe);
1673 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
1674 /* avoid a grammatical error if obj->quan gets
1675 reduced to 1 candle from more than one */
1676 s = (obj->quan != 1) ? "candles" : "candle";
1681 You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
1684 You("%ld
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ð%s%s
\82Ö
\8eæ
\82è
\82Â
\82¯
\82½
\81D",
1685 obj->quan, !otmp->spe ? "" : "
\82³
\82ç
\82É",
1688 if (!otmp->spe || otmp->age > obj->age)
1689 otmp->age = obj->age;
1690 otmp->spe += (int) obj->quan;
1691 if (otmp->lamplit && !obj->lamplit)
1693 pline_The("new %s magically %s!", s, vtense(s, "ignite"));
1695 pline("
\90V
\82µ
\82¢
\82ë
\82¤
\82»
\82
\82Í
\95s
\8ev
\8bc
\82È
\89\8a\82ð
\82 \82°
\82½
\81I");
1696 else if (!otmp->lamplit && obj->lamplit)
1698 pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
1700 pline("
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D");
1703 verbalize("You %s %s, you bought %s!",
1704 otmp->lamplit ? "burn" : "use",
1705 (obj->quan > 1L) ? "them" : "it",
1706 (obj->quan > 1L) ? "them" : "it");
1708 verbalize("
\89Î
\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1710 if (obj->quan < 7L && otmp->spe == 7)
1712 pline("%s now has seven%s candles attached.", The(xname(otmp)),
1713 otmp->lamplit ? " lit" : "");
1715 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",
1716 The(xname(otmp)), otmp->lamplit ? "
\89Î
\82Ì
\82Â
\82¢
\82½" : "");
1718 /* candelabrum's light range might increase */
1720 obj_merge_light_sources(otmp, otmp);
1721 /* candles are no longer a separate light source */
1723 end_burn(obj, TRUE);
1724 /* candles are now gone */
1726 /* candelabrum's weight is changing */
1727 otmp->owt = weight(otmp);
1732 /* call in drop, throw, and put in box, etc. */
1737 boolean candle = Is_candle(otmp);
1739 if ((candle || otmp->otyp == CANDELABRUM_OF_INVOCATION)
1743 #if 0 /*JP*//* not used */
1744 boolean many = candle ? (otmp->quan > 1L) : (otmp->spe > 1);
1747 (void) get_obj_location(otmp, &x, &y, 0);
1748 if (otmp->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1750 pline("%s%scandle%s flame%s extinguished.", Shk_Your(buf, otmp),
1751 (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"),
1752 (many ? "s are" : " is"));
1754 pline("%s%s
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, otmp),
1755 candle ? "" : "
\90C
\91ä
\82Ì");
1757 end_burn(otmp, TRUE);
1763 /* called when lit lamp is hit by water or put into a container or
1764 you've been swallowed by a monster; obj might be in transit while
1765 being thrown or dropped so don't assume that its location is valid */
1773 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1774 || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
1775 (void) get_obj_location(obj, &x, &y, 0);
1776 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1778 pline("%s %s out!", Yname2(obj), otense(obj, "go"));
1780 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", Yname2(obj));
1781 end_burn(obj, TRUE);
1784 if (snuff_candle(obj))
1790 /* Called when potentially lightable object is affected by fire_damage().
1791 Return TRUE if object was lit and FALSE otherwise --ALI */
1798 if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) {
1799 if ((obj->otyp == MAGIC_LAMP
1800 || obj->otyp == CANDELABRUM_OF_INVOCATION) && obj->spe == 0)
1802 else if (obj->otyp != MAGIC_LAMP && obj->age == 0)
1804 if (!get_obj_location(obj, &x, &y, 0))
1806 if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed)
1808 if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1809 || obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2))
1811 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1813 pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
1815 pline("%s
\82Ì
\96¾
\82©
\82è
\82ª
\82Â
\82¢
\82½
\81I", Yname2(obj));
1816 if (obj->otyp == POT_OIL)
1817 makeknown(obj->otyp);
1818 if (carried(obj) && obj->unpaid && costly_spot(u.ux, u.uy)) {
1819 /* if it catches while you have it, then it's your tough luck */
1822 verbalize("That's in addition to the cost of %s %s, of course.",
1823 yname(obj), obj->quan == 1L ? "itself" : "themselves");
1825 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ%s
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D", xname(obj));
1827 bill_dummy_object(obj);
1829 begin_burn(obj, FALSE);
1842 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1843 || obj->otyp == BRASS_LANTERN)
1845 pline("%slamp is now off.", Shk_Your(buf, obj));
1847 pline("%s
\83\89\83\93\83v
\82Ì
\93\94\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, obj));
1850 You("snuff out %s.", yname(obj));
1852 You("%s
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D", xname(obj));
1853 end_burn(obj, TRUE);
1858 pline(!Is_candle(obj) ? "This is not a diving lamp"
1859 : "Sorry, fire and water don't mix.");
1861 pline(!Is_candle(obj) ? "
\82±
\82ê
\82Í
\90ö
\90\85\97p
\82Ì
\83\89\83\93\83v
\82¶
\82á
\82È
\82¢
\81D"
1862 : "
\8ec
\94O
\82È
\82ª
\82ç
\81C
\89Î
\82Æ
\90\85\82Í
\82Ü
\82´
\82ç
\82È
\82¢
\81D");
1866 /* magic lamps with an spe == 0 (wished for) cannot be lit */
1867 if ((!Is_candle(obj) && obj->age == 0)
1868 || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
1869 if (obj->otyp == BRASS_LANTERN)
1871 Your("lamp has run out of power.");
1873 Your("
\83\89\83\93\83v
\82Ì
\93d
\97Í
\82ð
\8eg
\82¢
\90Ø
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1876 pline("This %s has no oil.", xname(obj));
1878 pline("
\82±
\82Ì%s
\82É
\82Í
\82à
\82¤
\83I
\83C
\83\8b\82ª
\82È
\82¢
\81D", xname(obj));
1881 if (obj->cursed && !rn2(2)) {
1884 pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"),
1885 otense(obj, "die"));
1887 pline("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D",
1891 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1892 || obj->otyp == BRASS_LANTERN) {
1895 pline("%slamp is now on.", Shk_Your(buf, obj));
1897 pline("%s
\83\89\83\93\83v
\82É
\93\94\82ª
\93\94\82Á
\82½
\81D", Shk_Your(buf, obj));
1898 } else { /* candle(s) */
1900 pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan),
1901 otense(obj, "burn"), Blind ? "." : " brightly!");
1903 pline("%s
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I",
1904 xname(obj), Blind ? "" : "
\96¾
\82é
\82");
1906 if (obj->unpaid && costly_spot(u.ux, u.uy)
1907 && obj->age == 20L * (long) objects[obj->otyp].oc_cost) {
1909 const char *ithem = (obj->quan > 1L) ? "them" : "it";
1911 verbalize("You burn %s, you bought %s!", ithem, ithem);
1913 verbalize("
\93\94\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1915 bill_dummy_object(obj);
1918 begin_burn(obj, FALSE);
1923 light_cocktail(optr)
1926 struct obj *obj = *optr; /* obj is a potion of oil */
1937 You("snuff the lit potion.");
1939 You("
\96û
\95r
\82Ì
\89Î
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1940 end_burn(obj, TRUE);
1942 * Free & add to re-merge potion. This will average the
1943 * age of the potions. Not exactly the best solution,
1947 *optr = addinv(obj);
1949 } else if (Underwater) {
1951 There("is not enough oxygen to sustain a fire.");
1953 pline("
\89Î
\82ð
\82Â
\82¯
\82é
\82Ì
\82É
\8f\
\95ª
\82È
\8e_
\91f
\82ª
\82È
\82¢
\81D");
1957 split1off = (obj->quan > 1L);
1959 obj = splitobj(obj, 1L);
1962 You("light %spotion.%s", shk_your(buf, obj),
1963 Blind ? "" : " It gives off a dim light.");
1965 You("%s
\96û
\95r
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s", shk_your(buf, obj),
1966 Blind ? "" : "
\96û
\95r
\82Í
\88Ã
\82¢
\8cõ
\82ð
\82Í
\82È
\82Á
\82½
\81D");
1969 if (obj->unpaid && costly_spot(u.ux, u.uy)) {
1970 /* Normally, we shouldn't both partially and fully charge
1971 * for an item, but (Yendorian Fuel) Taxes are inevitable...
1975 verbalize("That's in addition to the cost of the potion, of course.");
1977 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ
\96û
\95r
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D");
1978 bill_dummy_object(obj);
1980 makeknown(obj->otyp);
1982 begin_burn(obj, FALSE); /* after shop billing */
1984 obj_extract_self(obj); /* free from inv */
1987 obj = hold_another_object(obj, "You drop %s!", doname(obj),
1989 obj = hold_another_object(obj, "
\82 \82È
\82½
\82Í%s
\82ð
\97\8e\82µ
\82½
\81I", doname(obj),
1997 static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 };
2002 struct obj *obj = getobj(cuddly, "rub");
2004 if (obj && obj->oclass == GEM_CLASS) {
2005 if (is_graystone(obj)) {
2010 pline("Sorry, I don't know how to use that.");
2012 pline("
\8ec
\94O
\81D
\8eg
\82¢
\95û
\82ª
\82í
\82©
\82ç
\82È
\82¢
\81D");
2017 if (!obj || !wield_tool(obj, "rub"))
2020 /* now uwep is obj */
2021 if (uwep->otyp == MAGIC_LAMP) {
2022 if (uwep->spe > 0 && !rn2(3)) {
2023 check_unpaid_usage(uwep, TRUE); /* unusual item use */
2024 /* bones preparation: perform the lamp transformation
2025 before releasing the djinni in case the latter turns out
2026 to be fatal (a hostile djinni has no chance to attack yet,
2027 but an indebted one who grants a wish might bestow an
2028 artifact which blasts the hero with lethal results) */
2029 uwep->otyp = OIL_LAMP;
2030 uwep->spe = 0; /* for safety */
2031 uwep->age = rn1(500, 1000);
2033 begin_burn(uwep, TRUE);
2034 djinni_from_bottle(uwep);
2035 makeknown(MAGIC_LAMP);
2037 } else if (rn2(2)) {
2039 You("%s smoke.", !Blind ? "see a puff of" : "smell");
2041 pline("
\82¯
\82Þ
\82è%s
\81D", !Blind ? "
\82ª
\95\91\82¢
\82 \82ª
\82Á
\82½" : "
\82Ì
\93õ
\82¢
\82ª
\82µ
\82½");
2043 pline1(nothing_happens);
2044 } else if (obj->otyp == BRASS_LANTERN) {
2045 /* message from Adventure */
2047 pline("Rubbing the electric lamp is not particularly rewarding.");
2049 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");
2051 pline("Anyway, nothing exciting happens.");
2053 pline("
\82â
\82Á
\82Ï
\82è
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
2055 pline1(nothing_happens);
2066 enum jump_trajectory {
2067 jAny = 0, /* any direction => magical jump */
2070 jDiag = 3 /* jHorz|jVert */
2073 /* callback routine for walk_path() */
2075 check_jump(arg, x, y)
2079 int traj = *(int *) arg;
2080 struct rm *lev = &levl[x][y];
2084 if (IS_STWALL(lev->typ))
2086 if (IS_DOOR(lev->typ)) {
2087 if (closed_door(x, y))
2089 if ((lev->doormask & D_ISOPEN) != 0 && traj != jAny
2090 /* reject diagonal jump into or out-of or through open door */
2092 /* reject horizontal jump through horizontal open door
2093 and non-horizontal (ie, vertical) jump through
2094 non-horizontal (vertical) open door */
2095 || ((traj & jHorz) != 0) == (lev->horizontal != 0)))
2097 /* empty doorways aren't restricted */
2099 /* let giants jump over boulders (what about Flying?
2100 and is there really enough head room for giants to jump
2101 at all, let alone over something tall?) */
2102 if (sobj_at(BOULDER, x, y) && !throws_rocks(youmonst.data))
2108 is_valid_jump_pos(x, y, magic, showmsg)
2112 if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(x, y) != 5) {
2113 /* The Knight jumping restriction still applies when riding a
2114 * horse. After all, what shape is the knight piece in chess?
2118 pline("Illegal move!");
2120 pline("
\82»
\82Ì
\88Ú
\93®
\82Í
\8cj
\94n
\92µ
\82Ñ
\82¶
\82á
\82È
\82¢
\81I");
2122 } else if (distu(x, y) > (magic ? 6 + magic * 3 : 9)) {
2127 pline("
\89\93\82·
\82¬
\82é
\81I");
2129 } else if (!isok(x, y)) {
2132 You("cannot jump there!");
2134 You("
\82»
\82±
\82É
\82Í
\94ò
\82×
\82È
\82¢
\81I");
2136 } else if (!cansee(x, y)) {
2139 You("cannot see where to land!");
2141 You("
\92\85\92n
\93_
\82ª
\8c©
\82¦
\82È
\82¢
\81I");
2145 struct rm *lev = &levl[u.ux][u.uy];
2146 /* we want to categorize trajectory for use in determining
2147 passage through doorways: horizonal, vertical, or diagonal;
2148 since knight's jump and other irregular directions are
2149 possible, we flatten those out to simplify door checks */
2151 dx = x - u.ux, dy = y - u.uy,
2152 ax = abs(dx), ay = abs(dy);
2154 /* diag: any non-orthogonal destination classifed as diagonal */
2155 diag = (magic || Passes_walls || (!dx && !dy)) ? jAny
2156 : !dy ? jHorz : !dx ? jVert : jDiag;
2157 /* traj: flatten out the trajectory => some diagonals re-classified */
2160 else if (ay >= 2 * ax)
2162 traj = (magic || Passes_walls || (!ax && !ay)) ? jAny
2163 : !ay ? jHorz : !ax ? jVert : jDiag;
2164 /* walk_path doesn't process the starting spot;
2165 this is iffy: if you're starting on a closed door spot,
2166 you _can_ jump diagonally from doorway (without needing
2167 Passes_walls); that's intentional but is it correct? */
2168 if (diag == jDiag && IS_DOOR(lev->typ)
2169 && (lev->doormask & D_ISOPEN) != 0
2171 || ((traj & jHorz) != 0) == (lev->horizontal != 0))) {
2174 You_cant("jump diagonally out of a doorway.");
2176 You_cant("
\8fo
\93ü
\82è
\8cû
\82©
\82ç
\8eÎ
\82ß
\82É
\94ò
\82Ñ
\8fo
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2179 uc.x = u.ux, uc.y = u.uy;
2180 tc.x = x, tc.y = y; /* target */
2181 if (!walk_path(&uc, &tc, check_jump, (genericptr_t) &traj)) {
2184 There("is an obstacle preventing that jump.");
2186 pline("
\94ò
\82Ô
\82Ì
\82ð
\8e×
\96\82\82·
\82é
\89½
\82©
\82ª
\82 \82é
\81D");
2193 static int jumping_is_magic;
2196 get_valid_jump_position(x,y)
2200 && (ACCESSIBLE(levl[x][y].typ) || Passes_walls)
2201 && is_valid_jump_pos(x, y, jumping_is_magic, FALSE));
2205 display_jump_positions(state)
2209 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
2210 } else if (state == 1) {
2213 for (dx = -4; dx <= 4; dx++)
2214 for (dy = -4; dy <= 4; dy++) {
2215 x = dx + (int) u.ux;
2216 y = dy + (int) u.uy;
2217 if (get_valid_jump_position(x, y))
2221 tmp_at(DISP_END, 0);
2227 int magic; /* 0=Physical, otherwise skill level */
2231 /* attempt "jumping" spell if hero has no innate jumping ability */
2232 if (!magic && !Jumping) {
2235 for (sp_no = 0; sp_no < MAXSPELL; ++sp_no)
2236 if (spl_book[sp_no].sp_id == NO_SPELL)
2238 else if (spl_book[sp_no].sp_id == SPE_JUMPING)
2239 return spelleffects(sp_no, FALSE);
2242 if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
2243 /* normally (nolimbs || slithy) implies !Jumping,
2244 but that isn't necessarily the case for knights */
2246 You_cant("jump; you have no legs!");
2248 pline("
\91«
\82ª
\96³
\82
\82Ä
\82Í
\92µ
\82×
\82È
\82¢
\81I");
2250 } else if (!magic && !Jumping) {
2252 You_cant("jump very far.");
2254 You_cant("
\82»
\82ñ
\82È
\89\93\82
\82Ü
\82Å
\92µ
\82×
\82È
\82¢
\81D");
2256 /* if steed is immobile, can't do physical jump but can do spell one */
2257 } else if (!magic && u.usteed && stucksteed(FALSE)) {
2258 /* stucksteed gave "<steed> won't move" message */
2260 } else if (u.uswallow) {
2263 You("bounce around a little.");
2265 pline("
\94½
\93®
\82ð
\82Â
\82¯
\82½
\81D");
2269 pline("You've got to be kidding!");
2271 pline("
\8fç
\92k
\82Í
\82æ
\82µ
\82±
\82³
\82ñ
\81I");
2273 } else if (u.uinwater) {
2276 You("swish around a little.");
2278 pline("
\83X
\83C
\83X
\83C
\82Æ
\89j
\82¢
\82¾
\81D");
2282 pline("This calls for swimming, not jumping!");
2284 pline("
\82»
\82ê
\82Í
\81w
\89j
\82®
\81x
\82Å
\82 \82Á
\82Ä
\81C
\81w
\92µ
\82Ô
\81x
\82¶
\82á
\82È
\82¢
\81I");
2286 } else if (u.ustuck) {
2287 if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
2289 You("pull free from %s.", mon_nam(u.ustuck));
2291 You("%s
\82©
\82ç
\97£
\82ê
\82½
\81D", mon_nam(u.ustuck));
2297 You("writhe a little in the grasp of %s!", mon_nam(u.ustuck));
2299 You("%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\83W
\83^
\83o
\83^
\82µ
\82½
\81I", mon_nam(u.ustuck));
2303 You("cannot escape from %s!", mon_nam(u.ustuck));
2305 You("%s
\82©
\82ç
\93¦
\82ê
\82ç
\82ê
\82È
\82¢
\81I", mon_nam(u.ustuck));
2307 } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
2310 You("flail around a little.");
2312 You("
\83o
\83^
\83o
\83^
\92µ
\82ñ
\82¾
\81D");
2316 You("don't have enough traction to jump.");
2318 You("
\92µ
\82Ô
\82½
\82ß
\82Ì
\94½
\93®
\82ª
\82Â
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
2320 } else if (!magic && near_capacity() > UNENCUMBERED) {
2322 You("are carrying too much to jump!");
2324 You("
\82½
\82
\82³
\82ñ
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\92µ
\82×
\82È
\82¢
\81I");
2326 } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
2328 You("lack the strength to jump!");
2330 You("
\92µ
\82Ô
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I");
2332 } else if (!magic && Wounded_legs) {
2333 long wl = (Wounded_legs & BOTH_SIDES);
2334 const char *bp = body_part(LEG);
2336 if (wl == BOTH_SIDES)
2337 bp = makeplural(bp);
2340 pline("%s is in no shape for jumping.", Monnam(u.usteed));
2342 pline("%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D", Monnam(u.usteed));
2345 Your("%s%s %s in no shape for jumping.",
2346 (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right "
2348 bp, (wl == BOTH_SIDES) ? "are" : "is");
2350 Your("%s%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D",
2351 (wl == LEFT_SIDE) ? "
\8d¶" :
2352 (wl == RIGHT_SIDE) ? "
\89E" : "", bp);
2355 } else if (u.usteed && u.utrap) {
2357 pline("%s is stuck in a trap.", Monnam(u.usteed));
2359 pline("%s
\82Íã©
\82É
\82Ð
\82Á
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", Monnam(u.usteed));
2364 pline("Where do you want to jump?");
2366 pline("
\82Ç
\82±
\82É
\92µ
\82Ñ
\82Ü
\82·
\82©
\81H");
2369 jumping_is_magic = magic;
2370 getpos_sethilite(display_jump_positions, get_valid_jump_position);
2372 if (getpos(&cc, TRUE, "the desired position") < 0)
2374 if (getpos(&cc, TRUE, "
\92µ
\82Ñ
\82½
\82¢
\8fê
\8f\8a") < 0)
2375 return 0; /* user pressed ESC */
2376 if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
2383 switch (u.utraptype) {
2385 long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
2388 You("rip yourself free of the bear trap! Ouch!");
2390 You("
\8e©
\95ª
\82ð
\8cF
\82Ìã©
\82©
\82ç
\82Ð
\82«
\82Í
\82ª
\82µ
\82½
\81C
\82¢
\82Ä
\82Á
\81I");
2392 losehp(Maybe_Half_Phys(rnd(10)), "jumping out of a bear trap",
2394 losehp(Maybe_Half_Phys(rnd(10)), "
\8cF
\82Ìã©
\82©
\82ç
\94ò
\82Ñ
\8fo
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2396 set_wounded_legs(side, rn1(1000, 500));
2401 You("leap from the pit!");
2403 You("
\97\8e\82µ
\8c\8a\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2407 You("tear the web apart as you pull yourself free!");
2409 You("
\82
\82à
\82Ì
\91\83\82ð
\88ø
\82«
\97ô
\82«
\81C
\8e©
\97R
\82É
\82È
\82Á
\82½
\81I");
2410 deltrap(t_at(u.ux, u.uy));
2414 You("pull yourself above the %s!", hliquid("lava"));
2416 You("%s
\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I", hliquid("
\97n
\8aâ"));
2422 You("strain your %s, but you're still %s.",
2423 makeplural(body_part(LEG)),
2424 (u.utraptype == TT_INFLOOR)
2425 ? "stuck in the floor"
2426 : "attached to the buried ball");
2428 You("%s
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\82ª
\81C
\82 \82È
\82½
\82Í
\82Ü
\82¾%s
\81D",
2429 makeplural(body_part(LEG)),
2430 (u.utraptype == TT_INFLOOR)
2431 ? "
\8f°
\82É
\82¤
\82Ü
\82Á
\82Ä
\82¢
\82é"
2432 : "
\82¤
\82Ü
\82Á
\82½
\8b\85\82Æ
\82Â
\82È
\82ª
\82Á
\82Ä
\82¢
\82é");
2434 set_wounded_legs(LEFT_SIDE, rn1(10, 11));
2435 set_wounded_legs(RIGHT_SIDE, rn1(10, 11));
2440 * Check the path from uc to cc, calling hurtle_step at each
2441 * location. The final position actually reached will be
2446 /* calculate max(abs(dx), abs(dy)) as the range */
2447 range = cc.x - uc.x;
2455 (void) walk_path(&uc, &cc, hurtle_jump, (genericptr_t) &range);
2456 /* hurtle_jump -> hurtle_step results in <u.ux,u.uy> == <cc.x,cc.y>
2457 * and usually moves the ball if punished, but does not handle all
2458 * the effects of landing on the final position.
2460 teleds(cc.x, cc.y, FALSE);
2464 multi_reason = "jumping around";
2466 multi_reason = "
\92µ
\82Ë
\89ñ
\82Á
\82Ä
\82¢
\82é
\8e\9e\82É";
2468 morehungry(rnd(25));
2479 if (!mons[corpse->corpsenm].cnutrit)
2485 use_tinning_kit(obj)
2488 struct obj *corpse, *can;
2490 /* This takes only 1 move. If this is to be changed to take many
2491 * moves, we've got to deal with decaying corpses...
2493 if (obj->spe <= 0) {
2495 You("seem to be out of tins.");
2497 pline("
\8aÊ
\8bl
\82ð
\8dì
\82é
\82½
\82ß
\82Ì
\8aÊ
\82ª
\90Ø
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
2500 if (!(corpse = floorfood("tin", 2)))
2502 if (corpse->oeaten) {
2504 You("cannot tin %s which is partly eaten.", something);
2506 You("
\90H
\82×
\82©
\82¯
\82Ì
\82à
\82Ì
\82ð
\8aÊ
\8bl
\82É
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2509 if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance
2513 if (poly_when_stoned(youmonst.data))
2515 You("tin %s without wearing gloves.",
2516 an(mons[corpse->corpsenm].mname));
2518 You("
\8f¬
\8eè
\82È
\82µ
\82Å%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
2519 mons[corpse->corpsenm].mname);
2523 pline("Tinning %s without wearing gloves is a fatal mistake...",
2524 an(mons[corpse->corpsenm].mname));
2526 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",
2527 mons[corpse->corpsenm].mname);
2530 Sprintf(kbuf, "trying to tin %s without gloves",
2531 an(mons[corpse->corpsenm].mname));
2533 Sprintf(kbuf, "
\8f¬
\8eè
\82ð
\82Â
\82¯
\82¸
\82É%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2534 mons[corpse->corpsenm].mname);
2539 if (is_rider(&mons[corpse->corpsenm])) {
2540 if (revive_corpse(corpse))
2542 verbalize("Yes... But War does not preserve its enemies...");
2544 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");
2547 pline_The("corpse evades your grasp.");
2549 pline("
\8e\80\91Ì
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82ð
\93¦
\82ê
\82½
\81D");
2552 if (mons[corpse->corpsenm].cnutrit == 0) {
2554 pline("That's too insubstantial to tin.");
2556 pline("
\8eÀ
\91Ì
\82ª
\82È
\82¢
\82Ì
\82Å
\8aÊ
\8bl
\82É
\82Å
\82«
\82È
\82¢
\81D");
2559 consume_obj_charge(obj, TRUE);
2561 if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
2563 static const char you_buy_it[] = "You tin it, you bought it!";
2565 static const char you_buy_it[] = "
\8aÊ
\8bl
\82É
\82µ
\82½
\82Ì
\82È
\82ç
\94\83\82Á
\82Ä
\82à
\82ç
\82¤
\82æ
\81I";
2567 can->corpsenm = corpse->corpsenm;
2568 can->cursed = obj->cursed;
2569 can->blessed = obj->blessed;
2570 can->owt = weight(can);
2572 /* Mark tinned tins. No spinach allowed... */
2573 set_tin_variety(can, HOMEMADE_TIN);
2574 if (carried(corpse)) {
2576 verbalize(you_buy_it);
2579 if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
2580 verbalize(you_buy_it);
2584 (void) hold_another_object(can, "You make, but cannot pick up, %s.",
2585 doname(can), (const char *) 0);
2587 (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",
2588 doname(can), (const char *) 0);
2591 impossible("Tinning failed.");
2595 use_unicorn_horn(obj)
2598 #define PROP_COUNT 7 /* number of properties we're dealing with */
2599 #define ATTR_COUNT (A_MAX * 3) /* number of attribute points we might fix */
2600 int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop,
2602 int trouble_list[PROP_COUNT + ATTR_COUNT];
2604 if (obj && obj->cursed) {
2605 long lcount = (long) rn1(90, 10);
2607 switch (rn2(13) / 2) { /* case 6 is half as likely as the others */
2609 make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L
2610 : (long) rn1(ACURR(A_CON), 20),
2611 xname(obj), TRUE, SICK_NONVOMITABLE);
2614 make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
2619 You("suddenly feel %s.",
2620 Hallucination ? "trippy" : "confused");
2622 You("
\93Ë
\91R%s
\81D",
2623 Hallucination ? "
\82Ö
\82ë
\82Ö
\82ë
\82É
\82È
\82Á
\82½" : "
\8d¬
\97\90\82µ
\82½");
2625 make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
2628 make_stunned((HStun & TIMEOUT) + lcount, TRUE);
2631 (void) adjattrib(rn2(A_MAX), -1, FALSE);
2634 (void) make_hallucinated((HHallucination & TIMEOUT) + lcount,
2638 if (Deaf) /* make_deaf() won't give feedback when already deaf */
2640 pline("Nothing seems to happen.");
2642 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2643 make_deaf((HDeaf & TIMEOUT) + lcount, TRUE);
2650 * Entries in the trouble list use a very simple encoding scheme.
2652 #define prop2trbl(X) ((X) + A_MAX)
2653 #define attr2trbl(Y) (Y)
2654 #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
2655 #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
2656 #define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
2658 trouble_count = unfixable_trbl = did_prop = did_attr = 0;
2660 /* collect property troubles */
2661 if (TimedTrouble(Sick))
2663 if (TimedTrouble(Blinded) > (long) u.ucreamed
2665 && attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
2666 prop_trouble(BLINDED);
2667 if (TimedTrouble(HHallucination))
2668 prop_trouble(HALLUC);
2669 if (TimedTrouble(Vomiting))
2670 prop_trouble(VOMITING);
2671 if (TimedTrouble(HConfusion))
2672 prop_trouble(CONFUSION);
2673 if (TimedTrouble(HStun))
2674 prop_trouble(STUNNED);
2675 if (TimedTrouble(HDeaf))
2678 unfixable_trbl = unfixable_trouble_count(TRUE);
2680 /* collect attribute troubles */
2681 for (idx = 0; idx < A_MAX; idx++) {
2682 if (ABASE(idx) >= AMAX(idx))
2684 val_limit = AMAX(idx);
2685 /* this used to adjust 'val_limit' for A_STR when u.uhs was
2686 WEAK or worse, but that's handled via ATEMP(A_STR) now */
2688 /* potion/spell of restore ability override sustain ability
2689 intrinsic but unicorn horn usage doesn't */
2690 unfixable_trbl += val_limit - ABASE(idx);
2693 /* don't recover more than 3 points worth of any attribute */
2694 if (val_limit > ABASE(idx) + 3)
2695 val_limit = ABASE(idx) + 3;
2697 for (val = ABASE(idx); val < val_limit; val++)
2699 /* keep track of unfixed trouble, for message adjustment below */
2700 unfixable_trbl += (AMAX(idx) - val_limit);
2703 if (trouble_count == 0) {
2704 pline1(nothing_happens);
2706 } else if (trouble_count > 1) { /* shuffle */
2709 for (i = trouble_count - 1; i > 0; i--)
2710 if ((j = rn2(i + 1)) != i) {
2711 k = trouble_list[j];
2712 trouble_list[j] = trouble_list[i];
2713 trouble_list[i] = k;
2718 * Chances for number of troubles to be fixed
2720 * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8%
2721 * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0
2723 val_limit = rn2(d(2, (obj && obj->blessed) ? 4 : 2));
2724 if (val_limit > trouble_count)
2725 val_limit = trouble_count;
2727 /* fix [some of] the troubles */
2728 for (val = 0; val < val_limit; val++) {
2729 idx = trouble_list[val];
2732 case prop2trbl(SICK):
2733 make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2736 case prop2trbl(BLINDED):
2737 make_blinded((long) u.ucreamed, TRUE);
2740 case prop2trbl(HALLUC):
2741 (void) make_hallucinated(0L, TRUE, 0L);
2744 case prop2trbl(VOMITING):
2745 make_vomiting(0L, TRUE);
2748 case prop2trbl(CONFUSION):
2749 make_confused(0L, TRUE);
2752 case prop2trbl(STUNNED):
2753 make_stunned(0L, TRUE);
2756 case prop2trbl(DEAF):
2757 make_deaf(0L, TRUE);
2761 if (idx >= 0 && idx < A_MAX) {
2765 panic("use_unicorn_horn: bad trouble? (%d)", idx);
2770 if (did_attr || did_prop)
2771 context.botl = TRUE;
2774 pline("This makes you feel %s!",
2775 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2779 pline("
\8bC
\95ª
\82ª%s
\82æ
\82
\82È
\82Á
\82½
\81I",
2780 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2786 pline("Nothing seems to happen.");
2788 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2800 * Timer callback routine: turn figurine into monster
2803 fig_transform(arg, timeout)
2807 struct obj *figurine = arg->a_obj;
2810 boolean cansee_spot, silent, okay_spot;
2811 boolean redraw = FALSE;
2812 boolean suppress_see = FALSE;
2813 char monnambuf[BUFSZ], carriedby[BUFSZ];
2816 debugpline0("null figurine in fig_transform()");
2819 silent = (timeout != monstermoves); /* happened while away */
2820 okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0);
2821 if (figurine->where == OBJ_INVENT || figurine->where == OBJ_MINVENT)
2822 okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]);
2823 if (!okay_spot || !figurine_location_checks(figurine, &cc, TRUE)) {
2824 /* reset the timer to try again later */
2825 (void) start_timer((long) rnd(5000), TIMER_OBJECT, FIG_TRANSFORM,
2826 obj_to_any(figurine));
2830 cansee_spot = cansee(cc.x, cc.y);
2831 mtmp = make_familiar(figurine, cc.x, cc.y, TRUE);
2833 char and_vanish[BUFSZ];
2834 struct obj *mshelter = level.objects[mtmp->mx][mtmp->my];
2836 /* [m_monnam() yields accurate mon type, overriding hallucination] */
2837 Sprintf(monnambuf, "%s", an(m_monnam(mtmp)));
2838 /*JP:TODO:and_vanish
\82Í
\96¢
\8f\88\97\9d*/
2839 and_vanish[0] = '\0';
2840 if ((mtmp->minvis && !See_invisible)
2841 || (mtmp->data->mlet == S_MIMIC
2842 && M_AP_TYPE(mtmp) != M_AP_NOTHING))
2843 suppress_see = TRUE;
2845 if (mtmp->mundetected) {
2846 if (hides_under(mtmp->data) && mshelter) {
2847 Sprintf(and_vanish, " and %s under %s",
2848 locomotion(mtmp->data, "crawl"), doname(mshelter));
2849 } else if (mtmp->data->mlet == S_MIMIC
2850 || mtmp->data->mlet == S_EEL) {
2851 suppress_see = TRUE;
2853 Strcpy(and_vanish, " and vanish");
2856 switch (figurine->where) {
2858 if (Blind || suppress_see)
2860 You_feel("%s %s from your pack!", something,
2861 locomotion(mtmp->data, "drop"));
2863 You_feel("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82æ
\82¤
\82¾
\81I", something,
2864 jpast(locomotion(mtmp->data, "
\97\8e\82¿
\82é")));
2868 You_see("%s %s out of your pack%s!", monnambuf,
2869 locomotion(mtmp->data, "drop"), and_vanish);
2871 You("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2872 jpast(locomotion(mtmp->data,"
\97\8e\82¿
\82é")));
2877 if (cansee_spot && !silent) {
2880 pline("%s suddenly vanishes!", an(xname(figurine)));
2882 pline("%s
\82Í
\93Ë
\91R
\8fÁ
\82¦
\82½
\81I", xname(figurine));
2885 You_see("a figurine transform into %s%s!", monnambuf,
2888 You("
\90l
\8c`
\82ª
\93Ë
\91R%s
\82É
\82È
\82Á
\82½
\82Ì
\82ð
\8c©
\82½
\81I",
2891 redraw = TRUE; /* update figurine's map location */
2896 if (cansee_spot && !silent && !suppress_see) {
2899 mon = figurine->ocarry;
2900 /* figurine carrying monster might be invisible */
2901 if (canseemon(figurine->ocarry)
2902 && (!mon->wormno || cansee(mon->mx, mon->my)))
2904 Sprintf(carriedby, "%s pack", s_suffix(a_monnam(mon)));
2906 Sprintf(carriedby, "%s
\82Ì
\8a\93", a_monnam(mon));
2907 else if (is_pool(mon->mx, mon->my))
2909 Strcpy(carriedby, "empty water");
2911 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\90\85\92\86");
2914 Strcpy(carriedby, "thin air");
2916 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\8bó
\92\86");
2918 You_see("%s %s out of %s%s!", monnambuf,
2919 locomotion(mtmp->data, "drop"), carriedby,
2922 You("%s
\82ª%s
\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2923 carriedby, locomotion(mtmp->data, "
\97\8e\82¿
\82é"));
2933 impossible("figurine came to life where? (%d)",
2934 (int) figurine->where);
2938 /* free figurine now */
2939 if (carried(figurine)) {
2942 obj_extract_self(figurine);
2943 obfree(figurine, (struct obj *) 0);
2950 figurine_location_checks(obj, cc, quietly)
2957 if (carried(obj) && u.uswallow) {
2960 You("don't have enough room in here.");
2962 pline("
\82±
\82±
\82É
\82Í
\8f\
\95ª
\82È
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
2965 x = cc ? cc->x : u.ux;
2966 y = cc ? cc->y : u.uy;
2970 You("cannot put the figurine there.");
2972 You("
\82±
\82±
\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81D");
2975 if (IS_ROCK(levl[x][y].typ)
2976 && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x, y))) {
2979 You("cannot place a figurine in %s!",
2980 IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock");
2982 You("%s
\82Ì
\92\86\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81I",
2983 IS_TREE(levl[x][y].typ) ? "
\96Ø" : "
\8cÅ
\82¢
\90Î");
2987 if (sobj_at(BOULDER, x, y) && !passes_walls(&mons[obj->corpsenm])
2988 && !throws_rocks(&mons[obj->corpsenm])) {
2991 You("cannot fit the figurine on the boulder.");
2993 You("
\8aâ
\82É
\90l
\8c`
\82ð
\89\9f\82µ
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
3003 register struct obj *obj = *optr;
3008 /* can't activate a figurine while swallowed */
3009 if (!figurine_location_checks(obj, (coord *) 0, FALSE))
3012 if (!getdir((char *) 0)) {
3013 context.move = multi = 0;
3020 /* Passing FALSE arg here will result in messages displayed */
3021 if (!figurine_location_checks(obj, &cc, FALSE))
3024 You("%s and it %stransforms.",
3025 (u.dx || u.dy) ? "set the figurine beside you"
3026 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3027 || is_pool(cc.x, cc.y))
3028 ? "release the figurine"
3029 : (u.dz < 0 ? "toss the figurine into the air"
3030 : "set the figurine on the ground"),
3031 Blind ? "supposedly " : "");
3033 You("%s
\81D
\82·
\82é
\82Æ
\82»
\82ê
\82Í
\95Ï
\8c`
\82µ
\82½
\81D",
3034 (u.dx || u.dy) ? "
\82»
\82Î
\82É
\90l
\8c`
\82ð
\92u
\82¢
\82½"
3035 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3036 || is_pool(cc.x, cc.y))
3037 ? "
\90l
\8c`
\82ð
\95ú
\82Á
\82½"
3038 : (u.dz < 0 ? "
\90l
\8c`
\82ð
\8bó
\92\86\82É
\93\8a\82°
\82½"
3039 : "
\90l
\8c`
\82ð
\92n
\96Ê
\82É
\92u
\82¢
\82½"));
3041 (void) make_familiar(obj, cc.x, cc.y, FALSE);
3042 (void) stop_timer(FIG_TRANSFORM, obj_to_any(obj));
3045 map_invisible(cc.x, cc.y);
3049 static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 };
3059 pline("%s from your %s.", Tobjnam(obj, "slip"),
3060 makeplural(body_part(FINGER)));
3062 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
3070 if ((obj->cursed || Fumbling) && !rn2(2)) {
3071 consume_obj_charge(obj, TRUE);
3074 pline("%s from your %s.", Tobjnam(obj, "slip"),
3075 makeplural(body_part(FINGER)));
3077 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
3083 otmp = getobj(lubricables, "grease");
3087 if (inaccessible_equipment(otmp, "grease", FALSE))
3089 if (inaccessible_equipment(otmp, "
\82É
\8e\89\82ð
\93h
\82é", FALSE))
3091 consume_obj_charge(obj, TRUE);
3093 if (otmp != &zeroobj) {
3095 You("cover %s with a thick layer of grease.", yname(otmp));
3097 You("%s
\82É
\8e\89\82ð
\92O
\94O
\82É
\93h
\82Á
\82½
\81D", xname(otmp));
3099 if (obj->cursed && !nohands(youmonst.data)) {
3100 incr_itimeout(&Glib, rnd(15));
3102 pline("Some of the grease gets all over your %s.",
3104 pline("
\8e\89\82ª
\8f
\82µ%s
\82É
\82Â
\82¢
\82½
\81D",
3105 makeplural(body_part(HAND)));
3108 incr_itimeout(&Glib, rnd(15));
3110 You("coat your %s with grease.", makeplural(body_part(FINGER)));
3112 You("%s
\82É
\8e\89\82ð
\93h
\82Á
\82½
\81D", makeplural(body_part(FINGER)));
3117 pline("%s empty.", Tobjnam(obj, "are"));
3119 pline("%s
\82Í
\8bó
\82Á
\82Û
\82¾
\81D", xname(obj));
3122 pline("%s to be empty.", Tobjnam(obj, "seem"));
3124 pline("%s
\82Í
\8bó
\82Á
\82Û
\82Ì
\82æ
\82¤
\82¾
\81D", xname(obj));
3129 /* touchstones - by Ken Arnold */
3136 const char *streak_color, *choices;
3137 char stonebuf[QBUFSZ];
3139 static const char scritch[] = "\"scritch, scritch\"";
3141 static const char scritch[] = "
\81u
\83S
\83V
\81C
\83S
\83V
\81v";
3142 static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 };
3143 static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 };
3145 /* in case it was acquired while blinded */
3148 /* when the touchstone is fully known, don't bother listing extra
3149 junk as likely candidates for rubbing */
3150 choices = (tstone->otyp == TOUCHSTONE && tstone->dknown
3151 && objects[TOUCHSTONE].oc_name_known)
3155 Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan));
3157 Sprintf(stonebuf, "rub on the stone");
3158 if ((obj = getobj(choices, stonebuf)) == 0)
3161 if (obj == tstone && obj->quan == 1L) {
3163 You_cant("rub %s on itself.", the(xname(obj)));
3165 You("%s
\82ð
\82»
\82ê
\8e©
\91Ì
\82Å
\82±
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", the(xname(obj)));
3169 if (tstone->otyp == TOUCHSTONE && tstone->cursed
3170 && obj->oclass == GEM_CLASS && !is_graystone(obj)
3171 && !obj_resists(obj, 80, 100)) {
3174 pline("You feel something shatter.");
3176 You("
\89½
\82©
\82ª
\95²
\81X
\82É
\82È
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81D");
3177 else if (Hallucination)
3179 pline("Oh, wow, look at the pretty shards.");
3181 pline("
\83\8f\81[
\83H
\81I
\82È
\82ñ
\82Ä
\82«
\82ê
\82¢
\82È
\94j
\95Ð
\82È
\82ñ
\82¾
\81D");
3184 pline("A sharp crack shatters %s%s.",
3185 (obj->quan > 1L) ? "one of " : "", the(xname(obj)));
3187 pline("
\8b
\82
\82±
\82·
\82è
\82·
\82¬
\82Ä%s%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
3188 the(xname(obj)), (obj->quan > 1) ? "
\82Ì
\82Ð
\82Æ
\82Â" : "");
3197 } else if (Hallucination) {
3199 pline("Oh wow, man: Fractals!");
3201 pline("
\83\8f\81[
\83H
\81I
\83t
\83\89\83N
\83^
\83\8b\96Í
\97l
\82¾
\81I");
3209 switch (obj->oclass) {
3210 case GEM_CLASS: /* these have class-specific handling below */
3212 if (tstone->otyp != TOUCHSTONE) {
3214 } else if (obj->oclass == GEM_CLASS
3216 || (!tstone->cursed && (Role_if(PM_ARCHEOLOGIST)
3217 || Race_if(PM_GNOME))))) {
3218 makeknown(TOUCHSTONE);
3219 makeknown(obj->otyp);
3220 prinv((char *) 0, obj, 0L);
3223 /* either a ring or the touchstone was not effective */
3224 if (objects[obj->otyp].oc_material == GLASS) {
3229 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3230 break; /* gem or ring */
3233 switch (objects[obj->otyp].oc_material) {
3236 pline("%s a little more polished now.", Tobjnam(tstone, "look"));
3238 pline("%s
\82Í
\82³
\82ç
\82É
\82Â
\82â
\82ª
\8fo
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D", xname(tstone));
3242 if (!obj->known) /* note: not "whetstone" */
3244 You("must think this is a wetstone, do you?");
3246 You("
\82±
\82ê
\82Í
\93u
\90Î
\82¾
\82Æ
\8ev
\82Á
\82½
\81H");
3250 pline("%s a little wetter now.", Tobjnam(tstone, "are"));
3252 pline("%s
\82Í
\8f
\82µ
\82Ê
\82ê
\82½
\81D", xname(tstone));
3257 streak_color = "waxy";
3259 streak_color = "
\8e\89\82Á
\82Û
\82¢";
3261 break; /* okay even if not touchstone */
3264 streak_color = "wooden";
3266 streak_color = "
\82¨
\82ª
\82
\82¸
\82Ì
\82æ
\82¤
\82È";
3268 break; /* okay even if not touchstone */
3270 do_scratch = TRUE; /* scratching and streaks */
3272 streak_color = "golden";
3274 streak_color = "
\8bà
\90F
\82Ì";
3278 do_scratch = TRUE; /* scratching and streaks */
3280 streak_color = "silvery";
3282 streak_color = "
\8bâ
\90F
\82Ì";
3286 /* Objects passing the is_flimsy() test will not
3287 scratch a stone. They will leave streaks on
3288 non-touchstones and touchstones alike. */
3290 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3292 do_scratch = (tstone->otyp != TOUCHSTONE);
3295 break; /* default oclass */
3298 #if 0 /*JP*//* not used */
3299 Sprintf(stonebuf, "stone%s", plur(tstone->quan));
3303 You("make %s%sscratch marks on the %s.",
3304 streak_color ? streak_color : (const char *) "",
3305 streak_color ? " " : "", stonebuf);
3307 You("%s
\82±
\82·
\82è
\90Õ
\82ð
\90Î
\82É
\82Â
\82¯
\82½
\81D",
3308 streak_color ? streak_color : (const char *)"");
3310 else if (streak_color)
3312 You_see("%s streaks on the %s.", streak_color, stonebuf);
3314 pline("
\90Î
\82É%s
\8bØ
\82ª
\82Â
\82¢
\82½
\81D", streak_color);
3320 static struct trapinfo {
3324 boolean force_bungle;
3331 trapinfo.force_bungle = 0;
3334 /* Place a landmine/bear trap. Helge Hafting */
3340 const char *what = (char *) 0;
3342 int levtyp = levl[u.ux][u.uy].typ;
3344 const char *occutext = "setting the trap";
3346 const char *occutext = "ã©
\82ð
\8ed
\8a|
\82¯
\82Ä
\82¢
\82é";
3349 if (nohands(youmonst.data))
3351 what = "without hands";
3353 what = "
\8eè
\82ª
\82È
\82¢
\82Ì
\82Å";
3356 what = "while stunned";
3358 what = "
\82
\82ç
\82
\82ç
\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å";
3359 else if (u.uswallow)
3362 is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed";
3364 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Í";
3365 else if (Underwater)
3367 what = "underwater";
3369 what = "
\90\85\96Ê
\89º
\82Å
\82Í";
3370 else if (Levitation)
3372 what = "while levitating";
3374 what = "
\95\82\82¢
\82Ä
\82¢
\82é
\8aÔ
\82Í";
3375 else if (is_pool(u.ux, u.uy))
3379 what = "
\90\85\92\86\82Å
\82Í";
3380 else if (is_lava(u.ux, u.uy))
3384 what = "
\97n
\8aâ
\82Ì
\92\86\82Å
\82Í";
3385 else if (On_stairs(u.ux, u.uy))
3387 what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder"
3390 what = (u.ux == xdnladder || u.ux == xupladder) ? "
\82Í
\82µ
\82²
\82Ì
\8fã
\82Å
\82Í"
3391 : "
\8aK
\92i
\82Ì
\8fã
\82Å
\82Í";
3393 else if (IS_FURNITURE(levtyp) || IS_ROCK(levtyp)
3394 || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy))
3398 what = "
\82±
\82±
\82Å
\82Í";
3399 else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
3401 what = (levtyp == AIR)
3405 : "in this place"; /* Air/Water Plane catch-all */
3407 what = (levtyp == AIR)
3408 ? "
\8bó
\92\86\82Å
\82Í"
3410 ? "
\89_
\82Ì
\92\86\82Å
\82Í"
3411 : "
\82±
\82±
\82Å
\82Í"; /* Air/Water Plane catch-all */
3415 You_cant("set a trap %s!", what);
3417 pline("%sã©
\82ð
\8ed
\8a|
\82¯
\82ç
\82ê
\82È
\82¢
\81I",what);
3421 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3422 if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) {
3424 You("resume setting %s%s.", shk_your(buf, otmp),
3426 You("%s
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D",
3427 defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
3428 set_occupation(set_trap, occutext, 0);
3431 trapinfo.tobj = otmp;
3432 trapinfo.tx = u.ux, trapinfo.ty = u.uy;
3434 trapinfo.time_needed =
3435 (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5;
3437 trapinfo.time_needed *= 2;
3439 if (ttyp == BEAR_TRAP && tmp < 18)
3440 trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4;
3441 /*[fumbling and/or confusion and/or cursed object check(s)
3442 should be incorporated here instead of in set_trap]*/
3443 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) {
3446 if (Fumbling || otmp->cursed)
3447 chance = (rnl(10) > 3);
3449 chance = (rnl(10) > 5);
3451 You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
3453 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));
3455 Sprintf(buf, "Continue your attempt to set %s?",
3457 Sprintf(buf, "%s
\82Ì
\8ed
\8a|
\82¯
\82ð
\91±
\82¯
\82é
\81H",
3458 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
3460 if (yn(buf) == 'y') {
3463 case LANDMINE: /* set it off */
3464 trapinfo.time_needed = 0;
3465 trapinfo.force_bungle = TRUE;
3467 case BEAR_TRAP: /* drop it without arming it */
3472 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I",
3473 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
3485 You("begin setting %s%s.", shk_your(buf, otmp),
3487 You("%s%s
\82ð
\8ed
\8a|
\82¯
\82Í
\82¶
\82ß
\82½
\81D", shk_your(buf, otmp),
3488 defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
3489 set_occupation(set_trap, occutext, 0);
3497 struct obj *otmp = trapinfo.tobj;
3501 if (!otmp || !carried(otmp) || u.ux != trapinfo.tx
3502 || u.uy != trapinfo.ty) {
3508 if (--trapinfo.time_needed > 0)
3509 return 1; /* still busy */
3511 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3512 ttmp = maketrap(u.ux, u.uy, ttyp);
3516 if (*in_rooms(u.ux, u.uy, SHOPBASE)) {
3517 add_damage(u.ux, u.uy, 0L); /* schedule removal */
3519 if (!trapinfo.force_bungle)
3521 You("finish arming %s.",
3523 You("%s
\82ð
\8ed
\8a|
\82¯
\8fI
\82¦
\82½
\81D",
3524 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation));
3525 if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
3526 || trapinfo.force_bungle)
3528 (unsigned) (trapinfo.force_bungle ? FORCEBUNGLE : 0));
3530 /* this shouldn't happen */
3532 Your("trap setting attempt fails.");
3534 You("ã©
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D");
3548 int rx, ry, proficient, res = 0;
3550 const char *msg_slipsfree = "The bullwhip slips free.";
3552 const char *msg_slipsfree = "
\95Ú
\82Í
\82Ù
\82Ç
\82¯
\82½
\81D";
3554 const char *msg_snap = "Snap!";
3556 const char *msg_snap = "
\83s
\83V
\83b
\81I";
3559 if (!wield_tool(obj, "lash"))
3564 if (!getdir((char *) 0))
3572 if (Stunned || (Confusion && !rn2(5)))
3576 if (!isok(rx, ry)) {
3580 You("
\82Í
\82¸
\82µ
\82½
\81D");
3583 mtmp = m_at(rx, ry);
3586 /* fake some proficiency checks */
3588 if (Role_if(PM_ARCHEOLOGIST))
3590 if (ACURR(A_DEX) < 6)
3592 else if (ACURR(A_DEX) >= 14)
3593 proficient += (ACURR(A_DEX) - 14);
3601 if (u.uswallow && attack(u.ustuck)) {
3603 There("is not enough room to flick your bullwhip.");
3605 pline("
\95Ú
\82ð
\91Å
\82Â
\82Ù
\82Ç
\8dL
\82
\82È
\82¢
\81D");
3607 } else if (Underwater) {
3609 There("is too much resistance to flick your bullwhip.");
3611 pline("
\90\85\82Ì
\92ï
\8dR
\82ª
\82 \82è
\82·
\82¬
\82Ä
\95Ú
\82ð
\91Å
\82Â
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
3613 } else if (u.dz < 0) {
3615 You("flick a bug off of the %s.", ceiling(u.ux, u.uy));
3617 You("%s
\82Ì
\92\8e\82ð
\91Å
\82¿
\97\8e\82µ
\82½
\81D",ceiling(u.ux,u.uy));
3619 } else if ((!u.dx && !u.dy) || (u.dz > 0)) {
3622 /* Sometimes you hit your steed by mistake */
3623 if (u.usteed && !rn2(proficient + 2)) {
3625 You("whip %s!", mon_nam(u.usteed));
3627 You("%s
\82ð
\95Ú
\91Å
\82Á
\82½
\81I", mon_nam(u.usteed));
3631 if (Levitation || u.usteed) {
3632 /* Have a shot at snaring something on the floor */
3633 otmp = level.objects[u.ux][u.uy];
3634 if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) {
3636 pline("Why beat a dead horse?");
3638 pline("
\82Ç
\82¤
\82µ
\82Ä
\8e\80\82ñ
\82¾
\94n
\82ð
\95Ú
\91Å
\82Â
\82æ
\82¤
\82È
\82±
\82Æ
\82ð
\82·
\82é
\82Ì
\81H");
3641 if (otmp && proficient) {
3643 You("wrap your bullwhip around %s on the %s.",
3644 an(singular(otmp, xname)), surface(u.ux, u.uy));
3646 You("
\95Ú
\82ð%s
\82Ì
\8fã
\82Ì%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D",
3647 surface(u.ux, u.uy), an(singular(otmp, xname)));
3649 if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1)
3650 pline1(msg_slipsfree);
3654 dam = rnd(2) + dbon() + obj->spe;
3658 You("hit your %s with your bullwhip.", body_part(FOOT));
3660 You("
\8e©
\95ª
\82Ì%s
\82ð
\8e©
\95ª
\82Å
\91Å
\82¿
\82Â
\82¯
\82½
\81D", body_part(FOOT));
3662 Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis());
3663 losehp(Maybe_Half_Phys(dam), buf, NO_KILLER_PREFIX);
3665 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82ð
\95Ú
\91Å
\82Á
\82Ä");
3666 losehp(Maybe_Half_Phys(dam), buf, KILLED_BY);
3670 } else if ((Fumbling || Glib) && !rn2(5)) {
3672 pline_The("bullwhip slips out of your %s.", body_part(HAND));
3674 pline("
\95Ú
\82ª%s
\82©
\82ç
\82·
\82×
\82è
\97\8e\82¿
\82½
\81D", body_part(HAND));
3677 } else if (u.utrap && u.utraptype == TT_PIT) {
3681 * if you're in a pit
3682 * - you are attempting to get out of the pit
3683 * or, if you are applying it towards a small monster
3684 * - then it is assumed that you are trying to hit it
3685 * else if the monster is wielding a weapon
3686 * - you are attempting to disarm a monster
3688 * - you are attempting to hit the monster.
3690 * if you're confused (and thus off the mark)
3691 * - you only end up hitting.
3694 const char *wrapped_what = (char *) 0;
3697 if (bigmonst(mtmp->data)) {
3698 wrapped_what = strcpy(buf, mon_nam(mtmp));
3699 } else if (proficient) {
3706 if (!wrapped_what) {
3707 if (IS_FURNITURE(levl[rx][ry].typ))
3708 wrapped_what = something;
3709 else if (sobj_at(BOULDER, rx, ry))
3711 wrapped_what = "a boulder";
3713 wrapped_what = "
\8aâ";
3721 You("wrap your bullwhip around %s.", wrapped_what);
3723 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", wrapped_what);
3724 if (proficient && rn2(proficient + 2)) {
3725 if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) {
3727 You("yank yourself out of the pit!");
3729 You("
\82®
\82¢
\82Æ
\88ø
\82Á
\82Ï
\82Á
\82Ä
\8c\8a\82©
\82ç
\94²
\82¯
\8fo
\82µ
\82½
\81I");
3730 teleds(cc.x, cc.y, TRUE);
3732 vision_full_recalc = 1;
3735 pline1(msg_slipsfree);
3743 if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) {
3745 pline("A monster is there that you couldn't see.");
3747 pline("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82ª
\82¢
\82é
\81D");
3748 map_invisible(rx, ry);
3750 otmp = MON_WEP(mtmp); /* can be null */
3752 char onambuf[BUFSZ];
3753 const char *mon_hand;
3754 boolean gotit = proficient && (!Fumbling || !rn2(10));
3756 Strcpy(onambuf, cxname(otmp));
3758 mon_hand = mbodypart(mtmp, HAND);
3760 mon_hand = makeplural(mon_hand);
3762 mon_hand = 0; /* lint suppression */
3765 You("wrap your bullwhip around %s.", yname(otmp));
3767 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", xname(otmp));
3768 if (gotit && mwelded(otmp)) {
3770 pline("%s welded to %s %s%c",
3771 (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp),
3772 mon_hand, !otmp->bknown ? '!' : '.');
3774 pline("%s
\82Í%s
\82Ì%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82µ
\82Ü
\82Á
\82Ä
\82¢
\82é%s",
3776 mon_nam(mtmp), mon_hand,
3777 !otmp->bknown ? "
\81I" : "
\81D");
3780 gotit = FALSE; /* can't pull it free */
3783 obj_extract_self(otmp);
3784 possibly_unwield(mtmp, FALSE);
3785 setmnotwielded(mtmp, otmp);
3787 switch (rn2(proficient + 1)) {
3789 /* to floor near you */
3791 You("yank %s to the %s!", yname(otmp),
3793 You("%s
\82ð%s
\82É
\88ø
\82«
\97\8e\82µ
\82½
\81I", xname(otmp),
3794 surface(u.ux, u.uy));
3795 place_object(otmp, u.ux, u.uy);
3802 /* proficient with whip, but maybe not
3803 so proficient at catching weapons */
3806 hitvalu = 8 + otmp->spe;
3807 hitu = thitu(hitvalu, dmgval(otmp, &youmonst),
3811 pline_The("%s hits you as you try to snatch it!",
3813 pline_The("%s
\82ð
\92D
\82¨
\82¤
\82Æ
\82µ
\82½
\82ç
\82 \82È
\82½
\82É
\93\96\82½
\82Á
\82½
\81I",
3816 place_object(otmp, u.ux, u.uy);
3821 /* right into your inventory */
3823 You("snatch %s!", yname(otmp));
3825 You("%s
\82ð
\92D
\82Á
\82½
\81I", xname(otmp));
3826 if (otmp->otyp == CORPSE
3827 && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg
3828 && !Stone_resistance
3829 && !(poly_when_stoned(youmonst.data)
3830 && polymon(PM_STONE_GOLEM))) {
3834 Sprintf(kbuf, "%s corpse",
3835 an(mons[otmp->corpsenm].mname));
3836 pline("Snatching %s is a fatal mistake.", kbuf);
3838 pline("%s
\82Ì
\8e\80\91Ì
\82ð
\92D
\82Á
\82½
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
3839 mons[otmp->corpsenm].mname);
3840 Sprintf(kbuf, "%s
\82Ì
\8e\80\91Ì
\82É
\90G
\82ê
\82Ä",
3841 mons[otmp->corpsenm].mname);
3846 (void) hold_another_object(otmp, "You drop %s!",
3847 doname(otmp), (const char *) 0);
3849 (void) hold_another_object(otmp, "%s
\82ð
\97\8e\82µ
\82½
\81I",
3850 doname(otmp), (const char *) 0);
3854 /* to floor beneath mon */
3856 You("yank %s from %s %s!", the(onambuf),
3857 s_suffix(mon_nam(mtmp)), mon_hand);
3859 You("%s
\82ð%s
\82Ì%s
\82©
\82ç
\82Ð
\82Á
\82Ï
\82Á
\82½
\81I", the(xname(otmp)),
3860 mon_nam(mtmp), mon_hand);
3862 obj_no_longer_held(otmp);
3863 place_object(otmp, mtmp->mx, mtmp->my);
3868 pline1(msg_slipsfree);
3872 if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers
3874 stumble_onto_mimic(mtmp);
3877 You("flick your bullwhip towards %s.", mon_nam(mtmp));
3879 You("%s
\82É
\8cü
\82Á
\82Ä
\95Ú
\82ð
\91Å
\82Á
\82½
\81D", mon_nam(mtmp));
3888 } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
3889 /* it must be air -- water checked above */
3891 You("snap your whip through thin air.");
3893 You("
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë
\82Å
\95Ú
\82ð
\91Å
\82Á
\82½
\81D");
3903 not_enough_room[] = "There's not enough room here to use that.",
3905 not_enough_room[] = "
\82»
\82ê
\82ð
\8eg
\82¤
\82¾
\82¯
\82Ì
\8dL
\82³
\82ª
\82È
\82¢
\81D",
3907 where_to_hit[] = "Where do you want to hit?",
3909 where_to_hit[] = "
\82Ç
\82ê
\82ð
\91_
\82¤
\81H",
3911 cant_see_spot[] = "won't hit anything if you can't see that spot.",
3913 cant_see_spot[] = "
\8fê
\8f\8a\82ª
\8c©
\82¦
\82È
\82¯
\82ê
\82Î
\91_
\82¦
\82È
\82¢
\81D",
3915 cant_reach[] = "can't reach that spot from here.";
3917 cant_reach[] = "
\82±
\82±
\82©
\82ç
\82»
\82±
\82Ö
\82Í
\93Í
\82©
\82È
\82¢
\81D";
3919 /* find pos of monster in range, if only one monster */
3921 find_poleable_mon(pos, min_range, max_range)
3923 int min_range, max_range;
3928 int x, y, lo_x, hi_x, lo_y, hi_y, rt, glyph;
3931 return FALSE; /* must be able to see target location */
3932 impaired = (Confusion || Stunned || Hallucination);
3933 mpos.x = mpos.y = 0; /* no candidate location yet */
3934 rt = isqrt(max_range);
3935 lo_x = max(u.ux - rt, 1), hi_x = min(u.ux + rt, COLNO - 1);
3936 lo_y = max(u.uy - rt, 0), hi_y = min(u.uy + rt, ROWNO - 1);
3937 for (x = lo_x; x <= hi_x; ++x) {
3938 for (y = lo_y; y <= hi_y; ++y) {
3939 if (distu(x, y) < min_range || distu(x, y) > max_range
3940 || !isok(x, y) || !cansee(x, y))
3942 glyph = glyph_at(x, y);
3944 && glyph_is_monster(glyph)
3945 && (mtmp = m_at(x, y)) != 0
3946 && (mtmp->mtame || (mtmp->mpeaceful && flags.confirm)))
3948 if (glyph_is_monster(glyph)
3949 || glyph_is_warning(glyph)
3950 || glyph_is_invisible(glyph)
3951 || (glyph_is_statue(glyph) && impaired)) {
3953 return FALSE; /* more than one candidate location */
3954 mpos.x = x, mpos.y = y;
3959 return FALSE; /* no candidate location */
3964 static int polearm_range_min = -1;
3965 static int polearm_range_max = -1;
3968 get_valid_polearm_position(x, y)
3971 return (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
3972 && distu(x, y) >= polearm_range_min
3973 && distu(x, y) <= polearm_range_max);
3977 display_polearm_positions(state)
3981 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
3982 } else if (state == 1) {
3985 for (dx = -4; dx <= 4; dx++)
3986 for (dy = -4; dy <= 4; dy++) {
3987 x = dx + (int) u.ux;
3988 y = dy + (int) u.uy;
3989 if (get_valid_polearm_position(x, y)) {
3994 tmp_at(DISP_END, 0);
3998 /* Distance attacks by pole-weapons */
4003 int res = 0, typ, max_range, min_range, glyph;
4006 struct monst *hitm = context.polearm.hitmon;
4008 /* Are you allowed to use the pole? */
4010 pline(not_enough_room);
4014 if (!wield_tool(obj, "swing"))
4019 /* assert(obj == uwep); */
4022 * Calculate allowable range (pole's reach is always 2 steps):
4023 * unskilled and basic: orthogonal direction, 4..4;
4024 * skilled: as basic, plus knight's jump position, 4..5;
4025 * expert: as skilled, plus diagonal, 4..8.
4033 * (Note: no roles in nethack can become expert or better
4034 * for polearm skill; Yeoman in slash'em can become expert.)
4037 typ = uwep_skill_type();
4038 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4040 else if (P_SKILL(typ) == P_SKILLED)
4043 max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
4045 polearm_range_min = min_range;
4046 polearm_range_max = max_range;
4048 /* Prompt for a location */
4049 pline(where_to_hit);
4052 if (!find_poleable_mon(&cc, min_range, max_range) && hitm
4053 && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)
4054 && distu(hitm->mx, hitm->my) <= max_range
4055 && distu(hitm->mx, hitm->my) >= min_range) {
4059 getpos_sethilite(display_polearm_positions, get_valid_polearm_position);
4061 if (getpos(&cc, TRUE, "the spot to hit") < 0)
4063 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
4064 return res; /* ESC; uses turn iff polearm became wielded */
4066 glyph = glyph_at(cc.x, cc.y);
4067 if (distu(cc.x, cc.y) > max_range) {
4071 pline("
\89\93\82·
\82¬
\82é
\81I");
4073 } else if (distu(cc.x, cc.y) < min_range) {
4075 pline("Too close!");
4077 pline("
\8bß
\82·
\82¬
\82é
\81I");
4079 } else if (!cansee(cc.x, cc.y) && !glyph_is_monster(glyph)
4080 && !glyph_is_invisible(glyph) && !glyph_is_statue(glyph)) {
4083 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4088 context.polearm.hitmon = (struct monst *) 0;
4089 /* Attack the monster there */
4091 if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *) 0) {
4092 if (attack_checks(mtmp, uwep))
4095 return 1; /* burn nutrition; maybe pass out */
4096 context.polearm.hitmon = mtmp;
4097 check_caitiff(mtmp);
4098 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4099 (void) thitmonst(mtmp, uwep);
4100 } else if (glyph_is_statue(glyph) /* might be hallucinatory */
4101 && sobj_at(STATUE, bhitpos.x, bhitpos.y)) {
4102 struct trap *t = t_at(bhitpos.x, bhitpos.y);
4104 if (t && t->ttyp == STATUE_TRAP
4105 && activate_statue_trap(t, t->tx, t->ty, FALSE)) {
4106 ; /* feedback has been give by animate_statue() */
4108 /* Since statues look like monsters now, we say something
4109 different from "you miss" or "there's nobody there".
4110 Note: we only do this when a statue is displayed here,
4111 because the player is probably attempting to attack it;
4112 other statues obscured by anything are just ignored. */
4114 pline("Thump! Your blow bounces harmlessly off the statue.");
4116 pline("
\83S
\83c
\83\93\81I
\92¤
\91\9c\82Í
\8f\9d\82Â
\82©
\82È
\82©
\82Á
\82½
\81D");
4117 wake_nearto(bhitpos.x, bhitpos.y, 25);
4120 /* no monster here and no statue seen or remembered here */
4121 (void) unmap_invisible(bhitpos.x, bhitpos.y);
4123 You("miss; there is no one there to hit.");
4125 You("
\8aO
\82ê
\82½
\81D
\82»
\82±
\82É
\82Í
\89½
\82à
\82È
\82¢
\81D");
4127 u_wipe_engr(2); /* same as for melee or throwing */
4135 boolean wasblind = Blind;
4136 boolean wascreamed = u.ucreamed;
4137 boolean several = FALSE;
4139 if (obj->quan > 1L) {
4141 obj = splitobj(obj, 1L);
4145 You("give yourself a facial.");
4147 You("
\83N
\83\8a\81[
\83\80\83p
\83b
\83N
\82ð
\82µ
\82½
\81D");
4150 pline("You immerse your %s in %s%s.", body_part(FACE),
4151 several ? "one of " : "",
4152 several ? makeplural(the(xname(obj))) : the(xname(obj)));
4154 pline("%s%s
\82É%s
\82ð
\92¾
\82ß
\82½
\81D",
4156 several ? "
\82Ì
\82Ð
\82Æ
\82Â" : "", body_part(FACE));
4158 if (can_blnd((struct monst *) 0, &youmonst, AT_WEAP, obj)) {
4159 int blindinc = rnd(25);
4160 u.ucreamed += blindinc;
4161 make_blinded(Blinded + (long) blindinc, FALSE);
4162 if (!Blind || (Blind && wasblind))
4164 pline("There's %ssticky goop all over your %s.",
4165 wascreamed ? "more " : "", body_part(FACE));
4167 pline("
\82â
\82Á
\82©
\82¢
\82È
\82Ë
\82Î
\82Ë
\82Î
\82ª%s
\91S
\91Ì
\82É%s
\82Â
\82¢
\82½
\81D",
4168 body_part(FACE), wascreamed ? "
\82³
\82ç
\82É" : "");
4170 else /* Blind && !wasblind */
4172 You_cant("see through all the sticky goop on your %s.",
4174 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",
4179 /* useup() is appropriate, but we want costly_alteration()'s message */
4180 costly_alteration(obj, COST_SPLAT);
4181 obj_extract_self(obj);
4190 int res = 0, typ, max_range = 4, tohit;
4191 boolean save_confirm;
4196 /* Are you allowed to use the hook? */
4198 pline(not_enough_room);
4202 if (!wield_tool(obj, "cast"))
4207 /* assert(obj == uwep); */
4209 /* Prompt for a location */
4210 pline(where_to_hit);
4214 if (getpos(&cc, TRUE, "the spot to hit") < 0)
4216 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
4217 return res; /* ESC; uses turn iff grapnel became wielded */
4219 /* Calculate range; unlike use_pole(), there's no minimum for range */
4220 typ = uwep_skill_type();
4221 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4223 else if (P_SKILL(typ) == P_SKILLED)
4227 if (distu(cc.x, cc.y) > max_range) {
4231 pline("
\89\93\82·
\82¬
\82é
\81I");
4233 } else if (!cansee(cc.x, cc.y)) {
4236 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4241 /* What do you want to hit? */
4243 if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) {
4244 winid tmpwin = create_nhwindow(NHW_MENU);
4247 menu_item *selected;
4249 any = zeroany; /* set all bits to zero */
4250 any.a_int = 1; /* use index+1 (cant use 0) as identifier */
4254 Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
4256 Sprintf(buf, "%s
\82É
\82 \82é
\95¨
\91Ì", surface(cc.x, cc.y));
4257 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4261 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
4264 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "
\89ö
\95¨",
4269 Sprintf(buf, "the %s", surface(cc.x, cc.y));
4271 Sprintf(buf, "%s", surface(cc.x, cc.y));
4272 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4275 end_menu(tmpwin, "Aim for what?");
4277 end_menu(tmpwin, "
\89½
\82ð
\91_
\82¤
\81H");
4279 if (select_menu(tmpwin, PICK_ONE, &selected) > 0
4280 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2))
4281 tohit = selected[0].item.a_int - 1;
4282 free((genericptr_t) selected);
4283 destroy_nhwindow(tmpwin);
4286 /* possibly scuff engraving at your feet;
4287 any engraving at the target location is unaffected */
4288 if (tohit == 2 || !rn2(2))
4289 u_wipe_engr(rnd(2));
4291 /* What did you hit? */
4294 /* FIXME -- untrap needs to deal with non-adjacent traps */
4296 case 1: /* Object */
4297 if ((otmp = level.objects[cc.x][cc.y]) != 0) {
4299 You("snag an object from the %s!", surface(cc.x, cc.y));
4301 You("%s
\82Ì
\82à
\82Ì
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I", surface(cc.x, cc.y));
4302 (void) pickup_object(otmp, 1L, FALSE);
4303 /* If pickup fails, leave it alone */
4308 case 2: /* Monster */
4310 if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *) 0)
4312 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4313 save_confirm = flags.confirm;
4314 if (verysmall(mtmp->data) && !rn2(4)
4315 && enexto(&cc, u.ux, u.uy, (struct permonst *) 0)) {
4316 flags.confirm = FALSE;
4317 (void) attack_checks(mtmp, uwep);
4318 flags.confirm = save_confirm;
4319 check_caitiff(mtmp); /* despite fact there's no damage */
4321 You("pull in %s!", mon_nam(mtmp));
4323 You("%s
\82ð
\88ø
\82Á
\92£
\82Á
\82½
\81I", mon_nam(mtmp));
4324 mtmp->mundetected = 0;
4325 rloc_to(mtmp, cc.x, cc.y);
4327 } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data))
4329 flags.confirm = FALSE;
4330 (void) attack_checks(mtmp, uwep);
4331 flags.confirm = save_confirm;
4332 check_caitiff(mtmp);
4333 (void) thitmonst(mtmp, uwep);
4337 case 3: /* Surface */
4338 if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y))
4340 pline_The("hook slices through the %s.", surface(cc.x, cc.y));
4342 pline("
\83t
\83b
\83N
\82Í%s
\82ð
\82³
\82Á
\82Æ
\90Ø
\82Á
\82½
\81D", surface(cc.x, cc.y));
4345 You("are yanked toward the %s!", surface(cc.x, cc.y));
4347 You("%s
\82Ö
\88ø
\82Á
\82Ï
\82ç
\82ê
\82½
\81I", surface(cc.x, cc.y));
4348 hurtle(sgn(cc.x - u.ux), sgn(cc.y - u.uy), 1, FALSE);
4352 default: /* Yourself (oops!) */
4353 if (P_SKILL(typ) <= P_BASIC) {
4355 You("hook yourself!");
4357 You("
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I");
4359 losehp(Maybe_Half_Phys(rn1(10, 10)), "a grappling hook",
4361 losehp(Maybe_Half_Phys(rn1(10, 10)), "
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82Ä",
4367 pline1(nothing_happens);
4371 #define BY_OBJECT ((struct monst *) 0)
4373 /* return 1 if the wand is broken, hence some time elapsed */
4379 static const char nothing_else_happens[] = "But nothing else happens...";
4381 static const char nothing_else_happens[] = "
\82µ
\82©
\82µ
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D
\81D
\81D";
4382 register int i, x, y;
4383 register struct monst *mon;
4385 boolean affects_objects;
4386 boolean shop_damage = FALSE;
4387 boolean fillmsg = FALSE;
4388 int expltype = EXPL_MAGICAL;
4389 char confirm[QBUFSZ], buf[BUFSZ];
4391 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
4393 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "
\83o
\83\8b\83T
\82Ì
\8fñ"));
4396 if (!paranoid_query(ParanoidBreakwand,
4398 "Are you really sure you want to break ",
4399 "?", obj, yname, ysimple_name, "the wand")))
4401 if (!paranoid_query(ParanoidBreakwand,
4403 "
\96{
\93\96\82É", "
\82ð
\89ó
\82·
\82Ì
\81H",
4404 obj, xname, ysimple_name, "
\8fñ")))
4408 if (nohands(youmonst.data)) {
4410 You_cant("break %s without hands!", yname(obj));
4412 You("
\8eè
\82ª
\96³
\82¢
\82Ì
\82Å%s
\82ð
\89ó
\82¹
\82È
\82¢
\81I", xname(obj));
4414 } else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
4416 You("don't have the strength to break %s!", yname(obj));
4418 You("%s
\82ð
\89ó
\82·
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I", xname(obj));
4422 pline("Raising %s high above your %s, you %s it in two!", yname(obj),
4423 body_part(HEAD), is_fragile ? "snap" : "break");
4425 pline("%s
\82ð%s
\82Ì
\8fã
\82É
\8d\82\82
\8cf
\82°
\81C
\93ñ
\82Â
\82É
\82Ö
\82µ
\90Ü
\82Á
\82½
\81I", yname(obj),
4429 /* [ALI] Do this first so that wand is removed from bill. Otherwise,
4430 * the freeinv() below also hides it from setpaid() which causes problems.
4433 check_unpaid(obj); /* Extra charge for use */
4434 costly_alteration(obj, COST_DSTROY);
4437 current_wand = obj; /* destroy_item might reset this */
4438 freeinv(obj); /* hide it from destroy_item instead... */
4439 setnotworn(obj); /* so we need to do this ourselves */
4441 if (!zappable(obj)) {
4442 pline(nothing_else_happens);
4443 goto discard_broken_wand;
4445 /* successful call to zappable() consumes a charge; put it back */
4447 /* might have "wrested" a final charge, taking it from 0 to -1;
4448 if so, we just brought it back up to 0, which wouldn't do much
4449 below so give it 1..3 charges now, usually making it stronger
4450 than an ordinary last charge (the wand is already gone from
4451 inventory, so perm_invent can't accidentally reveal this) */
4458 affects_objects = FALSE;
4460 switch (obj->otyp) {
4465 case WAN_ENLIGHTENMENT:
4467 case WAN_SECRET_DOOR_DETECTION:
4468 pline(nothing_else_happens);
4469 goto discard_broken_wand;
4475 expltype = EXPL_FIERY;
4478 if (expltype == EXPL_MAGICAL)
4479 expltype = EXPL_FROSTY;
4482 case WAN_MAGIC_MISSILE:
4484 explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
4485 makeknown(obj->otyp); /* explode describes the effect */
4486 goto discard_broken_wand;
4488 /* we want this before the explosion instead of at the very end */
4490 pline("A wall of force smashes down around you!");
4492 pline("
\82 \82È
\82½
\82Í
\96\82\97Í
\82Ì
\95Ç
\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81I");
4493 dmg = d(1 + obj->spe, 6); /* normally 2d12 */
4495 case WAN_CANCELLATION:
4497 case WAN_TELEPORTATION:
4498 case WAN_UNDEAD_TURNING:
4499 affects_objects = TRUE;
4505 /* magical explosion and its visual effect occur before specific effects
4507 /* [TODO? This really ought to prevent the explosion from being
4508 fatal so that we never leave a bones file where none of the
4509 surrounding targets (or underlying objects) got affected yet.] */
4510 explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS,
4513 /* prepare for potential feedback from polymorph... */
4516 /* this makes it hit us last, so that we can see the action first */
4517 for (i = 0; i <= 8; i++) {
4518 bhitpos.x = x = obj->ox + xdir[i];
4519 bhitpos.y = y = obj->oy + ydir[i];
4523 if (obj->otyp == WAN_DIGGING) {
4526 if (dig_check(BY_OBJECT, FALSE, x, y)) {
4527 if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) {
4528 /* normally, pits and holes don't anger guards, but they
4529 * do if it's a wall or door that's being dug */
4530 watch_dig((struct monst *) 0, x, y, TRUE);
4531 if (*in_rooms(x, y, SHOPBASE))
4535 * Let liquid flow into the newly created pits.
4536 * Adjust corresponding code in music.c for
4537 * drum of earthquake if you alter this sequence.
4539 typ = fillholetyp(x, y, FALSE);
4541 levl[x][y].typ = typ, levl[x][y].flags = 0;
4542 liquid_flow(x, y, typ, t_at(x, y),
4546 : "Some holes are quickly filled with %s!");
4548 : "
\8c\8a\82Í
\82·
\82®
\82É%s
\82Å
\96\84\82Ü
\82Á
\82½
\81I");
4551 digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3
4552 || (!Can_dig_down(&u.uz)
4553 && !levl[x][y].candig))
4558 } else if (obj->otyp == WAN_CREATE_MONSTER) {
4559 /* u.ux,u.uy creates it near you--x,y might create it in rock */
4560 (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS);
4562 } else if (x != u.ux || y != u.uy) {
4564 * Wand breakage is targetting a square adjacent to the hero,
4565 * which might contain a monster or a pile of objects or both.
4566 * Handle objects last; avoids having undead turning raise an
4567 * undead's corpse and then attack resulting undead monster.
4568 * obj->bypass in bhitm() prevents the polymorphing of items
4569 * dropped due to monster's polymorph and prevents undead
4570 * turning that kills an undead from raising resulting corpse.
4572 if ((mon = m_at(x, y)) != 0) {
4573 (void) bhitm(mon, obj);
4574 /* if (context.botl) bot(); */
4576 if (affects_objects && level.objects[x][y]) {
4577 (void) bhitpile(obj, bhito, x, y, 0);
4579 bot(); /* potion effects */
4583 * Wand breakage is targetting the hero. Using xdir[]+ydir[]
4584 * deltas for location selection causes this case to happen
4585 * after all the surrounding squares have been handled.
4586 * Process objects first, in case damage is fatal and leaves
4587 * bones, or teleportation sends one or more of the objects to
4588 * same destination as hero (lookhere/autopickup); also avoids
4589 * the polymorphing of gear dropped due to hero's transformation.
4590 * (Unlike with monsters being hit by zaps, we can't rely on use
4591 * of obj->bypass in the zap code to accomplish that last case
4592 * since it's also used by retouch_equipment() for polyself.)
4594 if (affects_objects && level.objects[x][y]) {
4595 (void) bhitpile(obj, bhito, x, y, 0);
4597 bot(); /* potion effects */
4599 damage = zapyourself(obj, FALSE);
4602 Sprintf(buf, "killed %sself by breaking a wand", uhim());
4603 losehp(Maybe_Half_Phys(damage), buf, NO_KILLER_PREFIX);
4605 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82Å
\8fñ
\82ð
\89ó
\82µ
\82Ä
\83_
\83\81\81[
\83W
\82ð
\8eó
\82¯");
4606 losehp(Maybe_Half_Phys(damage), buf, KILLED_BY);
4610 bot(); /* blindness */
4614 /* potentially give post zap/break feedback */
4617 /* Note: if player fell thru, this call is a no-op.
4618 Damage is handled in digactualhole in that case */
4621 pay_for_damage("dig into", FALSE);
4623 pay_for_damage("
\8c\8a\82ð
\82 \82¯
\82é", FALSE);
4625 if (obj->otyp == WAN_LIGHT)
4626 litroom(TRUE, obj); /* only needs to be done once */
4628 discard_broken_wand:
4629 obj = current_wand; /* [see dozap() and destroy_item()] */
4638 add_class(cl, class)
4649 static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 };
4651 /* augment tools[] if various items are carried */
4653 setapplyclasses(class_list)
4656 register struct obj *otmp;
4658 boolean knowoil, knowtouchstone, addpotions, addstones, addfood;
4660 knowoil = objects[POT_OIL].oc_name_known;
4661 knowtouchstone = objects[TOUCHSTONE].oc_name_known;
4662 addpotions = addstones = addfood = FALSE;
4663 for (otmp = invent; otmp; otmp = otmp->nobj) {
4666 || (otmp->oclass == POTION_CLASS
4668 || (!knowoil && !objects[otyp].oc_name_known))))
4670 if (otyp == TOUCHSTONE
4671 || (is_graystone(otmp)
4673 || (!knowtouchstone && !objects[otyp].oc_name_known))))
4675 if (otyp == CREAM_PIE || otyp == EUCALYPTUS_LEAF)
4679 class_list[0] = '\0';
4680 if (addpotions || addstones)
4681 add_class(class_list, ALL_CLASSES);
4682 Strcat(class_list, tools);
4684 add_class(class_list, POTION_CLASS);
4686 add_class(class_list, GEM_CLASS);
4688 add_class(class_list, FOOD_CLASS);
4691 /* the 'a' command */
4696 register int res = 1;
4697 char class_list[MAXOCLASSES + 2];
4699 if (check_capacity((char *) 0))
4702 setapplyclasses(class_list); /* tools[] */
4703 obj = getobj(class_list, "use or apply");
4707 if (!retouch_object(&obj, FALSE))
4708 return 1; /* evading your grasp costs a turn; just be
4709 grateful that you don't drop it as well */
4711 if (obj->oclass == WAND_CLASS)
4712 return do_break_wand(obj);
4714 switch (obj->otyp) {
4717 if (obj == ublindf) {
4720 } else if (!ublindf) {
4724 You("are already %s.", ublindf->otyp == TOWEL
4725 ? "covered by a towel"
4726 : ublindf->otyp == BLINDFOLD
4727 ? "wearing a blindfold"
4728 : "wearing lenses");
4730 You("
\82à
\82¤%s
\82Ä
\82¢
\82é
\81D", ublindf->otyp == TOWEL
4731 ? "
\83^
\83I
\83\8b\82ð
\8aª
\82¢"
4732 : ublindf->otyp == BLINDFOLD
4733 ? "
\96Ú
\89B
\82µ
\82ð
\82Â
\82¯"
4734 : "
\83\8c\83\93\83Y
\82ð
\82Â
\82¯");
4739 res = use_cream_pie(obj);
4742 res = use_whip(obj);
4744 case GRAPPLING_HOOK:
4745 res = use_grapple(obj);
4751 case BAG_OF_HOLDING:
4753 res = use_container(&obj, 1, FALSE);
4756 (void) bagotricks(obj, FALSE, (int *) 0);
4764 res = (pick_lock(obj) != 0);
4767 case DWARVISH_MATTOCK:
4768 res = use_pick_axe(obj);
4771 use_tinning_kit(obj);
4774 res = use_leash(obj);
4777 res = use_saddle(obj);
4780 use_magic_whistle(obj);
4785 case EUCALYPTUS_LEAF:
4786 /* MRKR: Every Australian knows that a gum leaf makes an excellent
4787 * whistle, especially if your pet is a tame kangaroo named Skippy.
4790 use_magic_whistle(obj);
4791 /* sometimes the blessing will be worn off */
4795 pline("%s %s.", Yobjnam2(obj, "glow"), hcolor("brown"));
4797 pline("%s
\82Í%s
\8bP
\82¢
\82½
\81D", xname(obj), jconj_adj(hcolor("
\92\83\90F
\82Ì")));
4807 res = use_stethoscope(obj);
4810 res = use_mirror(obj);
4813 case BELL_OF_OPENING:
4816 case CANDELABRUM_OF_INVOCATION:
4817 use_candelabrum(obj);
4829 light_cocktail(&obj);
4831 case EXPENSIVE_CAMERA:
4832 res = use_camera(obj);
4835 res = use_towel(obj);
4838 use_crystal_ball(&obj);
4844 res = use_tin_opener(obj);
4850 use_unicorn_horn(obj);
4861 case DRUM_OF_EARTHQUAKE:
4862 res = do_play_instrument(obj);
4864 case HORN_OF_PLENTY: /* not a musical instrument */
4865 (void) hornoplenty(obj, FALSE);
4878 /* Pole-weapons can strike at a distance */
4880 res = use_pole(obj);
4882 } else if (is_pick(obj) || is_axe(obj)) {
4883 res = use_pick_axe(obj);
4887 pline("Sorry, I don't know how to use that.");
4889 pline("
\82»
\82ê
\82ð
\82Ç
\82¤
\82â
\82Á
\82Ä
\8eg
\82¤
\82ñ
\82¾
\82¢
\81H");
4893 if (res && obj && obj->oartifact)
4899 /* Keep track of unfixable troubles for purposes of messages saying you feel
4903 unfixable_trouble_count(is_horn)
4906 int unfixable_trbl = 0;
4912 if (Wounded_legs && !u.usteed)
4916 /* lycanthropy is undesirable, but it doesn't actually make you feel bad */
4918 if (!is_horn || (Confusion & ~TIMEOUT))
4920 if (!is_horn || (Sick & ~TIMEOUT))
4922 if (!is_horn || (HHallucination & ~TIMEOUT))
4924 if (!is_horn || (Vomiting & ~TIMEOUT))
4926 if (!is_horn || (HStun & ~TIMEOUT))
4928 if (!is_horn || (HDeaf & ~TIMEOUT))
4931 return unfixable_trbl;