1 /* NetHack 3.6 apply.c $NHDT-Date: 1446808436 2015/11/06 11:13:56 $ $NHDT-Branch: master $:$NHDT-Revision: 1.210 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* NetHack may be freely redistributed. See license for details. */
5 /* JNetHack Copyright */
6 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
7 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2016 */
8 /* JNetHack may be freely redistributed. See license for details. */
12 extern boolean notonhead; /* for long worms */
14 STATIC_DCL int FDECL(use_camera, (struct obj *));
15 STATIC_DCL int FDECL(use_towel, (struct obj *));
16 STATIC_DCL boolean FDECL(its_dead, (int, int, int *));
17 STATIC_DCL int FDECL(use_stethoscope, (struct obj *));
18 STATIC_DCL void FDECL(use_whistle, (struct obj *));
19 STATIC_DCL void FDECL(use_magic_whistle, (struct obj *));
20 STATIC_DCL void FDECL(use_leash, (struct obj *));
21 STATIC_DCL int FDECL(use_mirror, (struct obj *));
22 STATIC_DCL void FDECL(use_bell, (struct obj **));
23 STATIC_DCL void FDECL(use_candelabrum, (struct obj *));
24 STATIC_DCL void FDECL(use_candle, (struct obj **));
25 STATIC_DCL void FDECL(use_lamp, (struct obj *));
26 STATIC_DCL void FDECL(light_cocktail, (struct obj *));
27 STATIC_PTR void FDECL(display_jump_positions, (int));
28 STATIC_DCL void FDECL(use_tinning_kit, (struct obj *));
29 STATIC_DCL void FDECL(use_figurine, (struct obj **));
30 STATIC_DCL void FDECL(use_grease, (struct obj *));
31 STATIC_DCL void FDECL(use_trap, (struct obj *));
32 STATIC_DCL void FDECL(use_stone, (struct obj *));
33 STATIC_PTR int NDECL(set_trap); /* occupation callback */
34 STATIC_DCL int FDECL(use_whip, (struct obj *));
35 STATIC_PTR void FDECL(display_polearm_positions, (int));
36 STATIC_DCL int FDECL(use_pole, (struct obj *));
37 STATIC_DCL int FDECL(use_cream_pie, (struct obj *));
38 STATIC_DCL int FDECL(use_grapple, (struct obj *));
39 STATIC_DCL int FDECL(do_break_wand, (struct obj *));
40 STATIC_DCL boolean FDECL(figurine_location_checks, (struct obj *,
42 STATIC_DCL void FDECL(add_class, (char *, CHAR_P));
43 STATIC_DCL void FDECL(setapplyclasses, (char *));
44 STATIC_DCL boolean FDECL(is_valid_jump_pos, (int, int, int, BOOLEAN_P));
45 STATIC_DCL boolean FDECL(find_poleable_mon, (coord *, int, int));
48 void FDECL(amii_speaker, (struct obj *, char *, int));
51 static const char no_elbow_room[] =
53 "don't have enough elbow-room to maneuver.";
55 "
\82»
\82ê
\82ð
\82·
\82é
\82¾
\82¯
\82Ì
\82ä
\82Æ
\82è
\82ª
\82È
\82¢
\81D";
65 pline("Using your camera underwater would void the warranty.");
67 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");
70 if (!getdir((char *) 0))
74 pline1(nothing_happens);
77 consume_obj_charge(obj, TRUE);
79 if (obj->cursed && !rn2(2)) {
80 (void) zapyourself(obj, TRUE);
81 } else if (u.uswallow) {
83 You("take a picture of %s %s.", s_suffix(mon_nam(u.ustuck)),
84 mbodypart(u.ustuck, STOMACH));
86 You("%s
\82Ì%s
\82Ì
\8eÊ
\90^
\82ð
\8eB
\82Á
\82½
\81D", mon_nam(u.ustuck),
87 mbodypart(u.ustuck, STOMACH));
91 You("take a picture of the %s.",
93 You("take a picture of the %s.",
94 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
95 } else if (!u.dx && !u.dy) {
96 (void) zapyourself(obj, TRUE);
97 } else if ((mtmp = bhit(u.dx, u.dy, COLNO, FLASHED_LIGHT,
98 (int FDECL((*), (MONST_P, OBJ_P))) 0,
99 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj)) != 0) {
100 obj->ox = u.ux, obj->oy = u.uy;
101 (void) flash_hits_mon(mtmp, obj);
110 boolean drying_feedback = (obj == uwep);
114 You("have no free %s!", body_part(HAND));
116 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81I", body_part(HAND));
118 } else if (obj == ublindf) {
120 You("cannot use it while you're wearing it!");
122 You("
\82»
\82ê
\82ð
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\82Ì
\82Å
\8eg
\97p
\82Å
\82«
\82È
\82¢
\81I");
124 } else if (obj->cursed) {
130 incr_itimeout(&Glib, rn1(10, 3));
132 Your("%s %s!", makeplural(body_part(HAND)),
133 (old ? "are filthier than ever" : "get slimy"));
135 Your("%s
\82Í%s
\81I", makeplural(body_part(HAND)),
136 (old ? "
\82Ü
\82·
\82Ü
\82·
\89\98\82È
\82
\82È
\82Á
\82½" : "
\82Ê
\82é
\82Ê
\82é
\82É
\82È
\82Á
\82½"));
138 if (is_wet_towel(obj))
139 dry_a_towel(obj, -1, drying_feedback);
144 u.ucreamed += rn1(10, 3);
146 pline("Yecch! Your %s %s gunk on it!", body_part(FACE),
147 (old ? "has more" : "now has"));
149 pline("
\83Q
\83F
\81[
\81I
\82 \82È
\82½
\82Ì%s
\82Í%s
\82×
\82Æ
\82×
\82Æ
\82É
\82È
\82Á
\82½
\81I", body_part(FACE),
150 (old ? "
\82à
\82Á
\82Æ" : ""));
152 make_blinded(Blinded + (long) u.ucreamed - old, TRUE);
157 what = (ublindf->otyp == LENSES)
159 : (obj->otyp == ublindf->otyp) ? "other towel"
162 what = (ublindf->otyp == LENSES)
164 : (obj->otyp == ublindf->otyp) ? "
\83^
\83I
\83\8b"
167 if (ublindf->cursed) {
169 You("push your %s %s.", what,
170 rn2(2) ? "cock-eyed" : "crooked");
172 pline("%s
\82ª%s
\81D", what,
173 rn2(2) ? "
\82¸
\82ê
\82½" : "
\82ä
\82ª
\82ñ
\82¾");
176 struct obj *saved_ublindf = ublindf;
178 You("push your %s off.", what);
180 pline("%s
\82ª
\82¸
\82è
\97\8e\82¿
\82½
\81D", what);
182 dropx(saved_ublindf);
185 if (is_wet_towel(obj))
186 dry_a_towel(obj, -1, drying_feedback);
196 You("wipe off your %s.", makeplural(body_part(HAND)));
198 You("%s
\82ð
\90@
\82¢
\82½
\81D", makeplural(body_part(HAND)));
199 if (is_wet_towel(obj))
200 dry_a_towel(obj, -1, drying_feedback);
202 } else if (u.ucreamed) {
203 Blinded -= u.ucreamed;
207 pline("You've got the glop off.");
209 You("
\82³
\82Á
\82Ï
\82è
\82µ
\82½
\81D");
210 if (!gulp_blnd_check()) {
212 make_blinded(0L, TRUE);
216 Your("%s feels clean now.", body_part(FACE));
218 pline("%s
\82Ì
\89\98\82ê
\82ð
\90@
\82«
\82Æ
\82Á
\82½
\81D", body_part(FACE));
220 if (is_wet_towel(obj))
221 dry_a_towel(obj, -1, drying_feedback);
226 Your("%s and %s are already clean.", body_part(FACE),
227 makeplural(body_part(HAND)));
229 Your("%s
\82â%s
\82Í
\89\98\82ê
\82Ä
\82¢
\82È
\82¢
\81D", body_part(FACE),
230 makeplural(body_part(HAND)));
236 /* maybe give a stethoscope message based on floor objects */
238 its_dead(rx, ry, resp)
242 boolean more_corpses;
243 struct permonst *mptr;
244 struct obj *corpse = sobj_at(CORPSE, rx, ry),
245 *statue = sobj_at(STATUE, rx, ry);
247 if (!can_reach_floor(TRUE)) { /* levitation or unskilled riding */
248 corpse = 0; /* can't reach corpse on floor */
249 /* you can't reach tiny statues (even though you can fight
250 tiny monsters while levitating--consistency, what's that?) */
251 while (statue && mons[statue->corpsenm].msize == MZ_TINY)
252 statue = nxtobj(statue, STATUE, TRUE);
254 /* when both corpse and statue are present, pick the uppermost one */
255 if (corpse && statue) {
256 if (nxtobj(statue, CORPSE, TRUE) == corpse)
257 corpse = 0; /* corpse follows statue; ignore it */
259 statue = 0; /* corpse precedes statue; ignore statue */
261 more_corpses = (corpse && nxtobj(corpse, CORPSE, TRUE));
263 /* additional stethoscope messages from jyoung@apanix.apana.org.au */
264 if (!corpse && !statue) {
265 ; /* nothing to do */
267 } else if (Hallucination) {
270 Strcpy(buf, "You're both stoned");
271 } else if (corpse->quan == 1L && !more_corpses) {
272 int gndr = 2; /* neuter: "it" */
273 struct monst *mtmp = get_mtraits(corpse, FALSE);
275 /* (most corpses don't retain the monster's sex, so
276 we're usually forced to use generic pronoun here) */
278 mptr = &mons[mtmp->mnum];
279 /* can't use mhe() here; it calls pronoun_gender() which
280 expects monster to be on the map (visibility check) */
281 if ((humanoid(mptr) || (mptr->geno & G_UNIQ)
282 || type_is_pname(mptr)) && !is_neuter(mptr))
283 gndr = (int) mtmp->female;
285 mptr = &mons[corpse->corpsenm];
288 else if (is_male(mptr))
291 Sprintf(buf, "%s's dead", genders[gndr].he); /* "he"/"she"/"it" */
292 buf[0] = highc(buf[0]);
293 } else { /* plural */
294 Strcpy(buf, "They're dead");
296 /* variations on "He's dead, Jim." (Star Trek's Dr McCoy) */
298 You_hear("a voice say, \"%s, Jim.\"", buf);
300 You_hear("
\81u
\82»
\82¢
\82Â
\82Í
\8e\80\82ñ
\82Å
\82é
\82º
\81C
\83W
\83\80\81v
\82Æ
\82¢
\82¤
\90º
\82ª
\95·
\82±
\82¦
\82½
\81D");
305 boolean here = (rx == u.ux && ry == u.uy),
306 one = (corpse->quan == 1L && !more_corpses), reviver = FALSE;
308 if (Role_if(PM_HEALER)) {
309 /* ok to reset `corpse' here; we're done with it */
311 if (obj_has_timer(corpse, REVIVE_MON))
314 corpse = nxtobj(corpse, CORPSE, TRUE);
315 } while (corpse && !reviver);
318 You("determine that %s unfortunate being%s %s%s dead.",
319 one ? (here ? "this" : "that") : (here ? "these" : "those"),
320 one ? "" : "s", one ? "is" : "are", reviver ? " mostly" : "");
322 You("%s
\95s
\8dK
\82È
\90¶
\82«
\95¨
\82Í%s
\8e\80\82ñ
\82Å
\82¢
\82é
\82Æ
\8c\8b\98_
\82µ
\82½
\81D",
323 here ? "
\82±
\82Ì" : "
\82»
\82Ì",
324 reviver ? "
\82Ù
\82Ú" : "");
328 } else { /* statue */
329 const char *what, *how;
331 mptr = &mons[statue->corpsenm];
332 if (Blind) { /* ignore statue->dknown; it'll always be set */
333 Sprintf(buf, "%s %s",
334 (rx == u.ux && ry == u.uy) ? "This" : "That",
335 humanoid(mptr) ? "person" : "creature");
339 if (!type_is_pname(mptr))
343 if (Role_if(PM_HEALER)) {
344 struct trap *ttmp = t_at(rx, ry);
346 if (ttmp && ttmp->ttyp == STATUE_TRAP)
348 how = "extraordinary";
350 how = "
\8c\92\8dN
\93I
\82È";
351 else if (Has_contents(statue))
355 how = "
\96ô
\93®
\93I
\82È";
359 pline("%s is in %s health for a statue.", what, how);
361 pline("
\92¤
\91\9c\82Æ
\82µ
\82Ä
\82Ì%s
\82Í%s
\8dì
\95i
\82¾
\81D", what, how);
364 return FALSE; /* no corpse or statue */
368 static const char hollow_str[] = "a hollow sound. This must be a secret %s!";
370 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";
372 /* Strictly speaking it makes no sense for usage of a stethoscope to
373 not take any time; however, unless it did, the stethoscope would be
374 almost useless. As a compromise, one use per turn is free, another
375 uses up the turn; this makes curse status have a tangible effect. */
378 register struct obj *obj;
383 boolean interference = (u.uswallow && is_whirly(u.ustuck->data)
384 && !rn2(Role_if(PM_HEALER) ? 10 : 3));
386 if (nohands(youmonst.data)) {
388 You("have no hands!"); /* not `body_part(HAND)' */
390 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I");
395 You_cant("hear anything!");
397 You("
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81I");
399 } else if (!freehand()) {
401 You("have no free %s.", body_part(HAND));
403 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81D", body_part(HAND));
406 if (!getdir((char *) 0))
409 res = (moves == context.stethoscope_move)
410 && (youmonst.movement == context.stethoscope_movement);
411 context.stethoscope_move = moves;
412 context.stethoscope_movement = youmonst.movement;
414 if (u.usteed && u.dz > 0) {
417 pline("%s interferes.", Monnam(u.ustuck));
419 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
420 mstatusline(u.ustuck);
422 mstatusline(u.usteed);
424 } else if (u.uswallow && (u.dx || u.dy || u.dz)) {
425 mstatusline(u.ustuck);
427 } else if (u.uswallow && interference) {
429 pline("%s interferes.", Monnam(u.ustuck));
431 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
432 mstatusline(u.ustuck);
437 You_hear("faint splashing.");
439 You_hear("
\82©
\82·
\82©
\82É
\83o
\83V
\83\83\83o
\83V
\83\83\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
440 else if (u.dz < 0 || !can_reach_floor(TRUE))
441 cant_reach_floor(u.ux, u.uy, (u.dz < 0), TRUE);
442 else if (its_dead(u.ux, u.uy, &res))
443 ; /* message already given */
444 else if (Is_stronghold(&u.uz))
446 You_hear("the crackling of hellfire.");
448 You_hear("
\92n
\8d\96\82Ì
\89\8a\82ª
\83p
\83`
\83p
\83`
\94R
\82¦
\82Ä
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
451 pline_The("%s seems healthy enough.", surface(u.ux, u.uy));
453 pline("%s
\82Í
\8f[
\95ª
\8c\92\8dN
\82Ì
\82æ
\82¤
\82¾
\81D", surface(u.ux,u.uy));
455 } else if (obj->cursed && !rn2(2)) {
457 You_hear("your heart beat.");
459 You_hear("
\8e©
\95ª
\82Ì
\90S
\91\9f\82Ì
\8cÛ
\93®
\82ð
\95·
\82¢
\82½
\81D");
462 if (Stunned || (Confusion && !rn2(5)))
464 if (!u.dx && !u.dy) {
472 You_hear("a faint typing noise.");
474 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");
477 if ((mtmp = m_at(rx, ry)) != 0) {
478 const char *mnm = x_monnam(mtmp, ARTICLE_A, (const char *) 0,
479 SUPPRESS_IT | SUPPRESS_INVISIBLE, FALSE);
481 if (mtmp->mundetected) {
482 if (!canspotmon(mtmp))
483 There("is %s hidden there.", mnm);
484 mtmp->mundetected = 0;
485 newsym(mtmp->mx, mtmp->my);
486 } else if (mtmp->mappearance) {
487 const char *what = "thing";
489 switch (mtmp->m_ap_type) {
491 what = simple_typename(mtmp->mappearance);
493 case M_AP_MONSTER: /* ignore Hallucination here */
494 what = mons[mtmp->mappearance].mname;
497 what = defsyms[mtmp->mappearance].explanation;
501 pline("That %s is really %s", what, mnm);
502 } else if (flags.verbose && !canspotmon(mtmp)) {
503 There("is %s there.", mnm);
506 if (!canspotmon(mtmp))
507 map_invisible(rx, ry);
510 if (glyph_is_invisible(levl[rx][ry].glyph)) {
511 unmap_object(rx, ry);
514 pline_The("invisible monster must have moved.");
516 pline_The("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82Í
\88Ú
\93®
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
522 You_hear(hollow_str, "door");
524 You_hear(hollow_str, "
\94à");
525 cvt_sdoor_to_door(lev); /* ->typ = DOOR */
530 You_hear(hollow_str, "passage");
532 You_hear(hollow_str, "
\92Ê
\98H");
534 unblock_point(rx, ry);
539 if (!its_dead(rx, ry, &res))
541 You("hear nothing special."); /* not You_hear() */
543 pline("
\93Á
\82É
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81D");
549 static const char whistle_str[] = "produce a %s whistling sound.";
551 static const char whistle_str[] = "
\93J
\82ð
\90\81\82¢
\82Ä%s
\89¹
\82ð
\82½
\82Ä
\82½
\81D";
557 if (!can_blow(&youmonst)) {
559 You("are incapable of using the whistle.");
561 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
562 } else if (Underwater) {
564 You("blow bubbles through %s.", yname(obj));
566 You("%s
\82ð
\92Ê
\82µ
\82Ä
\96A
\82ð
\8fo
\82µ
\82½
\81D", yname(obj));
569 You(whistle_str, obj->cursed ? "shrill" : "high");
571 You(whistle_str, obj->cursed ? "
\95s
\8bC
\96¡
\82È" : "
\82©
\82ñ
\8d\82\82¢");
577 use_magic_whistle(obj)
580 register struct monst *mtmp, *nextmon;
582 if (!can_blow(&youmonst)) {
584 You("are incapable of using the whistle.");
586 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
587 } else if (obj->cursed && !rn2(2)) {
589 You("produce a %shigh-pitched humming noise.",
590 Underwater ? "very " : "");
592 You("%s
\8d\82\82¢
\92²
\8eq
\82Ì
\82¤
\82È
\82é
\82æ
\82¤
\82È
\89¹
\82ð
\82½
\82Ä
\82½
\81D",
593 Underwater ? "
\82Æ
\82Ä
\82à" : "");
597 int pet_cnt = 0, omx, omy;
599 /* it's magic! it works underwater too (at a higher pitch) */
602 Hallucination ? "normal" : Underwater ? "strange, high-pitched"
606 Hallucination ? "
\93J
\82Ì
\82æ
\82¤
\82È" : Underwater ? "
\95s
\8ev
\8bc
\82È
\8d\82\82¢
\92²
\8eq
\82Ì"
607 : "
\95s
\8ev
\8bc
\82È");
609 for (mtmp = fmon; mtmp; mtmp = nextmon) {
610 nextmon = mtmp->nmon; /* trap might kill mon */
611 if (DEADMONSTER(mtmp))
613 /* steed is already at your location, so not affected;
614 this avoids trap issues if you're on a trap location */
615 if (mtmp == u.usteed)
618 if (mtmp->mtrapped) {
619 /* no longer in previous trap (affects mintrap) */
621 fill_pit(mtmp->mx, mtmp->my);
623 /* mimic must be revealed before we know whether it
624 actually moves because line-of-sight may change */
627 omx = mtmp->mx, omy = mtmp->my;
629 if (mtmp->mx != omx || mtmp->my != omy) {
630 mtmp->mundetected = 0; /* reveal non-mimic hider */
631 if (canspotmon(mtmp))
633 if (mintrap(mtmp) == 2)
639 makeknown(obj->otyp);
647 return (boolean) (abs(u.ux - x) > n || abs(u.uy - y) > n);
656 for (obj = invent; obj; obj = obj->nobj)
657 if (obj->otyp == LEASH && obj->leashmon != 0)
662 /* otmp is about to be destroyed or stolen */
665 register struct obj *otmp;
667 register struct monst *mtmp;
669 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
670 if (mtmp->m_id == (unsigned) otmp->leashmon)
675 /* mtmp is about to die, or become untame */
677 m_unleash(mtmp, feedback)
678 register struct monst *mtmp;
681 register struct obj *otmp;
686 pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp));
688 pline("%s
\82Í
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82Ä
\93¦
\82ê
\82½
\81I", Monnam(mtmp));
691 Your("leash falls slack.");
693 Your("
\95R
\82ª
\82½
\82é
\82ñ
\82Å
\97\8e\82¿
\82½
\81D");
695 for (otmp = invent; otmp; otmp = otmp->nobj)
696 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
701 /* player is about to die (for bones) */
705 register struct obj *otmp;
706 register struct monst *mtmp;
708 for (otmp = invent; otmp; otmp = otmp->nobj)
709 if (otmp->otyp == LEASH)
711 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
721 return (boolean) (mtmp->mnum != PM_LONG_WORM);
730 register struct monst *mtmp;
733 if (!obj->leashmon && number_leashed() >= MAXLEASHED) {
735 You("cannot leash any more pets.");
737 You("
\82±
\82ê
\88È
\8fã
\83y
\83b
\83g
\82É
\95R
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
741 if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
744 if ((cc.x == u.ux) && (cc.y == u.uy)) {
745 if (u.usteed && u.dz > 0) {
751 pline("Leash yourself? Very funny...");
753 pline("
\8e©
\95ª
\82ð
\94\9b\82é
\81H
\95Ï
\82È
\82Ì
\81D
\81D
\81D");
757 if (!(mtmp = m_at(cc.x, cc.y))) {
759 There("is no creature there.");
761 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
765 spotmon = canspotmon(mtmp);
771 There("is no creature there.");
773 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
776 pline("%s %s leashed!", Monnam(mtmp),
777 (!obj->leashmon) ? "cannot be" : "is not");
779 pline("%s
\82Í
\95R
\82Å%s
\81I", Monnam(mtmp),
780 (!obj->leashmon) ? "
\8c\8b\82×
\82È
\82¢" : "
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢");
784 if (!obj->leashmon) {
785 if (mtmp->mleashed) {
787 pline("This %s is already leashed.",
788 spotmon ? l_monnam(mtmp) : "monster");
790 pline("%s
\82Í
\82·
\82Å
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D",
791 spotmon ? l_monnam(mtmp) : "
\89ö
\95¨");
795 if (!leashable(mtmp)) {
797 pline("The leash won't fit onto %s%s.", spotmon ? "your " : "",
800 pline("
\95R
\82Í%s
\82É
\8d\87\82í
\82È
\82¢
\81D",
807 You("slip the leash around %s%s.", spotmon ? "your " : "",
810 You("%s
\82ð
\95R
\82Å
\8c\8b\82Ñ
\82Â
\82¯
\82½
\81D",
814 obj->leashmon = (int) mtmp->m_id;
818 if (obj->leashmon != (int) mtmp->m_id) {
820 pline("This leash is not attached to that creature.");
822 pline("
\82±
\82Ì
\95R
\82Í
\82»
\82ê
\82É
\82Í
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢
\81D");
827 pline_The("leash would not come off!");
829 pline("
\95R
\82ª
\82Í
\82¸
\82ê
\82È
\82¢
\81I");
836 You("remove the leash from %s%s.", spotmon ? "your " : "",
839 You("%s
\82©
\82ç
\95R
\82ð
\82Í
\82¸
\82µ
\82½
\81D",
846 /* assuming mtmp->mleashed has been checked */
855 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
859 return (struct obj *) 0;
865 register struct monst *mtmp;
866 register struct obj *otmp;
868 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
869 if (DEADMONSTER(mtmp))
871 if (mtmp->mleashed) {
872 if (distu(mtmp->mx, mtmp->my) > 2)
874 if (distu(mtmp->mx, mtmp->my) > 2) {
875 for (otmp = invent; otmp; otmp = otmp->nobj)
876 if (otmp->otyp == LEASH
877 && otmp->leashmon == (int) mtmp->m_id) {
881 You_feel("%s leash go slack.",
882 (number_leashed() > 1) ? "a" : "the");
884 You("
\95R
\82ª
\82½
\82é
\82ñ
\82¾
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
892 /* no pack mules for the Amulet */
893 if (u.usteed && mon_has_amulet(u.usteed))
902 register struct obj *otmp;
903 register struct monst *mtmp;
905 for (otmp = invent; otmp; otmp = otmp->nobj) {
906 if (otmp->otyp != LEASH || otmp->leashmon == 0)
908 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
909 if (DEADMONSTER(mtmp))
911 if ((int) mtmp->m_id == otmp->leashmon)
915 impossible("leash in use isn't attached to anything?");
919 if (dist2(u.ux, u.uy, mtmp->mx, mtmp->my)
920 > dist2(x, y, mtmp->mx, mtmp->my)) {
921 if (!um_dist(mtmp->mx, mtmp->my, 3)) {
922 ; /* still close enough */
923 } else if (otmp->cursed && !breathless(mtmp->data)) {
924 if (um_dist(mtmp->mx, mtmp->my, 5)
925 || (mtmp->mhp -= rnd(2)) <= 0) {
926 long save_pacifism = u.uconduct.killer;
929 Your("leash chokes %s to death!", mon_nam(mtmp));
931 pline("%s
\82Í
\8di
\82ß
\8eE
\82³
\82ê
\82½
\81I",mon_nam(mtmp));
932 /* hero might not have intended to kill pet, but
933 that's the result of his actions; gain experience,
934 lose pacifism, take alignment and luck hit, make
935 corpse less likely to remain tame after revival */
936 xkilled(mtmp, 0); /* no "you kill it" message */
937 /* life-saving doesn't ordinarily reset this */
939 u.uconduct.killer = save_pacifism;
942 pline("%s is choked by the leash!", Monnam(mtmp));
944 pline("%s
\82Í
\95R
\82Å
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82½
\81I", Monnam(mtmp));
945 /* tameness eventually drops to 1 here (never 0) */
946 if (mtmp->mtame && rn2(mtmp->mtame))
950 if (um_dist(mtmp->mx, mtmp->my, 5)) {
952 pline("%s leash snaps loose!", s_suffix(Monnam(mtmp)));
954 pline("%s
\82Ì
\95R
\82Í
\83p
\83`
\83\93\82Æ
\8aO
\82ê
\82½
\81I", Monnam(mtmp));
955 m_unleash(mtmp, FALSE);
958 You("pull on the leash.");
960 You("
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\81D");
961 if (mtmp->data->msound != MS_SILENT)
982 return ((ACURR(A_CHA) > 14)
983 ? ((poly_gender() == 1)
989 /*JP
\8cê
\8a²
\82Å
\8eg
\82¤ */
996 #define WEAK 3 /* from eat.c */
999 static const char look_str[] = "look %s.";
1001 static const char look_str[] = "%s
\8c©
\82¦
\82é
\81D";
1007 const char *mirror, *uvisage;
1011 boolean vis, invis_mirror, useeit, monable;
1013 if (!getdir((char *) 0))
1015 invis_mirror = Invis;
1016 useeit = !Blind && (!invis_mirror || See_invisible);
1017 uvisage = beautiful();
1018 mirror = simpleonames(obj); /* "mirror" or "looking glass" */
1019 if (obj->cursed && !rn2(2)) {
1022 pline_The("%s fogs up and doesn't reflect!", mirror);
1024 pline("%s
\82Í
\93Ü
\82è
\81C
\89f
\82ç
\82È
\82
\82È
\82Á
\82½
\81I", mirror);
1027 if (!u.dx && !u.dy && !u.dz) {
1030 You_cant("see your %s %s.", uvisage, body_part(FACE));
1032 You_cant("
\8e©
\95ª
\82Ì%s
\82¢%s
\82ð
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", uvisage, body_part(FACE));
1034 if (u.umonnum == PM_FLOATING_EYE) {
1037 You("stiffen momentarily under your gaze.");
1039 pline("
\88ê
\8fu
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82½
\81D");
1043 pline("Yow! The %s stares back!", mirror);
1045 pline("
\82¨
\82ì
\81I%s
\82ª
\82 \82È
\82½
\82ð
\82É
\82ç
\82Ý
\95Ô
\82µ
\82½
\81I", mirror);
1048 pline("Yikes! You've frozen yourself!");
1050 pline("
\82¨
\82ì
\81I
\82 \82È
\82½
\82Í
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I");
1051 if (!Hallucination || !rn2(4)) {
1052 nomul(-rnd(MAXULEV + 6 - u.ulevel));
1053 multi_reason = "gazing into a mirror";
1055 nomovemsg = 0; /* default, "you can move again" */
1057 } else if (youmonst.data->mlet == S_VAMPIRE)
1059 You("don't have a reflection.");
1061 You("
\8b¾
\82É
\89f
\82ç
\82È
\82©
\82Á
\82½
\81D");
1062 else if (u.umonnum == PM_UMBER_HULK) {
1064 pline("Huh? That doesn't look like you!");
1066 pline("
\82Ù
\82¦
\81H
\8eÊ
\82Á
\82Ä
\82é
\82Ì
\82Í
\82 \82È
\82½
\82¶
\82á
\82È
\82¢
\82Ý
\82½
\82¢
\82¾
\81I");
1067 make_confused(HConfusion + d(3, 4), FALSE);
1068 } else if (Hallucination)
1069 You(look_str, hcolor((char *) 0));
1072 You(look_str, "peaked");
1074 You(look_str, "
\8aç
\90F
\82ª
\88«
\82");
1075 else if (u.uhs >= WEAK)
1077 You(look_str, "undernourished");
1079 You(look_str, "
\89h
\97{
\8e¸
\92²
\82Ì
\82æ
\82¤
\82É");
1082 You("look as %s as ever.", uvisage);
1084 You("
\82 \82¢
\82©
\82í
\82ç
\82¸%s
\82
\8c©
\82¦
\82é
\81D", uvisage);
1090 You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)),
1091 mbodypart(u.ustuck, STOMACH));
1097 You(Hallucination ? "give the fish a chance to fix their makeup."
1098 : "reflect the murky water.");
1100 You(Hallucination ? "
\8b\9b\82É
\89»
\8fÏ
\92¼
\82µ
\82Ì
\8b@
\89ï
\82ð
\97^
\82¦
\82½
\81D"
1101 : "
\82 \82È
\82½
\82Í
\97\84\82ñ
\82¾
\90\85\82ð
\89f
\82µ
\82½
\81D");
1108 You("reflect the %s.",
1110 You("%s
\82ð
\89f
\82µ
\82½
\81D",
1111 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
1114 mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM,
1115 (int FDECL((*), (MONST_P, OBJ_P))) 0,
1116 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1117 if (!mtmp || !haseyes(mtmp->data) || notonhead)
1120 /* couldsee(mtmp->mx, mtmp->my) is implied by the fact that bhit()
1121 targetted it, so we can ignore possibility of X-ray vision */
1122 vis = canseemon(mtmp);
1123 /* ways to directly see monster (excludes X-ray vision, telepathy,
1124 extended detection, type-specific warning) */
1125 #define SEENMON (MONSEEN_NORMAL | MONSEEN_SEEINVIS | MONSEEN_INFRAVIS)
1126 how_seen = vis ? howmonseen(mtmp) : 0;
1127 /* whether monster is able to use its vision-based capabilities */
1128 monable = !mtmp->mcan && (!mtmp->minvis || perceives(mtmp->data));
1129 mlet = mtmp->data->mlet;
1130 if (mtmp->msleeping) {
1133 pline("%s is too tired to look at your %s.", Monnam(mtmp),
1135 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),
1137 } else if (!mtmp->mcansee) {
1140 pline("%s can't see anything right now.", Monnam(mtmp));
1142 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\89½
\82à
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", Monnam(mtmp));
1143 } else if (invis_mirror && !perceives(mtmp->data)) {
1146 pline("%s fails to notice your %s.", Monnam(mtmp), mirror);
1148 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8bC
\95t
\82©
\82È
\82©
\82Á
\82½
\81D", Monnam(mtmp), mirror);
1149 /* infravision doesn't produce an image in the mirror */
1150 } else if ((how_seen & SEENMON) == MONSEEN_INFRAVIS) {
1151 if (vis) /* (redundant) */
1153 pline("%s is too far away to see %sself in the dark.",
1154 Monnam(mtmp), mhim(mtmp));
1156 pline("%s
\82Í
\88Ã
\88Å
\82Å
\8e©
\95ª
\8e©
\90g
\82ð
\8c©
\82é
\82É
\82Í
\89\93\82·
\82¬
\82é
\81D", Monnam(mtmp));
1158 /* some monsters do special things */
1159 } else if (mlet == S_VAMPIRE || mlet == S_GHOST || is_vampshifter(mtmp)) {
1162 pline("%s doesn't have a reflection.", Monnam(mtmp));
1164 pline("%s
\82Í%s
\82É
\89f
\82ç
\82È
\82¢
\81D", Monnam(mtmp), mirror);
1165 } else if (monable && mtmp->data == &mons[PM_MEDUSA]) {
1167 if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!"))
1169 if (mon_reflects(mtmp, "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81I"))
1173 pline("%s is turned to stone!", Monnam(mtmp));
1175 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1178 } else if (monable && mtmp->data == &mons[PM_FLOATING_EYE]) {
1179 int tmp = d((int) mtmp->m_lev, (int) mtmp->data->mattk[0].damd);
1184 pline("%s is frozen by its reflection.", Monnam(mtmp));
1186 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
1189 You_hear("%s stop moving.", something);
1191 You_hear("
\89½
\82©
\82ª
\93®
\82«
\82ð
\82Æ
\82ß
\82½
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1192 paralyze_monst(mtmp, (int) mtmp->mfrozen + tmp);
1193 } else if (monable && mtmp->data == &mons[PM_UMBER_HULK]) {
1196 pline("%s confuses itself!", Monnam(mtmp));
1198 pline("%s
\82Í
\8d¬
\97\90\82µ
\82½
\81I", Monnam(mtmp));
1200 } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
1201 || mtmp->data == &mons[PM_INCUBUS])) {
1203 char buf[BUFSZ]; /* "She" or "He" */
1206 pline("%s admires %sself in your %s.", Monnam(mtmp), mhim(mtmp),
1209 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\82¤
\82Á
\82Æ
\82è
\82µ
\82½
\81D", Monnam(mtmp));
1212 pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
1214 pline("%s
\82Í
\82»
\82ê
\82ð
\92D
\82Á
\82½
\81I", upstart(strcpy(buf, mhe(mtmp))));
1217 pline("It steals your %s!", mirror);
1219 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\93\90\82ñ
\82¾
\81I", mirror);
1220 setnotworn(obj); /* in case mirror was wielded */
1222 (void) mpickobj(mtmp, obj);
1223 if (!tele_restrict(mtmp))
1224 (void) rloc(mtmp, TRUE);
1225 } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
1226 && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
1229 pline("%s is frightened by its reflection.", Monnam(mtmp));
1231 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\95|
\82ª
\82Á
\82½
\81D", Monnam(mtmp));
1232 monflee(mtmp, d(2, 4), FALSE, FALSE);
1233 } else if (!Blind) {
1234 if (mtmp->minvis && !See_invisible)
1236 else if ((mtmp->minvis && !perceives(mtmp->data))
1237 /* redundant: can't get here if these are true */
1238 || !haseyes(mtmp->data) || notonhead || !mtmp->mcansee)
1240 pline("%s doesn't seem to notice %s reflection.", Monnam(mtmp),
1243 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1247 pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp));
1249 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\96³
\8e\8b\82µ
\82½
\81D", Monnam(mtmp));
1258 register struct obj *obj = *optr;
1260 boolean wakem = FALSE, learno = FALSE,
1261 ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe),
1263 (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy)
1264 && !On_stairs(u.ux, u.uy));
1267 You("ring %s.", the(xname(obj)));
1269 You("%s
\82ð
\96Â
\82ç
\82µ
\82½
\81D", the(xname(obj)));
1271 if (Underwater || (u.uswallow && ordinary)) {
1273 amii_speaker(obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME);
1276 pline("But the sound is muffled.");
1278 pline("
\82µ
\82©
\82µ
\89¹
\82Í
\82©
\82«
\8fÁ
\82³
\82ê
\82½
\81D");
1280 } else if (invoking && ordinary) {
1281 /* needs to be recharged... */
1283 pline("But it makes no sound.");
1285 pline("
\82µ
\82©
\82µ
\81C
\89¹
\82Í
\96Â
\82ç
\82È
\82©
\82Á
\82½
\81D");
1286 learno = TRUE; /* help player figure out why */
1288 } else if (ordinary) {
1290 amii_speaker(obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME);
1292 if (obj->cursed && !rn2(4)
1293 /* note: once any of them are gone, we stop all of them */
1294 && !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE)
1295 && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE)
1296 && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE)
1297 && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT))
1300 You("summon %s!", a_monnam(mtmp));
1302 You("%s
\82ð
\8f¢
\8a«
\82µ
\82½
\81I", a_monnam(mtmp));
1303 if (!obj_resists(obj, 93, 100)) {
1305 pline("%s shattered!", Tobjnam(obj, "have"));
1307 pline("%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81I", xname(obj));
1315 mon_adjust_speed(mtmp, 2, (struct obj *) 0);
1317 case 2: /* no explanation; it just happens... */
1319 multi_reason = NULL;
1327 /* charged Bell of Opening */
1328 consume_obj_charge(obj, TRUE);
1334 pline1(nothing_happens);
1336 } else if (obj->cursed) {
1341 mkundead(&mm, FALSE, NO_MINVENT);
1344 } else if (invoking) {
1346 pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue"));
1348 pline("%s
\82Í
\95s
\8bC
\96¡
\82È
\89s
\82¢
\89¹
\82ð
\8fo
\82µ
\82½
\81D
\81D
\81D", xname(obj));
1350 amii_speaker(obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME);
1356 } else if (obj->blessed) {
1360 amii_speaker(obj, "ahahahDhEhCw", AMII_SOFT_VOLUME);
1365 } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1366 buried_ball_to_freedom();
1372 pline1(nothing_happens);
1376 pline("%s opens...", Something);
1378 pline("
\89½
\82©
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1383 pline("Things open around you...");
1385 pline("
\82Ü
\82í
\82è
\82Ì
\95¨
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1390 } else { /* uncursed */
1392 amii_speaker(obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME);
1397 pline1(nothing_happens);
1400 } /* charged BofO */
1403 makeknown(BELL_OF_OPENING);
1411 use_candelabrum(obj)
1412 register struct obj *obj;
1414 #if 0 /*JP*//* not used */
1415 const char *s = (obj->spe != 1) ? "candles" : "candle";
1420 You("snuff the %s.", s);
1422 You("
\82ë
\82¤
\82»
\82
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1423 end_burn(obj, TRUE);
1426 if (obj->spe <= 0) {
1428 pline("This %s has no %s.", xname(obj), s);
1430 pline("
\82±
\82Ì%s
\82É
\82Í
\82ë
\82¤
\82»
\82
\82ª
\82È
\82¢
\81D", xname(obj));
1435 You("cannot make fire under water.");
1437 You("
\90\85\92\86\82Å
\89Î
\82ð
\82¨
\82±
\82¹
\82È
\82¢
\81D");
1440 if (u.uswallow || obj->cursed) {
1443 pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"),
1446 pline("
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\82µ
\82Î
\82ç
\82
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D");
1452 There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s,
1455 pline("%s
\82É
\82Í
\82½
\82Á
\82½%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82µ
\82©
\82È
\82¢
\81D",
1456 xname(obj), obj->spe);
1460 pline("%s lit. %s dimly.", obj->spe == 1 ? "It is" : "They are",
1461 Tobjnam(obj, "shine"));
1463 pline("%s
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s
\82Í
\82Ù
\82Ì
\82©
\82É
\8bP
\82¢
\82½
\81D",
1464 xname(obj), xname(obj));
1468 pline("%s's %s burn%s", The(xname(obj)), s,
1469 (Blind ? "." : " brightly!"));
1471 pline("%s
\82Ì
\82ë
\82¤
\82»
\82
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I", The(xname(obj)),
1472 (Blind ? "" : "
\96¾
\82é
\82"));
1475 if (!invocation_pos(u.ux, u.uy) || On_stairs(u.ux, u.uy)) {
1477 pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
1479 pline("
\82ë
\82¤
\82»
\82
\82Í
\82·
\82²
\82¢
\91¬
\82³
\82Å
\94R
\82¦
\8en
\82ß
\82½
\81I");
1480 /* this used to be obj->age /= 2, rounding down; an age of
1481 1 would yield 0, confusing begin_burn() and producing an
1482 unlightable, unrefillable candelabrum; round up instead */
1483 obj->age = (obj->age + 1L) / 2L;
1485 if (obj->spe == 7) {
1488 pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
1490 pline("
\8aï
\96
\82È
\92g
\82©
\82³
\82ð%s
\82É
\8a´
\82¶
\82½
\81I", xname(obj));
1493 pline("%s with a strange light!", Tobjnam(obj, "glow"));
1495 pline("%s
\82Í
\8aï
\96
\82È
\8cõ
\82ð
\94
\82µ
\82Ä
\82¢
\82é
\81I", xname(obj));
1499 begin_burn(obj, FALSE);
1506 register struct obj *obj = *optr;
1507 register struct obj *otmp;
1509 const char *s = (obj->quan != 1) ? "candles" : "candle";
1511 const char *s = "
\82ë
\82¤
\82»
\82";
1512 char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
1519 otmp = carrying(CANDELABRUM_OF_INVOCATION);
1520 if (!otmp || otmp->spe == 7) {
1525 /* first, minimal candelabrum suffix for formatting candles */
1526 Sprintf(qsfx, " to\033%s?", thesimpleoname(otmp));
1527 /* next, format the candles as a prefix for the candelabrum */
1529 (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1531 (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1532 /* strip temporary candelabrum suffix */
1533 if ((q = strstri(qbuf, " to\033")) != 0)
1535 /* last, format final "attach candles to candelabrum?" query */
1536 if (yn(safe_qbuf(qbuf, qbuf, "?", otmp, yname, thesimpleoname, "it"))
1541 if ((long) otmp->spe + obj->quan > 7L) {
1542 obj = splitobj(obj, 7L - (long) otmp->spe);
1543 /* avoid a grammatical error if obj->quan gets
1544 reduced to 1 candle from more than one */
1545 s = (obj->quan != 1) ? "candles" : "candle";
1549 You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
1552 You("%ld
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ð%s%s
\82Ö
\8eæ
\82è
\82Â
\82¯
\82½
\81D",
1553 obj->quan, !otmp->spe ? "" : "
\82³
\82ç
\82É",
1556 if (!otmp->spe || otmp->age > obj->age)
1557 otmp->age = obj->age;
1558 otmp->spe += (int) obj->quan;
1559 if (otmp->lamplit && !obj->lamplit)
1561 pline_The("new %s magically %s!", s, vtense(s, "ignite"));
1563 pline("
\90V
\82µ
\82¢
\82ë
\82¤
\82»
\82
\82Í
\95s
\8ev
\8bc
\82È
\89\8a\82ð
\82 \82°
\82½
\81I");
1564 else if (!otmp->lamplit && obj->lamplit)
1566 pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
1568 pline("
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D");
1571 verbalize("You %s %s, you bought %s!",
1572 otmp->lamplit ? "burn" : "use",
1573 (obj->quan > 1L) ? "them" : "it",
1574 (obj->quan > 1L) ? "them" : "it");
1576 verbalize("
\89Î
\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1578 if (obj->quan < 7L && otmp->spe == 7)
1580 pline("%s now has seven%s candles attached.", The(xname(otmp)),
1581 otmp->lamplit ? " lit" : "");
1583 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",
1584 The(xname(otmp)), otmp->lamplit ? "
\89Î
\82Ì
\82Â
\82¢
\82½" : "");
1586 /* candelabrum's light range might increase */
1588 obj_merge_light_sources(otmp, otmp);
1589 /* candles are no longer a separate light source */
1591 end_burn(obj, TRUE);
1592 /* candles are now gone */
1597 /* call in drop, throw, and put in box, etc. */
1602 boolean candle = Is_candle(otmp);
1604 if ((candle || otmp->otyp == CANDELABRUM_OF_INVOCATION)
1608 #if 0 /*JP*//* not used */
1609 boolean many = candle ? (otmp->quan > 1L) : (otmp->spe > 1);
1612 (void) get_obj_location(otmp, &x, &y, 0);
1613 if (otmp->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1615 pline("%s%scandle%s flame%s extinguished.", Shk_Your(buf, otmp),
1616 (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"),
1617 (many ? "s are" : " is"));
1619 pline("%s%s
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, otmp),
1620 candle ? "" : "
\90C
\91ä
\82Ì");
1622 end_burn(otmp, TRUE);
1628 /* called when lit lamp is hit by water or put into a container or
1629 you've been swallowed by a monster; obj might be in transit while
1630 being thrown or dropped so don't assume that its location is valid */
1638 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1639 || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
1640 (void) get_obj_location(obj, &x, &y, 0);
1641 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1643 pline("%s %s out!", Yname2(obj), otense(obj, "go"));
1645 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", Yname2(obj));
1646 end_burn(obj, TRUE);
1649 if (snuff_candle(obj))
1655 /* Called when potentially lightable object is affected by fire_damage().
1656 Return TRUE if object was lit and FALSE otherwise --ALI */
1663 if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) {
1664 if ((obj->otyp == MAGIC_LAMP
1665 || obj->otyp == CANDELABRUM_OF_INVOCATION) && obj->spe == 0)
1667 else if (obj->otyp != MAGIC_LAMP && obj->age == 0)
1669 if (!get_obj_location(obj, &x, &y, 0))
1671 if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed)
1673 if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1674 || obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2))
1676 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1678 pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
1680 pline("%s
\82Ì
\96¾
\82©
\82è
\82ª
\82Â
\82¢
\82½
\81I", Yname2(obj));
1681 if (obj->otyp == POT_OIL)
1682 makeknown(obj->otyp);
1683 if (carried(obj) && obj->unpaid && costly_spot(u.ux, u.uy)) {
1684 /* if it catches while you have it, then it's your tough luck */
1687 verbalize("That's in addition to the cost of %s %s, of course.",
1688 yname(obj), obj->quan == 1L ? "itself" : "themselves");
1690 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ%s
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D", Yname2(obj));
1692 bill_dummy_object(obj);
1694 begin_burn(obj, FALSE);
1707 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1708 || obj->otyp == BRASS_LANTERN)
1709 pline("%slamp is now off.", Shk_Your(buf, obj));
1711 You("snuff out %s.", yname(obj));
1712 end_burn(obj, TRUE);
1717 pline(!Is_candle(obj) ? "This is not a diving lamp"
1718 : "Sorry, fire and water don't mix.");
1720 pline(!Is_candle(obj) ? "
\82±
\82ê
\82Í
\90ö
\90\85\97p
\82Ì
\83\89\83\93\83v
\82¶
\82á
\82È
\82¢
\81D"
1721 : "
\8ec
\94O
\82È
\82ª
\82ç
\81C
\89Î
\82Æ
\90\85\82Í
\82Ü
\82´
\82ç
\82È
\82¢
\81D");
1725 /* magic lamps with an spe == 0 (wished for) cannot be lit */
1726 if ((!Is_candle(obj) && obj->age == 0)
1727 || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
1728 if (obj->otyp == BRASS_LANTERN)
1730 Your("lamp has run out of power.");
1732 Your("
\83\89\83\93\83v
\82Ì
\93d
\97Í
\82ð
\8eg
\82¢
\90Ø
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1735 pline("This %s has no oil.", xname(obj));
1737 pline("
\82±
\82Ì%s
\82É
\82Í
\82à
\82¤
\83I
\83C
\83\8b\82ª
\82È
\82¢
\81D", xname(obj));
1740 if (obj->cursed && !rn2(2)) {
1743 pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"),
1744 otense(obj, "die"));
1746 pline("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D",
1750 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1751 || obj->otyp == BRASS_LANTERN) {
1754 pline("%slamp is now on.", Shk_Your(buf, obj));
1756 pline("%s
\83\89\83\93\83v
\82É
\93\94\82ª
\93\94\82Á
\82½
\81D", Shk_Your(buf, obj));
1757 } else { /* candle(s) */
1759 pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan),
1760 otense(obj, "burn"), Blind ? "." : " brightly!");
1762 pline("%s
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I",
1763 Yname2(obj), Blind ? "" : "
\96¾
\82é
\82");
1765 if (obj->unpaid && costly_spot(u.ux, u.uy)
1766 && obj->age == 20L * (long) objects[obj->otyp].oc_cost) {
1768 const char *ithem = (obj->quan > 1L) ? "them" : "it";
1770 verbalize("You burn %s, you bought %s!", ithem, ithem);
1772 verbalize("
\93\94\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1774 bill_dummy_object(obj);
1777 begin_burn(obj, FALSE);
1783 struct obj *obj; /* obj is a potion of oil */
1795 You("snuff the lit potion.");
1797 You("
\96û
\95r
\82Ì
\89Î
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1798 end_burn(obj, TRUE);
1800 * Free & add to re-merge potion. This will average the
1801 * age of the potions. Not exactly the best solution,
1807 } else if (Underwater) {
1809 There("is not enough oxygen to sustain a fire.");
1811 pline("
\89Î
\82ð
\82Â
\82¯
\82é
\82Ì
\82É
\8f\
\95ª
\82È
\8e_
\91f
\82ª
\82È
\82¢
\81D");
1815 split1off = (obj->quan > 1L);
1817 obj = splitobj(obj, 1L);
1820 You("light %spotion.%s", shk_your(buf, obj),
1821 Blind ? "" : " It gives off a dim light.");
1823 You("%s
\96û
\95r
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s", shk_your(buf, obj),
1824 Blind ? "" : "
\96û
\95r
\82Í
\88Ã
\82¢
\8cõ
\82ð
\82Í
\82È
\82Á
\82½
\81D");
1827 if (obj->unpaid && costly_spot(u.ux, u.uy)) {
1828 /* Normally, we shouldn't both partially and fully charge
1829 * for an item, but (Yendorian Fuel) Taxes are inevitable...
1833 verbalize("That's in addition to the cost of the potion, of course.");
1835 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ
\96û
\95r
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D");
1836 bill_dummy_object(obj);
1838 makeknown(obj->otyp);
1840 begin_burn(obj, FALSE); /* after shop billing */
1842 obj_extract_self(obj); /* free from inv */
1845 obj = hold_another_object(obj, "You drop %s!", doname(obj),
1847 obj = hold_another_object(obj, "
\82 \82È
\82½
\82Í%s
\82ð
\97\8e\82µ
\82½
\81I", doname(obj),
1854 static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 };
1859 struct obj *obj = getobj(cuddly, "rub");
1861 if (obj && obj->oclass == GEM_CLASS) {
1862 if (is_graystone(obj)) {
1867 pline("Sorry, I don't know how to use that.");
1869 pline("
\8ec
\94O
\81D
\8eg
\82¢
\95û
\82ª
\82í
\82©
\82ç
\82È
\82¢
\81D");
1874 if (!obj || !wield_tool(obj, "rub"))
1877 /* now uwep is obj */
1878 if (uwep->otyp == MAGIC_LAMP) {
1879 if (uwep->spe > 0 && !rn2(3)) {
1880 check_unpaid_usage(uwep, TRUE); /* unusual item use */
1881 /* bones preparation: perform the lamp transformation
1882 before releasing the djinni in case the latter turns out
1883 to be fatal (a hostile djinni has no chance to attack yet,
1884 but an indebted one who grants a wish might bestow an
1885 artifact which blasts the hero with lethal results) */
1886 uwep->otyp = OIL_LAMP;
1887 uwep->spe = 0; /* for safety */
1888 uwep->age = rn1(500, 1000);
1890 begin_burn(uwep, TRUE);
1891 djinni_from_bottle(uwep);
1892 makeknown(MAGIC_LAMP);
1894 } else if (rn2(2)) {
1896 You("%s smoke.", !Blind ? "see a puff of" : "smell");
1898 pline("
\82¯
\82Þ
\82è%s
\81D", !Blind ? "
\82ª
\95\91\82¢
\82 \82ª
\82Á
\82½" : "
\82Ì
\93õ
\82¢
\82ª
\82µ
\82½");
1900 pline1(nothing_happens);
1901 } else if (obj->otyp == BRASS_LANTERN) {
1902 /* message from Adventure */
1904 pline("Rubbing the electric lamp is not particularly rewarding.");
1906 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");
1908 pline("Anyway, nothing exciting happens.");
1910 pline("
\82â
\82Á
\82Ï
\82è
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
1912 pline1(nothing_happens);
1924 is_valid_jump_pos(x, y, magic, showmsg)
1928 if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(x, y) != 5) {
1929 /* The Knight jumping restriction still applies when riding a
1930 * horse. After all, what shape is the knight piece in chess?
1934 pline("Illegal move!");
1936 pline("
\82»
\82Ì
\88Ú
\93®
\82Í
\8cj
\94n
\92µ
\82Ñ
\82¶
\82á
\82È
\82¢
\81I");
1938 } else if (distu(x, y) > (magic ? 6 + magic * 3 : 9)) {
1943 pline("
\89\93\82·
\82¬
\82é
\81I");
1945 } else if (!cansee(x, y)) {
1948 You("cannot see where to land!");
1950 You("
\92\85\92n
\93_
\82ª
\8c©
\82¦
\82È
\82¢
\81I");
1952 } else if (!isok(x, y)) {
1955 You("cannot jump there!");
1957 You("
\82»
\82±
\82É
\82Í
\94ò
\82×
\82È
\82¢
\81I");
1963 static int jumping_is_magic;
1966 display_jump_positions(state)
1970 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
1971 } else if (state == 1) {
1974 for (dx = -4; dx <= 4; dx++)
1975 for (dy = -4; dy <= 4; dy++) {
1976 x = dx + (int) u.ux;
1977 y = dy + (int) u.uy;
1978 if (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
1979 && is_valid_jump_pos(x, y, jumping_is_magic, FALSE))
1983 tmp_at(DISP_END, 0);
1989 int magic; /* 0=Physical, otherwise skill level */
1993 if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
1994 /* normally (nolimbs || slithy) implies !Jumping,
1995 but that isn't necessarily the case for knights */
1997 You_cant("jump; you have no legs!");
1999 pline("
\91«
\82ª
\96³
\82
\82Ä
\82Í
\92µ
\82×
\82È
\82¢
\81I");
2001 } else if (!magic && !Jumping) {
2003 You_cant("jump very far.");
2005 You_cant("
\82»
\82ñ
\82È
\89\93\82
\82Ü
\82Å
\92µ
\82×
\82È
\82¢
\81D");
2007 /* if steed is immobile, can't do physical jump but can do spell one */
2008 } else if (!magic && u.usteed && stucksteed(FALSE)) {
2009 /* stucksteed gave "<steed> won't move" message */
2011 } else if (u.uswallow) {
2014 You("bounce around a little.");
2016 pline("
\94½
\93®
\82ð
\82Â
\82¯
\82½
\81D");
2020 pline("You've got to be kidding!");
2022 pline("
\8fç
\92k
\82Í
\82æ
\82µ
\82±
\82³
\82ñ
\81I");
2024 } else if (u.uinwater) {
2027 You("swish around a little.");
2029 pline("
\83X
\83C
\83X
\83C
\82Æ
\89j
\82¢
\82¾
\81D");
2033 pline("This calls for swimming, not jumping!");
2035 pline("
\82»
\82ê
\82Í
\81w
\89j
\82®
\81x
\82Å
\82 \82Á
\82Ä
\81C
\81w
\92µ
\82Ô
\81x
\82¶
\82á
\82È
\82¢
\81I");
2037 } else if (u.ustuck) {
2038 if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
2040 You("pull free from %s.", mon_nam(u.ustuck));
2042 You("%s
\82©
\82ç
\97£
\82ê
\82½
\81D", mon_nam(u.ustuck));
2048 You("writhe a little in the grasp of %s!", mon_nam(u.ustuck));
2050 You("%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\83W
\83^
\83o
\83^
\82µ
\82½
\81I", mon_nam(u.ustuck));
2054 You("cannot escape from %s!", mon_nam(u.ustuck));
2056 You("%s
\82©
\82ç
\93¦
\82ê
\82ç
\82ê
\82È
\82¢
\81I", mon_nam(u.ustuck));
2058 } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
2061 You("flail around a little.");
2063 You("
\83o
\83^
\83o
\83^
\92µ
\82ñ
\82¾
\81D");
2067 You("don't have enough traction to jump.");
2069 You("
\92µ
\82Ô
\82½
\82ß
\82Ì
\94½
\93®
\82ª
\82Â
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
2071 } else if (!magic && near_capacity() > UNENCUMBERED) {
2073 You("are carrying too much to jump!");
2075 You("
\82½
\82
\82³
\82ñ
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\92µ
\82×
\82È
\82¢
\81I");
2077 } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
2079 You("lack the strength to jump!");
2081 You("
\92µ
\82Ô
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I");
2083 } else if (!magic && Wounded_legs) {
2084 long wl = (Wounded_legs & BOTH_SIDES);
2085 const char *bp = body_part(LEG);
2087 if (wl == BOTH_SIDES)
2088 bp = makeplural(bp);
2091 pline("%s is in no shape for jumping.", Monnam(u.usteed));
2093 pline("%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D", Monnam(u.usteed));
2096 Your("%s%s %s in no shape for jumping.",
2097 (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right "
2099 bp, (wl == BOTH_SIDES) ? "are" : "is");
2101 Your("%s%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D",
2102 (wl == LEFT_SIDE) ? "
\8d¶" :
2103 (wl == RIGHT_SIDE) ? "
\89E" : "", bp);
2106 } else if (u.usteed && u.utrap) {
2108 pline("%s is stuck in a trap.", Monnam(u.usteed));
2110 pline("%s
\82Íã©
\82É
\82Ð
\82Á
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", Monnam(u.usteed));
2115 pline("Where do you want to jump?");
2117 pline("
\82Ç
\82±
\82É
\92µ
\82Ñ
\82Ü
\82·
\82©
\81H");
2120 jumping_is_magic = magic;
2121 getpos_sethilite(display_jump_positions);
2123 if (getpos(&cc, TRUE, "the desired position") < 0)
2125 if (getpos(&cc, TRUE, "
\92µ
\82Ñ
\82½
\82¢
\8fê
\8f\8a") < 0)
2126 return 0; /* user pressed ESC */
2127 if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
2134 switch (u.utraptype) {
2136 long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
2139 You("rip yourself free of the bear trap! Ouch!");
2141 You("
\8e©
\95ª
\82ð
\8cF
\82Ìã©
\82©
\82ç
\82Ð
\82«
\82Í
\82ª
\82µ
\82½
\81C
\82¢
\82Ä
\82Á
\81I");
2143 losehp(Maybe_Half_Phys(rnd(10)), "jumping out of a bear trap",
2145 losehp(Maybe_Half_Phys(rnd(10)), "
\8cF
\82Ìã©
\82©
\82ç
\94ò
\82Ñ
\8fo
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2147 set_wounded_legs(side, rn1(1000, 500));
2152 You("leap from the pit!");
2154 You("
\97\8e\82µ
\8c\8a\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2158 You("tear the web apart as you pull yourself free!");
2160 You("
\82
\82à
\82Ì
\91\83\82ð
\88ø
\82«
\97ô
\82«
\81C
\8e©
\97R
\82É
\82È
\82Á
\82½
\81I");
2161 deltrap(t_at(u.ux, u.uy));
2165 You("pull yourself above the lava!");
2167 You("
\97n
\8aâ
\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2173 You("strain your %s, but you're still %s.",
2174 makeplural(body_part(LEG)),
2175 (u.utraptype == TT_INFLOOR)
2176 ? "stuck in the floor"
2177 : "attached to the buried ball");
2179 You("%s
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\82ª
\81C
\82 \82È
\82½
\82Í
\82Ü
\82¾%s
\81D",
2180 makeplural(body_part(LEG)),
2181 (u.utraptype == TT_INFLOOR)
2182 ? "
\8f°
\82É
\82¤
\82Ü
\82Á
\82Ä
\82¢
\82é"
2183 : "
\82¤
\82Ü
\82Á
\82½
\8b\85\82Æ
\82Â
\82È
\82ª
\82Á
\82Ä
\82¢
\82é");
2185 set_wounded_legs(LEFT_SIDE, rn1(10, 11));
2186 set_wounded_legs(RIGHT_SIDE, rn1(10, 11));
2191 * Check the path from uc to cc, calling hurtle_step at each
2192 * location. The final position actually reached will be
2197 /* calculate max(abs(dx), abs(dy)) as the range */
2198 range = cc.x - uc.x;
2206 (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t) &range);
2207 teleds(cc.x, cc.y, TRUE);
2210 multi_reason = "jumping around";
2212 morehungry(rnd(25));
2223 if (!mons[corpse->corpsenm].cnutrit)
2229 use_tinning_kit(obj)
2232 struct obj *corpse, *can;
2234 /* This takes only 1 move. If this is to be changed to take many
2235 * moves, we've got to deal with decaying corpses...
2237 if (obj->spe <= 0) {
2239 You("seem to be out of tins.");
2241 pline("
\8aÊ
\8bl
\82ð
\8dì
\82é
\82½
\82ß
\82Ì
\8aÊ
\82ª
\90Ø
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
2244 if (!(corpse = floorfood("tin", 2)))
2246 if (corpse->oeaten) {
2248 You("cannot tin %s which is partly eaten.", something);
2250 You("
\90H
\82×
\82©
\82¯
\82Ì
\82à
\82Ì
\82ð
\8aÊ
\8bl
\82É
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2253 if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance
2257 if (poly_when_stoned(youmonst.data))
2259 You("tin %s without wearing gloves.",
2260 an(mons[corpse->corpsenm].mname));
2262 You("
\8f¬
\8eè
\82È
\82µ
\82Å%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
2263 mons[corpse->corpsenm].mname);
2267 pline("Tinning %s without wearing gloves is a fatal mistake...",
2268 an(mons[corpse->corpsenm].mname));
2270 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",
2271 mons[corpse->corpsenm].mname);
2274 Sprintf(kbuf, "trying to tin %s without gloves",
2275 an(mons[corpse->corpsenm].mname));
2277 Sprintf(kbuf, "
\8f¬
\8eè
\82ð
\82Â
\82¯
\82¸
\82É%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2278 mons[corpse->corpsenm].mname);
2283 if (is_rider(&mons[corpse->corpsenm])) {
2284 if (revive_corpse(corpse))
2286 verbalize("Yes... But War does not preserve its enemies...");
2288 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");
2291 pline_The("corpse evades your grasp.");
2293 pline("
\8e\80\91Ì
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82ð
\93¦
\82ê
\82½
\81D");
2296 if (mons[corpse->corpsenm].cnutrit == 0) {
2298 pline("That's too insubstantial to tin.");
2300 pline("
\8eÀ
\91Ì
\82ª
\82È
\82¢
\82Ì
\82Å
\8aÊ
\8bl
\82É
\82Å
\82«
\82È
\82¢
\81D");
2303 consume_obj_charge(obj, TRUE);
2305 if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
2307 static const char you_buy_it[] = "You tin it, you bought it!";
2309 static const char you_buy_it[] = "
\8aÊ
\8bl
\82É
\82µ
\82½
\82Ì
\82È
\82ç
\94\83\82Á
\82Ä
\82à
\82ç
\82¤
\82æ
\81I";
2311 can->corpsenm = corpse->corpsenm;
2312 can->cursed = obj->cursed;
2313 can->blessed = obj->blessed;
2314 can->owt = weight(can);
2316 /* Mark tinned tins. No spinach allowed... */
2317 set_tin_variety(can, HOMEMADE_TIN);
2318 if (carried(corpse)) {
2320 verbalize(you_buy_it);
2323 if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
2324 verbalize(you_buy_it);
2328 can = hold_another_object(can, "You make, but cannot pick up, %s.",
2330 can = 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",
2331 doname(can), (const char *) 0);
2333 impossible("Tinning failed.");
2337 use_unicorn_horn(obj)
2340 #define PROP_COUNT 7 /* number of properties we're dealing with */
2341 #define ATTR_COUNT (A_MAX * 3) /* number of attribute points we might fix */
2342 int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop,
2344 int trouble_list[PROP_COUNT + ATTR_COUNT];
2346 if (obj && obj->cursed) {
2347 long lcount = (long) rn1(90, 10);
2349 switch (rn2(13) / 2) { /* case 6 is half as likely as the others */
2351 make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L
2352 : (long) rn1(ACURR(A_CON), 20),
2353 xname(obj), TRUE, SICK_NONVOMITABLE);
2356 make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
2361 You("suddenly feel %s.",
2362 Hallucination ? "trippy" : "confused");
2364 You("
\93Ë
\91R%s
\81D",
2365 Hallucination ? "
\82Ö
\82ë
\82Ö
\82ë
\82É
\82È
\82Á
\82½" : "
\8d¬
\97\90\82µ
\82½");
2367 make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
2370 make_stunned((HStun & TIMEOUT) + lcount, TRUE);
2373 (void) adjattrib(rn2(A_MAX), -1, FALSE);
2376 (void) make_hallucinated((HHallucination & TIMEOUT) + lcount,
2380 if (Deaf) /* make_deaf() won't give feedback when already deaf */
2382 pline("Nothing seems to happen.");
2384 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2385 make_deaf((HDeaf & TIMEOUT) + lcount, TRUE);
2392 * Entries in the trouble list use a very simple encoding scheme.
2394 #define prop2trbl(X) ((X) + A_MAX)
2395 #define attr2trbl(Y) (Y)
2396 #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
2397 #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
2398 #define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
2400 trouble_count = unfixable_trbl = did_prop = did_attr = 0;
2402 /* collect property troubles */
2403 if (TimedTrouble(Sick))
2405 if (TimedTrouble(Blinded) > (long) u.ucreamed
2407 && attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
2408 prop_trouble(BLINDED);
2409 if (TimedTrouble(HHallucination))
2410 prop_trouble(HALLUC);
2411 if (TimedTrouble(Vomiting))
2412 prop_trouble(VOMITING);
2413 if (TimedTrouble(HConfusion))
2414 prop_trouble(CONFUSION);
2415 if (TimedTrouble(HStun))
2416 prop_trouble(STUNNED);
2417 if (TimedTrouble(HDeaf))
2420 unfixable_trbl = unfixable_trouble_count(TRUE);
2422 /* collect attribute troubles */
2423 for (idx = 0; idx < A_MAX; idx++) {
2424 if (ABASE(idx) >= AMAX(idx))
2426 val_limit = AMAX(idx);
2427 /* don't recover strength lost from hunger */
2428 if (idx == A_STR && u.uhs >= WEAK)
2431 /* potion/spell of restore ability override sustain ability
2432 intrinsic but unicorn horn usage doesn't */
2433 unfixable_trbl += val_limit - ABASE(idx);
2436 /* don't recover more than 3 points worth of any attribute */
2437 if (val_limit > ABASE(idx) + 3)
2438 val_limit = ABASE(idx) + 3;
2440 for (val = ABASE(idx); val < val_limit; val++)
2442 /* keep track of unfixed trouble, for message adjustment below */
2443 unfixable_trbl += (AMAX(idx) - val_limit);
2446 if (trouble_count == 0) {
2447 pline1(nothing_happens);
2449 } else if (trouble_count > 1) { /* shuffle */
2452 for (i = trouble_count - 1; i > 0; i--)
2453 if ((j = rn2(i + 1)) != i) {
2454 k = trouble_list[j];
2455 trouble_list[j] = trouble_list[i];
2456 trouble_list[i] = k;
2461 * Chances for number of troubles to be fixed
2463 * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8%
2464 * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0
2466 val_limit = rn2(d(2, (obj && obj->blessed) ? 4 : 2));
2467 if (val_limit > trouble_count)
2468 val_limit = trouble_count;
2470 /* fix [some of] the troubles */
2471 for (val = 0; val < val_limit; val++) {
2472 idx = trouble_list[val];
2475 case prop2trbl(SICK):
2476 make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2479 case prop2trbl(BLINDED):
2480 make_blinded((long) u.ucreamed, TRUE);
2483 case prop2trbl(HALLUC):
2484 (void) make_hallucinated(0L, TRUE, 0L);
2487 case prop2trbl(VOMITING):
2488 make_vomiting(0L, TRUE);
2491 case prop2trbl(CONFUSION):
2492 make_confused(0L, TRUE);
2495 case prop2trbl(STUNNED):
2496 make_stunned(0L, TRUE);
2499 case prop2trbl(DEAF):
2500 make_deaf(0L, TRUE);
2504 if (idx >= 0 && idx < A_MAX) {
2508 panic("use_unicorn_horn: bad trouble? (%d)", idx);
2515 pline("This makes you feel %s!",
2516 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2520 pline("
\8bC
\95ª
\82ª%s
\82æ
\82
\82È
\82Á
\82½
\81I",
2521 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2527 pline("Nothing seems to happen.");
2529 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2531 context.botl = (did_attr || did_prop);
2542 * Timer callback routine: turn figurine into monster
2545 fig_transform(arg, timeout)
2549 struct obj *figurine = arg->a_obj;
2552 boolean cansee_spot, silent, okay_spot;
2553 boolean redraw = FALSE;
2554 boolean suppress_see = FALSE;
2555 char monnambuf[BUFSZ], carriedby[BUFSZ];
2558 debugpline0("null figurine in fig_transform()");
2561 silent = (timeout != monstermoves); /* happened while away */
2562 okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0);
2563 if (figurine->where == OBJ_INVENT || figurine->where == OBJ_MINVENT)
2564 okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]);
2565 if (!okay_spot || !figurine_location_checks(figurine, &cc, TRUE)) {
2566 /* reset the timer to try again later */
2567 (void) start_timer((long) rnd(5000), TIMER_OBJECT, FIG_TRANSFORM,
2568 obj_to_any(figurine));
2572 cansee_spot = cansee(cc.x, cc.y);
2573 mtmp = make_familiar(figurine, cc.x, cc.y, TRUE);
2575 char and_vanish[BUFSZ];
2576 struct obj *mshelter = level.objects[mtmp->mx][mtmp->my];
2577 Sprintf(monnambuf, "%s", an(m_monnam(mtmp)));
2579 and_vanish[0] = '\0';
2580 if ((mtmp->minvis && !See_invisible)
2581 || (mtmp->data->mlet == S_MIMIC
2582 && mtmp->m_ap_type != M_AP_NOTHING))
2583 suppress_see = TRUE;
2585 if (mtmp->mundetected) {
2586 if (hides_under(mtmp->data) && mshelter) {
2587 Sprintf(and_vanish, " and %s under %s",
2588 locomotion(mtmp->data, "crawl"), doname(mshelter));
2589 } else if (mtmp->data->mlet == S_MIMIC
2590 || mtmp->data->mlet == S_EEL) {
2591 suppress_see = TRUE;
2593 Strcpy(and_vanish, " and vanish");
2596 switch (figurine->where) {
2598 if (Blind || suppress_see)
2600 You_feel("%s %s from your pack!", something,
2601 locomotion(mtmp->data, "drop"));
2603 You_feel("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82æ
\82¤
\82¾
\81I", something,
2604 jpast(locomotion(mtmp->data, "
\97\8e\82¿
\82é")));
2608 You_see("%s %s out of your pack%s!", monnambuf,
2609 locomotion(mtmp->data, "drop"), and_vanish);
2611 You("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2612 jpast(locomotion(mtmp->data,"
\97\8e\82¿
\82é")));
2617 if (cansee_spot && !silent) {
2619 pline("%s suddenly vanishes!", an(xname(figurine)));
2622 You_see("a figurine transform into %s%s!", monnambuf,
2625 You("
\90l
\8c`
\82ª
\93Ë
\91R%s
\82É
\82È
\82Á
\82½
\82Ì
\82ð
\8c©
\82½
\81I",
2628 redraw = TRUE; /* update figurine's map location */
2633 if (cansee_spot && !silent && !suppress_see) {
2635 mon = figurine->ocarry;
2636 /* figurine carrying monster might be invisible */
2637 if (canseemon(figurine->ocarry)) {
2639 Sprintf(carriedby, "%s pack", s_suffix(a_monnam(mon)));
2641 Sprintf(carriedby, "%s
\82Ì
\8a\93", s_suffix(a_monnam(mon)));
2642 } else if (is_pool(mon->mx, mon->my))
2644 Strcpy(carriedby, "empty water");
2646 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\90\85\92\86");
2649 Strcpy(carriedby, "thin air");
2651 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\8bó
\92\86");
2653 You_see("%s %s out of %s%s!", monnambuf,
2654 locomotion(mtmp->data, "drop"), carriedby,
2657 You("%s
\82ª%s
\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2658 carriedby, locomotion(mtmp->data, "
\97\8e\82¿
\82é"));
2668 impossible("figurine came to life where? (%d)",
2669 (int) figurine->where);
2673 /* free figurine now */
2674 if (carried(figurine)) {
2677 obj_extract_self(figurine);
2678 obfree(figurine, (struct obj *) 0);
2685 figurine_location_checks(obj, cc, quietly)
2692 if (carried(obj) && u.uswallow) {
2695 You("don't have enough room in here.");
2697 pline("
\82±
\82±
\82É
\82Í
\8f\
\95ª
\82È
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
2700 x = cc ? cc->x : u.ux;
2701 y = cc ? cc->y : u.uy;
2705 You("cannot put the figurine there.");
2707 You("
\82±
\82±
\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81D");
2710 if (IS_ROCK(levl[x][y].typ)
2711 && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x, y))) {
2714 You("cannot place a figurine in %s!",
2715 IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock");
2717 You("%s
\82Ì
\92\86\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81I",
2718 IS_TREE(levl[x][y].typ) ? "
\96Ø" : "
\8cÅ
\82¢
\90Î");
2722 if (sobj_at(BOULDER, x, y) && !passes_walls(&mons[obj->corpsenm])
2723 && !throws_rocks(&mons[obj->corpsenm])) {
2726 You("cannot fit the figurine on the boulder.");
2728 You("
\8aâ
\82É
\90l
\8c`
\82ð
\89\9f\82µ
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2738 register struct obj *obj = *optr;
2743 /* can't activate a figurine while swallowed */
2744 if (!figurine_location_checks(obj, (coord *) 0, FALSE))
2747 if (!getdir((char *) 0)) {
2748 context.move = multi = 0;
2755 /* Passing FALSE arg here will result in messages displayed */
2756 if (!figurine_location_checks(obj, &cc, FALSE))
2759 You("%s and it transforms.",
2760 (u.dx || u.dy) ? "set the figurine beside you"
2761 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
2762 || is_pool(cc.x, cc.y))
2763 ? "release the figurine"
2764 : (u.dz < 0 ? "toss the figurine into the air"
2765 : "set the figurine on the ground"));
2767 You("%s
\81D
\82·
\82é
\82Æ
\82»
\82ê
\82Í
\95Ï
\8c`
\82µ
\82½
\81D",
2768 (u.dx || u.dy) ? "
\82»
\82Î
\82É
\90l
\8c`
\82ð
\92u
\82¢
\82½"
2769 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
2770 || is_pool(cc.x, cc.y))
2771 ? "
\90l
\8c`
\82ð
\95ú
\82Á
\82½"
2772 : (u.dz < 0 ? "
\90l
\8c`
\82ð
\8bó
\92\86\82É
\93\8a\82°
\82½"
2773 : "
\90l
\8c`
\82ð
\92n
\96Ê
\82É
\92u
\82¢
\82½"));
2775 (void) make_familiar(obj, cc.x, cc.y, FALSE);
2776 (void) stop_timer(FIG_TRANSFORM, obj_to_any(obj));
2781 static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 };
2791 pline("%s from your %s.", Tobjnam(obj, "slip"),
2792 makeplural(body_part(FINGER)));
2794 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
2802 if ((obj->cursed || Fumbling) && !rn2(2)) {
2803 consume_obj_charge(obj, TRUE);
2806 pline("%s from your %s.", Tobjnam(obj, "slip"),
2807 makeplural(body_part(FINGER)));
2809 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
2815 otmp = getobj(lubricables, "grease");
2818 if (inaccessible_equipment(otmp, "grease", FALSE))
2820 consume_obj_charge(obj, TRUE);
2822 if (otmp != &zeroobj) {
2824 You("cover %s with a thick layer of grease.", yname(otmp));
2826 You("%s
\82É
\8e\89\82ð
\92O
\94O
\82É
\93h
\82Á
\82½
\81D", yname(otmp));
2828 if (obj->cursed && !nohands(youmonst.data)) {
2829 incr_itimeout(&Glib, rnd(15));
2831 pline("Some of the grease gets all over your %s.",
2833 pline("
\8e\89\82ª
\8f
\82µ%s
\82É
\82Â
\82¢
\82½
\81D",
2834 makeplural(body_part(HAND)));
2837 incr_itimeout(&Glib, rnd(15));
2839 You("coat your %s with grease.", makeplural(body_part(FINGER)));
2841 You("%s
\82É
\8e\89\82ð
\93h
\82Á
\82½
\81D", makeplural(body_part(FINGER)));
2846 pline("%s empty.", Tobjnam(obj, "are"));
2848 pline("%s
\82Í
\8bó
\82Á
\82Û
\82¾
\81D", xname(obj));
2851 pline("%s to be empty.", Tobjnam(obj, "seem"));
2853 pline("%s
\82Í
\8bó
\82Á
\82Û
\82Ì
\82æ
\82¤
\82¾
\81D", xname(obj));
2858 static struct trapinfo {
2862 boolean force_bungle;
2869 trapinfo.force_bungle = 0;
2872 /* touchstones - by Ken Arnold */
2879 const char *streak_color, *choices;
2880 char stonebuf[QBUFSZ];
2882 static const char scritch[] = "\"scritch, scritch\"";
2884 static const char scritch[] = "
\81u
\83S
\83V
\81C
\83S
\83V
\81v";
2885 static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 };
2886 static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 };
2888 /* in case it was acquired while blinded */
2891 /* when the touchstone is fully known, don't bother listing extra
2892 junk as likely candidates for rubbing */
2893 choices = (tstone->otyp == TOUCHSTONE && tstone->dknown
2894 && objects[TOUCHSTONE].oc_name_known)
2898 Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan));
2900 Sprintf(stonebuf, "rub on the stone");
2901 if ((obj = getobj(choices, stonebuf)) == 0)
2904 if (obj == tstone && obj->quan == 1L) {
2906 You_cant("rub %s on itself.", the(xname(obj)));
2908 You("%s
\82ð
\82»
\82ê
\8e©
\91Ì
\82Å
\82±
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", the(xname(obj)));
2912 if (tstone->otyp == TOUCHSTONE && tstone->cursed
2913 && obj->oclass == GEM_CLASS && !is_graystone(obj)
2914 && !obj_resists(obj, 80, 100)) {
2917 pline("You feel something shatter.");
2919 You("
\89½
\82©
\82ª
\95²
\81X
\82É
\82È
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81D");
2920 else if (Hallucination)
2922 pline("Oh, wow, look at the pretty shards.");
2924 pline("
\83\8f\81[
\83H
\81I
\82È
\82ñ
\82Ä
\82«
\82ê
\82¢
\82È
\94j
\95Ð
\82È
\82ñ
\82¾
\81D");
2927 pline("A sharp crack shatters %s%s.",
2928 (obj->quan > 1L) ? "one of " : "", the(xname(obj)));
2930 pline("
\8b
\82
\82±
\82·
\82è
\82·
\82¬
\82Ä%s%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
2931 the(xname(obj)), (obj->quan > 1) ? "
\82Ì
\82Ð
\82Æ
\82Â" : "");
2940 } else if (Hallucination) {
2942 pline("Oh wow, man: Fractals!");
2944 pline("
\83\8f\81[
\83H
\81I
\83t
\83\89\83N
\83^
\83\8b\96Í
\97l
\82¾
\81I");
2952 switch (obj->oclass) {
2953 case GEM_CLASS: /* these have class-specific handling below */
2955 if (tstone->otyp != TOUCHSTONE) {
2957 } else if (obj->oclass == GEM_CLASS
2959 || (!tstone->cursed && (Role_if(PM_ARCHEOLOGIST)
2960 || Race_if(PM_GNOME))))) {
2961 makeknown(TOUCHSTONE);
2962 makeknown(obj->otyp);
2963 prinv((char *) 0, obj, 0L);
2966 /* either a ring or the touchstone was not effective */
2967 if (objects[obj->otyp].oc_material == GLASS) {
2972 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
2973 break; /* gem or ring */
2976 switch (objects[obj->otyp].oc_material) {
2979 pline("%s a little more polished now.", Tobjnam(tstone, "look"));
2981 pline("%s
\82Í
\82³
\82ç
\82É
\82Â
\82â
\82ª
\8fo
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D", xname(tstone));
2985 if (!obj->known) /* note: not "whetstone" */
2987 You("must think this is a wetstone, do you?");
2989 You("
\82±
\82ê
\82Í
\93u
\90Î
\82¾
\82Æ
\8ev
\82Á
\82½
\81H");
2993 pline("%s a little wetter now.", Tobjnam(tstone, "are"));
2995 pline("%s
\82Í
\8f
\82µ
\82Ê
\82ê
\82½
\81D", xname(tstone));
3000 streak_color = "waxy";
3002 streak_color = "
\8e\89\82Á
\82Û
\82¢";
3004 break; /* okay even if not touchstone */
3007 streak_color = "wooden";
3009 streak_color = "
\82¨
\82ª
\82
\82¸
\82Ì
\82æ
\82¤
\82È";
3011 break; /* okay even if not touchstone */
3013 do_scratch = TRUE; /* scratching and streaks */
3015 streak_color = "golden";
3017 streak_color = "
\8bà
\90F
\82Ì";
3021 do_scratch = TRUE; /* scratching and streaks */
3023 streak_color = "silvery";
3025 streak_color = "
\8bâ
\90F
\82Ì";
3029 /* Objects passing the is_flimsy() test will not
3030 scratch a stone. They will leave streaks on
3031 non-touchstones and touchstones alike. */
3033 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3035 do_scratch = (tstone->otyp != TOUCHSTONE);
3038 break; /* default oclass */
3041 #if 0 /*JP*//* not used */
3042 Sprintf(stonebuf, "stone%s", plur(tstone->quan));
3046 You("make %s%sscratch marks on the %s.",
3047 streak_color ? streak_color : (const char *) "",
3048 streak_color ? " " : "", stonebuf);
3050 You("%s
\82±
\82·
\82è
\90Õ
\82ð
\90Î
\82É
\82Â
\82¯
\82½
\81D",
3051 streak_color ? streak_color : (const char *)"");
3053 else if (streak_color)
3055 You_see("%s streaks on the %s.", streak_color, stonebuf);
3057 pline("
\90Î
\82É%s
\8bØ
\82ª
\82Â
\82¢
\82½
\81D", streak_color);
3063 /* Place a landmine/bear trap. Helge Hafting */
3069 const char *what = (char *) 0;
3071 int levtyp = levl[u.ux][u.uy].typ;
3073 const char *occutext = "setting the trap";
3075 const char *occutext = "ã©
\82ð
\8ed
\8a|
\82¯
\82Ä
\82¢
\82é";
3078 if (nohands(youmonst.data))
3080 what = "without hands";
3082 what = "
\8eè
\82ª
\82È
\82¢
\82Ì
\82Å";
3085 what = "while stunned";
3087 what = "
\82
\82ç
\82
\82ç
\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å";
3088 else if (u.uswallow)
3091 is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed";
3093 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Í";
3094 else if (Underwater)
3096 what = "underwater";
3098 what = "
\90\85\96Ê
\89º
\82Å
\82Í";
3099 else if (Levitation)
3101 what = "while levitating";
3103 what = "
\95\82\82¢
\82Ä
\82¢
\82é
\8aÔ
\82Í";
3104 else if (is_pool(u.ux, u.uy))
3108 what = "
\90\85\92\86\82Å
\82Í";
3109 else if (is_lava(u.ux, u.uy))
3113 what = "
\97n
\8aâ
\82Ì
\92\86\82Å
\82Í";
3114 else if (On_stairs(u.ux, u.uy))
3116 what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder"
3119 what = (u.ux == xdnladder || u.ux == xupladder) ? "
\82Í
\82µ
\82²
\82Ì
\8fã
\82Å
\82Í"
3120 : "
\8aK
\92i
\82Ì
\8fã
\82Å
\82Í";
3122 else if (IS_FURNITURE(levtyp) || IS_ROCK(levtyp)
3123 || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy))
3127 what = "
\82±
\82±
\82Å
\82Í";
3128 else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
3130 what = (levtyp == AIR)
3134 : "in this place"; /* Air/Water Plane catch-all */
3136 what = (levtyp == AIR)
3137 ? "
\8bó
\92\86\82Å
\82Í"
3139 ? "
\89_
\82Ì
\92\86\82Å
\82Í"
3140 : "
\82±
\82±
\82Å
\82Í"; /* Air/Water Plane catch-all */
3144 You_cant("set a trap %s!", what);
3146 pline("%sã©
\82ð
\8ed
\8a|
\82¯
\82ç
\82ê
\82È
\82¢
\81I",what);
3150 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3151 if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) {
3153 You("resume setting %s%s.", shk_your(buf, otmp),
3155 You("%s
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D",
3156 defsyms[trap_to_defsym(what_trap(ttyp))].explanation);
3157 set_occupation(set_trap, occutext, 0);
3160 trapinfo.tobj = otmp;
3161 trapinfo.tx = u.ux, trapinfo.ty = u.uy;
3163 trapinfo.time_needed =
3164 (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5;
3166 trapinfo.time_needed *= 2;
3168 if (ttyp == BEAR_TRAP && tmp < 18)
3169 trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4;
3170 /*[fumbling and/or confusion and/or cursed object check(s)
3171 should be incorporated here instead of in set_trap]*/
3172 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) {
3175 if (Fumbling || otmp->cursed)
3176 chance = (rnl(10) > 3);
3178 chance = (rnl(10) > 5);
3180 You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
3182 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));
3184 Sprintf(buf, "Continue your attempt to set %s?",
3186 Sprintf(buf, "%s
\82Ì
\8ed
\8a|
\82¯
\82ð
\91±
\82¯
\82é
\81H",
3187 the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation));
3188 if (yn(buf) == 'y') {
3191 case LANDMINE: /* set it off */
3192 trapinfo.time_needed = 0;
3193 trapinfo.force_bungle = TRUE;
3195 case BEAR_TRAP: /* drop it without arming it */
3200 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I",
3201 the(defsyms[trap_to_defsym(what_trap(ttyp))]
3213 You("begin setting %s%s.", shk_your(buf, otmp),
3215 You("%s%s
\82ð
\8ed
\8a|
\82¯
\82Í
\82¶
\82ß
\82½
\81D", shk_your(buf, otmp),
3216 defsyms[trap_to_defsym(what_trap(ttyp))].explanation);
3217 set_occupation(set_trap, occutext, 0);
3225 struct obj *otmp = trapinfo.tobj;
3229 if (!otmp || !carried(otmp) || u.ux != trapinfo.tx
3230 || u.uy != trapinfo.ty) {
3236 if (--trapinfo.time_needed > 0)
3237 return 1; /* still busy */
3239 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3240 ttmp = maketrap(u.ux, u.uy, ttyp);
3244 if (*in_rooms(u.ux, u.uy, SHOPBASE)) {
3245 add_damage(u.ux, u.uy, 0L); /* schedule removal */
3247 if (!trapinfo.force_bungle)
3249 You("finish arming %s.",
3251 You("%s
\82ð
\8ed
\8a|
\82¯
\8fI
\82¦
\82½
\81D",
3252 the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation));
3253 if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
3254 || trapinfo.force_bungle)
3256 (unsigned) (trapinfo.force_bungle ? FORCEBUNGLE : 0));
3258 /* this shouldn't happen */
3260 Your("trap setting attempt fails.");
3262 You("ã©
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D");
3276 int rx, ry, proficient, res = 0;
3278 const char *msg_slipsfree = "The bullwhip slips free.";
3280 const char *msg_slipsfree = "
\95Ú
\82Í
\82Ù
\82Ç
\82¯
\82½
\81D";
3282 const char *msg_snap = "Snap!";
3284 const char *msg_snap = "
\83s
\83V
\83b
\81I";
3287 if (!wield_tool(obj, "lash"))
3292 if (!getdir((char *) 0))
3300 if (Stunned || (Confusion && !rn2(5)))
3304 if (!isok(rx, ry)) {
3308 mtmp = m_at(rx, ry);
3311 /* fake some proficiency checks */
3313 if (Role_if(PM_ARCHEOLOGIST))
3315 if (ACURR(A_DEX) < 6)
3317 else if (ACURR(A_DEX) >= 14)
3318 proficient += (ACURR(A_DEX) - 14);
3326 if (u.uswallow && attack(u.ustuck)) {
3328 There("is not enough room to flick your bullwhip.");
3330 pline("
\95Ú
\82ð
\91Å
\82Â
\82Ù
\82Ç
\8dL
\82
\82È
\82¢
\81D");
3332 } else if (Underwater) {
3334 There("is too much resistance to flick your bullwhip.");
3336 pline("
\90\85\82Ì
\92ï
\8dR
\82ª
\82 \82è
\82·
\82¬
\82Ä
\95Ú
\82ð
\91Å
\82Â
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
3338 } else if (u.dz < 0) {
3340 You("flick a bug off of the %s.", ceiling(u.ux, u.uy));
3342 You("%s
\82Ì
\92\8e\82ð
\91Å
\82¿
\97\8e\82µ
\82½
\81D",ceiling(u.ux,u.uy));
3344 } else if ((!u.dx && !u.dy) || (u.dz > 0)) {
3347 /* Sometimes you hit your steed by mistake */
3348 if (u.usteed && !rn2(proficient + 2)) {
3350 You("whip %s!", mon_nam(u.usteed));
3352 You("%s
\82ð
\95Ú
\91Å
\82Á
\82½
\81I", mon_nam(u.usteed));
3356 if (Levitation || u.usteed) {
3357 /* Have a shot at snaring something on the floor */
3358 otmp = level.objects[u.ux][u.uy];
3359 if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) {
3361 pline("Why beat a dead horse?");
3363 pline("
\82Ç
\82¤
\82µ
\82Ä
\8e\80\82ñ
\82¾
\94n
\82ð
\95Ú
\91Å
\82Â
\82æ
\82¤
\82È
\82±
\82Æ
\82ð
\82·
\82é
\82Ì
\81H");
3366 if (otmp && proficient) {
3368 You("wrap your bullwhip around %s on the %s.",
3369 an(singular(otmp, xname)), surface(u.ux, u.uy));
3371 You("
\95Ú
\82ð%s
\82Ì
\8fã
\82Ì%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D",
3372 surface(u.ux, u.uy), an(singular(otmp, xname)));
3374 if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1)
3375 pline1(msg_slipsfree);
3379 dam = rnd(2) + dbon() + obj->spe;
3383 You("hit your %s with your bullwhip.", body_part(FOOT));
3385 You("
\8e©
\95ª
\82Ì%s
\82ð
\8e©
\95ª
\82Å
\91Å
\82¿
\82Â
\82¯
\82½
\81D", body_part(FOOT));
3387 Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis());
3388 losehp(Maybe_Half_Phys(dam), buf, NO_KILLER_PREFIX);
3390 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82ð
\95Ú
\91Å
\82Á
\82Ä");
3391 losehp(dam, buf, KILLED_BY);
3396 } else if ((Fumbling || Glib) && !rn2(5)) {
3398 pline_The("bullwhip slips out of your %s.", body_part(HAND));
3400 pline("
\95Ú
\82ª%s
\82©
\82ç
\82·
\82×
\82è
\97\8e\82¿
\82½
\81D", body_part(HAND));
3403 } else if (u.utrap && u.utraptype == TT_PIT) {
3407 * if you're in a pit
3408 * - you are attempting to get out of the pit
3409 * or, if you are applying it towards a small monster
3410 * - then it is assumed that you are trying to hit it
3411 * else if the monster is wielding a weapon
3412 * - you are attempting to disarm a monster
3414 * - you are attempting to hit the monster.
3416 * if you're confused (and thus off the mark)
3417 * - you only end up hitting.
3420 const char *wrapped_what = (char *) 0;
3423 if (bigmonst(mtmp->data)) {
3424 wrapped_what = strcpy(buf, mon_nam(mtmp));
3425 } else if (proficient) {
3432 if (!wrapped_what) {
3433 if (IS_FURNITURE(levl[rx][ry].typ))
3434 wrapped_what = something;
3435 else if (sobj_at(BOULDER, rx, ry))
3437 wrapped_what = "a boulder";
3439 wrapped_what = "
\8aâ";
3447 You("wrap your bullwhip around %s.", wrapped_what);
3449 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", wrapped_what);
3450 if (proficient && rn2(proficient + 2)) {
3451 if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) {
3453 You("yank yourself out of the pit!");
3455 You("
\82®
\82¢
\82Æ
\88ø
\82Á
\82Ï
\82Á
\82Ä
\8c\8a\82©
\82ç
\94²
\82¯
\8fo
\82µ
\82½
\81I");
3456 teleds(cc.x, cc.y, TRUE);
3458 vision_full_recalc = 1;
3461 pline1(msg_slipsfree);
3469 if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) {
3471 pline("A monster is there that you couldn't see.");
3473 pline("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82ª
\82¢
\82é
\81D");
3474 map_invisible(rx, ry);
3476 otmp = MON_WEP(mtmp); /* can be null */
3478 char onambuf[BUFSZ];
3479 const char *mon_hand;
3480 boolean gotit = proficient && (!Fumbling || !rn2(10));
3482 Strcpy(onambuf, cxname(otmp));
3484 mon_hand = mbodypart(mtmp, HAND);
3486 mon_hand = makeplural(mon_hand);
3488 mon_hand = 0; /* lint suppression */
3491 You("wrap your bullwhip around %s.", yname(otmp));
3493 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", yname(otmp));
3494 if (gotit && mwelded(otmp)) {
3496 pline("%s welded to %s %s%c",
3497 (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp),
3498 mon_hand, !otmp->bknown ? '!' : '.');
3500 pline("%s
\82Í%s
\82Ì%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82µ
\82Ü
\82Á
\82Ä
\82¢
\82é%s",
3502 mon_nam(mtmp), mon_hand,
3503 !otmp->bknown ? "
\81I" : "
\81D");
3506 gotit = FALSE; /* can't pull it free */
3509 obj_extract_self(otmp);
3510 possibly_unwield(mtmp, FALSE);
3511 setmnotwielded(mtmp, otmp);
3513 switch (rn2(proficient + 1)) {
3515 /* to floor near you */
3517 You("yank %s to the %s!", yname(otmp),
3519 You("%s
\82ð%s
\82É
\88ø
\82«
\97\8e\82µ
\82½
\81I", yname(otmp),
3520 surface(u.ux, u.uy));
3521 place_object(otmp, u.ux, u.uy);
3528 /* proficient with whip, but maybe not
3529 so proficient at catching weapons */
3532 hitvalu = 8 + otmp->spe;
3533 hitu = thitu(hitvalu,
3534 dmgval(otmp, &youmonst),
3538 pline_The("%s hits you as you try to snatch it!",
3540 pline_The("%s
\82ð
\92D
\82¨
\82¤
\82Æ
\82µ
\82½
\82ç
\82 \82È
\82½
\82É
\93\96\82½
\82Á
\82½
\81I",
3543 place_object(otmp, u.ux, u.uy);
3548 /* right into your inventory */
3550 You("snatch %s!", yname(otmp));
3552 You("%s
\82ð
\92D
\82Á
\82½
\81I", yname(otmp));
3553 if (otmp->otyp == CORPSE
3554 && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg
3555 && !Stone_resistance
3556 && !(poly_when_stoned(youmonst.data)
3557 && polymon(PM_STONE_GOLEM))) {
3561 Sprintf(kbuf, "%s corpse",
3562 an(mons[otmp->corpsenm].mname));
3563 pline("Snatching %s is a fatal mistake.", kbuf);
3565 pline("%s
\82Ì
\8e\80\91Ì
\82ð
\92D
\82Á
\82½
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
3566 mons[otmp->corpsenm].mname);
3567 Sprintf(kbuf, "%s
\82Ì
\8e\80\91Ì
\82É
\90G
\82ê
\82Ä",
3568 mons[otmp->corpsenm].mname);
3572 otmp = hold_another_object(
3574 otmp, "You drop %s!", doname(otmp), (const char *) 0);
3576 otmp, "%s
\82ð
\97\8e\82µ
\82½
\81I", doname(otmp), (const char *) 0);
3579 /* to floor beneath mon */
3581 You("yank %s from %s %s!", the(onambuf),
3583 You("%s
\82ð%s
\82Ì%s
\82©
\82ç
\82Ð
\82Á
\82Ï
\82Á
\82½
\81I", the(xname(otmp)),
3584 s_suffix(mon_nam(mtmp)), mon_hand);
3585 obj_no_longer_held(otmp);
3586 place_object(otmp, mtmp->mx, mtmp->my);
3591 pline1(msg_slipsfree);
3595 if (mtmp->m_ap_type && !Protection_from_shape_changers
3597 stumble_onto_mimic(mtmp);
3600 You("flick your bullwhip towards %s.", mon_nam(mtmp));
3602 You("%s
\82É
\8cü
\82Á
\82Ä
\95Ú
\82ð
\91Å
\82Á
\82½
\81D", mon_nam(mtmp));
3611 } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
3612 /* it must be air -- water checked above */
3614 You("snap your whip through thin air.");
3616 You("
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë
\82Å
\95Ú
\82ð
\91Å
\82Á
\82½
\81D");
3626 not_enough_room[] = "There's not enough room here to use that.",
3628 not_enough_room[] = "
\82»
\82ê
\82ð
\8eg
\82¤
\82¾
\82¯
\82Ì
\8dL
\82³
\82ª
\82È
\82¢
\81D",
3630 where_to_hit[] = "Where do you want to hit?",
3632 where_to_hit[] = "
\82Ç
\82ê
\82ð
\91_
\82¤
\81H",
3634 cant_see_spot[] = "won't hit anything if you can't see that spot.",
3636 cant_see_spot[] = "
\8fê
\8f\8a\82ª
\8c©
\82¦
\82È
\82¯
\82ê
\82Î
\91_
\82¦
\82È
\82¢
\81D",
3638 cant_reach[] = "can't reach that spot from here.";
3640 cant_reach[] = "
\82±
\82±
\82©
\82ç
\82»
\82±
\82Ö
\82Í
\93Í
\82©
\82È
\82¢
\81D";
3642 /* find pos of monster in range, if only one monster */
3644 find_poleable_mon(pos, min_range, max_range)
3646 int min_range, max_range;
3649 struct monst *selmon = (struct monst *) 0;
3651 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
3652 if (mtmp && !DEADMONSTER(mtmp) && !mtmp->mtame
3653 && cansee(mtmp->mx, mtmp->my)
3654 && distu(mtmp->mx, mtmp->my) <= max_range
3655 && distu(mtmp->mx, mtmp->my) >= min_range) {
3662 pos->x = selmon->mx;
3663 pos->y = selmon->my;
3667 static int polearm_range_min = -1;
3668 static int polearm_range_max = -1;
3671 display_polearm_positions(state)
3675 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
3676 } else if (state == 1) {
3679 for (dx = -4; dx <= 4; dx++)
3680 for (dy = -4; dy <= 4; dy++) {
3681 x = dx + (int) u.ux;
3682 y = dy + (int) u.uy;
3683 if (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
3684 && distu(x, y) >= polearm_range_min
3685 && distu(x, y) <= polearm_range_max) {
3690 tmp_at(DISP_END, 0);
3694 /* Distance attacks by pole-weapons */
3699 int res = 0, typ, max_range, min_range, glyph;
3702 struct monst *hitm = context.polearm.hitmon;
3704 /* Are you allowed to use the pole? */
3706 pline(not_enough_room);
3710 if (!wield_tool(obj, "swing"))
3715 /* assert(obj == uwep); */
3718 * Calculate allowable range (pole's reach is always 2 steps):
3719 * unskilled and basic: orthogonal direction, 4..4;
3720 * skilled: as basic, plus knight's jump position, 4..5;
3721 * expert: as skilled, plus diagonal, 4..8.
3729 * (Note: no roles in nethack can become expert or better
3730 * for polearm skill; Yeoman in slash'em can become expert.)
3733 typ = uwep_skill_type();
3734 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
3736 else if (P_SKILL(typ) == P_SKILLED)
3739 max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
3741 polearm_range_min = min_range;
3742 polearm_range_max = max_range;
3744 /* Prompt for a location */
3745 pline(where_to_hit);
3748 if (!find_poleable_mon(&cc, min_range, max_range) && hitm
3749 && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)
3750 && distu(hitm->mx, hitm->my) <= max_range
3751 && distu(hitm->mx, hitm->my) >= min_range) {
3755 getpos_sethilite(display_polearm_positions);
3757 if (getpos(&cc, TRUE, "the spot to hit") < 0)
3759 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
3760 return res; /* ESC; uses turn iff polearm became wielded */
3762 glyph = glyph_at(cc.x, cc.y);
3763 if (distu(cc.x, cc.y) > max_range) {
3767 pline("
\89\93\82·
\82¬
\82é
\81I");
3769 } else if (distu(cc.x, cc.y) < min_range) {
3771 pline("Too close!");
3773 pline("
\8bß
\82·
\82¬
\82é
\81I");
3775 } else if (!cansee(cc.x, cc.y) && !glyph_is_monster(glyph)
3776 && !glyph_is_invisible(glyph) && !glyph_is_statue(glyph)) {
3779 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
3784 context.polearm.hitmon = NULL;
3785 /* Attack the monster there */
3787 if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *) 0) {
3788 if (attack_checks(mtmp, uwep))
3791 return 1; /* burn nutrition; maybe pass out */
3792 context.polearm.hitmon = mtmp;
3793 check_caitiff(mtmp);
3794 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
3795 (void) thitmonst(mtmp, uwep);
3796 } else if (glyph_is_statue(glyph) /* might be hallucinatory */
3797 && sobj_at(STATUE, bhitpos.x, bhitpos.y)) {
3798 struct trap *t = t_at(bhitpos.x, bhitpos.y);
3800 if (t && t->ttyp == STATUE_TRAP
3801 && activate_statue_trap(t, t->tx, t->ty, FALSE)) {
3802 ; /* feedback has been give by animate_statue() */
3804 /* Since statues look like monsters now, we say something
3805 different from "you miss" or "there's nobody there".
3806 Note: we only do this when a statue is displayed here,
3807 because the player is probably attempting to attack it;
3808 other statues obscured by anything are just ignored. */
3810 pline("Thump! Your blow bounces harmlessly off the statue.");
3812 pline("
\83S
\83c
\83\93\81I
\92¤
\91\9c\82Í
\8f\9d\82Â
\82©
\82È
\82©
\82Á
\82½
\81D");
3813 wake_nearto(bhitpos.x, bhitpos.y, 25);
3816 /* no monster here and no statue seen or remembered here */
3817 if (glyph_is_invisible(glyph)) {
3818 /* now you know that nothing is there... */
3819 unmap_object(bhitpos.x, bhitpos.y);
3820 newsym(bhitpos.x, bhitpos.y);
3823 You("miss; there is no one there to hit.");
3825 You("
\8aO
\82ê
\82½
\81D
\82»
\82±
\82É
\82Í
\89½
\82à
\82È
\82¢
\81D");
3827 u_wipe_engr(2); /* same as for melee or throwing */
3835 boolean wasblind = Blind;
3836 boolean wascreamed = u.ucreamed;
3837 boolean several = FALSE;
3839 if (obj->quan > 1L) {
3841 obj = splitobj(obj, 1L);
3845 You("give yourself a facial.");
3847 You("
\83N
\83\8a\81[
\83\80\83p
\83b
\83N
\82ð
\82µ
\82½
\81D");
3850 pline("You immerse your %s in %s%s.", body_part(FACE),
3851 several ? "one of " : "",
3852 several ? makeplural(the(xname(obj))) : the(xname(obj)));
3854 pline("%s%s
\82É%s
\82ð
\92¾
\82ß
\82½
\81D",
3856 several ? "
\82Ì
\82Ð
\82Æ
\82Â" : "", body_part(FACE));
3858 if (can_blnd((struct monst *) 0, &youmonst, AT_WEAP, obj)) {
3859 int blindinc = rnd(25);
3860 u.ucreamed += blindinc;
3861 make_blinded(Blinded + (long) blindinc, FALSE);
3862 if (!Blind || (Blind && wasblind))
3864 pline("There's %ssticky goop all over your %s.",
3865 wascreamed ? "more " : "", body_part(FACE));
3867 pline("
\82â
\82Á
\82©
\82¢
\82È
\82Ë
\82Î
\82Ë
\82Î
\82ª%s
\91S
\91Ì
\82É%s
\82Â
\82¢
\82½
\81D",
3868 body_part(FACE), wascreamed ? "
\82³
\82ç
\82É" : "");
3870 else /* Blind && !wasblind */
3872 You_cant("see through all the sticky goop on your %s.",
3874 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",
3879 /* useup() is appropriate, but we want costly_alteration()'s message */
3880 costly_alteration(obj, COST_SPLAT);
3881 obj_extract_self(obj);
3890 int res = 0, typ, max_range = 4, tohit;
3891 boolean save_confirm;
3896 /* Are you allowed to use the hook? */
3898 pline(not_enough_room);
3902 if (!wield_tool(obj, "cast"))
3907 /* assert(obj == uwep); */
3909 /* Prompt for a location */
3910 pline(where_to_hit);
3914 if (getpos(&cc, TRUE, "the spot to hit") < 0)
3916 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
3917 return res; /* ESC; uses turn iff grapnel became wielded */
3919 /* Calculate range; unlike use_pole(), there's no minimum for range */
3920 typ = uwep_skill_type();
3921 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
3923 else if (P_SKILL(typ) == P_SKILLED)
3927 if (distu(cc.x, cc.y) > max_range) {
3931 pline("
\89\93\82·
\82¬
\82é
\81I");
3933 } else if (!cansee(cc.x, cc.y)) {
3936 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
3941 /* What do you want to hit? */
3943 if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) {
3944 winid tmpwin = create_nhwindow(NHW_MENU);
3947 menu_item *selected;
3949 any = zeroany; /* set all bits to zero */
3950 any.a_int = 1; /* use index+1 (cant use 0) as identifier */
3954 Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
3956 Sprintf(buf, "%s
\82É
\82 \82é
\95¨
\91Ì", surface(cc.x, cc.y));
3957 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
3961 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
3964 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "
\89ö
\95¨",
3969 Sprintf(buf, "the %s", surface(cc.x, cc.y));
3971 Sprintf(buf, "%s", surface(cc.x, cc.y));
3972 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
3975 end_menu(tmpwin, "Aim for what?");
3977 end_menu(tmpwin, "
\89½
\82ð
\91_
\82¤
\81H");
3979 if (select_menu(tmpwin, PICK_ONE, &selected) > 0
3980 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2))
3981 tohit = selected[0].item.a_int - 1;
3982 free((genericptr_t) selected);
3983 destroy_nhwindow(tmpwin);
3986 /* possibly scuff engraving at your feet;
3987 any engraving at the target location is unaffected */
3988 if (tohit == 2 || !rn2(2))
3989 u_wipe_engr(rnd(2));
3991 /* What did you hit? */
3994 /* FIXME -- untrap needs to deal with non-adjacent traps */
3996 case 1: /* Object */
3997 if ((otmp = level.objects[cc.x][cc.y]) != 0) {
3999 You("snag an object from the %s!", surface(cc.x, cc.y));
4001 You("%s
\82Ì
\82à
\82Ì
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I", surface(cc.x, cc.y));
4002 (void) pickup_object(otmp, 1L, FALSE);
4003 /* If pickup fails, leave it alone */
4008 case 2: /* Monster */
4010 if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *) 0)
4012 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4013 save_confirm = flags.confirm;
4014 if (verysmall(mtmp->data) && !rn2(4)
4015 && enexto(&cc, u.ux, u.uy, (struct permonst *) 0)) {
4016 flags.confirm = FALSE;
4017 (void) attack_checks(mtmp, uwep);
4018 flags.confirm = save_confirm;
4019 check_caitiff(mtmp); /* despite fact there's no damage */
4021 You("pull in %s!", mon_nam(mtmp));
4023 You("%s
\82ð
\88ø
\82Á
\92£
\82Á
\82½
\81I", mon_nam(mtmp));
4024 mtmp->mundetected = 0;
4025 rloc_to(mtmp, cc.x, cc.y);
4027 } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data))
4029 flags.confirm = FALSE;
4030 (void) attack_checks(mtmp, uwep);
4031 flags.confirm = save_confirm;
4032 check_caitiff(mtmp);
4033 (void) thitmonst(mtmp, uwep);
4037 case 3: /* Surface */
4038 if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y))
4040 pline_The("hook slices through the %s.", surface(cc.x, cc.y));
4042 pline("
\83t
\83b
\83N
\82Í%s
\82ð
\82³
\82Á
\82Æ
\90Ø
\82Á
\82½
\81D", surface(cc.x, cc.y));
4045 You("are yanked toward the %s!", surface(cc.x, cc.y));
4047 You("%s
\82Ö
\88ø
\82Á
\82Ï
\82ç
\82ê
\82½
\81I", surface(cc.x, cc.y));
4048 hurtle(sgn(cc.x - u.ux), sgn(cc.y - u.uy), 1, FALSE);
4052 default: /* Yourself (oops!) */
4053 if (P_SKILL(typ) <= P_BASIC) {
4055 You("hook yourself!");
4057 You("
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I");
4059 losehp(Maybe_Half_Phys(rn1(10, 10)), "a grappling hook",
4061 losehp(Maybe_Half_Phys(rn1(10, 10)), "
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82Ä",
4067 pline1(nothing_happens);
4071 #define BY_OBJECT ((struct monst *) 0)
4073 /* return 1 if the wand is broken, hence some time elapsed */
4079 static const char nothing_else_happens[] = "But nothing else happens...";
4081 static const char nothing_else_happens[] = "
\82µ
\82©
\82µ
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D
\81D
\81D";
4082 register int i, x, y;
4083 register struct monst *mon;
4085 boolean affects_objects;
4086 boolean shop_damage = FALSE;
4087 boolean fillmsg = FALSE;
4088 int expltype = EXPL_MAGICAL;
4089 char confirm[QBUFSZ], buf[BUFSZ];
4091 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
4093 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "
\83o
\83\8b\83T"));
4096 if (!paranoid_query(ParanoidBreakwand,
4098 "Are you really sure you want to break ",
4099 "?", obj, yname, ysimple_name, "the wand")))
4101 if (!paranoid_query(ParanoidBreakwand,
4103 "
\96{
\93\96\82É", "
\82ð
\89ó
\82·
\82Ì
\81H",
4104 obj, yname, ysimple_name, "
\8fñ")))
4108 if (nohands(youmonst.data)) {
4110 You_cant("break %s without hands!", yname(obj));
4112 You("
\8eè
\82ª
\96³
\82¢
\82Ì
\82Å%s
\82ð
\89ó
\82¹
\82È
\82¢
\81I", yname(obj));
4114 } else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
4116 You("don't have the strength to break %s!", yname(obj));
4118 You("%s
\82ð
\89ó
\82·
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I", yname(obj));
4122 pline("Raising %s high above your %s, you break it in two!", yname(obj),
4124 pline("%s
\82ð%s
\82Ì
\8fã
\82É
\8d\82\82
\8cf
\82°
\81C
\93ñ
\82Â
\82É
\82Ö
\82µ
\90Ü
\82Á
\82½
\81I", yname(obj),
4127 /* [ALI] Do this first so that wand is removed from bill. Otherwise,
4128 * the freeinv() below also hides it from setpaid() which causes problems.
4131 check_unpaid(obj); /* Extra charge for use */
4132 costly_alteration(obj, COST_DSTROY);
4135 current_wand = obj; /* destroy_item might reset this */
4136 freeinv(obj); /* hide it from destroy_item instead... */
4137 setnotworn(obj); /* so we need to do this ourselves */
4139 if (!zappable(obj)) {
4140 pline(nothing_else_happens);
4141 goto discard_broken_wand;
4143 /* successful call to zappable() consumes a charge; put it back */
4145 /* might have "wrested" a final charge, taking it from 0 to -1;
4146 if so, we just brought it back up to 0, which wouldn't do much
4147 below so give it 1..3 charges now, usually making it stronger
4148 than an ordinary last charge (the wand is already gone from
4149 inventory, so perm_invent can't accidentally reveal this) */
4156 affects_objects = FALSE;
4158 switch (obj->otyp) {
4163 case WAN_ENLIGHTENMENT:
4165 case WAN_SECRET_DOOR_DETECTION:
4166 pline(nothing_else_happens);
4167 goto discard_broken_wand;
4173 expltype = EXPL_FIERY;
4175 if (expltype == EXPL_MAGICAL)
4176 expltype = EXPL_FROSTY;
4178 case WAN_MAGIC_MISSILE:
4180 explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
4181 makeknown(obj->otyp); /* explode describes the effect */
4182 goto discard_broken_wand;
4184 /* we want this before the explosion instead of at the very end */
4186 pline("A wall of force smashes down around you!");
4188 pline("
\82 \82È
\82½
\82Í
\96\82\97Í
\82Ì
\95Ç
\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81I");
4189 dmg = d(1 + obj->spe, 6); /* normally 2d12 */
4191 case WAN_CANCELLATION:
4193 case WAN_TELEPORTATION:
4194 case WAN_UNDEAD_TURNING:
4195 affects_objects = TRUE;
4201 /* magical explosion and its visual effect occur before specific effects
4203 /* [TODO? This really ought to prevent the explosion from being
4204 fatal so that we never leave a bones file where none of the
4205 surrounding targets (or underlying objects) got affected yet.] */
4206 explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS,
4209 /* prepare for potential feedback from polymorph... */
4212 /* this makes it hit us last, so that we can see the action first */
4213 for (i = 0; i <= 8; i++) {
4214 bhitpos.x = x = obj->ox + xdir[i];
4215 bhitpos.y = y = obj->oy + ydir[i];
4219 if (obj->otyp == WAN_DIGGING) {
4222 if (dig_check(BY_OBJECT, FALSE, x, y)) {
4223 if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) {
4224 /* normally, pits and holes don't anger guards, but they
4225 * do if it's a wall or door that's being dug */
4226 watch_dig((struct monst *) 0, x, y, TRUE);
4227 if (*in_rooms(x, y, SHOPBASE))
4231 * Let liquid flow into the newly created pits.
4232 * Adjust corresponding code in music.c for
4233 * drum of earthquake if you alter this sequence.
4235 typ = fillholetyp(x, y, FALSE);
4237 levl[x][y].typ = typ;
4238 liquid_flow(x, y, typ, t_at(x, y),
4242 : "Some holes are quickly filled with %s!");
4244 : "
\8c\8a\82Í
\82·
\82®
\82É%s
\82Å
\96\84\82Ü
\82Á
\82½
\81I");
4247 digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3
4248 || (!Can_dig_down(&u.uz)
4249 && !levl[x][y].candig))
4254 } else if (obj->otyp == WAN_CREATE_MONSTER) {
4255 /* u.ux,u.uy creates it near you--x,y might create it in rock */
4256 (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS);
4258 } else if (x != u.ux || y != u.uy) {
4260 * Wand breakage is targetting a square adjacent to the hero,
4261 * which might contain a monster or a pile of objects or both.
4262 * Handle objects last; avoids having undead turning raise an
4263 * undead's corpse and then attack resulting undead monster.
4264 * obj->bypass in bhitm() prevents the polymorphing of items
4265 * dropped due to monster's polymorph and prevents undead
4266 * turning that kills an undead from raising resulting corpse.
4268 if ((mon = m_at(x, y)) != 0) {
4269 (void) bhitm(mon, obj);
4270 /* if (context.botl) bot(); */
4272 if (affects_objects && level.objects[x][y]) {
4273 (void) bhitpile(obj, bhito, x, y, 0);
4275 bot(); /* potion effects */
4279 * Wand breakage is targetting the hero. Using xdir[]+ydir[]
4280 * deltas for location selection causes this case to happen
4281 * after all the surrounding squares have been handled.
4282 * Process objects first, in case damage is fatal and leaves
4283 * bones, or teleportation sends one or more of the objects to
4284 * same destination as hero (lookhere/autopickup); also avoids
4285 * the polymorphing of gear dropped due to hero's transformation.
4286 * (Unlike with monsters being hit by zaps, we can't rely on use
4287 * of obj->bypass in the zap code to accomplish that last case
4288 * since it's also used by retouch_equipment() for polyself.)
4290 if (affects_objects && level.objects[x][y]) {
4291 (void) bhitpile(obj, bhito, x, y, 0);
4293 bot(); /* potion effects */
4295 damage = zapyourself(obj, FALSE);
4298 Sprintf(buf, "killed %sself by breaking a wand", uhim());
4299 losehp(Maybe_Half_Phys(damage), buf, NO_KILLER_PREFIX);
4301 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82Å
\8fñ
\82ð
\89ó
\82µ
\82Ä
\83_
\83\81\81[
\83W
\82ð
\8eó
\82¯");
4302 losehp(Maybe_Half_Phys(damage), buf, KILLED_BY);
4306 bot(); /* blindness */
4310 /* potentially give post zap/break feedback */
4313 /* Note: if player fell thru, this call is a no-op.
4314 Damage is handled in digactualhole in that case */
4317 pay_for_damage("dig into", FALSE);
4319 pay_for_damage("
\8c\8a\82ð
\82 \82¯
\82é", FALSE);
4321 if (obj->otyp == WAN_LIGHT)
4322 litroom(TRUE, obj); /* only needs to be done once */
4324 discard_broken_wand:
4325 obj = current_wand; /* [see dozap() and destroy_item()] */
4334 add_class(cl, class)
4345 static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 };
4347 /* augment tools[] if various items are carried */
4349 setapplyclasses(class_list)
4352 register struct obj *otmp;
4354 boolean knowoil, knowtouchstone, addpotions, addstones, addfood;
4356 knowoil = objects[POT_OIL].oc_name_known;
4357 knowtouchstone = objects[TOUCHSTONE].oc_name_known;
4358 addpotions = addstones = addfood = FALSE;
4359 for (otmp = invent; otmp; otmp = otmp->nobj) {
4362 || (otmp->oclass == POTION_CLASS
4364 || (!knowoil && !objects[otyp].oc_name_known))))
4366 if (otyp == TOUCHSTONE
4367 || (is_graystone(otmp)
4369 || (!knowtouchstone && !objects[otyp].oc_name_known))))
4371 if (otyp == CREAM_PIE || otyp == EUCALYPTUS_LEAF)
4375 class_list[0] = '\0';
4376 if (addpotions || addstones)
4377 add_class(class_list, ALL_CLASSES);
4378 Strcat(class_list, tools);
4380 add_class(class_list, POTION_CLASS);
4382 add_class(class_list, GEM_CLASS);
4384 add_class(class_list, FOOD_CLASS);
4387 /* the 'a' command */
4392 register int res = 1;
4393 char class_list[MAXOCLASSES + 2];
4395 if (check_capacity((char *) 0))
4398 setapplyclasses(class_list); /* tools[] */
4399 obj = getobj(class_list, "use or apply");
4403 if (!retouch_object(&obj, FALSE))
4404 return 1; /* evading your grasp costs a turn; just be
4405 grateful that you don't drop it as well */
4407 if (obj->oclass == WAND_CLASS)
4408 return do_break_wand(obj);
4410 switch (obj->otyp) {
4413 if (obj == ublindf) {
4416 } else if (!ublindf) {
4420 You("are already %s.", ublindf->otyp == TOWEL
4421 ? "covered by a towel"
4422 : ublindf->otyp == BLINDFOLD
4423 ? "wearing a blindfold"
4424 : "wearing lenses");
4426 You("
\82à
\82¤%s
\82Ä
\82¢
\82é
\81D", ublindf->otyp == TOWEL
4427 ? "
\83^
\83I
\83\8b\82ð
\8aª
\82¢"
4428 : ublindf->otyp == BLINDFOLD
4429 ? "
\96Ú
\89B
\82µ
\82ð
\82Â
\82¯"
4430 : "
\83\8c\83\93\83Y
\82ð
\82Â
\82¯");
4435 res = use_cream_pie(obj);
4438 res = use_whip(obj);
4440 case GRAPPLING_HOOK:
4441 res = use_grapple(obj);
4447 case BAG_OF_HOLDING:
4449 res = use_container(&obj, 1);
4452 (void) bagotricks(obj, FALSE, (int *) 0);
4460 res = (pick_lock(obj) != 0);
4463 case DWARVISH_MATTOCK:
4464 res = use_pick_axe(obj);
4467 use_tinning_kit(obj);
4473 res = use_saddle(obj);
4476 use_magic_whistle(obj);
4481 case EUCALYPTUS_LEAF:
4482 /* MRKR: Every Australian knows that a gum leaf makes an excellent
4483 * whistle, especially if your pet is a tame kangaroo named Skippy.
4486 use_magic_whistle(obj);
4487 /* sometimes the blessing will be worn off */
4491 pline("%s %s.", Yobjnam2(obj, "glow"), hcolor("brown"));
4493 pline("%s
\82Í%s
\8bP
\82¢
\82½
\81D", xname(obj), jconj_adj(hcolor("
\92\83\90F
\82Ì")));
4503 res = use_stethoscope(obj);
4506 res = use_mirror(obj);
4509 case BELL_OF_OPENING:
4512 case CANDELABRUM_OF_INVOCATION:
4513 use_candelabrum(obj);
4525 light_cocktail(obj);
4527 case EXPENSIVE_CAMERA:
4528 res = use_camera(obj);
4531 res = use_towel(obj);
4534 use_crystal_ball(&obj);
4540 if (!carrying(TIN)) {
4542 You("have no tin to open.");
4544 You("
\8aÊ
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D");
4548 You("cannot open a tin without eating or discarding its contents.");
4550 pline("
\92\86\90g
\82ð
\90H
\82×
\82é
\82©
\81C
\8eÌ
\82Ä
\82é
\82©
\82µ
\82È
\82¢
\82Æ
\8aÊ
\82ð
\8aJ
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
4553 pline("In order to eat, use the 'e' command.");
4555 pline("
\90H
\82×
\82é
\82É
\82Í
\81C'e'
\83R
\83}
\83\93\83h
\82ð
\8eg
\82¦
\82Î
\82æ
\82¢
\81D");
4559 "Opening the tin will be much easier if you wield the tin opener.");
4561 "
\8aÊ
\90Ø
\82è
\82ð
\91\95\94õ
\82µ
\82Ä
\82¢
\82ê
\82Î
\81C
\82¸
\82Á
\82Æ
\8aÈ
\92P
\82É
\8aJ
\82¯
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82é
\81D");
4568 use_unicorn_horn(obj);
4579 case DRUM_OF_EARTHQUAKE:
4580 res = do_play_instrument(obj);
4582 case HORN_OF_PLENTY: /* not a musical instrument */
4583 (void) hornoplenty(obj, FALSE);
4596 /* Pole-weapons can strike at a distance */
4598 res = use_pole(obj);
4600 } else if (is_pick(obj) || is_axe(obj)) {
4601 res = use_pick_axe(obj);
4605 pline("Sorry, I don't know how to use that.");
4607 pline("
\82»
\82ê
\82ð
\82Ç
\82¤
\82â
\82Á
\82Ä
\8eg
\82¤
\82ñ
\82¾
\82¢
\81H");
4612 if (res && obj && obj->oartifact)
4618 /* Keep track of unfixable troubles for purposes of messages saying you feel
4622 unfixable_trouble_count(is_horn)
4625 int unfixable_trbl = 0;
4631 if (Wounded_legs && !u.usteed)
4635 /* lycanthropy is undesirable, but it doesn't actually make you feel bad */
4637 if (!is_horn || (Confusion & ~TIMEOUT))
4639 if (!is_horn || (Sick & ~TIMEOUT))
4641 if (!is_horn || (HHallucination & ~TIMEOUT))
4643 if (!is_horn || (Vomiting & ~TIMEOUT))
4645 if (!is_horn || (HStun & ~TIMEOUT))
4647 if (!is_horn || (HDeaf & ~TIMEOUT))
4650 return unfixable_trbl;