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-2020 */
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)
794 /* player is about to die (for bones) */
798 register struct obj *otmp;
799 register struct monst *mtmp;
801 for (otmp = invent; otmp; otmp = otmp->nobj)
802 if (otmp->otyp == LEASH)
804 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
814 return (boolean) (mtmp->mnum != PM_LONG_WORM
815 && !unsolid(mtmp->data)
816 && (!nolimbs(mtmp->data) || has_head(mtmp->data)));
829 /* if the leash isn't in use, assume we're trying to leash
830 the engulfer; if it is use, distinguish between removing
831 it from the engulfer versus from some other creature
832 (note: the two in-use cases can't actually occur; all
833 leashes are released when the hero gets engulfed) */
835 You_cant((!obj->leashmon
836 ? "leash %s from inside."
837 : (obj->leashmon == (int) u.ustuck->m_id)
838 ? "unleash %s from inside."
839 : "unleash anything from inside %s."),
840 noit_mon_nam(u.ustuck));
842 You_cant((!obj->leashmon
843 ? "
\93à
\91¤
\82©
\82ç%s
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"
844 : (obj->leashmon == (int) u.ustuck->m_id)
845 ? "
\93à
\91¤
\82©
\82ç%s
\82ð
\8aO
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"
846 : "%s
\82Ì
\93à
\91¤
\82©
\82ç
\8aO
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D"),
847 noit_mon_nam(u.ustuck));
851 if (!obj->leashmon && number_leashed() >= MAXLEASHED) {
853 You("cannot leash any more pets.");
855 You("
\82±
\82ê
\88È
\8fã
\83y
\83b
\83g
\82É
\95R
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
859 if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
862 if (cc.x == u.ux && cc.y == u.uy) {
863 if (u.usteed && u.dz > 0) {
869 pline("Leash yourself? Very funny...");
871 pline("
\8e©
\95ª
\82ð
\94\9b\82é
\81H
\95Ï
\82È
\82Ì
\81D
\81D
\81D");
876 * From here on out, return value is 1 == a move is used.
879 if (!(mtmp = m_at(cc.x, cc.y))) {
881 There("is no creature there.");
883 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
884 (void) unmap_invisible(cc.x, cc.y);
888 spotmon = canspotmon(mtmp);
891 if (!spotmon && !glyph_is_invisible(levl[cc.x][cc.y].glyph)) {
892 /* for the unleash case, we don't verify whether this unseen
893 monster is the creature attached to the current leash */
895 You("fail to %sleash something.", obj->leashmon ? "un" : "");
897 You("%s
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D", obj->leashmon ? "
\8aO
\82·" : "
\8c\8b\82Ñ
\82Â
\82¯
\82é");
898 /* trying again will work provided the monster is tame
899 (and also that it doesn't change location by retry time) */
900 map_invisible(cc.x, cc.y);
901 } else if (!mtmp->mtame) {
903 pline("%s %s leashed!", Monnam(mtmp),
904 (!obj->leashmon) ? "cannot be" : "is not");
906 pline("%s
\82Í
\95R
\82Å%s
\81I", Monnam(mtmp),
907 (!obj->leashmon) ? "
\8c\8b\82×
\82È
\82¢" : "
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢");
909 } else if (!obj->leashmon) {
910 /* applying a leash which isn't currently in use */
911 if (mtmp->mleashed) {
913 pline("This %s is already leashed.",
914 spotmon ? l_monnam(mtmp) : "creature");
916 pline("%s
\82Í
\82·
\82Å
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D",
917 spotmon ? l_monnam(mtmp) : "
\89ö
\95¨");
919 } else if (unsolid(mtmp->data)) {
921 pline("The leash would just fall off.");
923 pline("
\95R
\82Í
\82»
\82Ì
\8fê
\82É
\97\8e\82¿
\82½
\81D");
924 } else if (nolimbs(mtmp->data) && !has_head(mtmp->data)) {
926 pline("%s has no extremities the leash would fit.",
928 pline("%s
\82É
\82Í
\95R
\82ð
\82Â
\82¯
\82ç
\82ê
\82»
\82¤
\82È
\82Æ
\82±
\82ë
\82ª
\82È
\82¢
\81D",
930 } else if (!leashable(mtmp)) {
932 pline("The leash won't fit onto %s%s.", spotmon ? "your " : "",
935 pline("
\95R
\82Í%s
\82É
\8d\87\82í
\82È
\82¢
\81D",
940 You("slip the leash around %s%s.", spotmon ? "your " : "",
943 You("%s
\82ð
\95R
\82Å
\8c\8b\82Ñ
\82Â
\82¯
\82½
\81D",
947 obj->leashmon = (int) mtmp->m_id;
951 /* applying a leash which is currently in use */
952 if (obj->leashmon != (int) mtmp->m_id) {
954 pline("This leash is not attached to that creature.");
956 pline("
\82±
\82Ì
\95R
\82Í
\82»
\82ê
\82É
\82Í
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢
\81D");
957 } else if (obj->cursed) {
959 pline_The("leash would not come off!");
961 pline("
\95R
\82ª
\82Í
\82¸
\82ê
\82È
\82¢
\81I");
967 You("remove the leash from %s%s.",
968 spotmon ? "your " : "", l_monnam(mtmp));
970 You("%s
\82©
\82ç
\95R
\82ð
\82Í
\82¸
\82µ
\82½
\81D",
978 /* assuming mtmp->mleashed has been checked */
987 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
991 return (struct obj *) 0;
997 register struct monst *mtmp;
998 register struct obj *otmp;
1000 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1001 if (DEADMONSTER(mtmp))
1003 if (mtmp->mleashed) {
1004 if (distu(mtmp->mx, mtmp->my) > 2)
1006 if (distu(mtmp->mx, mtmp->my) > 2) {
1007 for (otmp = invent; otmp; otmp = otmp->nobj)
1008 if (otmp->otyp == LEASH
1009 && otmp->leashmon == (int) mtmp->m_id) {
1013 You_feel("%s leash go slack.",
1014 (number_leashed() > 1) ? "a" : "the");
1016 You("
\95R
\82ª
\82½
\82é
\82ñ
\82¾
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1024 /* no pack mules for the Amulet */
1025 if (u.usteed && mon_has_amulet(u.usteed))
1032 register xchar x, y;
1034 register struct obj *otmp;
1035 register struct monst *mtmp;
1037 for (otmp = invent; otmp; otmp = otmp->nobj) {
1038 if (otmp->otyp != LEASH || otmp->leashmon == 0)
1040 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1041 if (DEADMONSTER(mtmp))
1043 if ((int) mtmp->m_id == otmp->leashmon)
1047 impossible("leash in use isn't attached to anything?");
1051 if (dist2(u.ux, u.uy, mtmp->mx, mtmp->my)
1052 > dist2(x, y, mtmp->mx, mtmp->my)) {
1053 if (!um_dist(mtmp->mx, mtmp->my, 3)) {
1054 ; /* still close enough */
1055 } else if (otmp->cursed && !breathless(mtmp->data)) {
1056 if (um_dist(mtmp->mx, mtmp->my, 5)
1057 || (mtmp->mhp -= rnd(2)) <= 0) {
1058 long save_pacifism = u.uconduct.killer;
1061 Your("leash chokes %s to death!", mon_nam(mtmp));
1063 pline("%s
\82Í
\8di
\82ß
\8eE
\82³
\82ê
\82½
\81I",mon_nam(mtmp));
1064 /* hero might not have intended to kill pet, but
1065 that's the result of his actions; gain experience,
1066 lose pacifism, take alignment and luck hit, make
1067 corpse less likely to remain tame after revival */
1068 xkilled(mtmp, XKILL_NOMSG);
1069 /* life-saving doesn't ordinarily reset this */
1070 if (!DEADMONSTER(mtmp))
1071 u.uconduct.killer = save_pacifism;
1074 pline("%s is choked by the leash!", Monnam(mtmp));
1076 pline("%s
\82Í
\95R
\82Å
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82½
\81I", Monnam(mtmp));
1077 /* tameness eventually drops to 1 here (never 0) */
1078 if (mtmp->mtame && rn2(mtmp->mtame))
1082 if (um_dist(mtmp->mx, mtmp->my, 5)) {
1084 pline("%s leash snaps loose!", s_suffix(Monnam(mtmp)));
1086 pline("%s
\82Ì
\95R
\82Í
\83p
\83`
\83\93\82Æ
\8aO
\82ê
\82½
\81I", Monnam(mtmp));
1087 m_unleash(mtmp, FALSE);
1090 You("pull on the leash.");
1092 You("
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\81D");
1093 if (mtmp->data->msound != MS_SILENT)
1114 return ((ACURR(A_CHA) > 14)
1115 ? ((poly_gender() == 1)
1121 /*JP
\8cê
\8a²
\82Å
\8eg
\82¤ */
1129 static const char look_str[] = "look %s.";
1131 static const char look_str[] = "%s
\8c©
\82¦
\82é
\81D";
1137 const char *mirror, *uvisage;
1141 boolean vis, invis_mirror, useeit, monable;
1143 if (!getdir((char *) 0))
1145 invis_mirror = Invis;
1146 useeit = !Blind && (!invis_mirror || See_invisible);
1147 uvisage = beautiful();
1148 mirror = simpleonames(obj); /* "mirror" or "looking glass" */
1149 if (obj->cursed && !rn2(2)) {
1152 pline_The("%s fogs up and doesn't reflect!", mirror);
1154 pline("%s
\82Í
\93Ü
\82è
\81C
\89f
\82ç
\82È
\82
\82È
\82Á
\82½
\81I", mirror);
1157 if (!u.dx && !u.dy && !u.dz) {
1160 You_cant("see your %s %s.", uvisage, body_part(FACE));
1162 You_cant("
\8e©
\95ª
\82Ì%s
\82¢%s
\82ð
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", uvisage, body_part(FACE));
1164 if (u.umonnum == PM_FLOATING_EYE) {
1167 You("stiffen momentarily under your gaze.");
1169 pline("
\88ê
\8fu
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82½
\81D");
1173 pline("Yow! The %s stares back!", mirror);
1175 pline("
\82¨
\82ì
\81I%s
\82ª
\82 \82È
\82½
\82ð
\82É
\82ç
\82Ý
\95Ô
\82µ
\82½
\81I", mirror);
1178 pline("Yikes! You've frozen yourself!");
1180 pline("
\82¨
\82ì
\81I
\82 \82È
\82½
\82Í
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I");
1181 if (!Hallucination || !rn2(4)) {
1182 nomul(-rnd(MAXULEV + 6 - u.ulevel));
1184 multi_reason = "gazing into a mirror";
1186 multi_reason = "
\8b¾
\82É
\94½
\8eË
\82µ
\82½
\8e\8b\90ü
\82Å
\8dd
\92¼
\82µ
\82Ä
\82¢
\82é
\8aÔ
\82É";
1188 nomovemsg = 0; /* default, "you can move again" */
1190 } else if (youmonst.data->mlet == S_VAMPIRE)
1192 You("don't have a reflection.");
1194 You("
\8b¾
\82É
\89f
\82ç
\82È
\82©
\82Á
\82½
\81D");
1195 else if (u.umonnum == PM_UMBER_HULK) {
1197 pline("Huh? That doesn't look like you!");
1199 pline("
\82Ù
\82¦
\81H
\8eÊ
\82Á
\82Ä
\82é
\82Ì
\82Í
\82 \82È
\82½
\82¶
\82á
\82È
\82¢
\82Ý
\82½
\82¢
\82¾
\81I");
1200 make_confused(HConfusion + d(3, 4), FALSE);
1201 } else if (Hallucination)
1202 You(look_str, hcolor((char *) 0));
1205 You(look_str, "peaked");
1207 You(look_str, "
\8aç
\90F
\82ª
\88«
\82");
1208 else if (u.uhs >= WEAK)
1210 You(look_str, "undernourished");
1212 You(look_str, "
\89h
\97{
\8e¸
\92²
\82Ì
\82æ
\82¤
\82É");
1215 You("look as %s as ever.", uvisage);
1217 You("
\82 \82¢
\82©
\82í
\82ç
\82¸%s
\82
\8c©
\82¦
\82é
\81D", uvisage);
1224 You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)),
1225 mbodypart(u.ustuck, STOMACH));
1227 You("%s
\82Ì%s
\82ð
\89f
\82µ
\82½
\81D", mon_nam(u.ustuck),
1228 mbodypart(u.ustuck, STOMACH));
1235 You(Hallucination ? "give the fish a chance to fix their makeup."
1236 : "reflect the murky water.");
1238 You(Hallucination ? "
\8b\9b\82É
\89»
\8fÏ
\92¼
\82µ
\82Ì
\8b@
\89ï
\82ð
\97^
\82¦
\82½
\81D"
1239 : "
\82 \82È
\82½
\82Í
\97\84\82ñ
\82¾
\90\85\82ð
\89f
\82µ
\82½
\81D");
1246 You("reflect the %s.",
1248 You("%s
\82ð
\89f
\82µ
\82½
\81D",
1249 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
1252 mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM,
1253 (int FDECL((*), (MONST_P, OBJ_P))) 0,
1254 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1255 if (!mtmp || !haseyes(mtmp->data) || notonhead)
1258 /* couldsee(mtmp->mx, mtmp->my) is implied by the fact that bhit()
1259 targetted it, so we can ignore possibility of X-ray vision */
1260 vis = canseemon(mtmp);
1261 /* ways to directly see monster (excludes X-ray vision, telepathy,
1262 extended detection, type-specific warning) */
1263 #define SEENMON (MONSEEN_NORMAL | MONSEEN_SEEINVIS | MONSEEN_INFRAVIS)
1264 how_seen = vis ? howmonseen(mtmp) : 0;
1265 /* whether monster is able to use its vision-based capabilities */
1266 monable = !mtmp->mcan && (!mtmp->minvis || perceives(mtmp->data));
1267 mlet = mtmp->data->mlet;
1268 if (mtmp->msleeping) {
1271 pline("%s is too tired to look at your %s.", Monnam(mtmp),
1273 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),
1275 } else if (!mtmp->mcansee) {
1278 pline("%s can't see anything right now.", Monnam(mtmp));
1280 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\89½
\82à
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", Monnam(mtmp));
1281 } else if (invis_mirror && !perceives(mtmp->data)) {
1284 pline("%s fails to notice your %s.", Monnam(mtmp), mirror);
1286 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8bC
\95t
\82©
\82È
\82©
\82Á
\82½
\81D", Monnam(mtmp), mirror);
1287 /* infravision doesn't produce an image in the mirror */
1288 } else if ((how_seen & SEENMON) == MONSEEN_INFRAVIS) {
1289 if (vis) /* (redundant) */
1291 pline("%s is too far away to see %sself in the dark.",
1292 Monnam(mtmp), mhim(mtmp));
1294 pline("%s
\82Í
\88Ã
\88Å
\82Å
\8e©
\95ª
\8e©
\90g
\82ð
\8c©
\82é
\82É
\82Í
\89\93\82·
\82¬
\82é
\81D", Monnam(mtmp));
1296 /* some monsters do special things */
1297 } else if (mlet == S_VAMPIRE || mlet == S_GHOST || is_vampshifter(mtmp)) {
1300 pline("%s doesn't have a reflection.", Monnam(mtmp));
1302 pline("%s
\82Í%s
\82É
\89f
\82ç
\82È
\82¢
\81D", Monnam(mtmp), mirror);
1303 } else if (monable && mtmp->data == &mons[PM_MEDUSA]) {
1305 if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!"))
1307 if (mon_reflects(mtmp, "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81I"))
1311 pline("%s is turned to stone!", Monnam(mtmp));
1313 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1316 } else if (monable && mtmp->data == &mons[PM_FLOATING_EYE]) {
1317 int tmp = d((int) mtmp->m_lev, (int) mtmp->data->mattk[0].damd);
1322 pline("%s is frozen by its reflection.", Monnam(mtmp));
1324 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
1327 You_hear("%s stop moving.", something);
1329 You_hear("
\89½
\82©
\82ª
\93®
\82«
\82ð
\82Æ
\82ß
\82½
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1330 paralyze_monst(mtmp, (int) mtmp->mfrozen + tmp);
1331 } else if (monable && mtmp->data == &mons[PM_UMBER_HULK]) {
1334 pline("%s confuses itself!", Monnam(mtmp));
1336 pline("%s
\82Í
\8d¬
\97\90\82µ
\82½
\81I", Monnam(mtmp));
1338 } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
1339 || mtmp->data == &mons[PM_INCUBUS])) {
1341 char buf[BUFSZ]; /* "She" or "He" */
1344 pline("%s admires %sself in your %s.", Monnam(mtmp), mhim(mtmp),
1347 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\82¤
\82Á
\82Æ
\82è
\82µ
\82½
\81D", Monnam(mtmp));
1350 pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
1352 pline("%s
\82Í
\82»
\82ê
\82ð
\92D
\82Á
\82½
\81I", upstart(strcpy(buf, mhe(mtmp))));
1355 pline("It steals your %s!", mirror);
1357 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\93\90\82ñ
\82¾
\81I", mirror);
1358 setnotworn(obj); /* in case mirror was wielded */
1360 (void) mpickobj(mtmp, obj);
1361 if (!tele_restrict(mtmp))
1362 (void) rloc(mtmp, TRUE);
1363 } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
1364 && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
1365 boolean do_react = TRUE;
1367 if (mtmp->mfrozen) {
1370 You("discern no obvious reaction from %s.", mon_nam(mtmp));
1372 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));
1375 You_feel("a bit silly gesturing the mirror in that direction.");
1377 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");
1383 pline("%s is frightened by its reflection.", Monnam(mtmp));
1385 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\95|
\82ª
\82Á
\82½
\81D", Monnam(mtmp));
1386 monflee(mtmp, d(2, 4), FALSE, FALSE);
1388 } else if (!Blind) {
1389 if (mtmp->minvis && !See_invisible)
1391 else if ((mtmp->minvis && !perceives(mtmp->data))
1392 /* redundant: can't get here if these are true */
1393 || !haseyes(mtmp->data) || notonhead || !mtmp->mcansee)
1395 pline("%s doesn't seem to notice %s reflection.", Monnam(mtmp),
1398 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1402 pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp));
1404 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\96³
\8e\8b\82µ
\82½
\81D", Monnam(mtmp));
1413 register struct obj *obj = *optr;
1415 boolean wakem = FALSE, learno = FALSE,
1416 ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe),
1418 (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy)
1419 && !On_stairs(u.ux, u.uy));
1422 You("ring %s.", the(xname(obj)));
1424 You("%s
\82ð
\96Â
\82ç
\82µ
\82½
\81D", the(xname(obj)));
1426 if (Underwater || (u.uswallow && ordinary)) {
1428 amii_speaker(obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME);
1431 pline("But the sound is muffled.");
1433 pline("
\82µ
\82©
\82µ
\89¹
\82Í
\82©
\82«
\8fÁ
\82³
\82ê
\82½
\81D");
1435 } else if (invoking && ordinary) {
1436 /* needs to be recharged... */
1438 pline("But it makes no sound.");
1440 pline("
\82µ
\82©
\82µ
\81C
\89¹
\82Í
\96Â
\82ç
\82È
\82©
\82Á
\82½
\81D");
1441 learno = TRUE; /* help player figure out why */
1443 } else if (ordinary) {
1445 amii_speaker(obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME);
1447 if (obj->cursed && !rn2(4)
1448 /* note: once any of them are gone, we stop all of them */
1449 && !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE)
1450 && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE)
1451 && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE)
1452 && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT))
1455 You("summon %s!", a_monnam(mtmp));
1457 You("%s
\82ð
\8f¢
\8a«
\82µ
\82½
\81I", a_monnam(mtmp));
1458 if (!obj_resists(obj, 93, 100)) {
1460 pline("%s shattered!", Tobjnam(obj, "have"));
1462 pline("%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81I", xname(obj));
1470 mon_adjust_speed(mtmp, 2, (struct obj *) 0);
1472 case 2: /* no explanation; it just happens... */
1474 multi_reason = NULL;
1482 /* charged Bell of Opening */
1483 consume_obj_charge(obj, TRUE);
1489 pline1(nothing_happens);
1491 } else if (obj->cursed) {
1496 mkundead(&mm, FALSE, NO_MINVENT);
1499 } else if (invoking) {
1501 pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue"));
1503 pline("%s
\82Í
\95s
\8bC
\96¡
\82È
\89s
\82¢
\89¹
\82ð
\8fo
\82µ
\82½
\81D
\81D
\81D", xname(obj));
1505 amii_speaker(obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME);
1511 } else if (obj->blessed) {
1515 amii_speaker(obj, "ahahahDhEhCw", AMII_SOFT_VOLUME);
1520 } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1521 buried_ball_to_freedom();
1527 pline1(nothing_happens);
1531 pline("%s opens...", Something);
1533 pline("
\89½
\82©
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1538 pline("Things open around you...");
1540 pline("
\82Ü
\82í
\82è
\82Ì
\95¨
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1545 } else { /* uncursed */
1547 amii_speaker(obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME);
1552 pline1(nothing_happens);
1555 } /* charged BofO */
1558 makeknown(BELL_OF_OPENING);
1566 use_candelabrum(obj)
1567 register struct obj *obj;
1569 #if 0 /*JP*//* not used */
1570 const char *s = (obj->spe != 1) ? "candles" : "candle";
1575 You("snuff the %s.", s);
1577 You("
\82ë
\82¤
\82»
\82
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1578 end_burn(obj, TRUE);
1581 if (obj->spe <= 0) {
1583 pline("This %s has no %s.", xname(obj), s);
1585 pline("
\82±
\82Ì%s
\82É
\82Í
\82ë
\82¤
\82»
\82
\82ª
\82È
\82¢
\81D", xname(obj));
1590 You("cannot make fire under water.");
1592 You("
\90\85\92\86\82Å
\89Î
\82ð
\82¨
\82±
\82¹
\82È
\82¢
\81D");
1595 if (u.uswallow || obj->cursed) {
1598 pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"),
1601 pline("
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\82µ
\82Î
\82ç
\82
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D");
1607 There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s,
1610 pline("%s
\82É
\82Í
\82½
\82Á
\82½%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82µ
\82©
\82È
\82¢
\81D",
1611 xname(obj), obj->spe);
1615 pline("%s lit. %s dimly.", obj->spe == 1 ? "It is" : "They are",
1616 Tobjnam(obj, "shine"));
1618 pline("%s
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s
\82Í
\82Ù
\82Ì
\82©
\82É
\8bP
\82¢
\82½
\81D",
1619 xname(obj), xname(obj));
1623 pline("%s's %s burn%s", The(xname(obj)), s,
1624 (Blind ? "." : " brightly!"));
1626 pline("%s
\82Ì
\82ë
\82¤
\82»
\82
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I", The(xname(obj)),
1627 (Blind ? "" : "
\96¾
\82é
\82"));
1630 if (!invocation_pos(u.ux, u.uy) || On_stairs(u.ux, u.uy)) {
1632 pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
1634 pline("
\82ë
\82¤
\82»
\82
\82Í
\82·
\82²
\82¢
\91¬
\82³
\82Å
\94R
\82¦
\8en
\82ß
\82½
\81I");
1635 /* this used to be obj->age /= 2, rounding down; an age of
1636 1 would yield 0, confusing begin_burn() and producing an
1637 unlightable, unrefillable candelabrum; round up instead */
1638 obj->age = (obj->age + 1L) / 2L;
1640 if (obj->spe == 7) {
1643 pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
1645 pline("
\8aï
\96
\82È
\92g
\82©
\82³
\82ð%s
\82É
\8a´
\82¶
\82½
\81I", xname(obj));
1648 pline("%s with a strange light!", Tobjnam(obj, "glow"));
1650 pline("%s
\82Í
\8aï
\96
\82È
\8cõ
\82ð
\94
\82µ
\82Ä
\82¢
\82é
\81I", xname(obj));
1654 begin_burn(obj, FALSE);
1661 register struct obj *obj = *optr;
1662 register struct obj *otmp;
1664 const char *s = (obj->quan != 1) ? "candles" : "candle";
1666 const char *s = "
\82ë
\82¤
\82»
\82";
1667 char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
1674 otmp = carrying(CANDELABRUM_OF_INVOCATION);
1675 if (!otmp || otmp->spe == 7) {
1680 /*JP:
\8dÅ
\8fI
\93I
\82É
\82Í
\81u
\82ë
\82¤
\82»
\82
\82ð
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1681 /* first, minimal candelabrum suffix for formatting candles */
1683 Sprintf(qsfx, " to\033%s?", thesimpleoname(otmp));
1685 Sprintf(qsfx, "
\82ð\033%s
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", thesimpleoname(otmp));
1686 /* next, format the candles as a prefix for the candelabrum */
1688 (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1690 (void) safe_qbuf(qbuf, "", qsfx, obj, xname, thesimpleoname, s);
1691 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð\033
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1692 /* strip temporary candelabrum suffix */
1694 if ((q = strstri(qbuf, " to\033")) != 0)
1697 if ((q = strchr(qbuf, '\033')) != 0)
1699 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð
\81v*/
1701 /* last, format final "attach candles to candelabrum?" query */
1703 if (yn(safe_qbuf(qbuf, qbuf, "?", otmp, yname, thesimpleoname, "it"))
1705 if (yn(safe_qbuf(qbuf, qbuf, "
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", otmp, xname, thesimpleoname, "
\82»
\82ê"))
1710 if ((long) otmp->spe + obj->quan > 7L) {
1711 obj = splitobj(obj, 7L - (long) otmp->spe);
1712 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
1713 /* avoid a grammatical error if obj->quan gets
1714 reduced to 1 candle from more than one */
1715 s = (obj->quan != 1) ? "candles" : "candle";
1720 You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
1723 You("%ld
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ð%s%s
\82Ö
\8eæ
\82è
\82Â
\82¯
\82½
\81D",
1724 obj->quan, !otmp->spe ? "" : "
\82³
\82ç
\82É",
1727 if (!otmp->spe || otmp->age > obj->age)
1728 otmp->age = obj->age;
1729 otmp->spe += (int) obj->quan;
1730 if (otmp->lamplit && !obj->lamplit)
1732 pline_The("new %s magically %s!", s, vtense(s, "ignite"));
1734 pline("
\90V
\82µ
\82¢
\82ë
\82¤
\82»
\82
\82Í
\95s
\8ev
\8bc
\82È
\89\8a\82ð
\82 \82°
\82½
\81I");
1735 else if (!otmp->lamplit && obj->lamplit)
1737 pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
1739 pline("
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D");
1742 verbalize("You %s %s, you bought %s!",
1743 otmp->lamplit ? "burn" : "use",
1744 (obj->quan > 1L) ? "them" : "it",
1745 (obj->quan > 1L) ? "them" : "it");
1747 verbalize("
\89Î
\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1749 if (obj->quan < 7L && otmp->spe == 7)
1751 pline("%s now has seven%s candles attached.", The(xname(otmp)),
1752 otmp->lamplit ? " lit" : "");
1754 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",
1755 The(xname(otmp)), otmp->lamplit ? "
\89Î
\82Ì
\82Â
\82¢
\82½" : "");
1757 /* candelabrum's light range might increase */
1759 obj_merge_light_sources(otmp, otmp);
1760 /* candles are no longer a separate light source */
1762 end_burn(obj, TRUE);
1763 /* candles are now gone */
1765 /* candelabrum's weight is changing */
1766 otmp->owt = weight(otmp);
1771 /* call in drop, throw, and put in box, etc. */
1776 boolean candle = Is_candle(otmp);
1778 if ((candle || otmp->otyp == CANDELABRUM_OF_INVOCATION)
1782 #if 0 /*JP*//* not used */
1783 boolean many = candle ? (otmp->quan > 1L) : (otmp->spe > 1);
1786 (void) get_obj_location(otmp, &x, &y, 0);
1787 if (otmp->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1789 pline("%s%scandle%s flame%s extinguished.", Shk_Your(buf, otmp),
1790 (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"),
1791 (many ? "s are" : " is"));
1793 pline("%s%s
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, otmp),
1794 candle ? "" : "
\90C
\91ä
\82Ì");
1796 end_burn(otmp, TRUE);
1802 /* called when lit lamp is hit by water or put into a container or
1803 you've been swallowed by a monster; obj might be in transit while
1804 being thrown or dropped so don't assume that its location is valid */
1812 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1813 || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
1814 (void) get_obj_location(obj, &x, &y, 0);
1815 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1817 pline("%s %s out!", Yname2(obj), otense(obj, "go"));
1819 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", Yname2(obj));
1820 end_burn(obj, TRUE);
1823 if (snuff_candle(obj))
1829 /* Called when potentially lightable object is affected by fire_damage().
1830 Return TRUE if object was lit and FALSE otherwise --ALI */
1837 if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) {
1838 if ((obj->otyp == MAGIC_LAMP
1839 || obj->otyp == CANDELABRUM_OF_INVOCATION) && obj->spe == 0)
1841 else if (obj->otyp != MAGIC_LAMP && obj->age == 0)
1843 if (!get_obj_location(obj, &x, &y, 0))
1845 if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed)
1847 if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1848 || obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2))
1850 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1852 pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
1854 pline("%s
\82Ì
\96¾
\82©
\82è
\82ª
\82Â
\82¢
\82½
\81I", Yname2(obj));
1855 if (obj->otyp == POT_OIL)
1856 makeknown(obj->otyp);
1857 if (carried(obj) && obj->unpaid && costly_spot(u.ux, u.uy)) {
1858 /* if it catches while you have it, then it's your tough luck */
1861 verbalize("That's in addition to the cost of %s %s, of course.",
1862 yname(obj), obj->quan == 1L ? "itself" : "themselves");
1864 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ%s
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D", xname(obj));
1866 bill_dummy_object(obj);
1868 begin_burn(obj, FALSE);
1881 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1882 || obj->otyp == BRASS_LANTERN)
1884 pline("%slamp is now off.", Shk_Your(buf, obj));
1886 pline("%s
\83\89\83\93\83v
\82Ì
\93\94\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, obj));
1889 You("snuff out %s.", yname(obj));
1891 You("%s
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D", xname(obj));
1892 end_burn(obj, TRUE);
1897 pline(!Is_candle(obj) ? "This is not a diving lamp"
1898 : "Sorry, fire and water don't mix.");
1900 pline(!Is_candle(obj) ? "
\82±
\82ê
\82Í
\90ö
\90\85\97p
\82Ì
\83\89\83\93\83v
\82¶
\82á
\82È
\82¢
\81D"
1901 : "
\8ec
\94O
\82È
\82ª
\82ç
\81C
\89Î
\82Æ
\90\85\82Í
\82Ü
\82´
\82ç
\82È
\82¢
\81D");
1905 /* magic lamps with an spe == 0 (wished for) cannot be lit */
1906 if ((!Is_candle(obj) && obj->age == 0)
1907 || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
1908 if (obj->otyp == BRASS_LANTERN)
1910 Your("lamp has run out of power.");
1912 Your("
\83\89\83\93\83v
\82Ì
\93d
\97Í
\82ð
\8eg
\82¢
\90Ø
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1915 pline("This %s has no oil.", xname(obj));
1917 pline("
\82±
\82Ì%s
\82É
\82Í
\82à
\82¤
\83I
\83C
\83\8b\82ª
\82È
\82¢
\81D", xname(obj));
1920 if (obj->cursed && !rn2(2)) {
1923 pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"),
1924 otense(obj, "die"));
1926 pline("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D",
1930 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1931 || obj->otyp == BRASS_LANTERN) {
1934 pline("%slamp is now on.", Shk_Your(buf, obj));
1936 pline("%s
\83\89\83\93\83v
\82É
\93\94\82ª
\93\94\82Á
\82½
\81D", Shk_Your(buf, obj));
1937 } else { /* candle(s) */
1939 pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan),
1940 otense(obj, "burn"), Blind ? "." : " brightly!");
1942 pline("%s
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I",
1943 xname(obj), Blind ? "" : "
\96¾
\82é
\82");
1945 if (obj->unpaid && costly_spot(u.ux, u.uy)
1946 && obj->age == 20L * (long) objects[obj->otyp].oc_cost) {
1948 const char *ithem = (obj->quan > 1L) ? "them" : "it";
1950 verbalize("You burn %s, you bought %s!", ithem, ithem);
1952 verbalize("
\93\94\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1954 bill_dummy_object(obj);
1957 begin_burn(obj, FALSE);
1962 light_cocktail(optr)
1965 struct obj *obj = *optr; /* obj is a potion of oil */
1976 You("snuff the lit potion.");
1978 You("
\96û
\95r
\82Ì
\89Î
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1979 end_burn(obj, TRUE);
1981 * Free & add to re-merge potion. This will average the
1982 * age of the potions. Not exactly the best solution,
1986 *optr = addinv(obj);
1988 } else if (Underwater) {
1990 There("is not enough oxygen to sustain a fire.");
1992 pline("
\89Î
\82ð
\82Â
\82¯
\82é
\82Ì
\82É
\8f\
\95ª
\82È
\8e_
\91f
\82ª
\82È
\82¢
\81D");
1996 split1off = (obj->quan > 1L);
1998 obj = splitobj(obj, 1L);
2001 You("light %spotion.%s", shk_your(buf, obj),
2002 Blind ? "" : " It gives off a dim light.");
2004 You("%s
\96û
\95r
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s", shk_your(buf, obj),
2005 Blind ? "" : "
\96û
\95r
\82Í
\88Ã
\82¢
\8cõ
\82ð
\82Í
\82È
\82Á
\82½
\81D");
2008 if (obj->unpaid && costly_spot(u.ux, u.uy)) {
2009 /* Normally, we shouldn't both partially and fully charge
2010 * for an item, but (Yendorian Fuel) Taxes are inevitable...
2014 verbalize("That's in addition to the cost of the potion, of course.");
2016 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ
\96û
\95r
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D");
2017 bill_dummy_object(obj);
2019 makeknown(obj->otyp);
2021 begin_burn(obj, FALSE); /* after shop billing */
2023 obj_extract_self(obj); /* free from inv */
2026 obj = hold_another_object(obj, "You drop %s!", doname(obj),
2028 obj = hold_another_object(obj, "
\82 \82È
\82½
\82Í%s
\82ð
\97\8e\82µ
\82½
\81I", doname(obj),
2036 static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 };
2041 struct obj *obj = getobj(cuddly, "rub");
2043 if (obj && obj->oclass == GEM_CLASS) {
2044 if (is_graystone(obj)) {
2049 pline("Sorry, I don't know how to use that.");
2051 pline("
\8ec
\94O
\81D
\8eg
\82¢
\95û
\82ª
\82í
\82©
\82ç
\82È
\82¢
\81D");
2056 if (!obj || !wield_tool(obj, "rub"))
2059 /* now uwep is obj */
2060 if (uwep->otyp == MAGIC_LAMP) {
2061 if (uwep->spe > 0 && !rn2(3)) {
2062 check_unpaid_usage(uwep, TRUE); /* unusual item use */
2063 /* bones preparation: perform the lamp transformation
2064 before releasing the djinni in case the latter turns out
2065 to be fatal (a hostile djinni has no chance to attack yet,
2066 but an indebted one who grants a wish might bestow an
2067 artifact which blasts the hero with lethal results) */
2068 uwep->otyp = OIL_LAMP;
2069 uwep->spe = 0; /* for safety */
2070 uwep->age = rn1(500, 1000);
2072 begin_burn(uwep, TRUE);
2073 djinni_from_bottle(uwep);
2074 makeknown(MAGIC_LAMP);
2076 } else if (rn2(2)) {
2078 You("%s smoke.", !Blind ? "see a puff of" : "smell");
2080 pline("
\82¯
\82Þ
\82è%s
\81D", !Blind ? "
\82ª
\95\91\82¢
\82 \82ª
\82Á
\82½" : "
\82Ì
\93õ
\82¢
\82ª
\82µ
\82½");
2082 pline1(nothing_happens);
2083 } else if (obj->otyp == BRASS_LANTERN) {
2084 /* message from Adventure */
2086 pline("Rubbing the electric lamp is not particularly rewarding.");
2088 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");
2090 pline("Anyway, nothing exciting happens.");
2092 pline("
\82â
\82Á
\82Ï
\82è
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
2094 pline1(nothing_happens);
2105 enum jump_trajectory {
2106 jAny = 0, /* any direction => magical jump */
2109 jDiag = 3 /* jHorz|jVert */
2112 /* callback routine for walk_path() */
2114 check_jump(arg, x, y)
2118 int traj = *(int *) arg;
2119 struct rm *lev = &levl[x][y];
2123 if (IS_STWALL(lev->typ))
2125 if (IS_DOOR(lev->typ)) {
2126 if (closed_door(x, y))
2128 if ((lev->doormask & D_ISOPEN) != 0 && traj != jAny
2129 /* reject diagonal jump into or out-of or through open door */
2131 /* reject horizontal jump through horizontal open door
2132 and non-horizontal (ie, vertical) jump through
2133 non-horizontal (vertical) open door */
2134 || ((traj & jHorz) != 0) == (lev->horizontal != 0)))
2136 /* empty doorways aren't restricted */
2138 /* let giants jump over boulders (what about Flying?
2139 and is there really enough head room for giants to jump
2140 at all, let alone over something tall?) */
2141 if (sobj_at(BOULDER, x, y) && !throws_rocks(youmonst.data))
2147 is_valid_jump_pos(x, y, magic, showmsg)
2151 if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(x, y) != 5) {
2152 /* The Knight jumping restriction still applies when riding a
2153 * horse. After all, what shape is the knight piece in chess?
2157 pline("Illegal move!");
2159 pline("
\82»
\82Ì
\88Ú
\93®
\82Í
\8cj
\94n
\92µ
\82Ñ
\82¶
\82á
\82È
\82¢
\81I");
2161 } else if (distu(x, y) > (magic ? 6 + magic * 3 : 9)) {
2166 pline("
\89\93\82·
\82¬
\82é
\81I");
2168 } else if (!isok(x, y)) {
2171 You("cannot jump there!");
2173 You("
\82»
\82±
\82É
\82Í
\94ò
\82×
\82È
\82¢
\81I");
2175 } else if (!cansee(x, y)) {
2178 You("cannot see where to land!");
2180 You("
\92\85\92n
\93_
\82ª
\8c©
\82¦
\82È
\82¢
\81I");
2184 struct rm *lev = &levl[u.ux][u.uy];
2185 /* we want to categorize trajectory for use in determining
2186 passage through doorways: horizonal, vertical, or diagonal;
2187 since knight's jump and other irregular directions are
2188 possible, we flatten those out to simplify door checks */
2190 dx = x - u.ux, dy = y - u.uy,
2191 ax = abs(dx), ay = abs(dy);
2193 /* diag: any non-orthogonal destination classifed as diagonal */
2194 diag = (magic || Passes_walls || (!dx && !dy)) ? jAny
2195 : !dy ? jHorz : !dx ? jVert : jDiag;
2196 /* traj: flatten out the trajectory => some diagonals re-classified */
2199 else if (ay >= 2 * ax)
2201 traj = (magic || Passes_walls || (!ax && !ay)) ? jAny
2202 : !ay ? jHorz : !ax ? jVert : jDiag;
2203 /* walk_path doesn't process the starting spot;
2204 this is iffy: if you're starting on a closed door spot,
2205 you _can_ jump diagonally from doorway (without needing
2206 Passes_walls); that's intentional but is it correct? */
2207 if (diag == jDiag && IS_DOOR(lev->typ)
2208 && (lev->doormask & D_ISOPEN) != 0
2210 || ((traj & jHorz) != 0) == (lev->horizontal != 0))) {
2213 You_cant("jump diagonally out of a doorway.");
2215 You_cant("
\8fo
\93ü
\82è
\8cû
\82©
\82ç
\8eÎ
\82ß
\82É
\94ò
\82Ñ
\8fo
\82·
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2218 uc.x = u.ux, uc.y = u.uy;
2219 tc.x = x, tc.y = y; /* target */
2220 if (!walk_path(&uc, &tc, check_jump, (genericptr_t) &traj)) {
2223 There("is an obstacle preventing that jump.");
2225 pline("
\94ò
\82Ô
\82Ì
\82ð
\8e×
\96\82\82·
\82é
\89½
\82©
\82ª
\82 \82é
\81D");
2232 static int jumping_is_magic;
2235 get_valid_jump_position(x,y)
2239 && (ACCESSIBLE(levl[x][y].typ) || Passes_walls)
2240 && is_valid_jump_pos(x, y, jumping_is_magic, FALSE));
2244 display_jump_positions(state)
2248 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
2249 } else if (state == 1) {
2252 for (dx = -4; dx <= 4; dx++)
2253 for (dy = -4; dy <= 4; dy++) {
2254 x = dx + (int) u.ux;
2255 y = dy + (int) u.uy;
2256 if (get_valid_jump_position(x, y))
2260 tmp_at(DISP_END, 0);
2266 int magic; /* 0=Physical, otherwise skill level */
2270 /* attempt "jumping" spell if hero has no innate jumping ability */
2271 if (!magic && !Jumping) {
2274 for (sp_no = 0; sp_no < MAXSPELL; ++sp_no)
2275 if (spl_book[sp_no].sp_id == NO_SPELL)
2277 else if (spl_book[sp_no].sp_id == SPE_JUMPING)
2278 return spelleffects(sp_no, FALSE);
2281 if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
2282 /* normally (nolimbs || slithy) implies !Jumping,
2283 but that isn't necessarily the case for knights */
2285 You_cant("jump; you have no legs!");
2287 pline("
\91«
\82ª
\96³
\82
\82Ä
\82Í
\92µ
\82×
\82È
\82¢
\81I");
2289 } else if (!magic && !Jumping) {
2291 You_cant("jump very far.");
2293 You_cant("
\82»
\82ñ
\82È
\89\93\82
\82Ü
\82Å
\92µ
\82×
\82È
\82¢
\81D");
2295 /* if steed is immobile, can't do physical jump but can do spell one */
2296 } else if (!magic && u.usteed && stucksteed(FALSE)) {
2297 /* stucksteed gave "<steed> won't move" message */
2299 } else if (u.uswallow) {
2302 You("bounce around a little.");
2304 pline("
\94½
\93®
\82ð
\82Â
\82¯
\82½
\81D");
2308 pline("You've got to be kidding!");
2310 pline("
\8fç
\92k
\82Í
\82æ
\82µ
\82±
\82³
\82ñ
\81I");
2312 } else if (u.uinwater) {
2315 You("swish around a little.");
2317 pline("
\83X
\83C
\83X
\83C
\82Æ
\89j
\82¢
\82¾
\81D");
2321 pline("This calls for swimming, not jumping!");
2323 pline("
\82»
\82ê
\82Í
\81w
\89j
\82®
\81x
\82Å
\82 \82Á
\82Ä
\81C
\81w
\92µ
\82Ô
\81x
\82¶
\82á
\82È
\82¢
\81I");
2325 } else if (u.ustuck) {
2326 if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
2328 You("pull free from %s.", mon_nam(u.ustuck));
2330 You("%s
\82©
\82ç
\97£
\82ê
\82½
\81D", mon_nam(u.ustuck));
2336 You("writhe a little in the grasp of %s!", mon_nam(u.ustuck));
2338 You("%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\83W
\83^
\83o
\83^
\82µ
\82½
\81I", mon_nam(u.ustuck));
2342 You("cannot escape from %s!", mon_nam(u.ustuck));
2344 You("%s
\82©
\82ç
\93¦
\82ê
\82ç
\82ê
\82È
\82¢
\81I", mon_nam(u.ustuck));
2346 } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
2349 You("flail around a little.");
2351 You("
\83o
\83^
\83o
\83^
\92µ
\82ñ
\82¾
\81D");
2355 You("don't have enough traction to jump.");
2357 You("
\92µ
\82Ô
\82½
\82ß
\82Ì
\94½
\93®
\82ª
\82Â
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
2359 } else if (!magic && near_capacity() > UNENCUMBERED) {
2361 You("are carrying too much to jump!");
2363 You("
\82½
\82
\82³
\82ñ
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\92µ
\82×
\82È
\82¢
\81I");
2365 } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
2367 You("lack the strength to jump!");
2369 You("
\92µ
\82Ô
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I");
2371 } else if (!magic && Wounded_legs) {
2372 long wl = (Wounded_legs & BOTH_SIDES);
2373 const char *bp = body_part(LEG);
2375 if (wl == BOTH_SIDES)
2376 bp = makeplural(bp);
2379 pline("%s is in no shape for jumping.", Monnam(u.usteed));
2381 pline("%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D", Monnam(u.usteed));
2384 Your("%s%s %s in no shape for jumping.",
2385 (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right "
2387 bp, (wl == BOTH_SIDES) ? "are" : "is");
2389 Your("%s%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D",
2390 (wl == LEFT_SIDE) ? "
\8d¶" :
2391 (wl == RIGHT_SIDE) ? "
\89E" : "", bp);
2394 } else if (u.usteed && u.utrap) {
2396 pline("%s is stuck in a trap.", Monnam(u.usteed));
2398 pline("%s
\82Íã©
\82É
\82Ð
\82Á
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", Monnam(u.usteed));
2403 pline("Where do you want to jump?");
2405 pline("
\82Ç
\82±
\82É
\92µ
\82Ñ
\82Ü
\82·
\82©
\81H");
2408 jumping_is_magic = magic;
2409 getpos_sethilite(display_jump_positions, get_valid_jump_position);
2411 if (getpos(&cc, TRUE, "the desired position") < 0)
2413 if (getpos(&cc, TRUE, "
\92µ
\82Ñ
\82½
\82¢
\8fê
\8f\8a") < 0)
2414 return 0; /* user pressed ESC */
2415 if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
2422 switch (u.utraptype) {
2424 long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
2427 You("rip yourself free of the bear trap! Ouch!");
2429 You("
\8e©
\95ª
\82ð
\8cF
\82Ìã©
\82©
\82ç
\82Ð
\82«
\82Í
\82ª
\82µ
\82½
\81C
\82¢
\82Ä
\82Á
\81I");
2431 losehp(Maybe_Half_Phys(rnd(10)), "jumping out of a bear trap",
2433 losehp(Maybe_Half_Phys(rnd(10)), "
\8cF
\82Ìã©
\82©
\82ç
\94ò
\82Ñ
\8fo
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2435 set_wounded_legs(side, rn1(1000, 500));
2440 You("leap from the pit!");
2442 You("
\97\8e\82µ
\8c\8a\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2446 You("tear the web apart as you pull yourself free!");
2448 You("
\82
\82à
\82Ì
\91\83\82ð
\88ø
\82«
\97ô
\82«
\81C
\8e©
\97R
\82É
\82È
\82Á
\82½
\81I");
2449 deltrap(t_at(u.ux, u.uy));
2453 You("pull yourself above the %s!", hliquid("lava"));
2455 You("%s
\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I", hliquid("
\97n
\8aâ"));
2461 You("strain your %s, but you're still %s.",
2462 makeplural(body_part(LEG)),
2463 (u.utraptype == TT_INFLOOR)
2464 ? "stuck in the floor"
2465 : "attached to the buried ball");
2467 You("%s
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\82ª
\81C
\82 \82È
\82½
\82Í
\82Ü
\82¾%s
\81D",
2468 makeplural(body_part(LEG)),
2469 (u.utraptype == TT_INFLOOR)
2470 ? "
\8f°
\82É
\82¤
\82Ü
\82Á
\82Ä
\82¢
\82é"
2471 : "
\82¤
\82Ü
\82Á
\82½
\8b\85\82Æ
\82Â
\82È
\82ª
\82Á
\82Ä
\82¢
\82é");
2473 set_wounded_legs(LEFT_SIDE, rn1(10, 11));
2474 set_wounded_legs(RIGHT_SIDE, rn1(10, 11));
2479 * Check the path from uc to cc, calling hurtle_step at each
2480 * location. The final position actually reached will be
2485 /* calculate max(abs(dx), abs(dy)) as the range */
2486 range = cc.x - uc.x;
2494 (void) walk_path(&uc, &cc, hurtle_jump, (genericptr_t) &range);
2495 /* hurtle_jump -> hurtle_step results in <u.ux,u.uy> == <cc.x,cc.y>
2496 * and usually moves the ball if punished, but does not handle all
2497 * the effects of landing on the final position.
2499 teleds(cc.x, cc.y, FALSE);
2503 multi_reason = "jumping around";
2505 multi_reason = "
\92µ
\82Ë
\89ñ
\82Á
\82Ä
\82¢
\82é
\8e\9e\82É";
2507 morehungry(rnd(25));
2518 if (!mons[corpse->corpsenm].cnutrit)
2524 use_tinning_kit(obj)
2527 struct obj *corpse, *can;
2529 /* This takes only 1 move. If this is to be changed to take many
2530 * moves, we've got to deal with decaying corpses...
2532 if (obj->spe <= 0) {
2534 You("seem to be out of tins.");
2536 pline("
\8aÊ
\8bl
\82ð
\8dì
\82é
\82½
\82ß
\82Ì
\8aÊ
\82ª
\90Ø
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
2539 if (!(corpse = floorfood("tin", 2)))
2541 if (corpse->oeaten) {
2543 You("cannot tin %s which is partly eaten.", something);
2545 You("
\90H
\82×
\82©
\82¯
\82Ì
\82à
\82Ì
\82ð
\8aÊ
\8bl
\82É
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2548 if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance
2552 if (poly_when_stoned(youmonst.data))
2554 You("tin %s without wearing gloves.",
2555 an(mons[corpse->corpsenm].mname));
2557 You("
\8f¬
\8eè
\82È
\82µ
\82Å%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
2558 mons[corpse->corpsenm].mname);
2562 pline("Tinning %s without wearing gloves is a fatal mistake...",
2563 an(mons[corpse->corpsenm].mname));
2565 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",
2566 mons[corpse->corpsenm].mname);
2569 Sprintf(kbuf, "trying to tin %s without gloves",
2570 an(mons[corpse->corpsenm].mname));
2572 Sprintf(kbuf, "
\8f¬
\8eè
\82ð
\82Â
\82¯
\82¸
\82É%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2573 mons[corpse->corpsenm].mname);
2578 if (is_rider(&mons[corpse->corpsenm])) {
2579 if (revive_corpse(corpse))
2581 verbalize("Yes... But War does not preserve its enemies...");
2583 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");
2586 pline_The("corpse evades your grasp.");
2588 pline("
\8e\80\91Ì
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82ð
\93¦
\82ê
\82½
\81D");
2591 if (mons[corpse->corpsenm].cnutrit == 0) {
2593 pline("That's too insubstantial to tin.");
2595 pline("
\8eÀ
\91Ì
\82ª
\82È
\82¢
\82Ì
\82Å
\8aÊ
\8bl
\82É
\82Å
\82«
\82È
\82¢
\81D");
2598 consume_obj_charge(obj, TRUE);
2600 if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
2602 static const char you_buy_it[] = "You tin it, you bought it!";
2604 static const char you_buy_it[] = "
\8aÊ
\8bl
\82É
\82µ
\82½
\82Ì
\82È
\82ç
\94\83\82Á
\82Ä
\82à
\82ç
\82¤
\82æ
\81I";
2606 can->corpsenm = corpse->corpsenm;
2607 can->cursed = obj->cursed;
2608 can->blessed = obj->blessed;
2609 can->owt = weight(can);
2611 /* Mark tinned tins. No spinach allowed... */
2612 set_tin_variety(can, HOMEMADE_TIN);
2613 if (carried(corpse)) {
2615 verbalize(you_buy_it);
2618 if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
2619 verbalize(you_buy_it);
2623 (void) hold_another_object(can, "You make, but cannot pick up, %s.",
2624 doname(can), (const char *) 0);
2626 (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",
2627 doname(can), (const char *) 0);
2630 impossible("Tinning failed.");
2634 use_unicorn_horn(obj)
2637 #define PROP_COUNT 7 /* number of properties we're dealing with */
2638 #define ATTR_COUNT (A_MAX * 3) /* number of attribute points we might fix */
2639 int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop,
2641 int trouble_list[PROP_COUNT + ATTR_COUNT];
2643 if (obj && obj->cursed) {
2644 long lcount = (long) rn1(90, 10);
2646 switch (rn2(13) / 2) { /* case 6 is half as likely as the others */
2648 make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L
2649 : (long) rn1(ACURR(A_CON), 20),
2650 xname(obj), TRUE, SICK_NONVOMITABLE);
2653 make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
2658 You("suddenly feel %s.",
2659 Hallucination ? "trippy" : "confused");
2661 You("
\93Ë
\91R%s
\81D",
2662 Hallucination ? "
\82Ö
\82ë
\82Ö
\82ë
\82É
\82È
\82Á
\82½" : "
\8d¬
\97\90\82µ
\82½");
2664 make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
2667 make_stunned((HStun & TIMEOUT) + lcount, TRUE);
2670 (void) adjattrib(rn2(A_MAX), -1, FALSE);
2673 (void) make_hallucinated((HHallucination & TIMEOUT) + lcount,
2677 if (Deaf) /* make_deaf() won't give feedback when already deaf */
2679 pline("Nothing seems to happen.");
2681 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2682 make_deaf((HDeaf & TIMEOUT) + lcount, TRUE);
2689 * Entries in the trouble list use a very simple encoding scheme.
2691 #define prop2trbl(X) ((X) + A_MAX)
2692 #define attr2trbl(Y) (Y)
2693 #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
2694 #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
2695 #define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
2697 trouble_count = unfixable_trbl = did_prop = did_attr = 0;
2699 /* collect property troubles */
2700 if (TimedTrouble(Sick))
2702 if (TimedTrouble(Blinded) > (long) u.ucreamed
2704 && attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
2705 prop_trouble(BLINDED);
2706 if (TimedTrouble(HHallucination))
2707 prop_trouble(HALLUC);
2708 if (TimedTrouble(Vomiting))
2709 prop_trouble(VOMITING);
2710 if (TimedTrouble(HConfusion))
2711 prop_trouble(CONFUSION);
2712 if (TimedTrouble(HStun))
2713 prop_trouble(STUNNED);
2714 if (TimedTrouble(HDeaf))
2717 unfixable_trbl = unfixable_trouble_count(TRUE);
2719 /* collect attribute troubles */
2720 for (idx = 0; idx < A_MAX; idx++) {
2721 if (ABASE(idx) >= AMAX(idx))
2723 val_limit = AMAX(idx);
2724 /* this used to adjust 'val_limit' for A_STR when u.uhs was
2725 WEAK or worse, but that's handled via ATEMP(A_STR) now */
2727 /* potion/spell of restore ability override sustain ability
2728 intrinsic but unicorn horn usage doesn't */
2729 unfixable_trbl += val_limit - ABASE(idx);
2732 /* don't recover more than 3 points worth of any attribute */
2733 if (val_limit > ABASE(idx) + 3)
2734 val_limit = ABASE(idx) + 3;
2736 for (val = ABASE(idx); val < val_limit; val++)
2738 /* keep track of unfixed trouble, for message adjustment below */
2739 unfixable_trbl += (AMAX(idx) - val_limit);
2742 if (trouble_count == 0) {
2743 pline1(nothing_happens);
2745 } else if (trouble_count > 1) { /* shuffle */
2748 for (i = trouble_count - 1; i > 0; i--)
2749 if ((j = rn2(i + 1)) != i) {
2750 k = trouble_list[j];
2751 trouble_list[j] = trouble_list[i];
2752 trouble_list[i] = k;
2757 * Chances for number of troubles to be fixed
2759 * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8%
2760 * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0
2762 val_limit = rn2(d(2, (obj && obj->blessed) ? 4 : 2));
2763 if (val_limit > trouble_count)
2764 val_limit = trouble_count;
2766 /* fix [some of] the troubles */
2767 for (val = 0; val < val_limit; val++) {
2768 idx = trouble_list[val];
2771 case prop2trbl(SICK):
2772 make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2775 case prop2trbl(BLINDED):
2776 make_blinded((long) u.ucreamed, TRUE);
2779 case prop2trbl(HALLUC):
2780 (void) make_hallucinated(0L, TRUE, 0L);
2783 case prop2trbl(VOMITING):
2784 make_vomiting(0L, TRUE);
2787 case prop2trbl(CONFUSION):
2788 make_confused(0L, TRUE);
2791 case prop2trbl(STUNNED):
2792 make_stunned(0L, TRUE);
2795 case prop2trbl(DEAF):
2796 make_deaf(0L, TRUE);
2800 if (idx >= 0 && idx < A_MAX) {
2804 panic("use_unicorn_horn: bad trouble? (%d)", idx);
2809 if (did_attr || did_prop)
2810 context.botl = TRUE;
2813 pline("This makes you feel %s!",
2814 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2818 pline("
\8bC
\95ª
\82ª%s
\82æ
\82
\82È
\82Á
\82½
\81I",
2819 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2825 pline("Nothing seems to happen.");
2827 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2839 * Timer callback routine: turn figurine into monster
2842 fig_transform(arg, timeout)
2846 struct obj *figurine = arg->a_obj;
2849 boolean cansee_spot, silent, okay_spot;
2850 boolean redraw = FALSE;
2851 boolean suppress_see = FALSE;
2852 char monnambuf[BUFSZ], carriedby[BUFSZ];
2855 debugpline0("null figurine in fig_transform()");
2858 silent = (timeout != monstermoves); /* happened while away */
2859 okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0);
2860 if (figurine->where == OBJ_INVENT || figurine->where == OBJ_MINVENT)
2861 okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]);
2862 if (!okay_spot || !figurine_location_checks(figurine, &cc, TRUE)) {
2863 /* reset the timer to try again later */
2864 (void) start_timer((long) rnd(5000), TIMER_OBJECT, FIG_TRANSFORM,
2865 obj_to_any(figurine));
2869 cansee_spot = cansee(cc.x, cc.y);
2870 mtmp = make_familiar(figurine, cc.x, cc.y, TRUE);
2872 char and_vanish[BUFSZ];
2873 struct obj *mshelter = level.objects[mtmp->mx][mtmp->my];
2875 /* [m_monnam() yields accurate mon type, overriding hallucination] */
2876 Sprintf(monnambuf, "%s", an(m_monnam(mtmp)));
2877 /*JP:TODO:and_vanish
\82Í
\96¢
\8f\88\97\9d*/
2878 and_vanish[0] = '\0';
2879 if ((mtmp->minvis && !See_invisible)
2880 || (mtmp->data->mlet == S_MIMIC
2881 && M_AP_TYPE(mtmp) != M_AP_NOTHING))
2882 suppress_see = TRUE;
2884 if (mtmp->mundetected) {
2885 if (hides_under(mtmp->data) && mshelter) {
2886 Sprintf(and_vanish, " and %s under %s",
2887 locomotion(mtmp->data, "crawl"), doname(mshelter));
2888 } else if (mtmp->data->mlet == S_MIMIC
2889 || mtmp->data->mlet == S_EEL) {
2890 suppress_see = TRUE;
2892 Strcpy(and_vanish, " and vanish");
2895 switch (figurine->where) {
2897 if (Blind || suppress_see)
2899 You_feel("%s %s from your pack!", something,
2900 locomotion(mtmp->data, "drop"));
2902 You_feel("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82æ
\82¤
\82¾
\81I", something,
2903 jpast(locomotion(mtmp->data, "
\97\8e\82¿
\82é")));
2907 You_see("%s %s out of your pack%s!", monnambuf,
2908 locomotion(mtmp->data, "drop"), and_vanish);
2910 You("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2911 jpast(locomotion(mtmp->data,"
\97\8e\82¿
\82é")));
2916 if (cansee_spot && !silent) {
2919 pline("%s suddenly vanishes!", an(xname(figurine)));
2921 pline("%s
\82Í
\93Ë
\91R
\8fÁ
\82¦
\82½
\81I", xname(figurine));
2924 You_see("a figurine transform into %s%s!", monnambuf,
2927 You("
\90l
\8c`
\82ª
\93Ë
\91R%s
\82É
\82È
\82Á
\82½
\82Ì
\82ð
\8c©
\82½
\81I",
2930 redraw = TRUE; /* update figurine's map location */
2935 if (cansee_spot && !silent && !suppress_see) {
2938 mon = figurine->ocarry;
2939 /* figurine carrying monster might be invisible */
2940 if (canseemon(figurine->ocarry)
2941 && (!mon->wormno || cansee(mon->mx, mon->my)))
2943 Sprintf(carriedby, "%s pack", s_suffix(a_monnam(mon)));
2945 Sprintf(carriedby, "%s
\82Ì
\8a\93", a_monnam(mon));
2946 else if (is_pool(mon->mx, mon->my))
2948 Strcpy(carriedby, "empty water");
2950 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\90\85\92\86");
2953 Strcpy(carriedby, "thin air");
2955 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\8bó
\92\86");
2957 You_see("%s %s out of %s%s!", monnambuf,
2958 locomotion(mtmp->data, "drop"), carriedby,
2961 You("%s
\82ª%s
\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2962 carriedby, locomotion(mtmp->data, "
\97\8e\82¿
\82é"));
2972 impossible("figurine came to life where? (%d)",
2973 (int) figurine->where);
2977 /* free figurine now */
2978 if (carried(figurine)) {
2981 obj_extract_self(figurine);
2982 obfree(figurine, (struct obj *) 0);
2989 figurine_location_checks(obj, cc, quietly)
2996 if (carried(obj) && u.uswallow) {
2999 You("don't have enough room in here.");
3001 pline("
\82±
\82±
\82É
\82Í
\8f\
\95ª
\82È
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
3004 x = cc ? cc->x : u.ux;
3005 y = cc ? cc->y : u.uy;
3009 You("cannot put the figurine there.");
3011 You("
\82±
\82±
\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81D");
3014 if (IS_ROCK(levl[x][y].typ)
3015 && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x, y))) {
3018 You("cannot place a figurine in %s!",
3019 IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock");
3021 You("%s
\82Ì
\92\86\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81I",
3022 IS_TREE(levl[x][y].typ) ? "
\96Ø" : "
\8cÅ
\82¢
\90Î");
3026 if (sobj_at(BOULDER, x, y) && !passes_walls(&mons[obj->corpsenm])
3027 && !throws_rocks(&mons[obj->corpsenm])) {
3030 You("cannot fit the figurine on the boulder.");
3032 You("
\8aâ
\82É
\90l
\8c`
\82ð
\89\9f\82µ
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
3042 register struct obj *obj = *optr;
3047 /* can't activate a figurine while swallowed */
3048 if (!figurine_location_checks(obj, (coord *) 0, FALSE))
3051 if (!getdir((char *) 0)) {
3052 context.move = multi = 0;
3059 /* Passing FALSE arg here will result in messages displayed */
3060 if (!figurine_location_checks(obj, &cc, FALSE))
3063 You("%s and it %stransforms.",
3064 (u.dx || u.dy) ? "set the figurine beside you"
3065 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3066 || is_pool(cc.x, cc.y))
3067 ? "release the figurine"
3068 : (u.dz < 0 ? "toss the figurine into the air"
3069 : "set the figurine on the ground"),
3070 Blind ? "supposedly " : "");
3072 You("%s
\81D
\82·
\82é
\82Æ
\82»
\82ê
\82Í
\95Ï
\8c`
\82µ
\82½
\81D",
3073 (u.dx || u.dy) ? "
\82»
\82Î
\82É
\90l
\8c`
\82ð
\92u
\82¢
\82½"
3074 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
3075 || is_pool(cc.x, cc.y))
3076 ? "
\90l
\8c`
\82ð
\95ú
\82Á
\82½"
3077 : (u.dz < 0 ? "
\90l
\8c`
\82ð
\8bó
\92\86\82É
\93\8a\82°
\82½"
3078 : "
\90l
\8c`
\82ð
\92n
\96Ê
\82É
\92u
\82¢
\82½"));
3080 (void) make_familiar(obj, cc.x, cc.y, FALSE);
3081 (void) stop_timer(FIG_TRANSFORM, obj_to_any(obj));
3084 map_invisible(cc.x, cc.y);
3088 static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 };
3098 pline("%s from your %s.", Tobjnam(obj, "slip"),
3099 fingers_or_gloves(FALSE));
3101 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
3102 fingers_or_gloves(FALSE));
3111 if ((obj->cursed || Fumbling) && !rn2(2)) {
3112 consume_obj_charge(obj, TRUE);
3115 pline("%s from your %s.", Tobjnam(obj, "slip"),
3116 fingers_or_gloves(FALSE));
3118 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
3119 fingers_or_gloves(FALSE));
3124 otmp = getobj(lubricables, "grease");
3128 if (inaccessible_equipment(otmp, "grease", FALSE))
3130 if (inaccessible_equipment(otmp, "
\82É
\8e\89\82ð
\93h
\82é", FALSE))
3132 consume_obj_charge(obj, TRUE);
3134 oldglib = (int) (Glib & TIMEOUT);
3135 if (otmp != &zeroobj) {
3137 You("cover %s with a thick layer of grease.", yname(otmp));
3139 You("%s
\82É
\8e\89\82ð
\92O
\94O
\82É
\93h
\82Á
\82½
\81D", xname(otmp));
3141 if (obj->cursed && !nohands(youmonst.data)) {
3142 make_glib(oldglib + rn1(6, 10)); /* + 10..15 */
3144 pline("Some of the grease gets all over your %s.",
3146 pline("
\8e\89\82ª
\8f
\82µ%s
\82É
\82Â
\82¢
\82½
\81D",
3147 fingers_or_gloves(TRUE));
3150 make_glib(oldglib + rn1(11, 5)); /* + 5..15 */
3152 You("coat your %s with grease.", fingers_or_gloves(TRUE));
3154 You("%s
\82É
\8e\89\82ð
\93h
\82Á
\82½
\81D", fingers_or_gloves(TRUE));
3159 pline("%s empty.", Tobjnam(obj, "are"));
3161 pline("%s
\82Í
\8bó
\82Á
\82Û
\82¾
\81D", xname(obj));
3164 pline("%s to be empty.", Tobjnam(obj, "seem"));
3166 pline("%s
\82Í
\8bó
\82Á
\82Û
\82Ì
\82æ
\82¤
\82¾
\81D", xname(obj));
3171 /* touchstones - by Ken Arnold */
3177 static const char scritch[] = "\"scritch, scritch\"";
3179 static const char scritch[] = "
\81u
\83S
\83V
\81C
\83S
\83V
\81v";
3180 static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 };
3181 static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 };
3184 const char *streak_color, *choices;
3185 char stonebuf[QBUFSZ];
3188 /* in case it was acquired while blinded */
3191 /* when the touchstone is fully known, don't bother listing extra
3192 junk as likely candidates for rubbing */
3193 choices = (tstone->otyp == TOUCHSTONE && tstone->dknown
3194 && objects[TOUCHSTONE].oc_name_known)
3198 Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan));
3200 Sprintf(stonebuf, "rub on the stone");
3201 if ((obj = getobj(choices, stonebuf)) == 0)
3204 if (obj == tstone && obj->quan == 1L) {
3206 You_cant("rub %s on itself.", the(xname(obj)));
3208 You("%s
\82ð
\82»
\82ê
\8e©
\91Ì
\82Å
\82±
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", the(xname(obj)));
3212 if (tstone->otyp == TOUCHSTONE && tstone->cursed
3213 && obj->oclass == GEM_CLASS && !is_graystone(obj)
3214 && !obj_resists(obj, 80, 100)) {
3217 pline("You feel something shatter.");
3219 You("
\89½
\82©
\82ª
\95²
\81X
\82É
\82È
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81D");
3220 else if (Hallucination)
3222 pline("Oh, wow, look at the pretty shards.");
3224 pline("
\83\8f\81[
\83H
\81I
\82È
\82ñ
\82Ä
\82«
\82ê
\82¢
\82È
\94j
\95Ð
\82È
\82ñ
\82¾
\81D");
3227 pline("A sharp crack shatters %s%s.",
3228 (obj->quan > 1L) ? "one of " : "", the(xname(obj)));
3230 pline("
\8b
\82
\82±
\82·
\82è
\82·
\82¬
\82Ä%s%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
3231 the(xname(obj)), (obj->quan > 1) ? "
\82Ì
\82Ð
\82Æ
\82Â" : "");
3240 } else if (Hallucination) {
3242 pline("Oh wow, man: Fractals!");
3244 pline("
\83\8f\81[
\83H
\81I
\83t
\83\89\83N
\83^
\83\8b\96Í
\97l
\82¾
\81I");
3252 oclass = obj->oclass;
3253 /* prevent non-gemstone rings from being treated like gems */
3254 if (oclass == RING_CLASS
3255 && objects[obj->otyp].oc_material != GEMSTONE
3256 && objects[obj->otyp].oc_material != MINERAL)
3257 oclass = RANDOM_CLASS; /* something that's neither gem nor ring */
3260 case GEM_CLASS: /* these have class-specific handling below */
3262 if (tstone->otyp != TOUCHSTONE) {
3264 } else if (obj->oclass == GEM_CLASS
3266 || (!tstone->cursed && (Role_if(PM_ARCHEOLOGIST)
3267 || Race_if(PM_GNOME))))) {
3268 makeknown(TOUCHSTONE);
3269 makeknown(obj->otyp);
3270 prinv((char *) 0, obj, 0L);
3273 /* either a ring or the touchstone was not effective */
3274 if (objects[obj->otyp].oc_material == GLASS) {
3279 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3280 break; /* gem or ring */
3283 switch (objects[obj->otyp].oc_material) {
3286 pline("%s a little more polished now.", Tobjnam(tstone, "look"));
3288 pline("%s
\82Í
\82³
\82ç
\82É
\82Â
\82â
\82ª
\8fo
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D", xname(tstone));
3292 if (!obj->known) /* note: not "whetstone" */
3294 You("must think this is a wetstone, do you?");
3296 You("
\82±
\82ê
\82Í
\93u
\90Î
\82¾
\82Æ
\8ev
\82Á
\82½
\81H");
3300 pline("%s a little wetter now.", Tobjnam(tstone, "are"));
3302 pline("%s
\82Í
\8f
\82µ
\82Ê
\82ê
\82½
\81D", xname(tstone));
3307 streak_color = "waxy";
3309 streak_color = "
\8e\89\82Á
\82Û
\82¢";
3311 break; /* okay even if not touchstone */
3314 streak_color = "wooden";
3316 streak_color = "
\82¨
\82ª
\82
\82¸
\82Ì
\82æ
\82¤
\82È";
3318 break; /* okay even if not touchstone */
3320 do_scratch = TRUE; /* scratching and streaks */
3322 streak_color = "golden";
3324 streak_color = "
\8bà
\90F
\82Ì";
3328 do_scratch = TRUE; /* scratching and streaks */
3330 streak_color = "silvery";
3332 streak_color = "
\8bâ
\90F
\82Ì";
3336 /* Objects passing the is_flimsy() test will not
3337 scratch a stone. They will leave streaks on
3338 non-touchstones and touchstones alike. */
3340 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3342 do_scratch = (tstone->otyp != TOUCHSTONE);
3345 break; /* default oclass */
3348 #if 0 /*JP*//* not used */
3349 Sprintf(stonebuf, "stone%s", plur(tstone->quan));
3353 You("make %s%sscratch marks on the %s.",
3354 streak_color ? streak_color : (const char *) "",
3355 streak_color ? " " : "", stonebuf);
3357 You("%s
\82±
\82·
\82è
\90Õ
\82ð
\90Î
\82É
\82Â
\82¯
\82½
\81D",
3358 streak_color ? streak_color : (const char *)"");
3360 else if (streak_color)
3362 You_see("%s streaks on the %s.", streak_color, stonebuf);
3364 pline("
\90Î
\82É%s
\8bØ
\82ª
\82Â
\82¢
\82½
\81D", streak_color);
3370 static struct trapinfo {
3374 boolean force_bungle;
3381 trapinfo.force_bungle = 0;
3384 /* Place a landmine/bear trap. Helge Hafting */
3390 const char *what = (char *) 0;
3392 int levtyp = levl[u.ux][u.uy].typ;
3394 const char *occutext = "setting the trap";
3396 const char *occutext = "ã©
\82ð
\8ed
\8a|
\82¯
\82Ä
\82¢
\82é";
3399 if (nohands(youmonst.data))
3401 what = "without hands";
3403 what = "
\8eè
\82ª
\82È
\82¢
\82Ì
\82Å";
3406 what = "while stunned";
3408 what = "
\82
\82ç
\82
\82ç
\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å";
3409 else if (u.uswallow)
3412 is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed";
3414 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Í";
3415 else if (Underwater)
3417 what = "underwater";
3419 what = "
\90\85\96Ê
\89º
\82Å
\82Í";
3420 else if (Levitation)
3422 what = "while levitating";
3424 what = "
\95\82\82¢
\82Ä
\82¢
\82é
\8aÔ
\82Í";
3425 else if (is_pool(u.ux, u.uy))
3429 what = "
\90\85\92\86\82Å
\82Í";
3430 else if (is_lava(u.ux, u.uy))
3434 what = "
\97n
\8aâ
\82Ì
\92\86\82Å
\82Í";
3435 else if (On_stairs(u.ux, u.uy))
3437 what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder"
3440 what = (u.ux == xdnladder || u.ux == xupladder) ? "
\82Í
\82µ
\82²
\82Ì
\8fã
\82Å
\82Í"
3441 : "
\8aK
\92i
\82Ì
\8fã
\82Å
\82Í";
3443 else if (IS_FURNITURE(levtyp) || IS_ROCK(levtyp)
3444 || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy))
3448 what = "
\82±
\82±
\82Å
\82Í";
3449 else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
3451 what = (levtyp == AIR)
3455 : "in this place"; /* Air/Water Plane catch-all */
3457 what = (levtyp == AIR)
3458 ? "
\8bó
\92\86\82Å
\82Í"
3460 ? "
\89_
\82Ì
\92\86\82Å
\82Í"
3461 : "
\82±
\82±
\82Å
\82Í"; /* Air/Water Plane catch-all */
3465 You_cant("set a trap %s!", what);
3467 pline("%sã©
\82ð
\8ed
\8a|
\82¯
\82ç
\82ê
\82È
\82¢
\81I",what);
3471 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3472 if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) {
3474 You("resume setting %s%s.", shk_your(buf, otmp),
3476 You("%s
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D",
3477 defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
3478 set_occupation(set_trap, occutext, 0);
3481 trapinfo.tobj = otmp;
3482 trapinfo.tx = u.ux, trapinfo.ty = u.uy;
3484 trapinfo.time_needed =
3485 (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5;
3487 trapinfo.time_needed *= 2;
3489 if (ttyp == BEAR_TRAP && tmp < 18)
3490 trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4;
3491 /*[fumbling and/or confusion and/or cursed object check(s)
3492 should be incorporated here instead of in set_trap]*/
3493 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) {
3496 if (Fumbling || otmp->cursed)
3497 chance = (rnl(10) > 3);
3499 chance = (rnl(10) > 5);
3501 You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
3503 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));
3505 Sprintf(buf, "Continue your attempt to set %s?",
3507 Sprintf(buf, "%s
\82Ì
\8ed
\8a|
\82¯
\82ð
\91±
\82¯
\82é
\81H",
3508 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
3510 if (yn(buf) == 'y') {
3513 case LANDMINE: /* set it off */
3514 trapinfo.time_needed = 0;
3515 trapinfo.force_bungle = TRUE;
3517 case BEAR_TRAP: /* drop it without arming it */
3522 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I",
3523 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))]
3535 You("begin setting %s%s.", shk_your(buf, otmp),
3537 You("%s%s
\82ð
\8ed
\8a|
\82¯
\82Í
\82¶
\82ß
\82½
\81D", shk_your(buf, otmp),
3538 defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation);
3539 set_occupation(set_trap, occutext, 0);
3547 struct obj *otmp = trapinfo.tobj;
3551 if (!otmp || !carried(otmp) || u.ux != trapinfo.tx
3552 || u.uy != trapinfo.ty) {
3558 if (--trapinfo.time_needed > 0)
3559 return 1; /* still busy */
3561 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3562 ttmp = maketrap(u.ux, u.uy, ttyp);
3566 if (*in_rooms(u.ux, u.uy, SHOPBASE)) {
3567 add_damage(u.ux, u.uy, 0L); /* schedule removal */
3569 if (!trapinfo.force_bungle)
3571 You("finish arming %s.",
3573 You("%s
\82ð
\8ed
\8a|
\82¯
\8fI
\82¦
\82½
\81D",
3574 the(defsyms[trap_to_defsym(what_trap(ttyp, rn2))].explanation));
3575 if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
3576 || trapinfo.force_bungle)
3578 (unsigned) (trapinfo.force_bungle ? FORCEBUNGLE : 0));
3580 /* this shouldn't happen */
3582 Your("trap setting attempt fails.");
3584 You("ã©
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D");
3598 int rx, ry, proficient, res = 0;
3600 const char *msg_slipsfree = "The bullwhip slips free.";
3602 const char *msg_slipsfree = "
\95Ú
\82Í
\82Ù
\82Ç
\82¯
\82½
\81D";
3604 const char *msg_snap = "Snap!";
3606 const char *msg_snap = "
\83s
\83V
\83b
\81I";
3609 if (!wield_tool(obj, "lash"))
3614 if (!getdir((char *) 0))
3622 if (Stunned || (Confusion && !rn2(5)))
3626 if (!isok(rx, ry)) {
3630 You("
\82Í
\82¸
\82µ
\82½
\81D");
3633 mtmp = m_at(rx, ry);
3636 /* fake some proficiency checks */
3638 if (Role_if(PM_ARCHEOLOGIST))
3640 if (ACURR(A_DEX) < 6)
3642 else if (ACURR(A_DEX) >= 14)
3643 proficient += (ACURR(A_DEX) - 14);
3651 if (u.uswallow && attack(u.ustuck)) {
3653 There("is not enough room to flick your bullwhip.");
3655 pline("
\95Ú
\82ð
\91Å
\82Â
\82Ù
\82Ç
\8dL
\82
\82È
\82¢
\81D");
3657 } else if (Underwater) {
3659 There("is too much resistance to flick your bullwhip.");
3661 pline("
\90\85\82Ì
\92ï
\8dR
\82ª
\82 \82è
\82·
\82¬
\82Ä
\95Ú
\82ð
\91Å
\82Â
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
3663 } else if (u.dz < 0) {
3665 You("flick a bug off of the %s.", ceiling(u.ux, u.uy));
3667 You("%s
\82Ì
\92\8e\82ð
\91Å
\82¿
\97\8e\82µ
\82½
\81D",ceiling(u.ux,u.uy));
3669 } else if ((!u.dx && !u.dy) || (u.dz > 0)) {
3672 /* Sometimes you hit your steed by mistake */
3673 if (u.usteed && !rn2(proficient + 2)) {
3675 You("whip %s!", mon_nam(u.usteed));
3677 You("%s
\82ð
\95Ú
\91Å
\82Á
\82½
\81I", mon_nam(u.usteed));
3681 if (Levitation || u.usteed) {
3682 /* Have a shot at snaring something on the floor */
3683 otmp = level.objects[u.ux][u.uy];
3684 if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) {
3686 pline("Why beat a dead horse?");
3688 pline("
\82Ç
\82¤
\82µ
\82Ä
\8e\80\82ñ
\82¾
\94n
\82ð
\95Ú
\91Å
\82Â
\82æ
\82¤
\82È
\82±
\82Æ
\82ð
\82·
\82é
\82Ì
\81H");
3691 if (otmp && proficient) {
3693 You("wrap your bullwhip around %s on the %s.",
3694 an(singular(otmp, xname)), surface(u.ux, u.uy));
3696 You("
\95Ú
\82ð%s
\82Ì
\8fã
\82Ì%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D",
3697 surface(u.ux, u.uy), an(singular(otmp, xname)));
3699 if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1)
3700 pline1(msg_slipsfree);
3704 dam = rnd(2) + dbon() + obj->spe;
3708 You("hit your %s with your bullwhip.", body_part(FOOT));
3710 You("
\8e©
\95ª
\82Ì%s
\82ð
\8e©
\95ª
\82Å
\91Å
\82¿
\82Â
\82¯
\82½
\81D", body_part(FOOT));
3712 Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis());
3713 losehp(Maybe_Half_Phys(dam), buf, NO_KILLER_PREFIX);
3715 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82ð
\95Ú
\91Å
\82Á
\82Ä");
3716 losehp(Maybe_Half_Phys(dam), buf, KILLED_BY);
3720 } else if ((Fumbling || Glib) && !rn2(5)) {
3722 pline_The("bullwhip slips out of your %s.", body_part(HAND));
3724 pline("
\95Ú
\82ª%s
\82©
\82ç
\82·
\82×
\82è
\97\8e\82¿
\82½
\81D", body_part(HAND));
3727 } else if (u.utrap && u.utraptype == TT_PIT) {
3731 * if you're in a pit
3732 * - you are attempting to get out of the pit
3733 * or, if you are applying it towards a small monster
3734 * - then it is assumed that you are trying to hit it
3735 * else if the monster is wielding a weapon
3736 * - you are attempting to disarm a monster
3738 * - you are attempting to hit the monster.
3740 * if you're confused (and thus off the mark)
3741 * - you only end up hitting.
3744 const char *wrapped_what = (char *) 0;
3747 if (bigmonst(mtmp->data)) {
3748 wrapped_what = strcpy(buf, mon_nam(mtmp));
3749 } else if (proficient) {
3756 if (!wrapped_what) {
3757 if (IS_FURNITURE(levl[rx][ry].typ))
3758 wrapped_what = something;
3759 else if (sobj_at(BOULDER, rx, ry))
3761 wrapped_what = "a boulder";
3763 wrapped_what = "
\8aâ";
3771 You("wrap your bullwhip around %s.", wrapped_what);
3773 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", wrapped_what);
3774 if (proficient && rn2(proficient + 2)) {
3775 if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) {
3777 You("yank yourself out of the pit!");
3779 You("
\82®
\82¢
\82Æ
\88ø
\82Á
\82Ï
\82Á
\82Ä
\8c\8a\82©
\82ç
\94²
\82¯
\8fo
\82µ
\82½
\81I");
3780 teleds(cc.x, cc.y, TRUE);
3782 vision_full_recalc = 1;
3785 pline1(msg_slipsfree);
3793 if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) {
3795 pline("A monster is there that you couldn't see.");
3797 pline("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82ª
\82¢
\82é
\81D");
3798 map_invisible(rx, ry);
3800 otmp = MON_WEP(mtmp); /* can be null */
3802 char onambuf[BUFSZ];
3803 const char *mon_hand;
3804 boolean gotit = proficient && (!Fumbling || !rn2(10));
3806 Strcpy(onambuf, cxname(otmp));
3808 mon_hand = mbodypart(mtmp, HAND);
3810 mon_hand = makeplural(mon_hand);
3812 mon_hand = 0; /* lint suppression */
3815 You("wrap your bullwhip around %s.", yname(otmp));
3817 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", xname(otmp));
3818 if (gotit && mwelded(otmp)) {
3820 pline("%s welded to %s %s%c",
3821 (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp),
3822 mon_hand, !otmp->bknown ? '!' : '.');
3824 pline("%s
\82Í%s
\82Ì%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82µ
\82Ü
\82Á
\82Ä
\82¢
\82é%s",
3826 mon_nam(mtmp), mon_hand,
3827 !otmp->bknown ? "
\81I" : "
\81D");
3829 set_bknown(otmp, 1);
3830 gotit = FALSE; /* can't pull it free */
3833 obj_extract_self(otmp);
3834 possibly_unwield(mtmp, FALSE);
3835 setmnotwielded(mtmp, otmp);
3837 switch (rn2(proficient + 1)) {
3839 /* to floor near you */
3841 You("yank %s to the %s!", yname(otmp),
3843 You("%s
\82ð%s
\82É
\88ø
\82«
\97\8e\82µ
\82½
\81I", xname(otmp),
3844 surface(u.ux, u.uy));
3845 place_object(otmp, u.ux, u.uy);
3852 /* proficient with whip, but maybe not
3853 so proficient at catching weapons */
3856 hitvalu = 8 + otmp->spe;
3857 hitu = thitu(hitvalu, dmgval(otmp, &youmonst),
3861 pline_The("%s hits you as you try to snatch it!",
3863 pline_The("%s
\82ð
\92D
\82¨
\82¤
\82Æ
\82µ
\82½
\82ç
\82 \82È
\82½
\82É
\93\96\82½
\82Á
\82½
\81I",
3866 place_object(otmp, u.ux, u.uy);
3871 /* right into your inventory */
3873 You("snatch %s!", yname(otmp));
3875 You("%s
\82ð
\92D
\82Á
\82½
\81I", xname(otmp));
3876 if (otmp->otyp == CORPSE
3877 && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg
3878 && !Stone_resistance
3879 && !(poly_when_stoned(youmonst.data)
3880 && polymon(PM_STONE_GOLEM))) {
3884 Sprintf(kbuf, "%s corpse",
3885 an(mons[otmp->corpsenm].mname));
3886 pline("Snatching %s is a fatal mistake.", kbuf);
3888 pline("%s
\82Ì
\8e\80\91Ì
\82ð
\92D
\82Á
\82½
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
3889 mons[otmp->corpsenm].mname);
3890 Sprintf(kbuf, "%s
\82Ì
\8e\80\91Ì
\82É
\90G
\82ê
\82Ä",
3891 mons[otmp->corpsenm].mname);
3896 (void) hold_another_object(otmp, "You drop %s!",
3897 doname(otmp), (const char *) 0);
3899 (void) hold_another_object(otmp, "%s
\82ð
\97\8e\82µ
\82½
\81I",
3900 doname(otmp), (const char *) 0);
3904 /* to floor beneath mon */
3906 You("yank %s from %s %s!", the(onambuf),
3907 s_suffix(mon_nam(mtmp)), mon_hand);
3909 You("%s
\82ð%s
\82Ì%s
\82©
\82ç
\82Ð
\82Á
\82Ï
\82Á
\82½
\81I", the(xname(otmp)),
3910 mon_nam(mtmp), mon_hand);
3912 obj_no_longer_held(otmp);
3913 place_object(otmp, mtmp->mx, mtmp->my);
3918 pline1(msg_slipsfree);
3922 if (M_AP_TYPE(mtmp) && !Protection_from_shape_changers
3924 stumble_onto_mimic(mtmp);
3927 You("flick your bullwhip towards %s.", mon_nam(mtmp));
3929 You("%s
\82É
\8cü
\82Á
\82Ä
\95Ú
\82ð
\91Å
\82Á
\82½
\81D", mon_nam(mtmp));
3938 } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
3939 /* it must be air -- water checked above */
3941 You("snap your whip through thin air.");
3943 You("
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë
\82Å
\95Ú
\82ð
\91Å
\82Á
\82½
\81D");
3953 not_enough_room[] = "There's not enough room here to use that.",
3955 not_enough_room[] = "
\82»
\82ê
\82ð
\8eg
\82¤
\82¾
\82¯
\82Ì
\8dL
\82³
\82ª
\82È
\82¢
\81D",
3957 where_to_hit[] = "Where do you want to hit?",
3959 where_to_hit[] = "
\82Ç
\82ê
\82ð
\91_
\82¤
\81H",
3961 cant_see_spot[] = "won't hit anything if you can't see that spot.",
3963 cant_see_spot[] = "
\8fê
\8f\8a\82ª
\8c©
\82¦
\82È
\82¯
\82ê
\82Î
\91_
\82¦
\82È
\82¢
\81D",
3965 cant_reach[] = "can't reach that spot from here.";
3967 cant_reach[] = "
\82±
\82±
\82©
\82ç
\82»
\82±
\82Ö
\82Í
\93Í
\82©
\82È
\82¢
\81D";
3969 /* find pos of monster in range, if only one monster */
3971 find_poleable_mon(pos, min_range, max_range)
3973 int min_range, max_range;
3978 int x, y, lo_x, hi_x, lo_y, hi_y, rt, glyph;
3981 return FALSE; /* must be able to see target location */
3982 impaired = (Confusion || Stunned || Hallucination);
3983 mpos.x = mpos.y = 0; /* no candidate location yet */
3984 rt = isqrt(max_range);
3985 lo_x = max(u.ux - rt, 1), hi_x = min(u.ux + rt, COLNO - 1);
3986 lo_y = max(u.uy - rt, 0), hi_y = min(u.uy + rt, ROWNO - 1);
3987 for (x = lo_x; x <= hi_x; ++x) {
3988 for (y = lo_y; y <= hi_y; ++y) {
3989 if (distu(x, y) < min_range || distu(x, y) > max_range
3990 || !isok(x, y) || !cansee(x, y))
3992 glyph = glyph_at(x, y);
3994 && glyph_is_monster(glyph)
3995 && (mtmp = m_at(x, y)) != 0
3996 && (mtmp->mtame || (mtmp->mpeaceful && flags.confirm)))
3998 if (glyph_is_monster(glyph)
3999 || glyph_is_warning(glyph)
4000 || glyph_is_invisible(glyph)
4001 || (glyph_is_statue(glyph) && impaired)) {
4003 return FALSE; /* more than one candidate location */
4004 mpos.x = x, mpos.y = y;
4009 return FALSE; /* no candidate location */
4014 static int polearm_range_min = -1;
4015 static int polearm_range_max = -1;
4018 get_valid_polearm_position(x, y)
4021 return (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
4022 && distu(x, y) >= polearm_range_min
4023 && distu(x, y) <= polearm_range_max);
4027 display_polearm_positions(state)
4031 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
4032 } else if (state == 1) {
4035 for (dx = -4; dx <= 4; dx++)
4036 for (dy = -4; dy <= 4; dy++) {
4037 x = dx + (int) u.ux;
4038 y = dy + (int) u.uy;
4039 if (get_valid_polearm_position(x, y)) {
4044 tmp_at(DISP_END, 0);
4048 /* Distance attacks by pole-weapons */
4053 int res = 0, typ, max_range, min_range, glyph;
4056 struct monst *hitm = context.polearm.hitmon;
4058 /* Are you allowed to use the pole? */
4060 pline(not_enough_room);
4064 if (!wield_tool(obj, "swing"))
4069 /* assert(obj == uwep); */
4072 * Calculate allowable range (pole's reach is always 2 steps):
4073 * unskilled and basic: orthogonal direction, 4..4;
4074 * skilled: as basic, plus knight's jump position, 4..5;
4075 * expert: as skilled, plus diagonal, 4..8.
4083 * (Note: no roles in nethack can become expert or better
4084 * for polearm skill; Yeoman in slash'em can become expert.)
4087 typ = uwep_skill_type();
4088 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4090 else if (P_SKILL(typ) == P_SKILLED)
4093 max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
4095 polearm_range_min = min_range;
4096 polearm_range_max = max_range;
4098 /* Prompt for a location */
4099 pline(where_to_hit);
4102 if (!find_poleable_mon(&cc, min_range, max_range) && hitm
4103 && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)
4104 && distu(hitm->mx, hitm->my) <= max_range
4105 && distu(hitm->mx, hitm->my) >= min_range) {
4109 getpos_sethilite(display_polearm_positions, get_valid_polearm_position);
4111 if (getpos(&cc, TRUE, "the spot to hit") < 0)
4113 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
4114 return res; /* ESC; uses turn iff polearm became wielded */
4116 glyph = glyph_at(cc.x, cc.y);
4117 if (distu(cc.x, cc.y) > max_range) {
4121 pline("
\89\93\82·
\82¬
\82é
\81I");
4123 } else if (distu(cc.x, cc.y) < min_range) {
4125 pline("Too close!");
4127 pline("
\8bß
\82·
\82¬
\82é
\81I");
4129 } else if (!cansee(cc.x, cc.y) && !glyph_is_monster(glyph)
4130 && !glyph_is_invisible(glyph) && !glyph_is_statue(glyph)) {
4133 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4138 context.polearm.hitmon = (struct monst *) 0;
4139 /* Attack the monster there */
4141 if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *) 0) {
4142 if (attack_checks(mtmp, uwep))
4145 return 1; /* burn nutrition; maybe pass out */
4146 context.polearm.hitmon = mtmp;
4147 check_caitiff(mtmp);
4148 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4149 (void) thitmonst(mtmp, uwep);
4150 } else if (glyph_is_statue(glyph) /* might be hallucinatory */
4151 && sobj_at(STATUE, bhitpos.x, bhitpos.y)) {
4152 struct trap *t = t_at(bhitpos.x, bhitpos.y);
4154 if (t && t->ttyp == STATUE_TRAP
4155 && activate_statue_trap(t, t->tx, t->ty, FALSE)) {
4156 ; /* feedback has been give by animate_statue() */
4158 /* Since statues look like monsters now, we say something
4159 different from "you miss" or "there's nobody there".
4160 Note: we only do this when a statue is displayed here,
4161 because the player is probably attempting to attack it;
4162 other statues obscured by anything are just ignored. */
4164 pline("Thump! Your blow bounces harmlessly off the statue.");
4166 pline("
\83S
\83c
\83\93\81I
\92¤
\91\9c\82Í
\8f\9d\82Â
\82©
\82È
\82©
\82Á
\82½
\81D");
4167 wake_nearto(bhitpos.x, bhitpos.y, 25);
4170 /* no monster here and no statue seen or remembered here */
4171 (void) unmap_invisible(bhitpos.x, bhitpos.y);
4173 You("miss; there is no one there to hit.");
4175 You("
\8aO
\82ê
\82½
\81D
\82»
\82±
\82É
\82Í
\89½
\82à
\82È
\82¢
\81D");
4177 u_wipe_engr(2); /* same as for melee or throwing */
4185 boolean wasblind = Blind;
4186 boolean wascreamed = u.ucreamed;
4187 boolean several = FALSE;
4189 if (obj->quan > 1L) {
4191 obj = splitobj(obj, 1L);
4195 You("give yourself a facial.");
4197 You("
\83N
\83\8a\81[
\83\80\83p
\83b
\83N
\82ð
\82µ
\82½
\81D");
4200 pline("You immerse your %s in %s%s.", body_part(FACE),
4201 several ? "one of " : "",
4202 several ? makeplural(the(xname(obj))) : the(xname(obj)));
4204 pline("%s%s
\82É%s
\82ð
\92¾
\82ß
\82½
\81D",
4206 several ? "
\82Ì
\82Ð
\82Æ
\82Â" : "", body_part(FACE));
4208 if (can_blnd((struct monst *) 0, &youmonst, AT_WEAP, obj)) {
4209 int blindinc = rnd(25);
4210 u.ucreamed += blindinc;
4211 make_blinded(Blinded + (long) blindinc, FALSE);
4212 if (!Blind || (Blind && wasblind))
4214 pline("There's %ssticky goop all over your %s.",
4215 wascreamed ? "more " : "", body_part(FACE));
4217 pline("
\82â
\82Á
\82©
\82¢
\82È
\82Ë
\82Î
\82Ë
\82Î
\82ª%s
\91S
\91Ì
\82É%s
\82Â
\82¢
\82½
\81D",
4218 body_part(FACE), wascreamed ? "
\82³
\82ç
\82É" : "");
4220 else /* Blind && !wasblind */
4222 You_cant("see through all the sticky goop on your %s.",
4224 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",
4229 /* useup() is appropriate, but we want costly_alteration()'s message */
4230 costly_alteration(obj, COST_SPLAT);
4231 obj_extract_self(obj);
4240 int res = 0, typ, max_range = 4, tohit;
4241 boolean save_confirm;
4246 /* Are you allowed to use the hook? */
4248 pline(not_enough_room);
4252 if (!wield_tool(obj, "cast"))
4257 /* assert(obj == uwep); */
4259 /* Prompt for a location */
4260 pline(where_to_hit);
4264 if (getpos(&cc, TRUE, "the spot to hit") < 0)
4266 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
4267 return res; /* ESC; uses turn iff grapnel became wielded */
4269 /* Calculate range; unlike use_pole(), there's no minimum for range */
4270 typ = uwep_skill_type();
4271 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
4273 else if (P_SKILL(typ) == P_SKILLED)
4277 if (distu(cc.x, cc.y) > max_range) {
4281 pline("
\89\93\82·
\82¬
\82é
\81I");
4283 } else if (!cansee(cc.x, cc.y)) {
4286 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4291 /* What do you want to hit? */
4293 if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) {
4294 winid tmpwin = create_nhwindow(NHW_MENU);
4297 menu_item *selected;
4299 any = zeroany; /* set all bits to zero */
4300 any.a_int = 1; /* use index+1 (cant use 0) as identifier */
4304 Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
4306 Sprintf(buf, "%s
\82É
\82 \82é
\95¨
\91Ì", surface(cc.x, cc.y));
4307 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4311 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
4314 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "
\89ö
\95¨",
4319 Sprintf(buf, "the %s", surface(cc.x, cc.y));
4321 Sprintf(buf, "%s", surface(cc.x, cc.y));
4322 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4325 end_menu(tmpwin, "Aim for what?");
4327 end_menu(tmpwin, "
\89½
\82ð
\91_
\82¤
\81H");
4329 if (select_menu(tmpwin, PICK_ONE, &selected) > 0
4330 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2))
4331 tohit = selected[0].item.a_int - 1;
4332 free((genericptr_t) selected);
4333 destroy_nhwindow(tmpwin);
4336 /* possibly scuff engraving at your feet;
4337 any engraving at the target location is unaffected */
4338 if (tohit == 2 || !rn2(2))
4339 u_wipe_engr(rnd(2));
4341 /* What did you hit? */
4344 /* FIXME -- untrap needs to deal with non-adjacent traps */
4346 case 1: /* Object */
4347 if ((otmp = level.objects[cc.x][cc.y]) != 0) {
4349 You("snag an object from the %s!", surface(cc.x, cc.y));
4351 You("%s
\82Ì
\82à
\82Ì
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I", surface(cc.x, cc.y));
4352 (void) pickup_object(otmp, 1L, FALSE);
4353 /* If pickup fails, leave it alone */
4358 case 2: /* Monster */
4360 if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *) 0)
4362 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4363 save_confirm = flags.confirm;
4364 if (verysmall(mtmp->data) && !rn2(4)
4365 && enexto(&cc, u.ux, u.uy, (struct permonst *) 0)) {
4366 flags.confirm = FALSE;
4367 (void) attack_checks(mtmp, uwep);
4368 flags.confirm = save_confirm;
4369 check_caitiff(mtmp); /* despite fact there's no damage */
4371 You("pull in %s!", mon_nam(mtmp));
4373 You("%s
\82ð
\88ø
\82Á
\92£
\82Á
\82½
\81I", mon_nam(mtmp));
4374 mtmp->mundetected = 0;
4375 rloc_to(mtmp, cc.x, cc.y);
4377 } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data))
4379 flags.confirm = FALSE;
4380 (void) attack_checks(mtmp, uwep);
4381 flags.confirm = save_confirm;
4382 check_caitiff(mtmp);
4383 (void) thitmonst(mtmp, uwep);
4387 case 3: /* Surface */
4388 if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y))
4390 pline_The("hook slices through the %s.", surface(cc.x, cc.y));
4392 pline("
\83t
\83b
\83N
\82Í%s
\82ð
\82³
\82Á
\82Æ
\90Ø
\82Á
\82½
\81D", surface(cc.x, cc.y));
4395 You("are yanked toward the %s!", surface(cc.x, cc.y));
4397 You("%s
\82Ö
\88ø
\82Á
\82Ï
\82ç
\82ê
\82½
\81I", surface(cc.x, cc.y));
4398 hurtle(sgn(cc.x - u.ux), sgn(cc.y - u.uy), 1, FALSE);
4402 default: /* Yourself (oops!) */
4403 if (P_SKILL(typ) <= P_BASIC) {
4405 You("hook yourself!");
4407 You("
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I");
4409 losehp(Maybe_Half_Phys(rn1(10, 10)), "a grappling hook",
4411 losehp(Maybe_Half_Phys(rn1(10, 10)), "
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82Ä",
4417 pline1(nothing_happens);
4421 #define BY_OBJECT ((struct monst *) 0)
4423 /* return 1 if the wand is broken, hence some time elapsed */
4429 static const char nothing_else_happens[] = "But nothing else happens...";
4431 static const char nothing_else_happens[] = "
\82µ
\82©
\82µ
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D
\81D
\81D";
4432 register int i, x, y;
4433 register struct monst *mon;
4435 boolean affects_objects;
4436 boolean shop_damage = FALSE;
4437 boolean fillmsg = FALSE;
4438 int expltype = EXPL_MAGICAL;
4439 char confirm[QBUFSZ], buf[BUFSZ];
4441 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
4443 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "
\83o
\83\8b\83T
\82Ì
\8fñ"));
4446 if (!paranoid_query(ParanoidBreakwand,
4448 "Are you really sure you want to break ",
4449 "?", obj, yname, ysimple_name, "the wand")))
4451 if (!paranoid_query(ParanoidBreakwand,
4453 "
\96{
\93\96\82É", "
\82ð
\89ó
\82·
\82Ì
\81H",
4454 obj, xname, ysimple_name, "
\8fñ")))
4458 if (nohands(youmonst.data)) {
4460 You_cant("break %s without hands!", yname(obj));
4462 You("
\8eè
\82ª
\96³
\82¢
\82Ì
\82Å%s
\82ð
\89ó
\82¹
\82È
\82¢
\81I", xname(obj));
4464 } else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
4466 You("don't have the strength to break %s!", yname(obj));
4468 You("%s
\82ð
\89ó
\82·
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I", xname(obj));
4472 pline("Raising %s high above your %s, you %s it in two!", yname(obj),
4473 body_part(HEAD), is_fragile ? "snap" : "break");
4475 pline("%s
\82ð%s
\82Ì
\8fã
\82É
\8d\82\82
\8cf
\82°
\81C
\93ñ
\82Â
\82É
\82Ö
\82µ
\90Ü
\82Á
\82½
\81I", yname(obj),
4479 /* [ALI] Do this first so that wand is removed from bill. Otherwise,
4480 * the freeinv() below also hides it from setpaid() which causes problems.
4483 check_unpaid(obj); /* Extra charge for use */
4484 costly_alteration(obj, COST_DSTROY);
4487 current_wand = obj; /* destroy_item might reset this */
4488 freeinv(obj); /* hide it from destroy_item instead... */
4489 setnotworn(obj); /* so we need to do this ourselves */
4491 if (!zappable(obj)) {
4492 pline(nothing_else_happens);
4493 goto discard_broken_wand;
4495 /* successful call to zappable() consumes a charge; put it back */
4497 /* might have "wrested" a final charge, taking it from 0 to -1;
4498 if so, we just brought it back up to 0, which wouldn't do much
4499 below so give it 1..3 charges now, usually making it stronger
4500 than an ordinary last charge (the wand is already gone from
4501 inventory, so perm_invent can't accidentally reveal this) */
4508 affects_objects = FALSE;
4510 switch (obj->otyp) {
4515 case WAN_ENLIGHTENMENT:
4517 case WAN_SECRET_DOOR_DETECTION:
4518 pline(nothing_else_happens);
4519 goto discard_broken_wand;
4525 expltype = EXPL_FIERY;
4528 if (expltype == EXPL_MAGICAL)
4529 expltype = EXPL_FROSTY;
4532 case WAN_MAGIC_MISSILE:
4534 explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
4535 makeknown(obj->otyp); /* explode describes the effect */
4536 goto discard_broken_wand;
4538 /* we want this before the explosion instead of at the very end */
4540 pline("A wall of force smashes down around you!");
4542 pline("
\82 \82È
\82½
\82Í
\96\82\97Í
\82Ì
\95Ç
\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81I");
4543 dmg = d(1 + obj->spe, 6); /* normally 2d12 */
4545 case WAN_CANCELLATION:
4547 case WAN_TELEPORTATION:
4548 case WAN_UNDEAD_TURNING:
4549 affects_objects = TRUE;
4555 /* magical explosion and its visual effect occur before specific effects
4557 /* [TODO? This really ought to prevent the explosion from being
4558 fatal so that we never leave a bones file where none of the
4559 surrounding targets (or underlying objects) got affected yet.] */
4560 explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS,
4563 /* prepare for potential feedback from polymorph... */
4566 /* this makes it hit us last, so that we can see the action first */
4567 for (i = 0; i <= 8; i++) {
4568 bhitpos.x = x = obj->ox + xdir[i];
4569 bhitpos.y = y = obj->oy + ydir[i];
4573 if (obj->otyp == WAN_DIGGING) {
4576 if (dig_check(BY_OBJECT, FALSE, x, y)) {
4577 if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) {
4578 /* normally, pits and holes don't anger guards, but they
4579 * do if it's a wall or door that's being dug */
4580 watch_dig((struct monst *) 0, x, y, TRUE);
4581 if (*in_rooms(x, y, SHOPBASE))
4585 * Let liquid flow into the newly created pits.
4586 * Adjust corresponding code in music.c for
4587 * drum of earthquake if you alter this sequence.
4589 typ = fillholetyp(x, y, FALSE);
4591 levl[x][y].typ = typ, levl[x][y].flags = 0;
4592 liquid_flow(x, y, typ, t_at(x, y),
4596 : "Some holes are quickly filled with %s!");
4598 : "
\8c\8a\82Í
\82·
\82®
\82É%s
\82Å
\96\84\82Ü
\82Á
\82½
\81I");
4601 digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3
4602 || (!Can_dig_down(&u.uz)
4603 && !levl[x][y].candig))
4608 } else if (obj->otyp == WAN_CREATE_MONSTER) {
4609 /* u.ux,u.uy creates it near you--x,y might create it in rock */
4610 (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS);
4612 } else if (x != u.ux || y != u.uy) {
4614 * Wand breakage is targetting a square adjacent to the hero,
4615 * which might contain a monster or a pile of objects or both.
4616 * Handle objects last; avoids having undead turning raise an
4617 * undead's corpse and then attack resulting undead monster.
4618 * obj->bypass in bhitm() prevents the polymorphing of items
4619 * dropped due to monster's polymorph and prevents undead
4620 * turning that kills an undead from raising resulting corpse.
4622 if ((mon = m_at(x, y)) != 0) {
4623 (void) bhitm(mon, obj);
4624 /* if (context.botl) bot(); */
4626 if (affects_objects && level.objects[x][y]) {
4627 (void) bhitpile(obj, bhito, x, y, 0);
4629 bot(); /* potion effects */
4633 * Wand breakage is targetting the hero. Using xdir[]+ydir[]
4634 * deltas for location selection causes this case to happen
4635 * after all the surrounding squares have been handled.
4636 * Process objects first, in case damage is fatal and leaves
4637 * bones, or teleportation sends one or more of the objects to
4638 * same destination as hero (lookhere/autopickup); also avoids
4639 * the polymorphing of gear dropped due to hero's transformation.
4640 * (Unlike with monsters being hit by zaps, we can't rely on use
4641 * of obj->bypass in the zap code to accomplish that last case
4642 * since it's also used by retouch_equipment() for polyself.)
4644 if (affects_objects && level.objects[x][y]) {
4645 (void) bhitpile(obj, bhito, x, y, 0);
4647 bot(); /* potion effects */
4649 damage = zapyourself(obj, FALSE);
4652 Sprintf(buf, "killed %sself by breaking a wand", uhim());
4653 losehp(Maybe_Half_Phys(damage), buf, NO_KILLER_PREFIX);
4655 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82Å
\8fñ
\82ð
\89ó
\82µ
\82Ä
\83_
\83\81\81[
\83W
\82ð
\8eó
\82¯");
4656 losehp(Maybe_Half_Phys(damage), buf, KILLED_BY);
4660 bot(); /* blindness */
4664 /* potentially give post zap/break feedback */
4667 /* Note: if player fell thru, this call is a no-op.
4668 Damage is handled in digactualhole in that case */
4671 pay_for_damage("dig into", FALSE);
4673 pay_for_damage("
\8c\8a\82ð
\82 \82¯
\82é", FALSE);
4675 if (obj->otyp == WAN_LIGHT)
4676 litroom(TRUE, obj); /* only needs to be done once */
4678 discard_broken_wand:
4679 obj = current_wand; /* [see dozap() and destroy_item()] */
4688 add_class(cl, class)
4699 static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 };
4701 /* augment tools[] if various items are carried */
4703 setapplyclasses(class_list)
4706 register struct obj *otmp;
4708 boolean knowoil, knowtouchstone, addpotions, addstones, addfood;
4710 knowoil = objects[POT_OIL].oc_name_known;
4711 knowtouchstone = objects[TOUCHSTONE].oc_name_known;
4712 addpotions = addstones = addfood = FALSE;
4713 for (otmp = invent; otmp; otmp = otmp->nobj) {
4716 || (otmp->oclass == POTION_CLASS
4718 || (!knowoil && !objects[otyp].oc_name_known))))
4720 if (otyp == TOUCHSTONE
4721 || (is_graystone(otmp)
4723 || (!knowtouchstone && !objects[otyp].oc_name_known))))
4725 if (otyp == CREAM_PIE || otyp == EUCALYPTUS_LEAF)
4729 class_list[0] = '\0';
4730 if (addpotions || addstones)
4731 add_class(class_list, ALL_CLASSES);
4732 Strcat(class_list, tools);
4734 add_class(class_list, POTION_CLASS);
4736 add_class(class_list, GEM_CLASS);
4738 add_class(class_list, FOOD_CLASS);
4741 /* the 'a' command */
4746 register int res = 1;
4747 char class_list[MAXOCLASSES + 2];
4749 if (check_capacity((char *) 0))
4752 setapplyclasses(class_list); /* tools[] */
4753 obj = getobj(class_list, "use or apply");
4757 if (!retouch_object(&obj, FALSE))
4758 return 1; /* evading your grasp costs a turn; just be
4759 grateful that you don't drop it as well */
4761 if (obj->oclass == WAND_CLASS)
4762 return do_break_wand(obj);
4764 switch (obj->otyp) {
4767 if (obj == ublindf) {
4770 } else if (!ublindf) {
4774 You("are already %s.", ublindf->otyp == TOWEL
4775 ? "covered by a towel"
4776 : ublindf->otyp == BLINDFOLD
4777 ? "wearing a blindfold"
4778 : "wearing lenses");
4780 You("
\82à
\82¤%s
\82Ä
\82¢
\82é
\81D", ublindf->otyp == TOWEL
4781 ? "
\83^
\83I
\83\8b\82ð
\8aª
\82¢"
4782 : ublindf->otyp == BLINDFOLD
4783 ? "
\96Ú
\89B
\82µ
\82ð
\82Â
\82¯"
4784 : "
\83\8c\83\93\83Y
\82ð
\82Â
\82¯");
4789 res = use_cream_pie(obj);
4792 res = use_whip(obj);
4794 case GRAPPLING_HOOK:
4795 res = use_grapple(obj);
4801 case BAG_OF_HOLDING:
4803 res = use_container(&obj, 1, FALSE);
4806 (void) bagotricks(obj, FALSE, (int *) 0);
4814 res = (pick_lock(obj) != 0);
4817 case DWARVISH_MATTOCK:
4818 res = use_pick_axe(obj);
4821 use_tinning_kit(obj);
4824 res = use_leash(obj);
4827 res = use_saddle(obj);
4830 use_magic_whistle(obj);
4835 case EUCALYPTUS_LEAF:
4836 /* MRKR: Every Australian knows that a gum leaf makes an excellent
4837 * whistle, especially if your pet is a tame kangaroo named Skippy.
4840 use_magic_whistle(obj);
4841 /* sometimes the blessing will be worn off */
4845 pline("%s %s.", Yobjnam2(obj, "glow"), hcolor("brown"));
4847 pline("%s
\82Í%s
\8bP
\82¢
\82½
\81D", xname(obj), jconj_adj(hcolor("
\92\83\90F
\82Ì")));
4857 res = use_stethoscope(obj);
4860 res = use_mirror(obj);
4863 case BELL_OF_OPENING:
4866 case CANDELABRUM_OF_INVOCATION:
4867 use_candelabrum(obj);
4879 light_cocktail(&obj);
4881 case EXPENSIVE_CAMERA:
4882 res = use_camera(obj);
4885 res = use_towel(obj);
4888 use_crystal_ball(&obj);
4894 res = use_tin_opener(obj);
4900 use_unicorn_horn(obj);
4911 case DRUM_OF_EARTHQUAKE:
4912 res = do_play_instrument(obj);
4914 case HORN_OF_PLENTY: /* not a musical instrument */
4915 (void) hornoplenty(obj, FALSE);
4928 /* Pole-weapons can strike at a distance */
4930 res = use_pole(obj);
4932 } else if (is_pick(obj) || is_axe(obj)) {
4933 res = use_pick_axe(obj);
4937 pline("Sorry, I don't know how to use that.");
4939 pline("
\82»
\82ê
\82ð
\82Ç
\82¤
\82â
\82Á
\82Ä
\8eg
\82¤
\82ñ
\82¾
\82¢
\81H");
4943 if (res && obj && obj->oartifact)
4949 /* Keep track of unfixable troubles for purposes of messages saying you feel
4953 unfixable_trouble_count(is_horn)
4956 int unfixable_trbl = 0;
4964 if (Wounded_legs && !u.usteed)
4966 /* lycanthropy is undesirable, but it doesn't actually make you feel bad
4967 so don't count it as a trouble which can't be fixed */
4970 * Unicorn horn can fix these when they're timed but not when
4971 * they aren't. Potion of restore ability doesn't touch them,
4972 * so they're always unfixable for the not-unihorn case.
4973 * [Most of these are timed only, so always curable via horn.
4974 * An exception is Stunned, which can be forced On by certain
4975 * polymorph forms (stalker, bats).]
4977 if (Sick && (!is_horn || (Sick & ~TIMEOUT) != 0L))
4979 if (Stunned && (!is_horn || (HStun & ~TIMEOUT) != 0L))
4981 if (Confusion && (!is_horn || (HConfusion & ~TIMEOUT) != 0L))
4983 if (Hallucination && (!is_horn || (HHallucination & ~TIMEOUT) != 0L))
4985 if (Vomiting && (!is_horn || (Vomiting & ~TIMEOUT) != 0L))
4987 if (Deaf && (!is_horn || (HDeaf & ~TIMEOUT) != 0L))
4990 return unfixable_trbl;