1 /* NetHack 3.6 apply.c $NHDT-Date: 1573778560 2019/11/15 00:42:40 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.284 $ */
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-2023 */
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) {
133 old = (Glib & TIMEOUT);
134 make_glib((int) old + rn1(10, 3)); /* + 3..12 */
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.",
201 !uarmg ? makeplural(body_part(HAND)) : gloves_simple_name(uarmg));
203 You("%s
\82ð
\90@
\82¢
\82½
\81D",
204 !uarmg ? makeplural(body_part(HAND)) : gloves_simple_name(uarmg));
206 if (is_wet_towel(obj))
207 dry_a_towel(obj, -1, drying_feedback);
209 } else if (u.ucreamed) {
210 Blinded -= u.ucreamed;
214 pline("You've got the glop off.");
216 You("
\82³
\82Á
\82Ï
\82è
\82µ
\82½
\81D");
217 if (!gulp_blnd_check()) {
219 make_blinded(0L, TRUE);
223 Your("%s feels clean now.", body_part(FACE));
225 pline("%s
\82Ì
\89\98\82ê
\82ð
\90@
\82«
\82Æ
\82Á
\82½
\81D", body_part(FACE));
227 if (is_wet_towel(obj))
228 dry_a_towel(obj, -1, drying_feedback);
233 Your("%s and %s are already clean.", body_part(FACE),
234 makeplural(body_part(HAND)));
236 Your("%s
\82â%s
\82Í
\89\98\82ê
\82Ä
\82¢
\82È
\82¢
\81D", body_part(FACE),
237 makeplural(body_part(HAND)));
243 /* maybe give a stethoscope message based on floor objects */
245 its_dead(rx, ry, resp)
250 boolean more_corpses;
251 struct permonst *mptr;
253 struct obj *corpse = sobj_at(CORPSE, rx, ry),
254 *statue = sobj_at(STATUE, rx, ry);
256 if (!can_reach_floor(TRUE)) { /* levitation or unskilled riding */
257 corpse = 0; /* can't reach corpse on floor */
258 /* you can't reach tiny statues (even though you can fight
259 tiny monsters while levitating--consistency, what's that?) */
260 while (statue && mons[statue->corpsenm].msize == MZ_TINY)
261 statue = nxtobj(statue, STATUE, TRUE);
263 /* when both corpse and statue are present, pick the uppermost one */
264 if (corpse && statue) {
265 if (nxtobj(statue, CORPSE, TRUE) == corpse)
266 corpse = 0; /* corpse follows statue; ignore it */
268 statue = 0; /* corpse precedes statue; ignore statue */
271 more_corpses = (corpse && nxtobj(corpse, CORPSE, TRUE));
274 /* additional stethoscope messages from jyoung@apanix.apana.org.au */
275 if (!corpse && !statue) {
276 ; /* nothing to do */
278 } else if (Hallucination) {
282 Strcpy(buf, "You're both stoned");
284 Strcpy(buf, "
\90Î
\82¾");
285 #if 0 /*JP*//*
\91ã
\96¼
\8e\8c\8f\88\97\9d\82Í
\95s
\97v*/
286 } else if (corpse->quan == 1L && !more_corpses) {
287 int gndr = 2; /* neuter: "it" */
288 struct monst *mtmp = get_mtraits(corpse, FALSE);
290 /* (most corpses don't retain the monster's sex, so
291 we're usually forced to use generic pronoun here) */
293 mptr = mtmp->data = &mons[mtmp->mnum];
294 /* TRUE: override visibility check--it's not on the map */
295 gndr = pronoun_gender(mtmp, TRUE);
297 mptr = &mons[corpse->corpsenm];
300 else if (is_male(mptr))
303 Sprintf(buf, "%s's dead", genders[gndr].he); /* "he"/"she"/"it" */
304 buf[0] = highc(buf[0]);
306 } else { /* plural */
308 Strcpy(buf, "They're dead");
310 Strcpy(buf, "
\8e\80\82ñ
\82Å
\82é
\82º");
312 /* variations on "He's dead, Jim." (Star Trek's Dr McCoy) */
314 You_hear("a voice say, \"%s, Jim.\"", buf);
316 You_hear("
\81u
\82»
\82¢
\82Â
\82Í%s
\81C
\83W
\83\80\81v
\82Æ
\82¢
\82¤
\90º
\82ª
\95·
\82±
\82¦
\82½
\81D", buf);
322 boolean here = (rx == u.ux && ry == u.uy),
323 one = (corpse->quan == 1L && !more_corpses), reviver = FALSE;
325 boolean here = (rx == u.ux && ry == u.uy), reviver = FALSE;
327 int visglyph, corpseglyph;
329 visglyph = glyph_at(rx, ry);
330 corpseglyph = obj_to_glyph(corpse, rn2);
332 if (Blind && (visglyph != corpseglyph))
333 map_object(corpse, TRUE);
335 if (Role_if(PM_HEALER)) {
336 /* ok to reset `corpse' here; we're done with it */
338 if (obj_has_timer(corpse, REVIVE_MON))
341 corpse = nxtobj(corpse, CORPSE, TRUE);
342 } while (corpse && !reviver);
345 You("determine that %s unfortunate being%s %s%s dead.",
346 one ? (here ? "this" : "that") : (here ? "these" : "those"),
347 one ? "" : "s", one ? "is" : "are", reviver ? " mostly" : "");
349 You("%s
\95s
\8dK
\82È
\90¶
\82«
\95¨
\82Í%s
\8e\80\82ñ
\82Å
\82¢
\82é
\82Æ
\8c\8b\98_
\82µ
\82½
\81D",
350 here ? "
\82±
\82Ì" : "
\82»
\82Ì",
351 reviver ? "
\82Ù
\82Ú" : "");
355 } else { /* statue */
356 const char *what, *how;
359 mptr = &mons[statue->corpsenm];
360 if (Blind) { /* ignore statue->dknown; it'll always be set */
361 Sprintf(buf, "%s %s",
362 (rx == u.ux && ry == u.uy) ? "This" : "That",
363 humanoid(mptr) ? "person" : "creature");
367 if (!type_is_pname(mptr))
370 #else /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\83V
\83\93\83v
\83\8b\82É*/
371 if (Blind) { /* ignore statue->dknown; it'll always be set */
372 what = (rx == u.ux && ry == u.uy) ? "
\82±
\82ê" : "
\82 \82ê";
374 what = mons[statue->corpsenm].mname;
381 if (Role_if(PM_HEALER)) {
382 struct trap *ttmp = t_at(rx, ry);
384 if (ttmp && ttmp->ttyp == STATUE_TRAP)
386 how = "extraordinary";
388 how = "
\95À
\8aO
\82ê
\82½";
389 else if (Has_contents(statue))
393 how = "
\92\8d\96Ú
\82·
\82×
\82«";
397 pline("%s is in %s health for a statue.", what, how);
399 pline("
\92¤
\91\9c\82Æ
\82µ
\82Ä
\82Ì%s
\82Í%s
\8dì
\95i
\82¾
\81D", what, how);
402 return FALSE; /* no corpse or statue */
406 static const char hollow_str[] = "a hollow sound. This must be a secret %s!";
408 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";
410 /* Strictly speaking it makes no sense for usage of a stethoscope to
411 not take any time; however, unless it did, the stethoscope would be
412 almost useless. As a compromise, one use per turn is free, another
413 uses up the turn; this makes curse status have a tangible effect. */
416 register struct obj *obj;
421 boolean interference = (u.uswallow && is_whirly(u.ustuck->data)
422 && !rn2(Role_if(PM_HEALER) ? 10 : 3));
424 if (nohands(youmonst.data)) {
426 You("have no hands!"); /* not `body_part(HAND)' */
428 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I");
433 You_cant("hear anything!");
435 You("
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81I");
437 } else if (!freehand()) {
439 You("have no free %s.", body_part(HAND));
441 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81D", body_part(HAND));
444 if (!getdir((char *) 0))
447 res = (moves == context.stethoscope_move)
448 && (youmonst.movement == context.stethoscope_movement);
449 context.stethoscope_move = moves;
450 context.stethoscope_movement = youmonst.movement;
452 bhitpos.x = u.ux, bhitpos.y = u.uy; /* tentative, reset below */
453 notonhead = u.uswallow;
454 if (u.usteed && u.dz > 0) {
457 pline("%s interferes.", Monnam(u.ustuck));
459 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
460 mstatusline(u.ustuck);
462 mstatusline(u.usteed);
464 } else if (u.uswallow && (u.dx || u.dy || u.dz)) {
465 mstatusline(u.ustuck);
467 } else if (u.uswallow && interference) {
469 pline("%s interferes.", Monnam(u.ustuck));
471 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
472 mstatusline(u.ustuck);
477 You_hear("faint splashing.");
479 You_hear("
\82©
\82·
\82©
\82É
\83o
\83V
\83\83\83o
\83V
\83\83\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
480 else if (u.dz < 0 || !can_reach_floor(TRUE))
481 cant_reach_floor(u.ux, u.uy, (u.dz < 0), TRUE);
482 else if (its_dead(u.ux, u.uy, &res))
483 ; /* message already given */
484 else if (Is_stronghold(&u.uz))
486 You_hear("the crackling of hellfire.");
488 You_hear("
\92n
\8d\96\82Ì
\89\8a\82ª
\83p
\83`
\83p
\83`
\94R
\82¦
\82Ä
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
491 pline_The("%s seems healthy enough.", surface(u.ux, u.uy));
493 pline("%s
\82Í
\8f[
\95ª
\8c\92\8dN
\82Ì
\82æ
\82¤
\82¾
\81D", surface(u.ux,u.uy));
495 } else if (obj->cursed && !rn2(2)) {
497 You_hear("your heart beat.");
499 You_hear("
\8e©
\95ª
\82Ì
\90S
\91\9f\82Ì
\8cÛ
\93®
\82ð
\95·
\82¢
\82½
\81D");
502 if (Stunned || (Confusion && !rn2(5)))
504 if (!u.dx && !u.dy) {
512 You_hear("a faint typing noise.");
514 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");
517 if ((mtmp = m_at(rx, ry)) != 0) {
518 const char *mnm = x_monnam(mtmp, ARTICLE_A, (const char *) 0,
519 SUPPRESS_IT | SUPPRESS_INVISIBLE, FALSE);
521 /* bhitpos needed by mstatusline() iff mtmp is a long worm */
522 bhitpos.x = rx, bhitpos.y = ry;
523 notonhead = (mtmp->mx != rx || mtmp->my != ry);
525 if (mtmp->mundetected) {
526 if (!canspotmon(mtmp))
528 There("is %s hidden there.", mnm);
530 pline("
\82±
\82±
\82É%s
\82ª
\89B
\82ê
\82Ä
\82¢
\82é
\81D", mnm);
531 mtmp->mundetected = 0;
532 newsym(mtmp->mx, mtmp->my);
533 } else if (mtmp->mappearance) {
535 const char *what = "thing";
537 const char *what = "
\95¨
\91Ì";
538 #if 0 /*JP*//*unused*/
539 boolean use_plural = FALSE;
541 struct obj dummyobj, *odummy;
543 switch (M_AP_TYPE(mtmp)) {
546 * we should probably be using object_from_map() here
548 odummy = init_dummyobj(&dummyobj, mtmp->mappearance, 1L);
549 /* simple_typename() yields "fruit" for any named fruit;
550 we want the same thing '//' or ';' shows: "slime mold"
551 or "grape" or "slice of pizza" */
552 if (odummy->otyp == SLIME_MOLD
553 && has_mcorpsenm(mtmp) && MCORPSENM(mtmp) != NON_PM) {
554 odummy->spe = MCORPSENM(mtmp);
555 what = simpleonames(odummy);
557 what = simple_typename(odummy->otyp);
560 use_plural = (is_boots(odummy) || is_gloves(odummy)
561 || odummy->otyp == LENSES);
564 case M_AP_MONSTER: /* ignore Hallucination here */
565 what = mons[mtmp->mappearance].mname;
568 what = defsyms[mtmp->mappearance].explanation;
573 pline("%s %s %s really %s.",
574 use_plural ? "Those" : "That", what,
575 use_plural ? "are" : "is", mnm);
577 pline("
\82±
\82Ì%s
\82Í
\8eÀ
\8dÛ
\82É
\82Í%s
\81D", what, mnm);
579 } else if (flags.verbose && !canspotmon(mtmp)) {
581 There("is %s there.", mnm);
583 pline("
\82±
\82±
\82É
\82Í%s
\82ª
\82¢
\82é
\81D", mnm);
587 if (!canspotmon(mtmp))
588 map_invisible(rx, ry);
591 if (unmap_invisible(rx,ry))
593 pline_The("invisible monster must have moved.");
595 pline_The("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82Í
\88Ú
\93®
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
601 You_hear(hollow_str, "door");
603 You_hear(hollow_str, "
\94à");
604 cvt_sdoor_to_door(lev); /* ->typ = DOOR */
609 You_hear(hollow_str, "passage");
611 You_hear(hollow_str, "
\92Ê
\98H");
612 lev->typ = CORR, lev->flags = 0;
613 unblock_point(rx, ry);
618 if (!its_dead(rx, ry, &res))
620 You("hear nothing special."); /* not You_hear() */
622 pline("
\93Á
\82É
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81D");
628 static const char whistle_str[] = "produce a %s whistling sound.",
629 alt_whistle_str[] = "produce a %s, sharp vibration.";
631 static const char whistle_str[] = "
\93J
\82ð
\90\81\82¢
\82Ä%s
\89¹
\82ð
\82½
\82Ä
\82½
\81D",
632 /*JP:TODO:
\89¹
\82Æ
\90U
\93®
\82ð
\8d\87\82í
\82¹
\82é*/
633 alt_whistle_str[] = "
\93J
\82ð
\90\81\82¢
\82Ä
\90U
\93®
\82ð
\82¨
\82±
\82µ
\82½
\81D";
640 if (!can_blow(&youmonst)) {
642 You("are incapable of using the whistle.");
644 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
645 } else if (Underwater) {
647 You("blow bubbles through %s.", yname(obj));
649 You("%s
\82ð
\92Ê
\82µ
\82Ä
\96A
\82ð
\8fo
\82µ
\82½
\81D", xname(obj));
653 You_feel("rushing air tickle your %s.", body_part(NOSE));
655 You_feel("
\8bó
\8bC
\82Ì
\97¬
\82ê
\82ª%s
\82ð
\82
\82·
\82®
\82Á
\82½
\81D", body_part(NOSE));
658 You(whistle_str, obj->cursed ? "shrill" : "high");
660 You(whistle_str, obj->cursed ? "
\95s
\8bC
\96¡
\82È" : "
\82©
\82ñ
\8d\82\82¢");
668 use_magic_whistle(obj)
671 register struct monst *mtmp, *nextmon;
673 if (!can_blow(&youmonst)) {
675 You("are incapable of using the whistle.");
677 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
678 } else if (obj->cursed && !rn2(2)) {
680 You("produce a %shigh-%s.", Underwater ? "very " : "",
681 Deaf ? "frequency vibration" : "pitched humming noise");
683 You("%s%s
\81D", Underwater ? "
\82Æ
\82Ä
\82à" : "",
684 Deaf ? "
\8d\82\8eü
\94g
\82Ì
\90U
\93®
\82ð
\8bN
\82±
\82µ
\82½" : "
\8d\82\82¢
\92²
\8eq
\82Ì
\82¤
\82È
\82é
\82æ
\82¤
\82È
\89¹
\82ð
\82½
\82Ä
\82½");
688 int pet_cnt = 0, omx, omy;
690 /* it's magic! it works underwater too (at a higher pitch) */
692 You(Deaf ? alt_whistle_str : whistle_str,
693 Hallucination ? "normal"
694 : (Underwater && !Deaf) ? "strange, high-pitched"
697 You(Deaf ? alt_whistle_str : whistle_str,
698 Hallucination ? "
\93J
\82Ì
\82æ
\82¤
\82È"
699 : (Underwater && !Deaf) ? "
\95s
\8ev
\8bc
\82È
\8d\82\82¢
\92²
\8eq
\82Ì"
700 : "
\95s
\8ev
\8bc
\82È");
702 for (mtmp = fmon; mtmp; mtmp = nextmon) {
703 nextmon = mtmp->nmon; /* trap might kill mon */
704 if (DEADMONSTER(mtmp))
706 /* steed is already at your location, so not affected;
707 this avoids trap issues if you're on a trap location */
708 if (mtmp == u.usteed)
711 if (mtmp->mtrapped) {
712 /* no longer in previous trap (affects mintrap) */
714 fill_pit(mtmp->mx, mtmp->my);
716 /* mimic must be revealed before we know whether it
717 actually moves because line-of-sight may change */
720 omx = mtmp->mx, omy = mtmp->my;
722 if (mtmp->mx != omx || mtmp->my != omy) {
723 mtmp->mundetected = 0; /* reveal non-mimic hider */
724 if (canspotmon(mtmp))
726 if (mintrap(mtmp) == 2)
732 makeknown(obj->otyp);
740 return (boolean) (abs(u.ux - x) > n || abs(u.uy - y) > n);
749 for (obj = invent; obj; obj = obj->nobj)
750 if (obj->otyp == LEASH && obj->leashmon != 0)
755 /* otmp is about to be destroyed or stolen */
758 register struct obj *otmp;
760 register struct monst *mtmp;
762 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
763 if (mtmp->m_id == (unsigned) otmp->leashmon)
768 /* mtmp is about to die, or become untame */
770 m_unleash(mtmp, feedback)
771 register struct monst *mtmp;
774 register struct obj *otmp;
779 pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp));
781 pline("%s
\82Í
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82Ä
\93¦
\82ê
\82½
\81I", Monnam(mtmp));
784 Your("leash falls slack.");
786 Your("
\95R
\82ª
\82½
\82é
\82ñ
\82Å
\97\8e\82¿
\82½
\81D");
788 for (otmp = invent; otmp; otmp = otmp->nobj)
789 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id) {
796 /* player is about to die (for bones) */
800 register struct obj *otmp;
801 register struct monst *mtmp;
803 for (otmp = invent; otmp; otmp = otmp->nobj)
804 if (otmp->otyp == LEASH)
806 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
816 return (boolean) (mtmp->mnum != PM_LONG_WORM
817 && !unsolid(mtmp->data)
818 && (!nolimbs(mtmp->data) || has_head(mtmp->data)));
831 /* if the leash isn't in use, assume we're trying to leash
832 the engulfer; if it is use, distinguish between removing
833 it from the engulfer versus from some other creature
834 (note: the two in-use cases can't actually occur; all
835 leashes are released when the hero gets engulfed) */
837 You_cant((!obj->leashmon
838 ? "leash %s from inside."
839 : (obj->leashmon == (int) u.ustuck->m_id)
840 ? "unleash %s from inside."
841 : "unleash anything from inside %s."),
842 noit_mon_nam(u.ustuck));
844 You_cant((!obj->leashmon
845 ? "
\93à
\91¤
\82©
\82ç%s
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"
846 : (obj->leashmon == (int) u.ustuck->m_id)
847 ? "
\93à
\91¤
\82©
\82ç%s
\82ð
\8aO
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"
848 : "%s
\82Ì
\93à
\91¤
\82©
\82ç
\8aO
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"),
849 noit_mon_nam(u.ustuck));
853 if (!obj->leashmon && number_leashed() >= MAXLEASHED) {
855 You("cannot leash any more pets.");
857 You("
\82±
\82ê
\88È
\8fã
\83y
\83b
\83g
\82É
\95R
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
861 if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
864 if (cc.x == u.ux && cc.y == u.uy) {
865 if (u.usteed && u.dz > 0) {
871 pline("Leash yourself? Very funny...");
873 pline("
\8e©
\95ª
\82ð
\94\9b\82é
\81H
\95Ï
\82È
\82Ì
\81D
\81D
\81D");
878 * From here on out, return value is 1 == a move is used.
881 if (!(mtmp = m_at(cc.x, cc.y))) {
883 There("is no creature there.");
885 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
886 (void) unmap_invisible(cc.x, cc.y);
890 spotmon = canspotmon(mtmp);
893 if (!spotmon && !glyph_is_invisible(levl[cc.x][cc.y].glyph)) {
894 /* for the unleash case, we don't verify whether this unseen
895 monster is the creature attached to the current leash */
897 You("fail to %sleash something.", obj->leashmon ? "un" : "");
899 You("%s
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D", obj->leashmon ? "
\8aO
\82·" : "
\8c\8b\82Ñ
\82Â
\82¯
\82é");
900 /* trying again will work provided the monster is tame
901 (and also that it doesn't change location by retry time) */
902 map_invisible(cc.x, cc.y);
903 } else if (!mtmp->mtame) {
905 pline("%s %s leashed!", Monnam(mtmp),
906 (!obj->leashmon) ? "cannot be" : "is not");
908 pline("%s
\82Í
\95R
\82Å%s
\81I", Monnam(mtmp),
909 (!obj->leashmon) ? "
\8c\8b\82×
\82È
\82¢" : "
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢");
911 } else if (!obj->leashmon) {
912 /* applying a leash which isn't currently in use */
913 if (mtmp->mleashed) {
915 pline("This %s is already leashed.",
916 spotmon ? l_monnam(mtmp) : "creature");
918 pline("%s
\82Í
\82·
\82Å
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D",
919 spotmon ? l_monnam(mtmp) : "
\89ö
\95¨");
921 } else if (unsolid(mtmp->data)) {
923 pline("The leash would just fall off.");
925 pline("
\95R
\82Í
\82»
\82Ì
\8fê
\82É
\97\8e\82¿
\82½
\81D");
926 } else if (nolimbs(mtmp->data) && !has_head(mtmp->data)) {
928 pline("%s has no extremities the leash would fit.",
930 pline("%s
\82É
\82Í
\95R
\82ð
\82Â
\82¯
\82ç
\82ê
\82»
\82¤
\82È
\82Æ
\82±
\82ë
\82ª
\82È
\82¢
\81D",
932 } else if (!leashable(mtmp)) {
934 pline("The leash won't fit onto %s%s.", spotmon ? "your " : "",
937 pline("
\95R
\82Í%s
\82É
\8d\87\82í
\82È
\82¢
\81D",
942 You("slip the leash around %s%s.", spotmon ? "your " : "",
945 You("%s
\82ð
\95R
\82Å
\8c\8b\82Ñ
\82Â
\82¯
\82½
\81D",
949 obj->leashmon = (int) mtmp->m_id;
953 /* applying a leash which is currently in use */
954 if (obj->leashmon != (int) mtmp->m_id) {
956 pline("This leash is not attached to that creature.");
958 pline("
\82±
\82Ì
\95R
\82Í
\82»
\82ê
\82É
\82Í
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢
\81D");
959 } else if (obj->cursed) {
961 pline_The("leash would not come off!");
963 pline("
\95R
\82ª
\82Í
\82¸
\82ê
\82È
\82¢
\81I");
969 You("remove the leash from %s%s.",
970 spotmon ? "your " : "", l_monnam(mtmp));
972 You("%s
\82©
\82ç
\95R
\82ð
\82Í
\82¸
\82µ
\82½
\81D",
980 /* assuming mtmp->mleashed has been checked */
989 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
993 return (struct obj *) 0;
999 register struct monst *mtmp;
1000 register struct obj *otmp;
1002 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1003 if (DEADMONSTER(mtmp))
1005 if (mtmp->mleashed) {
1006 if (distu(mtmp->mx, mtmp->my) > 2)
1008 if (distu(mtmp->mx, mtmp->my) > 2) {
1009 for (otmp = invent; otmp; otmp = otmp->nobj)
1010 if (otmp->otyp == LEASH
1011 && otmp->leashmon == (int) mtmp->m_id) {
1015 You_feel("%s leash go slack.",
1016 (number_leashed() > 1) ? "a" : "the");
1018 You("
\95R
\82ª
\82½
\82é
\82ñ
\82¾
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1026 /* no pack mules for the Amulet */
1027 if (u.usteed && mon_has_amulet(u.usteed))
1034 register xchar x, y;
1036 register struct obj *otmp;
1037 register struct monst *mtmp;
1039 for (otmp = invent; otmp; otmp = otmp->nobj) {
1040 if (otmp->otyp != LEASH || otmp->leashmon == 0)
1042 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1043 if (DEADMONSTER(mtmp))
1045 if ((int) mtmp->m_id == otmp->leashmon)
1049 impossible("leash in use isn't attached to anything?");
1053 if (dist2(u.ux, u.uy, mtmp->mx, mtmp->my)
1054 > dist2(x, y, mtmp->mx, mtmp->my)) {
1055 if (!um_dist(mtmp->mx, mtmp->my, 3)) {
1056 ; /* still close enough */
1057 } else if (otmp->cursed && !breathless(mtmp->data)) {
1058 if (um_dist(mtmp->mx, mtmp->my, 5)
1059 || (mtmp->mhp -= rnd(2)) <= 0) {
1060 long save_pacifism = u.uconduct.killer;
1063 Your("leash chokes %s to death!", mon_nam(mtmp));
1065 pline("%s
\82Í
\8di
\82ß
\8eE
\82³
\82ê
\82½
\81I",mon_nam(mtmp));
1066 /* hero might not have intended to kill pet, but
1067 that's the result of his actions; gain experience,
1068 lose pacifism, take alignment and luck hit, make
1069 corpse less likely to remain tame after revival */
1070 xkilled(mtmp, XKILL_NOMSG);
1071 /* life-saving doesn't ordinarily reset this */
1072 if (!DEADMONSTER(mtmp))
1073 u.uconduct.killer = save_pacifism;
1076 pline("%s is choked by the leash!", Monnam(mtmp));
1078 pline("%s
\82Í
\95R
\82Å
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82½
\81I", Monnam(mtmp));
1079 /* tameness eventually drops to 1 here (never 0) */
1080 if (mtmp->mtame && rn2(mtmp->mtame))
1084 if (um_dist(mtmp->mx, mtmp->my, 5)) {
1086 pline("%s leash snaps loose!", s_suffix(Monnam(mtmp)));
1088 pline("%s
\82Ì
\95R
\82Í
\83p
\83`
\83\93\82Æ
\8aO
\82ê
\82½
\81I", Monnam(mtmp));
1089 m_unleash(mtmp, FALSE);
1092 You("pull on the leash.");
1094 You("
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\81D");
1095 if (mtmp->data->msound != MS_SILENT)
1116 return ((ACURR(A_CHA) > 14)
1117 ? ((poly_gender() == 1)
1123 /*JP
\8cê
\8a²
\82Å
\8eg
\82¤ */
1131 static const char look_str[] = "look %s.";
1133 static const char look_str[] = "%s
\8c©
\82¦
\82é
\81D";
1139 const char *mirror, *uvisage;
1143 boolean vis, invis_mirror, useeit, monable;
1145 if (!getdir((char *) 0))
1147 invis_mirror = Invis;
1148 useeit = !Blind && (!invis_mirror || See_invisible);
1149 uvisage = beautiful();
1150 mirror = simpleonames(obj); /* "mirror" or "looking glass" */
1151 if (obj->cursed && !rn2(2)) {
1154 pline_The("%s fogs up and doesn't reflect!", mirror);
1156 pline("%s
\82Í
\93Ü
\82è
\81C
\89f
\82ç
\82È
\82
\82È
\82Á
\82½
\81I", mirror);
1159 if (!u.dx && !u.dy && !u.dz) {
1162 You_cant("see your %s %s.", uvisage, body_part(FACE));
1164 You_cant("
\8e©
\95ª
\82Ì%s
\82¢%s
\82ð
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", uvisage, body_part(FACE));
1166 if (u.umonnum == PM_FLOATING_EYE) {
1169 You("stiffen momentarily under your gaze.");
1171 pline("
\88ê
\8fu
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82½
\81D");
1175 pline("Yow! The %s stares back!", mirror);
1177 pline("
\82¨
\82ì
\81I%s
\82ª
\82 \82È
\82½
\82ð
\82É
\82ç
\82Ý
\95Ô
\82µ
\82½
\81I", mirror);
1180 pline("Yikes! You've frozen yourself!");
1182 pline("
\82¨
\82ì
\81I
\82 \82È
\82½
\82Í
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I");
1183 if (!Hallucination || !rn2(4)) {
1184 nomul(-rnd(MAXULEV + 6 - u.ulevel));
1186 multi_reason = "gazing into a mirror";
1188 multi_reason = "
\8b¾
\82É
\94½
\8eË
\82µ
\82½
\8e\8b\90ü
\82Å
\8dd
\92¼
\82µ
\82Ä
\82¢
\82é
\8aÔ
\82É";
1190 nomovemsg = 0; /* default, "you can move again" */
1192 } else if (youmonst.data->mlet == S_VAMPIRE)
1194 You("don't have a reflection.");
1196 You("
\8b¾
\82É
\89f
\82ç
\82È
\82©
\82Á
\82½
\81D");
1197 else if (u.umonnum == PM_UMBER_HULK) {
1199 pline("Huh? That doesn't look like you!");
1201 pline("
\82Ù
\82¦
\81H
\8eÊ
\82Á
\82Ä
\82é
\82Ì
\82Í
\82 \82È
\82½
\82¶
\82á
\82È
\82¢
\82Ý
\82½
\82¢
\82¾
\81I");
1202 make_confused(HConfusion + d(3, 4), FALSE);
1203 } else if (Hallucination)
1204 You(look_str, hcolor((char *) 0));
1207 You(look_str, "peaked");
1209 You(look_str, "
\8aç
\90F
\82ª
\88«
\82");
1210 else if (u.uhs >= WEAK)
1212 You(look_str, "undernourished");
1214 You(look_str, "
\89h
\97{
\8e¸
\92²
\82Ì
\82æ
\82¤
\82É");
1217 You("look as %s as ever.", uvisage);
1219 You("
\82 \82¢
\82©
\82í
\82ç
\82¸%s
\82
\8c©
\82¦
\82é
\81D", uvisage);
1226 You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)),
1227 mbodypart(u.ustuck, STOMACH));
1229 You("%s
\82Ì%s
\82ð
\89f
\82µ
\82½
\81D", mon_nam(u.ustuck),
1230 mbodypart(u.ustuck, STOMACH));
1237 You(Hallucination ? "give the fish a chance to fix their makeup."
1238 : "reflect the murky water.");
1240 You(Hallucination ? "
\8b\9b\82É
\89»
\8fÏ
\92¼
\82µ
\82Ì
\8b@
\89ï
\82ð
\97^
\82¦
\82½
\81D"
1241 : "
\82 \82È
\82½
\82Í
\97\84\82ñ
\82¾
\90\85\82ð
\89f
\82µ
\82½
\81D");
1248 You("reflect the %s.",
1250 You("%s
\82ð
\89f
\82µ
\82½
\81D",
1251 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
1254 mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM,
1255 (int FDECL((*), (MONST_P, OBJ_P))) 0,
1256 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1257 if (!mtmp || !haseyes(mtmp->data) || notonhead)
1260 /* couldsee(mtmp->mx, mtmp->my) is implied by the fact that bhit()
1261 targetted it, so we can ignore possibility of X-ray vision */
1262 vis = canseemon(mtmp);
1263 /* ways to directly see monster (excludes X-ray vision, telepathy,
1264 extended detection, type-specific warning) */
1265 #define SEENMON (MONSEEN_NORMAL | MONSEEN_SEEINVIS | MONSEEN_INFRAVIS)
1266 how_seen = vis ? howmonseen(mtmp) : 0;
1267 /* whether monster is able to use its vision-based capabilities */
1268 monable = !mtmp->mcan && (!mtmp->minvis || perceives(mtmp->data));
1269 mlet = mtmp->data->mlet;
1270 if (mtmp->msleeping) {
1273 pline("%s is too tired to look at your %s.", Monnam(mtmp),
1275 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),
1277 } else if (!mtmp->mcansee) {
1280 pline("%s can't see anything right now.", Monnam(mtmp));
1282 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\89½
\82à
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", Monnam(mtmp));
1283 } else if (invis_mirror && !perceives(mtmp->data)) {
1286 pline("%s fails to notice your %s.", Monnam(mtmp), mirror);
1288 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8bC
\95t
\82©
\82È
\82©
\82Á
\82½
\81D", Monnam(mtmp), mirror);
1289 /* infravision doesn't produce an image in the mirror */
1290 } else if ((how_seen & SEENMON) == MONSEEN_INFRAVIS) {
1291 if (vis) /* (redundant) */
1293 pline("%s is too far away to see %sself in the dark.",
1294 Monnam(mtmp), mhim(mtmp));
1296 pline("%s
\82Í
\88Ã
\88Å
\82Å
\8e©
\95ª
\8e©
\90g
\82ð
\8c©
\82é
\82É
\82Í
\89\93\82·
\82¬
\82é
\81D", Monnam(mtmp));
1298 /* some monsters do special things */
1299 } else if (mlet == S_VAMPIRE || mlet == S_GHOST || is_vampshifter(mtmp)) {
1302 pline("%s doesn't have a reflection.", Monnam(mtmp));
1304 pline("%s
\82Í%s
\82É
\89f
\82ç
\82È
\82¢
\81D", Monnam(mtmp), mirror);
1305 } else if (monable && mtmp->data == &mons[PM_MEDUSA]) {
1307 if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!"))
1309 if (mon_reflects(mtmp, "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81I"))
1313 pline("%s is turned to stone!", Monnam(mtmp));
1315 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1318 } else if (monable && mtmp->data == &mons[PM_FLOATING_EYE]) {
1319 int tmp = d((int) mtmp->m_lev, (int) mtmp->data->mattk[0].damd);
1324 pline("%s is frozen by its reflection.", Monnam(mtmp));
1326 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
1329 You_hear("%s stop moving.", something);
1331 You_hear("
\89½
\82©
\82ª
\93®
\82«
\82ð
\82Æ
\82ß
\82½
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1332 paralyze_monst(mtmp, (int) mtmp->mfrozen + tmp);
1333 } else if (monable && mtmp->data == &mons[PM_UMBER_HULK]) {
1336 pline("%s confuses itself!", Monnam(mtmp));
1338 pline("%s
\82Í
\8d¬
\97\90\82µ
\82½
\81I", Monnam(mtmp));
1340 } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
1341 || mtmp->data == &mons[PM_INCUBUS])) {
1343 char buf[BUFSZ]; /* "She" or "He" */
1346 pline("%s admires %sself in your %s.", Monnam(mtmp), mhim(mtmp),
1349 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\82¤
\82Á
\82Æ
\82è
\82µ
\82½
\81D", Monnam(mtmp));
1352 pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
1354 pline("%s
\82Í
\82»
\82ê
\82ð
\92D
\82Á
\82½
\81I", upstart(strcpy(buf, mhe(mtmp))));
1357 pline("It steals your %s!", mirror);
1359 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\93\90\82ñ
\82¾
\81I", mirror);
1360 setnotworn(obj); /* in case mirror was wielded */
1362 (void) mpickobj(mtmp, obj);
1363 if (!tele_restrict(mtmp))
1364 (void) rloc(mtmp, TRUE);
1365 } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
1366 && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
1367 boolean do_react = TRUE;
1369 if (mtmp->mfrozen) {
1372 You("discern no obvious reaction from %s.", mon_nam(mtmp));
1374 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));
1377 You_feel("a bit silly gesturing the mirror in that direction.");
1379 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");
1385 pline("%s is frightened by its reflection.", Monnam(mtmp));
1387 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\95|
\82ª
\82Á
\82½
\81D", Monnam(mtmp));
1388 monflee(mtmp, d(2, 4), FALSE, FALSE);
1390 } else if (!Blind) {
1391 if (mtmp->minvis && !See_invisible)
1393 else if ((mtmp->minvis && !perceives(mtmp->data))
1394 /* redundant: can't get here if these are true */
1395 || !haseyes(mtmp->data) || notonhead || !mtmp->mcansee)
1397 pline("%s doesn't seem to notice %s reflection.", Monnam(mtmp),
1400 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1404 pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp));
1406 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\96³
\8e\8b\82µ
\82½
\81D", Monnam(mtmp));
1415 register struct obj *obj = *optr;
1417 boolean wakem = FALSE, learno = FALSE,
1418 ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe),
1420 (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy)
1421 && !On_stairs(u.ux, u.uy));
1424 You("ring %s.", the(xname(obj)));
1426 You("%s
\82ð
\96Â
\82ç
\82µ
\82½
\81D", the(xname(obj)));
1428 if (Underwater || (u.uswallow && ordinary)) {
1430 amii_speaker(obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME);
1433 pline("But the sound is muffled.");
1435 pline("
\82µ
\82©
\82µ
\89¹
\82Í
\82©
\82«
\8fÁ
\82³
\82ê
\82½
\81D");
1437 } else if (invoking && ordinary) {
1438 /* needs to be recharged... */
1440 pline("But it makes no sound.");
1442 pline("
\82µ
\82©
\82µ
\81C
\89¹
\82Í
\96Â
\82ç
\82È
\82©
\82Á
\82½
\81D");
1443 learno = TRUE; /* help player figure out why */
1445 } else if (ordinary) {
1447 amii_speaker(obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME);
1449 if (obj->cursed && !rn2(4)
1450 /* note: once any of them are gone, we stop all of them */
1451 && !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE)
1452 && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE)
1453 && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE)
1454 && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT))
1457 You("summon %s!", a_monnam(mtmp));
1459 You("%s
\82ð
\8f¢
\8a«
\82µ
\82½
\81I", a_monnam(mtmp));
1460 if (!obj_resists(obj, 93, 100)) {
1462 pline("%s shattered!", Tobjnam(obj, "have"));
1464 pline("%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81I", xname(obj));
1472 mon_adjust_speed(mtmp, 2, (struct obj *) 0);
1474 case 2: /* no explanation; it just happens... */
1476 multi_reason = NULL;
1484 /* charged Bell of Opening */
1485 consume_obj_charge(obj, TRUE);
1491 pline1(nothing_happens);
1493 } else if (obj->cursed) {
1498 mkundead(&mm, FALSE, NO_MINVENT);
1501 } else if (invoking) {
1503 pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue"));
1505 pline("%s
\82Í
\95s
\8bC
\96¡
\82È
\89s
\82¢
\89¹
\82ð
\8fo
\82µ
\82½
\81D
\81D
\81D", xname(obj));
1507 amii_speaker(obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME);
1513 } else if (obj->blessed) {
1517 amii_speaker(obj, "ahahahDhEhCw", AMII_SOFT_VOLUME);
1522 } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1523 buried_ball_to_freedom();
1529 pline1(nothing_happens);
1533 pline("%s opens...", Something);
1535 pline("
\89½
\82©
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1540 pline("Things open around you...");
1542 pline("
\82Ü
\82í
\82è
\82Ì
\95¨
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1547 } else { /* uncursed */
1549 amii_speaker(obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME);
1554 pline1(nothing_happens);
1557 } /* charged BofO */
1560 makeknown(BELL_OF_OPENING);
1568 use_candelabrum(obj)
1569 register struct obj *obj;
1571 #if 0 /*JP*//* not used */
1572 const char *s = (obj->spe != 1) ? "candles" : "candle";
1577 You("snuff the %s.", s);
1579 You("
\82ë
\82¤
\82»
\82
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1580 end_burn(obj, TRUE);
1583 if (obj->spe <= 0) {
1585 pline("This %s has no %s.", xname(obj), s);
1587 pline("
\82±
\82Ì%s
\82É
\82Í
\82ë
\82¤
\82»
\82
\82ª
\82È
\82¢
\81D", xname(obj));
1592 You("cannot make fire under water.");
1594 You("
\90\85\92\86\82Å
\89Î
\82ð
\82¨
\82±
\82¹
\82È
\82¢
\81D");
1597 if (u.uswallow || obj->cursed) {
1600 pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"),
1603 pline("
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\82µ
\82Î
\82ç
\82
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D");
1609 There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s,
1612 pline("%s
\82É
\82Í
\82½
\82Á
\82½%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82µ
\82©
\82È
\82¢
\81D",
1613 xname(obj), obj->spe);
1617 pline("%s lit. %s dimly.", obj->spe == 1 ? "It is" : "They are",
1618 Tobjnam(obj, "shine"));
1620 pline("%s
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s
\82Í
\82Ù
\82Ì
\82©
\82É
\8bP
\82¢
\82½
\81D",
1621 xname(obj), xname(obj));
1625 pline("%s's %s burn%s", The(xname(obj)), s,
1626 (Blind ? "." : " brightly!"));
1628 pline("%s
\82Ì
\82ë
\82¤
\82»
\82
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I", The(xname(obj)),
1629 (Blind ? "" : "
\96¾
\82é
\82"));
1632 if (!invocation_pos(u.ux, u.uy) || On_stairs(u.ux, u.uy)) {
1634 pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
1636 pline("
\82ë
\82¤
\82»
\82
\82Í
\82·
\82²
\82¢
\91¬
\82³
\82Å
\94R
\82¦
\8en
\82ß
\82½
\81I");
1637 /* this used to be obj->age /= 2, rounding down; an age of
1638 1 would yield 0, confusing begin_burn() and producing an
1639 unlightable, unrefillable candelabrum; round up instead */
1640 obj->age = (obj->age + 1L) / 2L;
1642 if (obj->spe == 7) {
1645 pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
1647 pline("
\8aï
\96
\82È
\92g
\82©
\82³
\82ð%s
\82É
\8a´
\82¶
\82½
\81I", xname(obj));
1650 pline("%s with a strange light!", Tobjnam(obj, "glow"));
1652 pline("%s
\82Í
\8aï
\96
\82È
\8cõ
\82ð
\94
\82µ
\82Ä
\82¢
\82é
\81I", xname(obj));
1656 begin_burn(obj, FALSE);
1663 register struct obj *obj = *optr;
1664 register struct obj *otmp;
1666 const char *s = (obj->quan != 1) ? "candles" : "candle";
1668 const char *s = "
\82ë
\82¤
\82»
\82";
1669 char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
1676 otmp = carrying(CANDELABRUM_OF_INVOCATION);
1677 if (!otmp || otmp->spe == 7) {
1682 /*JP:
\8dÅ
\8fI
\93I
\82É
\82Í
\81u
\82ë
\82¤
\82»
\82
\82ð
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1683 /* first, minimal candelabrum suffix for formatting candles */
1685 Sprintf(qsfx, " to\033%s?", thesimpleoname(otmp));
1687 Sprintf(qsfx, "
\82ð\033%s
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", thesimpleoname(otmp));
1688 /* next, format the candles as a prefix for the candelabrum */
1690 (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1692 (void) safe_qbuf(qbuf, "", qsfx, obj, xname, thesimpleoname, s);
1693 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð\033
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1694 /* strip temporary candelabrum suffix */
1696 if ((q = strstri(qbuf, " to\033")) != 0)
1699 if ((q = strchr(qbuf, '\033')) != 0)
1701 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð
\81v*/
1703 /* last, format final "attach candles to candelabrum?" query */
1705 if (yn(safe_qbuf(qbuf, qbuf, "?", otmp, yname, thesimpleoname, "it"))
1707 if (yn(safe_qbuf(qbuf, qbuf, "
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", otmp, xname, thesimpleoname, "
\82»
\82ê"))
1712 if ((long) otmp->spe + obj->quan > 7L) {
1713 obj = splitobj(obj, 7L - (long) otmp->spe);
1714 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
1715 /* avoid a grammatical error if obj->quan gets
1716 reduced to 1 candle from more than one */
1717 s = (obj->quan != 1) ? "candles" : "candle";
1722 You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
1725 You("%ld
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ð%s%s
\82Ö
\8eæ
\82è
\82Â
\82¯
\82½
\81D",
1726 obj->quan, !otmp->spe ? "" : "
\82³
\82ç
\82É",
1729 if (!otmp->spe || otmp->age > obj->age)
1730 otmp->age = obj->age;
1731 otmp->spe += (int) obj->quan;
1732 if (otmp->lamplit && !obj->lamplit)
1734 pline_The("new %s magically %s!", s, vtense(s, "ignite"));
1736 pline("
\90V
\82µ
\82¢
\82ë
\82¤
\82»
\82
\82Í
\95s
\8ev
\8bc
\82È
\89\8a\82ð
\82 \82°
\82½
\81I");
1737 else if (!otmp->lamplit && obj->lamplit)
1739 pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
1741 pline("
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D");
1744 verbalize("You %s %s, you bought %s!",
1745 otmp->lamplit ? "burn" : "use",
1746 (obj->quan > 1L) ? "them" : "it",
1747 (obj->quan > 1L) ? "them" : "it");
1749 verbalize("
\89Î
\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1751 if (obj->quan < 7L && otmp->spe == 7)
1753 pline("%s now has seven%s candles attached.", The(xname(otmp)),
1754 otmp->lamplit ? " lit" : "");
1756 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",
1757 The(xname(otmp)), otmp->lamplit ? "
\89Î
\82Ì
\82Â
\82¢
\82½" : "");
1759 /* candelabrum's light range might increase */
1761 obj_merge_light_sources(otmp, otmp);
1762 /* candles are no longer a separate light source */
1764 end_burn(obj, TRUE);
1765 /* candles are now gone */
1767 /* candelabrum's weight is changing */
1768 otmp->owt = weight(otmp);
1773 /* call in drop, throw, and put in box, etc. */
1778 boolean candle = Is_candle(otmp);
1780 if ((candle || otmp->otyp == CANDELABRUM_OF_INVOCATION)
1784 #if 0 /*JP*//* not used */
1785 boolean many = candle ? (otmp->quan > 1L) : (otmp->spe > 1);
1788 (void) get_obj_location(otmp, &x, &y, 0);
1789 if (otmp->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1791 pline("%s%scandle%s flame%s extinguished.", Shk_Your(buf, otmp),
1792 (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"),
1793 (many ? "s are" : " is"));
1795 pline("%s%s
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, otmp),
1796 candle ? "" : "
\90C
\91ä
\82Ì");
1798 end_burn(otmp, TRUE);
1804 /* called when lit lamp is hit by water or put into a container or
1805 you've been swallowed by a monster; obj might be in transit while
1806 being thrown or dropped so don't assume that its location is valid */
1814 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1815 || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
1816 (void) get_obj_location(obj, &x, &y, 0);
1817 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1819 pline("%s %s out!", Yname2(obj), otense(obj, "go"));
1821 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", Yname2(obj));
1822 end_burn(obj, TRUE);
1825 if (snuff_candle(obj))
1831 /* Called when potentially lightable object is affected by fire_damage().
1832 Return TRUE if object was lit and FALSE otherwise --ALI */
1839 if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) {
1840 if ((obj->otyp == MAGIC_LAMP
1841 || obj->otyp == CANDELABRUM_OF_INVOCATION) && obj->spe == 0)
1843 else if (obj->otyp != MAGIC_LAMP && obj->age == 0)
1845 if (!get_obj_location(obj, &x, &y, 0))
1847 if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed)
1849 if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1850 || obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2))
1852 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1854 pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
1856 pline("%s
\82Ì
\96¾
\82©
\82è
\82ª
\82Â
\82¢
\82½
\81I", Yname2(obj));
1857 if (obj->otyp == POT_OIL)
1858 makeknown(obj->otyp);
1859 if (carried(obj) && obj->unpaid && costly_spot(u.ux, u.uy)) {
1860 /* if it catches while you have it, then it's your tough luck */
1863 verbalize("That's in addition to the cost of %s %s, of course.",
1864 yname(obj), obj->quan == 1L ? "itself" : "themselves");
1866 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ%s
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D", xname(obj));
1868 bill_dummy_object(obj);
1870 begin_burn(obj, FALSE);
1883 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1884 || obj->otyp == BRASS_LANTERN)
1886 pline("%slamp is now off.", Shk_Your(buf, obj));
1888 pline("%s
\83\89\83\93\83v
\82Ì
\93\94\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, obj));
1891 You("snuff out %s.", yname(obj));
1893 You("%s
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D", xname(obj));
1894 end_burn(obj, TRUE);
1899 pline(!Is_candle(obj) ? "This is not a diving lamp"
1900 : "Sorry, fire and water don't mix.");
1902 pline(!Is_candle(obj) ? "
\82±
\82ê
\82Í
\90ö
\90\85\97p
\82Ì
\83\89\83\93\83v
\82¶
\82á
\82È
\82¢
\81D"
1903 : "
\8ec
\94O
\82È
\82ª
\82ç
\81C
\89Î
\82Æ
\90\85\82Í
\82Ü
\82´
\82ç
\82È
\82¢
\81D");
1907 /* magic lamps with an spe == 0 (wished for) cannot be lit */
1908 if ((!Is_candle(obj) && obj->age == 0)
1909 || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
1910 if (obj->otyp == BRASS_LANTERN)
1912 Your("lamp has run out of power.");
1914 Your("
\83\89\83\93\83v
\82Ì
\93d
\97Í
\82ð
\8eg
\82¢
\90Ø
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1917 pline("This %s has no oil.", xname(obj));
1919 pline("
\82±
\82Ì%s
\82É
\82Í
\82à
\82¤
\83I
\83C
\83\8b\82ª
\82È
\82¢
\81D", xname(obj));
1922 if (obj->cursed && !rn2(2)) {
1925 pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"),
1926 otense(obj, "die"));
1928 pline("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D",
1932 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1933 || obj->otyp == BRASS_LANTERN) {
1936 pline("%slamp is now on.", Shk_Your(buf, obj));
1938 pline("%s
\83\89\83\93\83v
\82É
\93\94\82ª
\93\94\82Á
\82½
\81D", Shk_Your(buf, obj));
1939 } else { /* candle(s) */
1941 pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan),
1942 otense(obj, "burn"), Blind ? "." : " brightly!");
1944 pline("%s
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I",
1945 xname(obj), Blind ? "" : "
\96¾
\82é
\82");
1947 if (obj->unpaid && costly_spot(u.ux, u.uy)
1948 && obj->age == 20L * (long) objects[obj->otyp].oc_cost) {
1950 const char *ithem = (obj->quan > 1L) ? "them" : "it";
1952 verbalize("You burn %s, you bought %s!", ithem, ithem);
1954 verbalize("
\93\94\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1956 bill_dummy_object(obj);
1959 begin_burn(obj, FALSE);
1964 light_cocktail(optr)
1967 struct obj *obj = *optr; /* obj is a potion of oil */
1978 You("snuff the lit potion.");
1980 You("
\96û
\95r
\82Ì
\89Î
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1981 end_burn(obj, TRUE);
1983 * Free & add to re-merge potion. This will average the
1984 * age of the potions. Not exactly the best solution,
1988 *optr = addinv(obj);
1990 } else if (Underwater) {
1992 There("is not enough oxygen to sustain a fire.");
1994 pline("
\89Î
\82ð
\82Â
\82¯
\82é
\82Ì
\82É
\8f\
\95ª
\82È
\8e_
\91f
\82ª
\82È
\82¢
\81D");
1998 split1off = (obj->quan > 1L);
2000 obj = splitobj(obj, 1L);
2003 You("light %spotion.%s", shk_your(buf, obj),
2004 Blind ? "" : " It gives off a dim light.");
2006 You("%s
\96û
\95r
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s", shk_your(buf, obj),
2007 Blind ? "" : "
\96û
\95r
\82Í
\88Ã
\82¢
\8cõ
\82ð
\82Í
\82È
\82Á
\82½
\81D");
2010 if (obj->unpaid && costly_spot(u.ux, u.uy)) {
2011 /* Normally, we shouldn't both partially and fully charge
2012 * for an item, but (Yendorian Fuel) Taxes are inevitable...
2016 verbalize("That's in addition to the cost of the potion, of course.");
2018 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ
\96û
\95r
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D");
2019 bill_dummy_object(obj);
2021 makeknown(obj->otyp);
2023 begin_burn(obj, FALSE); /* after shop billing */
2025 obj_extract_self(obj); /* free from inv */
2028 obj = hold_another_object(obj, "You drop %s!", doname(obj),
2030 obj = hold_another_object(obj, "
\82 \82È
\82½
\82Í%s
\82ð
\97\8e\82µ
\82½
\81I", doname(obj),
2038 static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 };
2043 struct obj *obj = getobj(cuddly, "rub");
2045 if (obj && obj->oclass == GEM_CLASS) {
2046 if (is_graystone(obj)) {
2051 pline("Sorry, I don't know how to use that.");
2053 pline("
\8ec
\94O
\81D
\8eg
\82¢
\95û
\82ª
\82í
\82©
\82ç
\82È
\82¢
\81D");
2058 if (!obj || !wield_tool(obj, "rub"))
2061 /* now uwep is obj */
2062 if (uwep->otyp == MAGIC_LAMP) {
2063 if (uwep->spe > 0 && !rn2(3)) {
2064 check_unpaid_usage(uwep, TRUE); /* unusual item use */
2065 /* bones preparation: perform the lamp transformation
2066 before releasing the djinni in case the latter turns out
2067 to be fatal (a hostile djinni has no chance to attack yet,
2068 but an indebted one who grants a wish might bestow an
2069 artifact which blasts the hero with lethal results) */
2070 uwep->otyp = OIL_LAMP;
2071 uwep->spe = 0; /* for safety */
2072 uwep->age = rn1(500, 1000);
2074 begin_burn(uwep, TRUE);
2075 djinni_from_bottle(uwep);
2076 makeknown(MAGIC_LAMP);
2078 } else if (rn2(2)) {
2080 You("%s smoke.", !Blind ? "see a puff of" : "smell");
2082 pline("
\82¯
\82Þ
\82è%s
\81D", !Blind ? "
\82ª
\95\91\82¢
\82 \82ª
\82Á
\82½" : "
\82Ì
\93õ
\82¢
\82ª
\82µ
\82½");
2084 pline1(nothing_happens);
2085 } else if (obj->otyp == BRASS_LANTERN) {
2086 /* message from Adventure */
2088 pline("Rubbing the electric lamp is not particularly rewarding.");
2090 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");
2092 pline("Anyway, nothing exciting happens.");
2094 pline("
\82â
\82Á
\82Ï
\82è
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
2096 pline1(nothing_happens);
2107 enum jump_trajectory {
2108 jAny = 0, /* any direction => magical jump */
2111 jDiag = 3 /* jHorz|jVert */
2114 /* callback routine for walk_path() */
2116 check_jump(arg, x, y)
2120 int traj = *(int *) arg;
2121 struct rm *lev = &levl[x][y];
2125 if (IS_STWALL(lev->typ))
2127 if (IS_DOOR(lev->typ)) {
2128 if (closed_door(x, y))
2130 if ((lev->doormask & D_ISOPEN) != 0 && traj != jAny
2131 /* reject diagonal jump into or out-of or through open door */
2133 /* reject horizontal jump through horizontal open door
2134 and non-horizontal (ie, vertical) jump through
2135 non-horizontal (vertical) open door */
2136 || ((traj & jHorz) != 0) == (lev->horizontal != 0)))
2138 /* empty doorways aren't restricted */
2140 /* let giants jump over boulders (what about Flying?
2141 and is there really enough head room for giants to jump
2142 at all, let alone over something tall?) */
2143 if (sobj_at(BOULDER, x, y) && !throws_rocks(youmonst.data))
2149 is_valid_jump_pos(x, y, magic, showmsg)
2153 if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(x, y) != 5) {
2154 /* The Knight jumping restriction still applies when riding a
2155 * horse. After all, what shape is the knight piece in chess?
2159 pline("Illegal move!");
2161 pline("
\82»
\82Ì
\88Ú
\93®
\82Í
\8cj
\94n
\92µ
\82Ñ
\82¶
\82á
\82È
\82¢
\81I");
2163 } else if (distu(x, y) > (magic ? 6 + magic * 3 : 9)) {
2168 pline("
\89\93\82·
\82¬
\82é
\81I");
2170 } else if (!isok(x, y)) {
2173 You("cannot jump there!");
2175 You("
\82»
\82±
\82É
\82Í
\94ò
\82×
\82È
\82¢
\81I");
2177 } else if (!cansee(x, y)) {
2180 You("cannot see where to land!");
2182 You("
\92\85\92n
\93_
\82ª
\8c©
\82¦
\82È
\82¢
\81I");
2186 struct rm *lev = &levl[u.ux][u.uy];
2187 /* we want to categorize trajectory for use in determining
2188 passage through doorways: horizonal, vertical, or diagonal;
2189 since knight's jump and other irregular directions are
2190 possible, we flatten those out to simplify door checks */
2192 dx = x - u.ux, dy = y - u.uy,
2193 ax = abs(dx), ay = abs(dy);
2195 /* diag: any non-orthogonal destination classifed as diagonal */
2196 diag = (magic || Passes_walls || (!dx && !dy)) ? jAny
2197 : !dy ? jHorz : !dx ? jVert : jDiag;
2198 /* traj: flatten out the trajectory => some diagonals re-classified */
2201 else if (ay >= 2 * ax)
2203 traj = (magic || Passes_walls || (!ax && !ay)) ? jAny
2204 : !ay ? jHorz : !ax ? jVert : jDiag;
2205 /* walk_path doesn't process the starting spot;
2206 this is iffy: if you're starting on a closed door spot,
2207 you _can_ jump diagonally from doorway (without needing
2208 Passes_walls); that's intentional but is it correct? */
2209 if (diag == jDiag && IS_DOOR(lev->typ)
2210 && (lev->doormask & D_ISOPEN) != 0
2212 || ((traj & jHorz) != 0) == (lev->horizontal != 0))) {
2215 You_cant("jump diagonally out of a doorway.");
2217 You_cant("
\8fo
\93ü
\82è
\8cû
\82©
\82ç
\8eÎ
\82ß
\82É
\94ò
\82Ñ
\8fo
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2220 uc.x = u.ux, uc.y = u.uy;
2221 tc.x = x, tc.y = y; /* target */
2222 if (!walk_path(&uc, &tc, check_jump, (genericptr_t) &traj)) {
2225 There("is an obstacle preventing that jump.");
2227 pline("
\94ò
\82Ô
\82Ì
\82ð
\8e×
\96\82\82·
\82é
\89½
\82©
\82ª
\82 \82é
\81D");
2234 static int jumping_is_magic;
2237 get_valid_jump_position(x,y)
2241 && (ACCESSIBLE(levl[x][y].typ) || Passes_walls)
2242 && is_valid_jump_pos(x, y, jumping_is_magic, FALSE));
2246 display_jump_positions(state)
2250 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
2251 } else if (state == 1) {
2254 for (dx = -4; dx <= 4; dx++)
2255 for (dy = -4; dy <= 4; dy++) {
2256 x = dx + (int) u.ux;
2257 y = dy + (int) u.uy;
2258 if (get_valid_jump_position(x, y))
2262 tmp_at(DISP_END, 0);
2268 int magic; /* 0=Physical, otherwise skill level */
2272 /* attempt "jumping" spell if hero has no innate jumping ability */
2273 if (!magic && !Jumping) {
2276 for (sp_no = 0; sp_no < MAXSPELL; ++sp_no)
2277 if (spl_book[sp_no].sp_id == NO_SPELL)
2279 else if (spl_book[sp_no].sp_id == SPE_JUMPING)
2280 return spelleffects(sp_no, FALSE);
2283 if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
2284 /* normally (nolimbs || slithy) implies !Jumping,
2285 but that isn't necessarily the case for knights */
2287 You_cant("jump; you have no legs!");
2289 pline("
\91«
\82ª
\96³
\82
\82Ä
\82Í
\92µ
\82×
\82È
\82¢
\81I");
2291 } else if (!magic && !Jumping) {
2293 You_cant("jump very far.");
2295 You_cant("
\82»
\82ñ
\82È
\89\93\82
\82Ü
\82Å
\92µ
\82×
\82È
\82¢
\81D");
2297 /* if steed is immobile, can't do physical jump but can do spell one */
2298 } else if (!magic && u.usteed && stucksteed(FALSE)) {
2299 /* stucksteed gave "<steed> won't move" message */
2301 } else if (u.uswallow) {
2304 You("bounce around a little.");
2306 pline("
\94½
\93®
\82ð
\82Â
\82¯
\82½
\81D");
2310 pline("You've got to be kidding!");
2312 pline("
\8fç
\92k
\82Í
\82æ
\82µ
\82±
\82³
\82ñ
\81I");
2314 } else if (u.uinwater) {
2317 You("swish around a little.");
2319 pline("
\83X
\83C
\83X
\83C
\82Æ
\89j
\82¢
\82¾
\81D");
2323 pline("This calls for swimming, not jumping!");
2325 pline("
\82»
\82ê
\82Í
\81w
\89j
\82®
\81x
\82Å
\82 \82Á
\82Ä
\81C
\81w
\92µ
\82Ô
\81x
\82¶
\82á
\82È
\82¢
\81I");
2327 } else if (u.ustuck) {
2328 if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
2330 You("pull free from %s.", mon_nam(u.ustuck));
2332 You("%s
\82©
\82ç
\97£
\82ê
\82½
\81D", mon_nam(u.ustuck));
2338 You("writhe a little in the grasp of %s!", mon_nam(u.ustuck));
2340 You("%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\83W
\83^
\83o
\83^
\82µ
\82½
\81I", mon_nam(u.ustuck));
2344 You("cannot escape from %s!", mon_nam(u.ustuck));
2346 You("%s
\82©
\82ç
\93¦
\82ê
\82ç
\82ê
\82È
\82¢
\81I", mon_nam(u.ustuck));
2348 } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
2351 You("flail around a little.");
2353 You("
\83o
\83^
\83o
\83^
\92µ
\82ñ
\82¾
\81D");
2357 You("don't have enough traction to jump.");
2359 You("
\92µ
\82Ô
\82½
\82ß
\82Ì
\94½
\93®
\82ª
\82Â
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
2361 } else if (!magic && near_capacity() > UNENCUMBERED) {
2363 You("are carrying too much to jump!");
2365 You("
\82½
\82
\82³
\82ñ
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\92µ
\82×
\82È
\82¢
\81I");
2367 } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
2369 You("lack the strength to jump!");
2371 You("
\92µ
\82Ô
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I");
2373 } else if (!magic && Wounded_legs) {
2374 long wl = (Wounded_legs & BOTH_SIDES);
2375 const char *bp = body_part(LEG);
2377 if (wl == BOTH_SIDES)
2378 bp = makeplural(bp);
2381 pline("%s is in no shape for jumping.", Monnam(u.usteed));
2383 pline("%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D", Monnam(u.usteed));
2386 Your("%s%s %s in no shape for jumping.",
2387 (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right "
2389 bp, (wl == BOTH_SIDES) ? "are" : "is");
2391 Your("%s%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D",
2392 (wl == LEFT_SIDE) ? "
\8d¶" :
2393 (wl == RIGHT_SIDE) ? "
\89E" : "", bp);
2396 } else if (u.usteed && u.utrap) {
2398 pline("%s is stuck in a trap.", Monnam(u.usteed));
2400 pline("%s
\82Íã©
\82É
\82Ð
\82Á
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", Monnam(u.usteed));
2405 pline("Where do you want to jump?");
2407 pline("
\82Ç
\82±
\82É
\92µ
\82Ñ
\82Ü
\82·
\82©
\81H");
2410 jumping_is_magic = magic;
2411 getpos_sethilite(display_jump_positions, get_valid_jump_position);
2413 if (getpos(&cc, TRUE, "the desired position") < 0)
2415 if (getpos(&cc, TRUE, "
\92µ
\82Ñ
\82½
\82¢
\8fê
\8f\8a") < 0)
2416 return 0; /* user pressed ESC */
2417 if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
2424 switch (u.utraptype) {
2426 long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
2429 You("rip yourself free of the bear trap! Ouch!");
2431 You("
\8e©
\95ª
\82ð
\8cF
\82Ìã©
\82©
\82ç
\82Ð
\82«
\82Í
\82ª
\82µ
\82½
\81C
\82¢
\82Ä
\82Á
\81I");
2433 losehp(Maybe_Half_Phys(rnd(10)), "jumping out of a bear trap",
2435 losehp(Maybe_Half_Phys(rnd(10)), "
\8cF
\82Ìã©
\82©
\82ç
\94ò
\82Ñ
\8fo
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2437 set_wounded_legs(side, rn1(1000, 500));
2442 You("leap from the pit!");
2444 You("
\97\8e\82µ
\8c\8a\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2448 You("tear the web apart as you pull yourself free!");
2450 You("
\82
\82à
\82Ì
\91\83\82ð
\88ø
\82«
\97ô
\82«
\81C
\8e©
\97R
\82É
\82È
\82Á
\82½
\81I");
2451 deltrap(t_at(u.ux, u.uy));
2455 You("pull yourself above the %s!", hliquid("lava"));
2457 You("%s
\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I", hliquid("
\97n
\8aâ"));
2463 You("strain your %s, but you're still %s.",
2464 makeplural(body_part(LEG)),
2465 (u.utraptype == TT_INFLOOR)
2466 ? "stuck in the floor"
2467 : "attached to the buried ball");
2469 You("%s
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\82ª
\81C
\82 \82È
\82½
\82Í
\82Ü
\82¾%s
\81D",
2470 makeplural(body_part(LEG)),
2471 (u.utraptype == TT_INFLOOR)
2472 ? "
\8f°
\82É
\82¤
\82Ü
\82Á
\82Ä
\82¢
\82é"
2473 : "
\82¤
\82Ü
\82Á
\82½
\8b\85\82Æ
\82Â
\82È
\82ª
\82Á
\82Ä
\82¢
\82é");
2475 set_wounded_legs(LEFT_SIDE, rn1(10, 11));
2476 set_wounded_legs(RIGHT_SIDE, rn1(10, 11));
2481 * Check the path from uc to cc, calling hurtle_step at each
2482 * location. The final position actually reached will be
2487 /* calculate max(abs(dx), abs(dy)) as the range */
2488 range = cc.x - uc.x;
2496 (void) walk_path(&uc, &cc, hurtle_jump, (genericptr_t) &range);
2497 /* hurtle_jump -> hurtle_step results in <u.ux,u.uy> == <cc.x,cc.y>
2498 * and usually moves the ball if punished, but does not handle all
2499 * the effects of landing on the final position.
2501 teleds(cc.x, cc.y, FALSE);
2505 multi_reason = "jumping around";
2507 multi_reason = "
\92µ
\82Ë
\89ñ
\82Á
\82Ä
\82¢
\82é
\8e\9e\82É";
2509 morehungry(rnd(25));
2520 if (!mons[corpse->corpsenm].cnutrit)
2526 use_tinning_kit(obj)
2529 struct obj *corpse, *can;
2531 /* This takes only 1 move. If this is to be changed to take many
2532 * moves, we've got to deal with decaying corpses...
2534 if (obj->spe <= 0) {
2536 You("seem to be out of tins.");
2538 pline("
\8aÊ
\8bl
\82ð
\8dì
\82é
\82½
\82ß
\82Ì
\8aÊ
\82ª
\90Ø
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
2541 if (!(corpse = floorfood("tin", 2)))
2543 if (corpse->oeaten) {
2545 You("cannot tin %s which is partly eaten.", something);
2547 You("
\90H
\82×
\82©
\82¯
\82Ì
\82à
\82Ì
\82ð
\8aÊ
\8bl
\82É
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2550 if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance
2554 if (poly_when_stoned(youmonst.data))
2556 You("tin %s without wearing gloves.",
2557 an(mons[corpse->corpsenm].mname));
2559 You("
\8f¬
\8eè
\82È
\82µ
\82Å%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
2560 mons[corpse->corpsenm].mname);
2564 pline("Tinning %s without wearing gloves is a fatal mistake...",
2565 an(mons[corpse->corpsenm].mname));
2567 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",
2568 mons[corpse->corpsenm].mname);
2571 Sprintf(kbuf, "trying to tin %s without gloves",
2572 an(mons[corpse->corpsenm].mname));
2574 Sprintf(kbuf, "
\8f¬
\8eè
\82ð
\82Â
\82¯
\82¸
\82É%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2575 mons[corpse->corpsenm].mname);
2580 if (is_rider(&mons[corpse->corpsenm])) {
2581 if (revive_corpse(corpse))
2583 verbalize("Yes... But War does not preserve its enemies...");
2585 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");
2588 pline_The("corpse evades your grasp.");
2590 pline("
\8e\80\91Ì
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82ð
\93¦
\82ê
\82½
\81D");
2593 if (mons[corpse->corpsenm].cnutrit == 0) {
2595 pline("That's too insubstantial to tin.");
2597 pline("
\8eÀ
\91Ì
\82ª
\82È
\82¢
\82Ì
\82Å
\8aÊ
\8bl
\82É
\82Å
\82«
\82È
\82¢
\81D");
2600 consume_obj_charge(obj, TRUE);
2602 if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
2604 static const char you_buy_it[] = "You tin it, you bought it!";
2606 static const char you_buy_it[] = "
\8aÊ
\8bl
\82É
\82µ
\82½
\82Ì
\82È
\82ç
\94\83\82Á
\82Ä
\82à
\82ç
\82¤
\82æ
\81I";
2608 can->corpsenm = corpse->corpsenm;
2609 can->cursed = obj->cursed;
2610 can->blessed = obj->blessed;
2611 can->owt = weight(can);
2613 /* Mark tinned tins. No spinach allowed... */
2614 set_tin_variety(can, HOMEMADE_TIN);
2615 if (carried(corpse)) {
2617 verbalize(you_buy_it);
2620 if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
2621 verbalize(you_buy_it);
2625 (void) hold_another_object(can, "You make, but cannot pick up, %s.",
2626 doname(can), (const char *) 0);
2628 (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",
2629 doname(can), (const char *) 0);
2632 impossible("Tinning failed.");
2636 use_unicorn_horn(obj)
2639 #define PROP_COUNT 7 /* number of properties we're dealing with */
2640 #define ATTR_COUNT (A_MAX * 3) /* number of attribute points we might fix */
2641 int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop,
2643 int trouble_list[PROP_COUNT + ATTR_COUNT];
2645 if (obj && obj->cursed) {
2646 long lcount = (long) rn1(90, 10);
2648 switch (rn2(13) / 2) { /* case 6 is half as likely as the others */
2650 make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L
2651 : (long) rn1(ACURR(A_CON), 20),
2652 xname(obj), TRUE, SICK_NONVOMITABLE);
2655 make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
2660 You("suddenly feel %s.",
2661 Hallucination ? "trippy" : "confused");
2663 You("
\93Ë
\91R%s
\81D",
2664 Hallucination ? "
\82Ö
\82ë
\82Ö
\82ë
\82É
\82È
\82Á
\82½" : "
\8d¬
\97\90\82µ
\82½");
2666 make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
2669 make_stunned((HStun & TIMEOUT) + lcount, TRUE);
2672 (void) adjattrib(rn2(A_MAX), -1, FALSE);
2675 (void) make_hallucinated((HHallucination & TIMEOUT) + lcount,
2679 if (Deaf) /* make_deaf() won't give feedback when already deaf */
2681 pline("Nothing seems to happen.");
2683 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2684 make_deaf((HDeaf & TIMEOUT) + lcount, TRUE);
2691 * Entries in the trouble list use a very simple encoding scheme.
2693 #define prop2trbl(X) ((X) + A_MAX)
2694 #define attr2trbl(Y) (Y)
2695 #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
2696 #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
2697 #define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
2699 trouble_count = unfixable_trbl = did_prop = did_attr = 0;
2701 /* collect property troubles */
2702 if (TimedTrouble(Sick))
2704 if (TimedTrouble(Blinded) > (long) u.ucreamed
2706 && attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
2707 prop_trouble(BLINDED);
2708 if (TimedTrouble(HHallucination))
2709 prop_trouble(HALLUC);
2710 if (TimedTrouble(Vomiting))
2711 prop_trouble(VOMITING);
2712 if (TimedTrouble(HConfusion))
2713 prop_trouble(CONFUSION);
2714 if (TimedTrouble(HStun))
2715 prop_trouble(STUNNED);
2716 if (TimedTrouble(HDeaf))
2719 unfixable_trbl = unfixable_trouble_count(TRUE);
2721 /* collect attribute troubles */
2722 for (idx = 0; idx < A_MAX; idx++) {
2723 if (ABASE(idx) >= AMAX(idx))
2725 val_limit = AMAX(idx);
2726 /* this used to adjust 'val_limit' for A_STR when u.uhs was
2727 WEAK or worse, but that's handled via ATEMP(A_STR) now */
2729 /* potion/spell of restore ability override sustain ability
2730 intrinsic but unicorn horn usage doesn't */
2731 unfixable_trbl += val_limit - ABASE(idx);
2734 /* don't recover more than 3 points worth of any attribute */
2735 if (val_limit > ABASE(idx) + 3)
2736 val_limit = ABASE(idx) + 3;
2738 for (val = ABASE(idx); val < val_limit; val++)
2740 /* keep track of unfixed trouble, for message adjustment below */
2741 unfixable_trbl += (AMAX(idx) - val_limit);
2744 if (trouble_count == 0) {
2745 pline1(nothing_happens);
2747 } else if (trouble_count > 1) { /* shuffle */
2750 for (i = trouble_count - 1; i > 0; i--)
2751 if ((j = rn2(i + 1)) != i) {
2752 k = trouble_list[j];
2753 trouble_list[j] = trouble_list[i];
2754 trouble_list[i] = k;
2759 * Chances for number of troubles to be fixed
2761 * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8%
2762 * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0
2764 val_limit = rn2(d(2, (obj && obj->blessed) ? 4 : 2));
2765 if (val_limit > trouble_count)
2766 val_limit = trouble_count;
2768 /* fix [some of] the troubles */
2769 for (val = 0; val < val_limit; val++) {
2770 idx = trouble_list[val];
2773 case prop2trbl(SICK):
2774 make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2777 case prop2trbl(BLINDED):
2778 make_blinded((long) u.ucreamed, TRUE);
2781 case prop2trbl(HALLUC):
2782 (void) make_hallucinated(0L, TRUE, 0L);
2785 case prop2trbl(VOMITING):
2786 make_vomiting(0L, TRUE);
2789 case prop2trbl(CONFUSION):
2790 make_confused(0L, TRUE);
2793 case prop2trbl(STUNNED):
2794 make_stunned(0L, TRUE);
2797 case prop2trbl(DEAF):
2798 make_deaf(0L, TRUE);
2802 if (idx >= 0 && idx < A_MAX) {
2806 panic("use_unicorn_horn: bad trouble? (%d)", idx);
2811 if (did_attr || did_prop)
2812 context.botl = TRUE;
2815 pline("This makes you feel %s!",
2816 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2820 pline("
\8bC
\95ª
\82ª%s
\82æ
\82
\82È
\82Á
\82½
\81I",
2821 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2827 pline("Nothing seems to happen.");
2829 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2841 * Timer callback routine: turn figurine into monster
2844 fig_transform(arg, timeout)
2848 struct obj *figurine = arg->a_obj;
2851 boolean cansee_spot, silent, okay_spot;
2852 boolean redraw = FALSE;
2853 boolean suppress_see = FALSE;
2854 char monnambuf[BUFSZ], carriedby[BUFSZ];
2857 debugpline0("null figurine in fig_transform()");
2860 silent = (timeout != monstermoves); /* happened while away */
2861 okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0);
2862 if (figurine->where == OBJ_INVENT || figurine->where == OBJ_MINVENT)
2863 okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]);
2864 if (!okay_spot || !figurine_location_checks(figurine, &cc, TRUE)) {
2865 /* reset the timer to try again later */
2866 (void) start_timer((long) rnd(5000), TIMER_OBJECT, FIG_TRANSFORM,
2867 obj_to_any(figurine));
2871 cansee_spot = cansee(cc.x, cc.y);
2872 mtmp = make_familiar(figurine, cc.x, cc.y, TRUE);
2874 char and_vanish[BUFSZ];
2875 struct obj *mshelter = level.objects[mtmp->mx][mtmp->my];
2877 /* [m_monnam() yields accurate mon type, overriding hallucination] */
2878 Sprintf(monnambuf, "%s", an(m_monnam(mtmp)));
2879 /*JP:TODO:and_vanish
\82Í
\96¢
\8f\88\97\9d*/
2880 and_vanish[0] = '\0';
2881 if ((mtmp->minvis && !See_invisible)
2882 || (mtmp->data->mlet == S_MIMIC
2883 && M_AP_TYPE(mtmp) != M_AP_NOTHING))
2884 suppress_see = TRUE;
2886 if (mtmp->mundetected) {
2887 if (hides_under(mtmp->data) && mshelter) {
2888 Sprintf(and_vanish, " and %s under %s",
2889 locomotion(mtmp->data, "crawl"), doname(mshelter));
2890 } else if (mtmp->data->mlet == S_MIMIC
2891 || mtmp->data->mlet == S_EEL) {
2892 suppress_see = TRUE;
2894 Strcpy(and_vanish, " and vanish");
2897 switch (figurine->where) {
2899 if (Blind || suppress_see)
2901 You_feel("%s %s from your pack!", something,
2902 locomotion(mtmp->data, "drop"));
2904 You_feel("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82æ
\82¤
\82¾
\81I", something,
2905 jpast(locomotion(mtmp->data, "
\97\8e\82¿
\82é")));
2909 You_see("%s %s out of your pack%s!", monnambuf,
2910 locomotion(mtmp->data, "drop"), and_vanish);
2912 You("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2913 jpast(locomotion(mtmp->data,"
\97\8e\82¿
\82é")));
2918 if (cansee_spot && !silent) {
2921 pline("%s suddenly vanishes!", an(xname(figurine)));
2923 pline("%s
\82Í
\93Ë
\91R
\8fÁ
\82¦
\82½
\81I", xname(figurine));
2926 You_see("a figurine transform into %s%s!", monnambuf,
2929 You("
\90l
\8c`
\82ª
\93Ë
\91R%s
\82É
\82È
\82Á
\82½
\82Ì
\82ð
\8c©
\82½
\81I",
2932 redraw = TRUE; /* update figurine's map location */
2937 if (cansee_spot && !silent && !suppress_see) {
2940 mon = figurine->ocarry;
2941 /* figurine carrying monster might be invisible */
2942 if (canseemon(figurine->ocarry)
2943 && (!mon->wormno || cansee(mon->mx, mon->my)))
2945 Sprintf(carriedby, "%s pack", s_suffix(a_monnam(mon)));
2947 Sprintf(carriedby, "%s
\82Ì
\8a\93", a_monnam(mon));
2948 else if (is_pool(mon->mx, mon->my))
2950 Strcpy(carriedby, "empty water");
2952 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\90\85\92\86");
2955 Strcpy(carriedby, "thin air");
2957 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\8bó
\92\86");
2959 You_see("%s %s out of %s%s!", monnambuf,
2960 locomotion(mtmp->data, "drop"), carriedby,
2963 You("%s
\82ª%s
\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2964 carriedby, locomotion(mtmp->data, "
\97\8e\82¿
\82é"));
2974 impossible("figurine came to life where? (%d)",
2975 (int) figurine->where);
2979 /* free figurine now */
2980 if (carried(figurine)) {
2983 obj_extract_self(figurine);
2984 obfree(figurine, (struct obj *) 0);
2991 figurine_location_checks(obj, cc, quietly)
2998 if (carried(obj) && u.uswallow) {
3001 You("don't have enough room in here.");
3003 pline("
\82±
\82±
\82É
\82Í
\8f\
\95ª
\82È
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
3006 x = cc ? cc->x : u.ux;
3007 y = cc ? cc->y : u.uy;
3011 You("cannot put the figurine there.");
3013 You("
\82±
\82±
\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81D");
3016 if (IS_ROCK(levl[x][y].typ)
3017 && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x, y))) {
3020 You("cannot place a figurine in %s!",
3021 IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock");
3023 You("%s
\82Ì
\92\86\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81I",
3024 IS_TREE(levl[x][y].typ) ? "
\96Ø" : "
\8cÅ
\82¢
\90Î");
3028 if (sobj_at(BOULDER, x, y) && !passes_walls(&mons[obj->corpsenm])
3029 && !throws_rocks(&mons[obj->corpsenm])) {
3032 You("cannot fit the figurine on the boulder.");
3034 You("
\8aâ
\82É
\90l
\8c`
\82ð
\89\9f\82µ
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
3044 register struct obj *obj = *optr;
3049 /* can't activate a figurine while swallowed */
3050 if (!figurine_location_checks(obj, (coord *) 0, FALSE))
3053 if (!getdir((char *) 0)) {
3054 context.move = multi = 0;
3061 /* Passing FALSE arg here will result in messages displayed */
3062 if (!figurine_location_checks(obj, &cc, FALSE))
3065 You("%s and it %stransforms.",
3066 (u.dx || u.dy) ? "set the figurine beside you"
3067 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3068 || is_pool(cc.x, cc.y))
3069 ? "release the figurine"
3070 : (u.dz < 0 ? "toss the figurine into the air"
3071 : "set the figurine on the ground"),
3072 Blind ? "supposedly " : "");
3074 You("%s
\81D
\82·
\82é
\82Æ
\82»
\82ê
\82Í
\95Ï
\8c`
\82µ
\82½
\81D",
3075 (u.dx || u.dy) ? "
\82»
\82Î
\82É
\90l
\8c`
\82ð
\92u
\82¢
\82½"
3076 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3077 || is_pool(cc.x, cc.y))
3078 ? "
\90l
\8c`
\82ð
\95ú
\82Á
\82½"
3079 : (u.dz < 0 ? "
\90l
\8c`
\82ð
\8bó
\92\86\82É
\93\8a\82°
\82½"
3080 : "
\90l
\8c`
\82ð
\92n
\96Ê
\82É
\92u
\82¢
\82½"));
3082 (void) make_familiar(obj, cc.x, cc.y, FALSE);
3083 (void) stop_timer(FIG_TRANSFORM, obj_to_any(obj));
3086 map_invisible(cc.x, cc.y);
3090 static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 };
3100 pline("%s from your %s.", Tobjnam(obj, "slip"),
3101 fingers_or_gloves(FALSE));
3103 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
3104 fingers_or_gloves(FALSE));
3113 if ((obj->cursed || Fumbling) && !rn2(2)) {
3114 consume_obj_charge(obj, TRUE);
3117 pline("%s from your %s.", Tobjnam(obj, "slip"),
3118 fingers_or_gloves(FALSE));
3120 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
3121 fingers_or_gloves(FALSE));
3126 otmp = getobj(lubricables, "grease");
3130 if (inaccessible_equipment(otmp, "grease", FALSE))
3132 if (inaccessible_equipment(otmp, "
\82É
\8e\89\82ð
\93h
\82é", FALSE))
3134 consume_obj_charge(obj, TRUE);
3136 oldglib = (int) (Glib & TIMEOUT);
3137 if (otmp != &zeroobj) {
3139 You("cover %s with a thick layer of grease.", yname(otmp));
3141 You("%s
\82É
\8e\89\82ð
\92O
\94O
\82É
\93h
\82Á
\82½
\81D", xname(otmp));
3143 if (obj->cursed && !nohands(youmonst.data)) {
3144 make_glib(oldglib + rn1(6, 10)); /* + 10..15 */
3146 pline("Some of the grease gets all over your %s.",
3148 pline("
\8e\89\82ª
\8f
\82µ%s
\82É
\82Â
\82¢
\82½
\81D",
3149 fingers_or_gloves(TRUE));
3152 make_glib(oldglib + rn1(11, 5)); /* + 5..15 */
3154 You("coat your %s with grease.", fingers_or_gloves(TRUE));
3156 You("%s
\82É
\8e\89\82ð
\93h
\82Á
\82½
\81D", fingers_or_gloves(TRUE));
3161 pline("%s empty.", Tobjnam(obj, "are"));
3163 pline("%s
\82Í
\8bó
\82Á
\82Û
\82¾
\81D", xname(obj));
3166 pline("%s to be empty.", Tobjnam(obj, "seem"));
3168 pline("%s
\82Í
\8bó
\82Á
\82Û
\82Ì
\82æ
\82¤
\82¾
\81D", xname(obj));
3173 /* touchstones - by Ken Arnold */
3179 static const char scritch[] = "\"scritch, scritch\"";
3181 static const char scritch[] = "
\81u
\83S
\83V
\81C
\83S
\83V
\81v";
3182 static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 };
3183 static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 };
3186 const char *streak_color, *choices;
3187 char stonebuf[QBUFSZ];
3190 /* in case it was acquired while blinded */
3193 /* when the touchstone is fully known, don't bother listing extra
3194 junk as likely candidates for rubbing */
3195 choices = (tstone->otyp == TOUCHSTONE && tstone->dknown
3196 && objects[TOUCHSTONE].oc_name_known)
3200 Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan));
3202 Sprintf(stonebuf, "rub on the stone");
3203 if ((obj = getobj(choices, stonebuf)) == 0)
3206 if (obj == tstone && obj->quan == 1L) {
3208 You_cant("rub %s on itself.", the(xname(obj)));
3210 You("%s
\82ð
\82»
\82ê
\8e©
\91Ì
\82Å
\82±
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", the(xname(obj)));
3214 if (tstone->otyp == TOUCHSTONE && tstone->cursed
3215 && obj->oclass == GEM_CLASS && !is_graystone(obj)
3216 && !obj_resists(obj, 80, 100)) {
3219 pline("You feel something shatter.");
3221 You("
\89½
\82©
\82ª
\95²
\81X
\82É
\82È
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81D");
3222 else if (Hallucination)
3224 pline("Oh, wow, look at the pretty shards.");
3226 pline("
\83\8f\81[
\83H
\81I
\82È
\82ñ
\82Ä
\82«
\82ê
\82¢
\82È
\94j
\95Ð
\82È
\82ñ
\82¾
\81D");
3229 pline("A sharp crack shatters %s%s.",
3230 (obj->quan > 1L) ? "one of " : "", the(xname(obj)));
3232 pline("
\8b
\82
\82±
\82·
\82è
\82·
\82¬
\82Ä%s%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
3233 the(xname(obj)), (obj->quan > 1) ? "
\82Ì
\82Ð
\82Æ
\82Â" : "");
3242 } else if (Hallucination) {
3244 pline("Oh wow, man: Fractals!");
3246 pline("
\83\8f\81[
\83H
\81I
\83t
\83\89\83N
\83^
\83\8b\96Í
\97l
\82¾
\81I");
3254 oclass = obj->oclass;
3255 /* prevent non-gemstone rings from being treated like gems */
3256 if (oclass == RING_CLASS
3257 && objects[obj->otyp].oc_material != GEMSTONE
3258 && objects[obj->otyp].oc_material != MINERAL)
3259 oclass = RANDOM_CLASS; /* something that's neither gem nor ring */
3262 case GEM_CLASS: /* these have class-specific handling below */
3264 if (tstone->otyp != TOUCHSTONE) {
3266 } else if (obj->oclass == GEM_CLASS
3268 || (!tstone->cursed && (Role_if(PM_ARCHEOLOGIST)
3269 || Race_if(PM_GNOME))))) {
3270 makeknown(TOUCHSTONE);
3271 makeknown(obj->otyp);
3272 prinv((char *) 0, obj, 0L);
3275 /* either a ring or the touchstone was not effective */
3276 if (objects[obj->otyp].oc_material == GLASS) {
3281 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3282 break; /* gem or ring */
3285 switch (objects[obj->otyp].oc_material) {
3288 pline("%s a little more polished now.", Tobjnam(tstone, "look"));
3290 pline("%s
\82Í
\82³
\82ç
\82É
\82Â
\82â
\82ª
\8fo
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D", xname(tstone));
3294 if (!obj->known) /* note: not "whetstone" */
3296 You("must think this is a wetstone, do you?");
3298 You("
\82±
\82ê
\82Í
\93u
\90Î
\82¾
\82Æ
\8ev
\82Á
\82½
\81H");
3302 pline("%s a little wetter now.", Tobjnam(tstone, "are"));
3304 pline("%s
\82Í
\8f
\82µ
\82Ê
\82ê
\82½
\81D", xname(tstone));
3309 streak_color = "waxy";
3311 streak_color = "
\8e\89\82Á
\82Û
\82¢";
3313 break; /* okay even if not touchstone */
3316 streak_color = "wooden";
3318 streak_color = "
\82¨
\82ª
\82
\82¸
\82Ì
\82æ
\82¤
\82È";
3320 break; /* okay even if not touchstone */
3322 do_scratch = TRUE; /* scratching and streaks */
3324 streak_color = "golden";
3326 streak_color = "
\8bà
\90F
\82Ì";
3330 do_scratch = TRUE; /* scratching and streaks */
3332 streak_color = "silvery";
3334 streak_color = "
\8bâ
\90F
\82Ì";
3338 /* Objects passing the is_flimsy() test will not
3339 scratch a stone. They will leave streaks on
3340 non-touchstones and touchstones alike. */
3342 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3344 do_scratch = (tstone->otyp != TOUCHSTONE);
3347 break; /* default oclass */
3350 #if 0 /*JP*//* not used */
3351 Sprintf(stonebuf, "stone%s", plur(tstone->quan));
3355 You("make %s%sscratch marks on the %s.",
3356 streak_color ? streak_color : (const char *) "",
3357 streak_color ? " " : "", stonebuf);
3359 You("%s
\82±
\82·
\82è
\90Õ
\82ð
\90Î
\82É
\82Â
\82¯
\82½
\81D",
3360 streak_color ? streak_color : (const char *)"");
3362 else if (streak_color)
3364 You_see("%s streaks on the %s.", streak_color, stonebuf);
3366 pline("
\90Î
\82É%s
\8bØ
\82ª
\82Â
\82¢
\82½
\81D", streak_color);
3372 static struct trapinfo {
3376 boolean force_bungle;
3383 trapinfo.force_bungle = 0;
3386 /* Place a landmine/bear trap. Helge Hafting */
3392 const char *what = (char *) 0;
3394 int levtyp = levl[u.ux][u.uy].typ;
3396 const char *occutext = "setting the trap";
3398 const char *occutext = "ã©
\82ð
\8ed
\8a|
\82¯
\82Ä
\82¢
\82é";
3401 if (nohands(youmonst.data))
3403 what = "without hands";
3405 what = "
\8eè
\82ª
\82È
\82¢
\82Ì
\82Å";
3408 what = "while stunned";
3410 what = "
\82
\82ç
\82
\82ç
\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å";
3411 else if (u.uswallow)
3414 is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed";
3416 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Í";
3417 else if (Underwater)
3419 what = "underwater";
3421 what = "
\90\85\96Ê
\89º
\82Å
\82Í";
3422 else if (Levitation)
3424 what = "while levitating";
3426 what = "
\95\82\82¢
\82Ä
\82¢
\82é
\8aÔ
\82Í";
3427 else if (is_pool(u.ux, u.uy))
3431 what = "
\90\85\92\86\82Å
\82Í";
3432 else if (is_lava(u.ux, u.uy))
3436 what = "
\97n
\8aâ
\82Ì
\92\86\82Å
\82Í";
3437 else if (On_stairs(u.ux, u.uy))
3439 what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder"
3442 what = (u.ux == xdnladder || u.ux == xupladder) ? "
\82Í
\82µ
\82²
\82Ì
\8fã
\82Å
\82Í"
3443 : "
\8aK
\92i
\82Ì
\8fã
\82Å
\82Í";
3445 else if (IS_FURNITURE(levtyp) || IS_ROCK(levtyp)
3446 || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy))
3450 what = "
\82±
\82±
\82Å
\82Í";
3451 else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
3453 what = (levtyp == AIR)
3457 : "in this place"; /* Air/Water Plane catch-all */
3459 what = (levtyp == AIR)
3460 ? "
\8bó
\92\86\82Å
\82Í"
3462 ? "
\89_
\82Ì
\92\86\82Å
\82Í"
3463 : "
\82±
\82±
\82Å
\82Í"; /* Air/Water Plane catch-all */
3467 You_cant("set a trap %s!", what);
3469 pline("%sã©
\82ð
\8ed
\8a|
\82¯
\82ç
\82ê
\82È
\82¢
\81I",what);
3473 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3474 if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) {
3476 You("resume setting %s%s.", shk_your(buf, otmp),
3478 You("%s
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D",
3479 defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
3480 set_occupation(set_trap, occutext, 0);
3483 trapinfo.tobj = otmp;
3484 trapinfo.tx = u.ux, trapinfo.ty = u.uy;
3486 trapinfo.time_needed =
3487 (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5;
3489 trapinfo.time_needed *= 2;
3491 if (ttyp == BEAR_TRAP && tmp < 18)
3492 trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4;
3493 /*[fumbling and/or confusion and/or cursed object check(s)
3494 should be incorporated here instead of in set_trap]*/
3495 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) {
3498 if (Fumbling || otmp->cursed)
3499 chance = (rnl(10) > 3);
3501 chance = (rnl(10) > 5);
3503 You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
3505 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));
3507 Sprintf(buf, "Continue your attempt to set %s?",
3509 Sprintf(buf, "%s
\82Ì
\8ed
\8a|
\82¯
\82ð
\91±
\82¯
\82é
\81H",
3510 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
3512 if (yn(buf) == 'y') {
3515 case LANDMINE: /* set it off */
3516 trapinfo.time_needed = 0;
3517 trapinfo.force_bungle = TRUE;
3519 case BEAR_TRAP: /* drop it without arming it */
3524 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I",
3525 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
3537 You("begin setting %s%s.", shk_your(buf, otmp),
3539 You("%s%s
\82ð
\8ed
\8a|
\82¯
\82Í
\82¶
\82ß
\82½
\81D", shk_your(buf, otmp),
3540 defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
3541 set_occupation(set_trap, occutext, 0);
3549 struct obj *otmp = trapinfo.tobj;
3553 if (!otmp || !carried(otmp) || u.ux != trapinfo.tx
3554 || u.uy != trapinfo.ty) {
3560 if (--trapinfo.time_needed > 0)
3561 return 1; /* still busy */
3563 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3564 ttmp = maketrap(u.ux, u.uy, ttyp);
3568 if (*in_rooms(u.ux, u.uy, SHOPBASE)) {
3569 add_damage(u.ux, u.uy, 0L); /* schedule removal */
3571 if (!trapinfo.force_bungle)
3573 You("finish arming %s.",
3575 You("%s
\82ð
\8ed
\8a|
\82¯
\8fI
\82¦
\82½
\81D",
3576 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation));
3577 if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
3578 || trapinfo.force_bungle)
3580 (unsigned) (trapinfo.force_bungle ? FORCEBUNGLE : 0));
3582 /* this shouldn't happen */
3584 Your("trap setting attempt fails.");
3586 You("ã©
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D");
3600 int rx, ry, proficient, res = 0;
3602 const char *msg_slipsfree = "The bullwhip slips free.";
3604 const char *msg_slipsfree = "
\95Ú
\82Í
\82Ù
\82Ç
\82¯
\82½
\81D";
3606 const char *msg_snap = "Snap!";
3608 const char *msg_snap = "
\83s
\83V
\83b
\81I";
3611 if (!wield_tool(obj, "lash"))
3616 if (!getdir((char *) 0))
3624 if (Stunned || (Confusion && !rn2(5)))
3628 if (!isok(rx, ry)) {
3632 You("
\82Í
\82¸
\82µ
\82½
\81D");
3635 mtmp = m_at(rx, ry);
3638 /* fake some proficiency checks */
3640 if (Role_if(PM_ARCHEOLOGIST))
3642 if (ACURR(A_DEX) < 6)
3644 else if (ACURR(A_DEX) >= 14)
3645 proficient += (ACURR(A_DEX) - 14);
3653 if (u.uswallow && attack(u.ustuck)) {
3655 There("is not enough room to flick your bullwhip.");
3657 pline("
\95Ú
\82ð
\91Å
\82Â
\82Ù
\82Ç
\8dL
\82
\82È
\82¢
\81D");
3659 } else if (Underwater) {
3661 There("is too much resistance to flick your bullwhip.");
3663 pline("
\90\85\82Ì
\92ï
\8dR
\82ª
\82 \82è
\82·
\82¬
\82Ä
\95Ú
\82ð
\91Å
\82Â
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
3665 } else if (u.dz < 0) {
3667 You("flick a bug off of the %s.", ceiling(u.ux, u.uy));
3669 You("%s
\82Ì
\92\8e\82ð
\91Å
\82¿
\97\8e\82µ
\82½
\81D",ceiling(u.ux,u.uy));
3671 } else if ((!u.dx && !u.dy) || (u.dz > 0)) {
3674 /* Sometimes you hit your steed by mistake */
3675 if (u.usteed && !rn2(proficient + 2)) {
3677 You("whip %s!", mon_nam(u.usteed));
3679 You("%s
\82ð
\95Ú
\91Å
\82Á
\82½
\81I", mon_nam(u.usteed));
3683 if (Levitation || u.usteed) {
3684 /* Have a shot at snaring something on the floor */
3685 otmp = level.objects[u.ux][u.uy];
3686 if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) {
3688 pline("Why beat a dead horse?");
3690 pline("
\82Ç
\82¤
\82µ
\82Ä
\8e\80\82ñ
\82¾
\94n
\82ð
\95Ú
\91Å
\82Â
\82æ
\82¤
\82È
\82±
\82Æ
\82ð
\82·
\82é
\82Ì
\81H");
3693 if (otmp && proficient) {
3695 You("wrap your bullwhip around %s on the %s.",
3696 an(singular(otmp, xname)), surface(u.ux, u.uy));
3698 You("
\95Ú
\82ð%s
\82Ì
\8fã
\82Ì%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D",
3699 surface(u.ux, u.uy), an(singular(otmp, xname)));
3701 if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1)
3702 pline1(msg_slipsfree);
3706 dam = rnd(2) + dbon() + obj->spe;
3710 You("hit your %s with your bullwhip.", body_part(FOOT));
3712 You("
\8e©
\95ª
\82Ì%s
\82ð
\8e©
\95ª
\82Å
\91Å
\82¿
\82Â
\82¯
\82½
\81D", body_part(FOOT));
3714 Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis());
3715 losehp(Maybe_Half_Phys(dam), buf, NO_KILLER_PREFIX);
3717 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82ð
\95Ú
\91Å
\82Á
\82Ä");
3718 losehp(Maybe_Half_Phys(dam), buf, KILLED_BY);
3722 } else if ((Fumbling || Glib) && !rn2(5)) {
3724 pline_The("bullwhip slips out of your %s.", body_part(HAND));
3726 pline("
\95Ú
\82ª%s
\82©
\82ç
\82·
\82×
\82è
\97\8e\82¿
\82½
\81D", body_part(HAND));
3729 } else if (u.utrap && u.utraptype == TT_PIT) {
3733 * if you're in a pit
3734 * - you are attempting to get out of the pit
3735 * or, if you are applying it towards a small monster
3736 * - then it is assumed that you are trying to hit it
3737 * else if the monster is wielding a weapon
3738 * - you are attempting to disarm a monster
3740 * - you are attempting to hit the monster.
3742 * if you're confused (and thus off the mark)
3743 * - you only end up hitting.
3746 const char *wrapped_what = (char *) 0;
3749 if (bigmonst(mtmp->data)) {
3750 wrapped_what = strcpy(buf, mon_nam(mtmp));
3751 } else if (proficient) {
3758 if (!wrapped_what) {
3759 if (IS_FURNITURE(levl[rx][ry].typ))
3760 wrapped_what = something;
3761 else if (sobj_at(BOULDER, rx, ry))
3763 wrapped_what = "a boulder";
3765 wrapped_what = "
\8aâ";
3773 You("wrap your bullwhip around %s.", wrapped_what);
3775 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", wrapped_what);
3776 if (proficient && rn2(proficient + 2)) {
3777 if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) {
3779 You("yank yourself out of the pit!");
3781 You("
\82®
\82¢
\82Æ
\88ø
\82Á
\82Ï
\82Á
\82Ä
\8c\8a\82©
\82ç
\94²
\82¯
\8fo
\82µ
\82½
\81I");
3782 teleds(cc.x, cc.y, TRUE);
3784 vision_full_recalc = 1;
3787 pline1(msg_slipsfree);
3795 if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) {
3797 pline("A monster is there that you couldn't see.");
3799 pline("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82ª
\82¢
\82é
\81D");
3800 map_invisible(rx, ry);
3802 otmp = MON_WEP(mtmp); /* can be null */
3804 char onambuf[BUFSZ];
3805 const char *mon_hand;
3806 boolean gotit = proficient && (!Fumbling || !rn2(10));
3808 Strcpy(onambuf, cxname(otmp));
3810 mon_hand = mbodypart(mtmp, HAND);
3812 mon_hand = makeplural(mon_hand);
3814 mon_hand = 0; /* lint suppression */
3817 You("wrap your bullwhip around %s.", yname(otmp));
3819 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", xname(otmp));
3820 if (gotit && mwelded(otmp)) {
3822 pline("%s welded to %s %s%c",
3823 (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp),
3824 mon_hand, !otmp->bknown ? '!' : '.');
3826 pline("%s
\82Í%s
\82Ì%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82µ
\82Ü
\82Á
\82Ä
\82¢
\82é%s",
3828 mon_nam(mtmp), mon_hand,
3829 !otmp->bknown ? "
\81I" : "
\81D");
3831 set_bknown(otmp, 1);
3832 gotit = FALSE; /* can't pull it free */
3835 obj_extract_self(otmp);
3836 possibly_unwield(mtmp, FALSE);
3837 setmnotwielded(mtmp, otmp);
3839 switch (rn2(proficient + 1)) {
3841 /* to floor near you */
3843 You("yank %s to the %s!", yname(otmp),
3845 You("%s
\82ð%s
\82É
\88ø
\82«
\97\8e\82µ
\82½
\81I", xname(otmp),
3846 surface(u.ux, u.uy));
3847 place_object(otmp, u.ux, u.uy);
3854 /* proficient with whip, but maybe not
3855 so proficient at catching weapons */
3858 hitvalu = 8 + otmp->spe;
3859 hitu = thitu(hitvalu, dmgval(otmp, &youmonst),
3863 pline_The("%s hits you as you try to snatch it!",
3865 pline_The("%s
\82ð
\92D
\82¨
\82¤
\82Æ
\82µ
\82½
\82ç
\82 \82È
\82½
\82É
\93\96\82½
\82Á
\82½
\81I",
3868 place_object(otmp, u.ux, u.uy);
3873 /* right into your inventory */
3875 You("snatch %s!", yname(otmp));
3877 You("%s
\82ð
\92D
\82Á
\82½
\81I", xname(otmp));
3878 if (otmp->otyp == CORPSE
3879 && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg
3880 && !Stone_resistance
3881 && !(poly_when_stoned(youmonst.data)
3882 && polymon(PM_STONE_GOLEM))) {
3886 Sprintf(kbuf, "%s corpse",
3887 an(mons[otmp->corpsenm].mname));
3888 pline("Snatching %s is a fatal mistake.", kbuf);
3890 pline("%s
\82Ì
\8e\80\91Ì
\82ð
\92D
\82Á
\82½
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
3891 mons[otmp->corpsenm].mname);
3892 Sprintf(kbuf, "%s
\82Ì
\8e\80\91Ì
\82É
\90G
\82ê
\82Ä",
3893 mons[otmp->corpsenm].mname);
3898 (void) hold_another_object(otmp, "You drop %s!",
3899 doname(otmp), (const char *) 0);
3901 (void) hold_another_object(otmp, "%s
\82ð
\97\8e\82µ
\82½
\81I",
3902 doname(otmp), (const char *) 0);
3906 /* to floor beneath mon */
3908 You("yank %s from %s %s!", the(onambuf),
3909 s_suffix(mon_nam(mtmp)), mon_hand);
3911 You("%s
\82ð%s
\82Ì%s
\82©
\82ç
\82Ð
\82Á
\82Ï
\82Á
\82½
\81I", the(xname(otmp)),
3912 mon_nam(mtmp), mon_hand);
3914 obj_no_longer_held(otmp);
3915 place_object(otmp, mtmp->mx, mtmp->my);
3920 pline1(msg_slipsfree);
3924 if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers
3926 stumble_onto_mimic(mtmp);
3929 You("flick your bullwhip towards %s.", mon_nam(mtmp));
3931 You("%s
\82É
\8cü
\82Á
\82Ä
\95Ú
\82ð
\91Å
\82Á
\82½
\81D", mon_nam(mtmp));
3940 } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
3941 /* it must be air -- water checked above */
3943 You("snap your whip through thin air.");
3945 You("
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë
\82Å
\95Ú
\82ð
\91Å
\82Á
\82½
\81D");
3955 not_enough_room[] = "There's not enough room here to use that.",
3957 not_enough_room[] = "
\82»
\82ê
\82ð
\8eg
\82¤
\82¾
\82¯
\82Ì
\8dL
\82³
\82ª
\82È
\82¢
\81D",
3959 where_to_hit[] = "Where do you want to hit?",
3961 where_to_hit[] = "
\82Ç
\82ê
\82ð
\91_
\82¤
\81H",
3963 cant_see_spot[] = "won't hit anything if you can't see that spot.",
3965 cant_see_spot[] = "
\8fê
\8f\8a\82ª
\8c©
\82¦
\82È
\82¯
\82ê
\82Î
\91_
\82¦
\82È
\82¢
\81D",
3967 cant_reach[] = "can't reach that spot from here.";
3969 cant_reach[] = "
\82±
\82±
\82©
\82ç
\82»
\82±
\82Ö
\82Í
\93Í
\82©
\82È
\82¢
\81D";
3971 /* find pos of monster in range, if only one monster */
3973 find_poleable_mon(pos, min_range, max_range)
3975 int min_range, max_range;
3980 int x, y, lo_x, hi_x, lo_y, hi_y, rt, glyph;
3983 return FALSE; /* must be able to see target location */
3984 impaired = (Confusion || Stunned || Hallucination);
3985 mpos.x = mpos.y = 0; /* no candidate location yet */
3986 rt = isqrt(max_range);
3987 lo_x = max(u.ux - rt, 1), hi_x = min(u.ux + rt, COLNO - 1);
3988 lo_y = max(u.uy - rt, 0), hi_y = min(u.uy + rt, ROWNO - 1);
3989 for (x = lo_x; x <= hi_x; ++x) {
3990 for (y = lo_y; y <= hi_y; ++y) {
3991 if (distu(x, y) < min_range || distu(x, y) > max_range
3992 || !isok(x, y) || !cansee(x, y))
3994 glyph = glyph_at(x, y);
3996 && glyph_is_monster(glyph)
3997 && (mtmp = m_at(x, y)) != 0
3998 && (mtmp->mtame || (mtmp->mpeaceful && flags.confirm)))
4000 if (glyph_is_monster(glyph)
4001 || glyph_is_warning(glyph)
4002 || glyph_is_invisible(glyph)
4003 || (glyph_is_statue(glyph) && impaired)) {
4005 return FALSE; /* more than one candidate location */
4006 mpos.x = x, mpos.y = y;
4011 return FALSE; /* no candidate location */
4016 static int polearm_range_min = -1;
4017 static int polearm_range_max = -1;
4020 get_valid_polearm_position(x, y)
4023 return (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
4024 && distu(x, y) >= polearm_range_min
4025 && distu(x, y) <= polearm_range_max);
4029 display_polearm_positions(state)
4033 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
4034 } else if (state == 1) {
4037 for (dx = -4; dx <= 4; dx++)
4038 for (dy = -4; dy <= 4; dy++) {
4039 x = dx + (int) u.ux;
4040 y = dy + (int) u.uy;
4041 if (get_valid_polearm_position(x, y)) {
4046 tmp_at(DISP_END, 0);
4050 /* Distance attacks by pole-weapons */
4055 int res = 0, typ, max_range, min_range, glyph;
4058 struct monst *hitm = context.polearm.hitmon;
4060 /* Are you allowed to use the pole? */
4062 pline(not_enough_room);
4066 if (!wield_tool(obj, "swing"))
4071 /* assert(obj == uwep); */
4074 * Calculate allowable range (pole's reach is always 2 steps):
4075 * unskilled and basic: orthogonal direction, 4..4;
4076 * skilled: as basic, plus knight's jump position, 4..5;
4077 * expert: as skilled, plus diagonal, 4..8.
4085 * (Note: no roles in nethack can become expert or better
4086 * for polearm skill; Yeoman in slash'em can become expert.)
4089 typ = uwep_skill_type();
4090 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4092 else if (P_SKILL(typ) == P_SKILLED)
4095 max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
4097 polearm_range_min = min_range;
4098 polearm_range_max = max_range;
4100 /* Prompt for a location */
4101 pline(where_to_hit);
4104 if (!find_poleable_mon(&cc, min_range, max_range) && hitm
4105 && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)
4106 && distu(hitm->mx, hitm->my) <= max_range
4107 && distu(hitm->mx, hitm->my) >= min_range) {
4111 getpos_sethilite(display_polearm_positions, get_valid_polearm_position);
4113 if (getpos(&cc, TRUE, "the spot to hit") < 0)
4115 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
4116 return res; /* ESC; uses turn iff polearm became wielded */
4118 glyph = glyph_at(cc.x, cc.y);
4119 if (distu(cc.x, cc.y) > max_range) {
4123 pline("
\89\93\82·
\82¬
\82é
\81I");
4125 } else if (distu(cc.x, cc.y) < min_range) {
4127 pline("Too close!");
4129 pline("
\8bß
\82·
\82¬
\82é
\81I");
4131 } else if (!cansee(cc.x, cc.y) && !glyph_is_monster(glyph)
4132 && !glyph_is_invisible(glyph) && !glyph_is_statue(glyph)) {
4135 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4140 context.polearm.hitmon = (struct monst *) 0;
4141 /* Attack the monster there */
4143 if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *) 0) {
4144 if (attack_checks(mtmp, uwep))
4147 return 1; /* burn nutrition; maybe pass out */
4148 context.polearm.hitmon = mtmp;
4149 check_caitiff(mtmp);
4150 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4151 (void) thitmonst(mtmp, uwep);
4152 } else if (glyph_is_statue(glyph) /* might be hallucinatory */
4153 && sobj_at(STATUE, bhitpos.x, bhitpos.y)) {
4154 struct trap *t = t_at(bhitpos.x, bhitpos.y);
4156 if (t && t->ttyp == STATUE_TRAP
4157 && activate_statue_trap(t, t->tx, t->ty, FALSE)) {
4158 ; /* feedback has been give by animate_statue() */
4160 /* Since statues look like monsters now, we say something
4161 different from "you miss" or "there's nobody there".
4162 Note: we only do this when a statue is displayed here,
4163 because the player is probably attempting to attack it;
4164 other statues obscured by anything are just ignored. */
4166 pline("Thump! Your blow bounces harmlessly off the statue.");
4168 pline("
\83S
\83c
\83\93\81I
\92¤
\91\9c\82Í
\8f\9d\82Â
\82©
\82È
\82©
\82Á
\82½
\81D");
4169 wake_nearto(bhitpos.x, bhitpos.y, 25);
4172 /* no monster here and no statue seen or remembered here */
4173 (void) unmap_invisible(bhitpos.x, bhitpos.y);
4175 You("miss; there is no one there to hit.");
4177 You("
\8aO
\82ê
\82½
\81D
\82»
\82±
\82É
\82Í
\89½
\82à
\82È
\82¢
\81D");
4179 u_wipe_engr(2); /* same as for melee or throwing */
4187 boolean wasblind = Blind;
4188 boolean wascreamed = u.ucreamed;
4189 boolean several = FALSE;
4191 if (obj->quan > 1L) {
4193 obj = splitobj(obj, 1L);
4197 You("give yourself a facial.");
4199 You("
\83N
\83\8a\81[
\83\80\83p
\83b
\83N
\82ð
\82µ
\82½
\81D");
4202 pline("You immerse your %s in %s%s.", body_part(FACE),
4203 several ? "one of " : "",
4204 several ? makeplural(the(xname(obj))) : the(xname(obj)));
4206 pline("%s%s
\82É%s
\82ð
\92¾
\82ß
\82½
\81D",
4208 several ? "
\82Ì
\82Ð
\82Æ
\82Â" : "", body_part(FACE));
4210 if (can_blnd((struct monst *) 0, &youmonst, AT_WEAP, obj)) {
4211 int blindinc = rnd(25);
4212 u.ucreamed += blindinc;
4213 make_blinded(Blinded + (long) blindinc, FALSE);
4214 if (!Blind || (Blind && wasblind))
4216 pline("There's %ssticky goop all over your %s.",
4217 wascreamed ? "more " : "", body_part(FACE));
4219 pline("
\82â
\82Á
\82©
\82¢
\82È
\82Ë
\82Î
\82Ë
\82Î
\82ª%s
\91S
\91Ì
\82É%s
\82Â
\82¢
\82½
\81D",
4220 body_part(FACE), wascreamed ? "
\82³
\82ç
\82É" : "");
4222 else /* Blind && !wasblind */
4224 You_cant("see through all the sticky goop on your %s.",
4226 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",
4231 /* useup() is appropriate, but we want costly_alteration()'s message */
4232 costly_alteration(obj, COST_SPLAT);
4233 obj_extract_self(obj);
4242 int res = 0, typ, max_range = 4, tohit;
4243 boolean save_confirm;
4248 /* Are you allowed to use the hook? */
4250 pline(not_enough_room);
4254 if (!wield_tool(obj, "cast"))
4259 /* assert(obj == uwep); */
4261 /* Prompt for a location */
4262 pline(where_to_hit);
4266 if (getpos(&cc, TRUE, "the spot to hit") < 0)
4268 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
4269 return res; /* ESC; uses turn iff grapnel became wielded */
4271 /* Calculate range; unlike use_pole(), there's no minimum for range */
4272 typ = uwep_skill_type();
4273 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4275 else if (P_SKILL(typ) == P_SKILLED)
4279 if (distu(cc.x, cc.y) > max_range) {
4283 pline("
\89\93\82·
\82¬
\82é
\81I");
4285 } else if (!cansee(cc.x, cc.y)) {
4288 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4293 /* What do you want to hit? */
4295 if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) {
4296 winid tmpwin = create_nhwindow(NHW_MENU);
4299 menu_item *selected;
4301 any = zeroany; /* set all bits to zero */
4302 any.a_int = 1; /* use index+1 (cant use 0) as identifier */
4306 Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
4308 Sprintf(buf, "%s
\82É
\82 \82é
\95¨
\91Ì", surface(cc.x, cc.y));
4309 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4313 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
4316 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "
\89ö
\95¨",
4321 Sprintf(buf, "the %s", surface(cc.x, cc.y));
4323 Sprintf(buf, "%s", surface(cc.x, cc.y));
4324 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4327 end_menu(tmpwin, "Aim for what?");
4329 end_menu(tmpwin, "
\89½
\82ð
\91_
\82¤
\81H");
4331 if (select_menu(tmpwin, PICK_ONE, &selected) > 0
4332 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2))
4333 tohit = selected[0].item.a_int - 1;
4334 free((genericptr_t) selected);
4335 destroy_nhwindow(tmpwin);
4338 /* possibly scuff engraving at your feet;
4339 any engraving at the target location is unaffected */
4340 if (tohit == 2 || !rn2(2))
4341 u_wipe_engr(rnd(2));
4343 /* What did you hit? */
4346 /* FIXME -- untrap needs to deal with non-adjacent traps */
4348 case 1: /* Object */
4349 if ((otmp = level.objects[cc.x][cc.y]) != 0) {
4351 You("snag an object from the %s!", surface(cc.x, cc.y));
4353 You("%s
\82Ì
\82à
\82Ì
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I", surface(cc.x, cc.y));
4354 (void) pickup_object(otmp, 1L, FALSE);
4355 /* If pickup fails, leave it alone */
4360 case 2: /* Monster */
4362 if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *) 0)
4364 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4365 save_confirm = flags.confirm;
4366 if (verysmall(mtmp->data) && !rn2(4)
4367 && enexto(&cc, u.ux, u.uy, (struct permonst *) 0)) {
4368 flags.confirm = FALSE;
4369 (void) attack_checks(mtmp, uwep);
4370 flags.confirm = save_confirm;
4371 check_caitiff(mtmp); /* despite fact there's no damage */
4373 You("pull in %s!", mon_nam(mtmp));
4375 You("%s
\82ð
\88ø
\82Á
\92£
\82Á
\82½
\81I", mon_nam(mtmp));
4376 mtmp->mundetected = 0;
4377 rloc_to(mtmp, cc.x, cc.y);
4379 } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data))
4381 flags.confirm = FALSE;
4382 (void) attack_checks(mtmp, uwep);
4383 flags.confirm = save_confirm;
4384 check_caitiff(mtmp);
4385 (void) thitmonst(mtmp, uwep);
4389 case 3: /* Surface */
4390 if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y))
4392 pline_The("hook slices through the %s.", surface(cc.x, cc.y));
4394 pline("
\83t
\83b
\83N
\82Í%s
\82ð
\82³
\82Á
\82Æ
\90Ø
\82Á
\82½
\81D", surface(cc.x, cc.y));
4397 You("are yanked toward the %s!", surface(cc.x, cc.y));
4399 You("%s
\82Ö
\88ø
\82Á
\82Ï
\82ç
\82ê
\82½
\81I", surface(cc.x, cc.y));
4400 hurtle(sgn(cc.x - u.ux), sgn(cc.y - u.uy), 1, FALSE);
4404 default: /* Yourself (oops!) */
4405 if (P_SKILL(typ) <= P_BASIC) {
4407 You("hook yourself!");
4409 You("
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I");
4411 losehp(Maybe_Half_Phys(rn1(10, 10)), "a grappling hook",
4413 losehp(Maybe_Half_Phys(rn1(10, 10)), "
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82Ä",
4419 pline1(nothing_happens);
4423 #define BY_OBJECT ((struct monst *) 0)
4425 /* return 1 if the wand is broken, hence some time elapsed */
4431 static const char nothing_else_happens[] = "But nothing else happens...";
4433 static const char nothing_else_happens[] = "
\82µ
\82©
\82µ
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D
\81D
\81D";
4434 register int i, x, y;
4435 register struct monst *mon;
4437 boolean affects_objects;
4438 boolean shop_damage = FALSE;
4439 boolean fillmsg = FALSE;
4440 int expltype = EXPL_MAGICAL;
4441 char confirm[QBUFSZ], buf[BUFSZ];
4443 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
4445 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "
\83o
\83\8b\83T
\82Ì
\8fñ"));
4448 if (!paranoid_query(ParanoidBreakwand,
4450 "Are you really sure you want to break ",
4451 "?", obj, yname, ysimple_name, "the wand")))
4453 if (!paranoid_query(ParanoidBreakwand,
4455 "
\96{
\93\96\82É", "
\82ð
\89ó
\82·
\82Ì
\81H",
4456 obj, xname, ysimple_name, "
\8fñ")))
4460 if (nohands(youmonst.data)) {
4462 You_cant("break %s without hands!", yname(obj));
4464 You("
\8eè
\82ª
\96³
\82¢
\82Ì
\82Å%s
\82ð
\89ó
\82¹
\82È
\82¢
\81I", xname(obj));
4466 } else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
4468 You("don't have the strength to break %s!", yname(obj));
4470 You("%s
\82ð
\89ó
\82·
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I", xname(obj));
4474 pline("Raising %s high above your %s, you %s it in two!", yname(obj),
4475 body_part(HEAD), is_fragile ? "snap" : "break");
4477 pline("%s
\82ð%s
\82Ì
\8fã
\82É
\8d\82\82
\8cf
\82°
\81C
\93ñ
\82Â
\82É
\82Ö
\82µ
\90Ü
\82Á
\82½
\81I", yname(obj),
4481 /* [ALI] Do this first so that wand is removed from bill. Otherwise,
4482 * the freeinv() below also hides it from setpaid() which causes problems.
4485 check_unpaid(obj); /* Extra charge for use */
4486 costly_alteration(obj, COST_DSTROY);
4489 current_wand = obj; /* destroy_item might reset this */
4490 freeinv(obj); /* hide it from destroy_item instead... */
4491 setnotworn(obj); /* so we need to do this ourselves */
4493 if (!zappable(obj)) {
4494 pline(nothing_else_happens);
4495 goto discard_broken_wand;
4497 /* successful call to zappable() consumes a charge; put it back */
4499 /* might have "wrested" a final charge, taking it from 0 to -1;
4500 if so, we just brought it back up to 0, which wouldn't do much
4501 below so give it 1..3 charges now, usually making it stronger
4502 than an ordinary last charge (the wand is already gone from
4503 inventory, so perm_invent can't accidentally reveal this) */
4510 affects_objects = FALSE;
4512 switch (obj->otyp) {
4517 case WAN_ENLIGHTENMENT:
4519 case WAN_SECRET_DOOR_DETECTION:
4520 pline(nothing_else_happens);
4521 goto discard_broken_wand;
4527 expltype = EXPL_FIERY;
4530 if (expltype == EXPL_MAGICAL)
4531 expltype = EXPL_FROSTY;
4534 case WAN_MAGIC_MISSILE:
4536 explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
4537 makeknown(obj->otyp); /* explode describes the effect */
4538 goto discard_broken_wand;
4540 /* we want this before the explosion instead of at the very end */
4542 pline("A wall of force smashes down around you!");
4544 pline("
\82 \82È
\82½
\82Í
\96\82\97Í
\82Ì
\95Ç
\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81I");
4545 dmg = d(1 + obj->spe, 6); /* normally 2d12 */
4547 case WAN_CANCELLATION:
4549 case WAN_TELEPORTATION:
4550 case WAN_UNDEAD_TURNING:
4551 affects_objects = TRUE;
4557 /* magical explosion and its visual effect occur before specific effects
4559 /* [TODO? This really ought to prevent the explosion from being
4560 fatal so that we never leave a bones file where none of the
4561 surrounding targets (or underlying objects) got affected yet.] */
4562 explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS,
4565 /* prepare for potential feedback from polymorph... */
4568 /* this makes it hit us last, so that we can see the action first */
4569 for (i = 0; i <= 8; i++) {
4570 bhitpos.x = x = obj->ox + xdir[i];
4571 bhitpos.y = y = obj->oy + ydir[i];
4575 if (obj->otyp == WAN_DIGGING) {
4578 if (dig_check(BY_OBJECT, FALSE, x, y)) {
4579 if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) {
4580 /* normally, pits and holes don't anger guards, but they
4581 * do if it's a wall or door that's being dug */
4582 watch_dig((struct monst *) 0, x, y, TRUE);
4583 if (*in_rooms(x, y, SHOPBASE))
4587 * Let liquid flow into the newly created pits.
4588 * Adjust corresponding code in music.c for
4589 * drum of earthquake if you alter this sequence.
4591 typ = fillholetyp(x, y, FALSE);
4593 levl[x][y].typ = typ, levl[x][y].flags = 0;
4594 liquid_flow(x, y, typ, t_at(x, y),
4598 : "Some holes are quickly filled with %s!");
4600 : "
\8c\8a\82Í
\82·
\82®
\82É%s
\82Å
\96\84\82Ü
\82Á
\82½
\81I");
4603 digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3
4604 || (!Can_dig_down(&u.uz)
4605 && !levl[x][y].candig))
4610 } else if (obj->otyp == WAN_CREATE_MONSTER) {
4611 /* u.ux,u.uy creates it near you--x,y might create it in rock */
4612 (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS);
4614 } else if (x != u.ux || y != u.uy) {
4616 * Wand breakage is targetting a square adjacent to the hero,
4617 * which might contain a monster or a pile of objects or both.
4618 * Handle objects last; avoids having undead turning raise an
4619 * undead's corpse and then attack resulting undead monster.
4620 * obj->bypass in bhitm() prevents the polymorphing of items
4621 * dropped due to monster's polymorph and prevents undead
4622 * turning that kills an undead from raising resulting corpse.
4624 if ((mon = m_at(x, y)) != 0) {
4625 (void) bhitm(mon, obj);
4626 /* if (context.botl) bot(); */
4628 if (affects_objects && level.objects[x][y]) {
4629 (void) bhitpile(obj, bhito, x, y, 0);
4631 bot(); /* potion effects */
4635 * Wand breakage is targetting the hero. Using xdir[]+ydir[]
4636 * deltas for location selection causes this case to happen
4637 * after all the surrounding squares have been handled.
4638 * Process objects first, in case damage is fatal and leaves
4639 * bones, or teleportation sends one or more of the objects to
4640 * same destination as hero (lookhere/autopickup); also avoids
4641 * the polymorphing of gear dropped due to hero's transformation.
4642 * (Unlike with monsters being hit by zaps, we can't rely on use
4643 * of obj->bypass in the zap code to accomplish that last case
4644 * since it's also used by retouch_equipment() for polyself.)
4646 if (affects_objects && level.objects[x][y]) {
4647 (void) bhitpile(obj, bhito, x, y, 0);
4649 bot(); /* potion effects */
4651 damage = zapyourself(obj, FALSE);
4654 Sprintf(buf, "killed %sself by breaking a wand", uhim());
4655 losehp(Maybe_Half_Phys(damage), buf, NO_KILLER_PREFIX);
4657 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82Å
\8fñ
\82ð
\89ó
\82µ
\82Ä
\83_
\83\81\81[
\83W
\82ð
\8eó
\82¯");
4658 losehp(Maybe_Half_Phys(damage), buf, KILLED_BY);
4662 bot(); /* blindness */
4666 /* potentially give post zap/break feedback */
4669 /* Note: if player fell thru, this call is a no-op.
4670 Damage is handled in digactualhole in that case */
4673 pay_for_damage("dig into", FALSE);
4675 pay_for_damage("
\8c\8a\82ð
\82 \82¯
\82é", FALSE);
4677 if (obj->otyp == WAN_LIGHT)
4678 litroom(TRUE, obj); /* only needs to be done once */
4680 discard_broken_wand:
4681 obj = current_wand; /* [see dozap() and destroy_item()] */
4690 add_class(cl, class)
4701 static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 };
4703 /* augment tools[] if various items are carried */
4705 setapplyclasses(class_list)
4708 register struct obj *otmp;
4710 boolean knowoil, knowtouchstone, addpotions, addstones, addfood;
4712 knowoil = objects[POT_OIL].oc_name_known;
4713 knowtouchstone = objects[TOUCHSTONE].oc_name_known;
4714 addpotions = addstones = addfood = FALSE;
4715 for (otmp = invent; otmp; otmp = otmp->nobj) {
4718 || (otmp->oclass == POTION_CLASS
4720 || (!knowoil && !objects[otyp].oc_name_known))))
4722 if (otyp == TOUCHSTONE
4723 || (is_graystone(otmp)
4725 || (!knowtouchstone && !objects[otyp].oc_name_known))))
4727 if (otyp == CREAM_PIE || otyp == EUCALYPTUS_LEAF)
4731 class_list[0] = '\0';
4732 if (addpotions || addstones)
4733 add_class(class_list, ALL_CLASSES);
4734 Strcat(class_list, tools);
4736 add_class(class_list, POTION_CLASS);
4738 add_class(class_list, GEM_CLASS);
4740 add_class(class_list, FOOD_CLASS);
4743 /* the 'a' command */
4748 register int res = 1;
4749 char class_list[MAXOCLASSES + 2];
4751 if (check_capacity((char *) 0))
4754 setapplyclasses(class_list); /* tools[] */
4755 obj = getobj(class_list, "use or apply");
4759 if (!retouch_object(&obj, FALSE))
4760 return 1; /* evading your grasp costs a turn; just be
4761 grateful that you don't drop it as well */
4763 if (obj->oclass == WAND_CLASS)
4764 return do_break_wand(obj);
4766 switch (obj->otyp) {
4769 if (obj == ublindf) {
4772 } else if (!ublindf) {
4776 You("are already %s.", ublindf->otyp == TOWEL
4777 ? "covered by a towel"
4778 : ublindf->otyp == BLINDFOLD
4779 ? "wearing a blindfold"
4780 : "wearing lenses");
4782 You("
\82à
\82¤%s
\82Ä
\82¢
\82é
\81D", ublindf->otyp == TOWEL
4783 ? "
\83^
\83I
\83\8b\82ð
\8aª
\82¢"
4784 : ublindf->otyp == BLINDFOLD
4785 ? "
\96Ú
\89B
\82µ
\82ð
\82Â
\82¯"
4786 : "
\83\8c\83\93\83Y
\82ð
\82Â
\82¯");
4791 res = use_cream_pie(obj);
4794 res = use_whip(obj);
4796 case GRAPPLING_HOOK:
4797 res = use_grapple(obj);
4803 case BAG_OF_HOLDING:
4805 res = use_container(&obj, 1, FALSE);
4808 (void) bagotricks(obj, FALSE, (int *) 0);
4816 res = (pick_lock(obj) != 0);
4819 case DWARVISH_MATTOCK:
4820 res = use_pick_axe(obj);
4823 use_tinning_kit(obj);
4826 res = use_leash(obj);
4829 res = use_saddle(obj);
4832 use_magic_whistle(obj);
4837 case EUCALYPTUS_LEAF:
4838 /* MRKR: Every Australian knows that a gum leaf makes an excellent
4839 * whistle, especially if your pet is a tame kangaroo named Skippy.
4842 use_magic_whistle(obj);
4843 /* sometimes the blessing will be worn off */
4847 pline("%s %s.", Yobjnam2(obj, "glow"), hcolor("brown"));
4849 pline("%s
\82Í%s
\8bP
\82¢
\82½
\81D", xname(obj), hcolor_adv("
\92\83\90F
\82Ì"));
4859 res = use_stethoscope(obj);
4862 res = use_mirror(obj);
4865 case BELL_OF_OPENING:
4868 case CANDELABRUM_OF_INVOCATION:
4869 use_candelabrum(obj);
4881 light_cocktail(&obj);
4883 case EXPENSIVE_CAMERA:
4884 res = use_camera(obj);
4887 res = use_towel(obj);
4890 use_crystal_ball(&obj);
4896 res = use_tin_opener(obj);
4902 use_unicorn_horn(obj);
4913 case DRUM_OF_EARTHQUAKE:
4914 res = do_play_instrument(obj);
4916 case HORN_OF_PLENTY: /* not a musical instrument */
4917 (void) hornoplenty(obj, FALSE);
4930 /* Pole-weapons can strike at a distance */
4932 res = use_pole(obj);
4934 } else if (is_pick(obj) || is_axe(obj)) {
4935 res = use_pick_axe(obj);
4939 pline("Sorry, I don't know how to use that.");
4941 pline("
\82»
\82ê
\82ð
\82Ç
\82¤
\82â
\82Á
\82Ä
\8eg
\82¤
\82ñ
\82¾
\82¢
\81H");
4945 if (res && obj && obj->oartifact)
4951 /* Keep track of unfixable troubles for purposes of messages saying you feel
4955 unfixable_trouble_count(is_horn)
4958 int unfixable_trbl = 0;
4966 if (Wounded_legs && !u.usteed)
4968 /* lycanthropy is undesirable, but it doesn't actually make you feel bad
4969 so don't count it as a trouble which can't be fixed */
4972 * Unicorn horn can fix these when they're timed but not when
4973 * they aren't. Potion of restore ability doesn't touch them,
4974 * so they're always unfixable for the not-unihorn case.
4975 * [Most of these are timed only, so always curable via horn.
4976 * An exception is Stunned, which can be forced On by certain
4977 * polymorph forms (stalker, bats).]
4979 if (Sick && (!is_horn || (Sick & ~TIMEOUT) != 0L))
4981 if (Stunned && (!is_horn || (HStun & ~TIMEOUT) != 0L))
4983 if (Confusion && (!is_horn || (HConfusion & ~TIMEOUT) != 0L))
4985 if (Hallucination && (!is_horn || (HHallucination & ~TIMEOUT) != 0L))
4987 if (Vomiting && (!is_horn || (Vomiting & ~TIMEOUT) != 0L))
4989 if (Deaf && (!is_horn || (HDeaf & ~TIMEOUT) != 0L))
4992 return unfixable_trbl;