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("%s
\82Ì
\8eÊ
\90^
\82ð
\8eB
\82Á
\82½
\81D",
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) {
271 Strcpy(buf, "You're both stoned");
273 Strcpy(buf, "
\90Î
\82¾");
274 #if 0 /*JP*//*
\91ã
\96¼
\8e\8c\8f\88\97\9d\82Í
\95s
\97v*/
275 } else if (corpse->quan == 1L && !more_corpses) {
276 int gndr = 2; /* neuter: "it" */
277 struct monst *mtmp = get_mtraits(corpse, FALSE);
279 /* (most corpses don't retain the monster's sex, so
280 we're usually forced to use generic pronoun here) */
282 mptr = &mons[mtmp->mnum];
283 /* can't use mhe() here; it calls pronoun_gender() which
284 expects monster to be on the map (visibility check) */
285 if ((humanoid(mptr) || (mptr->geno & G_UNIQ)
286 || type_is_pname(mptr)) && !is_neuter(mptr))
287 gndr = (int) mtmp->female;
289 mptr = &mons[corpse->corpsenm];
292 else if (is_male(mptr))
295 Sprintf(buf, "%s's dead", genders[gndr].he); /* "he"/"she"/"it" */
296 buf[0] = highc(buf[0]);
298 } else { /* plural */
300 Strcpy(buf, "They're dead");
302 Strcpy(buf, "
\8e\80\82ñ
\82Å
\82é
\82º");
304 /* variations on "He's dead, Jim." (Star Trek's Dr McCoy) */
306 You_hear("a voice say, \"%s, Jim.\"", buf);
308 You_hear("
\81u
\82»
\82¢
\82Â
\82Í%s
\81C
\83W
\83\80\81v
\82Æ
\82¢
\82¤
\90º
\82ª
\95·
\82±
\82¦
\82½
\81D", buf);
313 boolean here = (rx == u.ux && ry == u.uy),
314 one = (corpse->quan == 1L && !more_corpses), reviver = FALSE;
316 if (Role_if(PM_HEALER)) {
317 /* ok to reset `corpse' here; we're done with it */
319 if (obj_has_timer(corpse, REVIVE_MON))
322 corpse = nxtobj(corpse, CORPSE, TRUE);
323 } while (corpse && !reviver);
326 You("determine that %s unfortunate being%s %s%s dead.",
327 one ? (here ? "this" : "that") : (here ? "these" : "those"),
328 one ? "" : "s", one ? "is" : "are", reviver ? " mostly" : "");
330 You("%s
\95s
\8dK
\82È
\90¶
\82«
\95¨
\82Í%s
\8e\80\82ñ
\82Å
\82¢
\82é
\82Æ
\8c\8b\98_
\82µ
\82½
\81D",
331 here ? "
\82±
\82Ì" : "
\82»
\82Ì",
332 reviver ? "
\82Ù
\82Ú" : "");
336 } else { /* statue */
337 const char *what, *how;
340 mptr = &mons[statue->corpsenm];
341 if (Blind) { /* ignore statue->dknown; it'll always be set */
342 Sprintf(buf, "%s %s",
343 (rx == u.ux && ry == u.uy) ? "This" : "That",
344 humanoid(mptr) ? "person" : "creature");
348 if (!type_is_pname(mptr))
351 #else /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\83V
\83\93\83v
\83\8b\82É*/
352 if (Blind) { /* ignore statue->dknown; it'll always be set */
353 what = (rx == u.ux && ry == u.uy) ? "
\82±
\82ê" : "
\82 \82ê";
355 what = mons[statue->corpsenm].mname;
362 if (Role_if(PM_HEALER)) {
363 struct trap *ttmp = t_at(rx, ry);
365 if (ttmp && ttmp->ttyp == STATUE_TRAP)
367 how = "extraordinary";
369 how = "
\95À
\8aO
\82ê
\82½";
370 else if (Has_contents(statue))
374 how = "
\92\8d\96Ú
\82·
\82×
\82«";
378 pline("%s is in %s health for a statue.", what, how);
380 pline("
\92¤
\91\9c\82Æ
\82µ
\82Ä
\82Ì%s
\82Í%s
\8dì
\95i
\82¾
\81D", what, how);
383 return FALSE; /* no corpse or statue */
387 static const char hollow_str[] = "a hollow sound. This must be a secret %s!";
389 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";
391 /* Strictly speaking it makes no sense for usage of a stethoscope to
392 not take any time; however, unless it did, the stethoscope would be
393 almost useless. As a compromise, one use per turn is free, another
394 uses up the turn; this makes curse status have a tangible effect. */
397 register struct obj *obj;
402 boolean interference = (u.uswallow && is_whirly(u.ustuck->data)
403 && !rn2(Role_if(PM_HEALER) ? 10 : 3));
405 if (nohands(youmonst.data)) {
407 You("have no hands!"); /* not `body_part(HAND)' */
409 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I");
414 You_cant("hear anything!");
416 You("
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81I");
418 } else if (!freehand()) {
420 You("have no free %s.", body_part(HAND));
422 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81D", body_part(HAND));
425 if (!getdir((char *) 0))
428 res = (moves == context.stethoscope_move)
429 && (youmonst.movement == context.stethoscope_movement);
430 context.stethoscope_move = moves;
431 context.stethoscope_movement = youmonst.movement;
433 if (u.usteed && u.dz > 0) {
436 pline("%s interferes.", Monnam(u.ustuck));
438 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
439 mstatusline(u.ustuck);
441 mstatusline(u.usteed);
443 } else if (u.uswallow && (u.dx || u.dy || u.dz)) {
444 mstatusline(u.ustuck);
446 } else if (u.uswallow && interference) {
448 pline("%s interferes.", Monnam(u.ustuck));
450 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
451 mstatusline(u.ustuck);
456 You_hear("faint splashing.");
458 You_hear("
\82©
\82·
\82©
\82É
\83o
\83V
\83\83\83o
\83V
\83\83\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
459 else if (u.dz < 0 || !can_reach_floor(TRUE))
460 cant_reach_floor(u.ux, u.uy, (u.dz < 0), TRUE);
461 else if (its_dead(u.ux, u.uy, &res))
462 ; /* message already given */
463 else if (Is_stronghold(&u.uz))
465 You_hear("the crackling of hellfire.");
467 You_hear("
\92n
\8d\96\82Ì
\89\8a\82ª
\83p
\83`
\83p
\83`
\94R
\82¦
\82Ä
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
470 pline_The("%s seems healthy enough.", surface(u.ux, u.uy));
472 pline("%s
\82Í
\8f[
\95ª
\8c\92\8dN
\82Ì
\82æ
\82¤
\82¾
\81D", surface(u.ux,u.uy));
474 } else if (obj->cursed && !rn2(2)) {
476 You_hear("your heart beat.");
478 You_hear("
\8e©
\95ª
\82Ì
\90S
\91\9f\82Ì
\8cÛ
\93®
\82ð
\95·
\82¢
\82½
\81D");
481 if (Stunned || (Confusion && !rn2(5)))
483 if (!u.dx && !u.dy) {
491 You_hear("a faint typing noise.");
493 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");
496 if ((mtmp = m_at(rx, ry)) != 0) {
497 const char *mnm = x_monnam(mtmp, ARTICLE_A, (const char *) 0,
498 SUPPRESS_IT | SUPPRESS_INVISIBLE, FALSE);
500 if (mtmp->mundetected) {
501 if (!canspotmon(mtmp))
503 There("is %s hidden there.", mnm);
505 pline("
\82±
\82±
\82É%s
\82ª
\89B
\82ê
\82Ä
\82¢
\82é
\81D", mnm);
506 mtmp->mundetected = 0;
507 newsym(mtmp->mx, mtmp->my);
508 } else if (mtmp->mappearance) {
509 const char *what = "thing";
511 switch (mtmp->m_ap_type) {
513 what = simple_typename(mtmp->mappearance);
515 case M_AP_MONSTER: /* ignore Hallucination here */
516 what = mons[mtmp->mappearance].mname;
519 what = defsyms[mtmp->mappearance].explanation;
524 pline("That %s is really %s", what, mnm);
526 pline("
\82±
\82Ì%s
\82Í
\8eÀ
\8dÛ
\82É
\82Í%s
\81D", what, mnm);
527 } else if (flags.verbose && !canspotmon(mtmp)) {
529 There("is %s there.", mnm);
531 pline("
\82±
\82±
\82É
\82Í%s
\82ª
\82¢
\82é
\81D", mnm);
534 if (!canspotmon(mtmp))
535 map_invisible(rx, ry);
538 if (glyph_is_invisible(levl[rx][ry].glyph)) {
539 unmap_object(rx, ry);
542 pline_The("invisible monster must have moved.");
544 pline_The("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82Í
\88Ú
\93®
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
550 You_hear(hollow_str, "door");
552 You_hear(hollow_str, "
\94à");
553 cvt_sdoor_to_door(lev); /* ->typ = DOOR */
558 You_hear(hollow_str, "passage");
560 You_hear(hollow_str, "
\92Ê
\98H");
562 unblock_point(rx, ry);
567 if (!its_dead(rx, ry, &res))
569 You("hear nothing special."); /* not You_hear() */
571 pline("
\93Á
\82É
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81D");
577 static const char whistle_str[] = "produce a %s whistling sound.";
579 static const char whistle_str[] = "
\93J
\82ð
\90\81\82¢
\82Ä%s
\89¹
\82ð
\82½
\82Ä
\82½
\81D";
585 if (!can_blow(&youmonst)) {
587 You("are incapable of using the whistle.");
589 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
590 } else if (Underwater) {
592 You("blow bubbles through %s.", yname(obj));
594 You("%s
\82ð
\92Ê
\82µ
\82Ä
\96A
\82ð
\8fo
\82µ
\82½
\81D", xname(obj));
597 You(whistle_str, obj->cursed ? "shrill" : "high");
599 You(whistle_str, obj->cursed ? "
\95s
\8bC
\96¡
\82È" : "
\82©
\82ñ
\8d\82\82¢");
605 use_magic_whistle(obj)
608 register struct monst *mtmp, *nextmon;
610 if (!can_blow(&youmonst)) {
612 You("are incapable of using the whistle.");
614 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
615 } else if (obj->cursed && !rn2(2)) {
617 You("produce a %shigh-pitched humming noise.",
618 Underwater ? "very " : "");
620 You("%s
\8d\82\82¢
\92²
\8eq
\82Ì
\82¤
\82È
\82é
\82æ
\82¤
\82È
\89¹
\82ð
\82½
\82Ä
\82½
\81D",
621 Underwater ? "
\82Æ
\82Ä
\82à" : "");
625 int pet_cnt = 0, omx, omy;
627 /* it's magic! it works underwater too (at a higher pitch) */
630 Hallucination ? "normal" : Underwater ? "strange, high-pitched"
634 Hallucination ? "
\93J
\82Ì
\82æ
\82¤
\82È" : Underwater ? "
\95s
\8ev
\8bc
\82È
\8d\82\82¢
\92²
\8eq
\82Ì"
635 : "
\95s
\8ev
\8bc
\82È");
637 for (mtmp = fmon; mtmp; mtmp = nextmon) {
638 nextmon = mtmp->nmon; /* trap might kill mon */
639 if (DEADMONSTER(mtmp))
641 /* steed is already at your location, so not affected;
642 this avoids trap issues if you're on a trap location */
643 if (mtmp == u.usteed)
646 if (mtmp->mtrapped) {
647 /* no longer in previous trap (affects mintrap) */
649 fill_pit(mtmp->mx, mtmp->my);
651 /* mimic must be revealed before we know whether it
652 actually moves because line-of-sight may change */
655 omx = mtmp->mx, omy = mtmp->my;
657 if (mtmp->mx != omx || mtmp->my != omy) {
658 mtmp->mundetected = 0; /* reveal non-mimic hider */
659 if (canspotmon(mtmp))
661 if (mintrap(mtmp) == 2)
667 makeknown(obj->otyp);
675 return (boolean) (abs(u.ux - x) > n || abs(u.uy - y) > n);
684 for (obj = invent; obj; obj = obj->nobj)
685 if (obj->otyp == LEASH && obj->leashmon != 0)
690 /* otmp is about to be destroyed or stolen */
693 register struct obj *otmp;
695 register struct monst *mtmp;
697 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
698 if (mtmp->m_id == (unsigned) otmp->leashmon)
703 /* mtmp is about to die, or become untame */
705 m_unleash(mtmp, feedback)
706 register struct monst *mtmp;
709 register struct obj *otmp;
714 pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp));
716 pline("%s
\82Í
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82Ä
\93¦
\82ê
\82½
\81I", Monnam(mtmp));
719 Your("leash falls slack.");
721 Your("
\95R
\82ª
\82½
\82é
\82ñ
\82Å
\97\8e\82¿
\82½
\81D");
723 for (otmp = invent; otmp; otmp = otmp->nobj)
724 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
729 /* player is about to die (for bones) */
733 register struct obj *otmp;
734 register struct monst *mtmp;
736 for (otmp = invent; otmp; otmp = otmp->nobj)
737 if (otmp->otyp == LEASH)
739 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
749 return (boolean) (mtmp->mnum != PM_LONG_WORM);
758 register struct monst *mtmp;
761 if (!obj->leashmon && number_leashed() >= MAXLEASHED) {
763 You("cannot leash any more pets.");
765 You("
\82±
\82ê
\88È
\8fã
\83y
\83b
\83g
\82É
\95R
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
769 if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
772 if ((cc.x == u.ux) && (cc.y == u.uy)) {
773 if (u.usteed && u.dz > 0) {
779 pline("Leash yourself? Very funny...");
781 pline("
\8e©
\95ª
\82ð
\94\9b\82é
\81H
\95Ï
\82È
\82Ì
\81D
\81D
\81D");
785 if (!(mtmp = m_at(cc.x, cc.y))) {
787 There("is no creature there.");
789 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
793 spotmon = canspotmon(mtmp);
799 There("is no creature there.");
801 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
804 pline("%s %s leashed!", Monnam(mtmp),
805 (!obj->leashmon) ? "cannot be" : "is not");
807 pline("%s
\82Í
\95R
\82Å%s
\81I", Monnam(mtmp),
808 (!obj->leashmon) ? "
\8c\8b\82×
\82È
\82¢" : "
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢");
812 if (!obj->leashmon) {
813 if (mtmp->mleashed) {
815 pline("This %s is already leashed.",
816 spotmon ? l_monnam(mtmp) : "monster");
818 pline("%s
\82Í
\82·
\82Å
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D",
819 spotmon ? l_monnam(mtmp) : "
\89ö
\95¨");
823 if (!leashable(mtmp)) {
825 pline("The leash won't fit onto %s%s.", spotmon ? "your " : "",
828 pline("
\95R
\82Í%s
\82É
\8d\87\82í
\82È
\82¢
\81D",
835 You("slip the leash around %s%s.", spotmon ? "your " : "",
838 You("%s
\82ð
\95R
\82Å
\8c\8b\82Ñ
\82Â
\82¯
\82½
\81D",
842 obj->leashmon = (int) mtmp->m_id;
846 if (obj->leashmon != (int) mtmp->m_id) {
848 pline("This leash is not attached to that creature.");
850 pline("
\82±
\82Ì
\95R
\82Í
\82»
\82ê
\82É
\82Í
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢
\81D");
855 pline_The("leash would not come off!");
857 pline("
\95R
\82ª
\82Í
\82¸
\82ê
\82È
\82¢
\81I");
864 You("remove the leash from %s%s.", spotmon ? "your " : "",
867 You("%s
\82©
\82ç
\95R
\82ð
\82Í
\82¸
\82µ
\82½
\81D",
874 /* assuming mtmp->mleashed has been checked */
883 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
887 return (struct obj *) 0;
893 register struct monst *mtmp;
894 register struct obj *otmp;
896 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
897 if (DEADMONSTER(mtmp))
899 if (mtmp->mleashed) {
900 if (distu(mtmp->mx, mtmp->my) > 2)
902 if (distu(mtmp->mx, mtmp->my) > 2) {
903 for (otmp = invent; otmp; otmp = otmp->nobj)
904 if (otmp->otyp == LEASH
905 && otmp->leashmon == (int) mtmp->m_id) {
909 You_feel("%s leash go slack.",
910 (number_leashed() > 1) ? "a" : "the");
912 You("
\95R
\82ª
\82½
\82é
\82ñ
\82¾
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
920 /* no pack mules for the Amulet */
921 if (u.usteed && mon_has_amulet(u.usteed))
930 register struct obj *otmp;
931 register struct monst *mtmp;
933 for (otmp = invent; otmp; otmp = otmp->nobj) {
934 if (otmp->otyp != LEASH || otmp->leashmon == 0)
936 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
937 if (DEADMONSTER(mtmp))
939 if ((int) mtmp->m_id == otmp->leashmon)
943 impossible("leash in use isn't attached to anything?");
947 if (dist2(u.ux, u.uy, mtmp->mx, mtmp->my)
948 > dist2(x, y, mtmp->mx, mtmp->my)) {
949 if (!um_dist(mtmp->mx, mtmp->my, 3)) {
950 ; /* still close enough */
951 } else if (otmp->cursed && !breathless(mtmp->data)) {
952 if (um_dist(mtmp->mx, mtmp->my, 5)
953 || (mtmp->mhp -= rnd(2)) <= 0) {
954 long save_pacifism = u.uconduct.killer;
957 Your("leash chokes %s to death!", mon_nam(mtmp));
959 pline("%s
\82Í
\8di
\82ß
\8eE
\82³
\82ê
\82½
\81I",mon_nam(mtmp));
960 /* hero might not have intended to kill pet, but
961 that's the result of his actions; gain experience,
962 lose pacifism, take alignment and luck hit, make
963 corpse less likely to remain tame after revival */
964 xkilled(mtmp, 0); /* no "you kill it" message */
965 /* life-saving doesn't ordinarily reset this */
967 u.uconduct.killer = save_pacifism;
970 pline("%s is choked by the leash!", Monnam(mtmp));
972 pline("%s
\82Í
\95R
\82Å
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82½
\81I", Monnam(mtmp));
973 /* tameness eventually drops to 1 here (never 0) */
974 if (mtmp->mtame && rn2(mtmp->mtame))
978 if (um_dist(mtmp->mx, mtmp->my, 5)) {
980 pline("%s leash snaps loose!", s_suffix(Monnam(mtmp)));
982 pline("%s
\82Ì
\95R
\82Í
\83p
\83`
\83\93\82Æ
\8aO
\82ê
\82½
\81I", Monnam(mtmp));
983 m_unleash(mtmp, FALSE);
986 You("pull on the leash.");
988 You("
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\81D");
989 if (mtmp->data->msound != MS_SILENT)
1010 return ((ACURR(A_CHA) > 14)
1011 ? ((poly_gender() == 1)
1017 /*JP
\8cê
\8a²
\82Å
\8eg
\82¤ */
1024 #define WEAK 3 /* from eat.c */
1027 static const char look_str[] = "look %s.";
1029 static const char look_str[] = "%s
\8c©
\82¦
\82é
\81D";
1035 const char *mirror, *uvisage;
1039 boolean vis, invis_mirror, useeit, monable;
1041 if (!getdir((char *) 0))
1043 invis_mirror = Invis;
1044 useeit = !Blind && (!invis_mirror || See_invisible);
1045 uvisage = beautiful();
1046 mirror = simpleonames(obj); /* "mirror" or "looking glass" */
1047 if (obj->cursed && !rn2(2)) {
1050 pline_The("%s fogs up and doesn't reflect!", mirror);
1052 pline("%s
\82Í
\93Ü
\82è
\81C
\89f
\82ç
\82È
\82
\82È
\82Á
\82½
\81I", mirror);
1055 if (!u.dx && !u.dy && !u.dz) {
1058 You_cant("see your %s %s.", uvisage, body_part(FACE));
1060 You_cant("
\8e©
\95ª
\82Ì%s
\82¢%s
\82ð
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", uvisage, body_part(FACE));
1062 if (u.umonnum == PM_FLOATING_EYE) {
1065 You("stiffen momentarily under your gaze.");
1067 pline("
\88ê
\8fu
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82½
\81D");
1071 pline("Yow! The %s stares back!", mirror);
1073 pline("
\82¨
\82ì
\81I%s
\82ª
\82 \82È
\82½
\82ð
\82É
\82ç
\82Ý
\95Ô
\82µ
\82½
\81I", mirror);
1076 pline("Yikes! You've frozen yourself!");
1078 pline("
\82¨
\82ì
\81I
\82 \82È
\82½
\82Í
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I");
1079 if (!Hallucination || !rn2(4)) {
1080 nomul(-rnd(MAXULEV + 6 - u.ulevel));
1082 multi_reason = "gazing into a mirror";
1084 multi_reason = "
\8b¾
\82É
\94½
\8eË
\82µ
\82½
\8e\8b\90ü
\82Å
\8dd
\92¼
\82µ
\82Ä
\82¢
\82é
\8aÔ
\82É";
1086 nomovemsg = 0; /* default, "you can move again" */
1088 } else if (youmonst.data->mlet == S_VAMPIRE)
1090 You("don't have a reflection.");
1092 You("
\8b¾
\82É
\89f
\82ç
\82È
\82©
\82Á
\82½
\81D");
1093 else if (u.umonnum == PM_UMBER_HULK) {
1095 pline("Huh? That doesn't look like you!");
1097 pline("
\82Ù
\82¦
\81H
\8eÊ
\82Á
\82Ä
\82é
\82Ì
\82Í
\82 \82È
\82½
\82¶
\82á
\82È
\82¢
\82Ý
\82½
\82¢
\82¾
\81I");
1098 make_confused(HConfusion + d(3, 4), FALSE);
1099 } else if (Hallucination)
1100 You(look_str, hcolor((char *) 0));
1103 You(look_str, "peaked");
1105 You(look_str, "
\8aç
\90F
\82ª
\88«
\82");
1106 else if (u.uhs >= WEAK)
1108 You(look_str, "undernourished");
1110 You(look_str, "
\89h
\97{
\8e¸
\92²
\82Ì
\82æ
\82¤
\82É");
1113 You("look as %s as ever.", uvisage);
1115 You("
\82 \82¢
\82©
\82í
\82ç
\82¸%s
\82
\8c©
\82¦
\82é
\81D", uvisage);
1121 You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)),
1122 mbodypart(u.ustuck, STOMACH));
1128 You(Hallucination ? "give the fish a chance to fix their makeup."
1129 : "reflect the murky water.");
1131 You(Hallucination ? "
\8b\9b\82É
\89»
\8fÏ
\92¼
\82µ
\82Ì
\8b@
\89ï
\82ð
\97^
\82¦
\82½
\81D"
1132 : "
\82 \82È
\82½
\82Í
\97\84\82ñ
\82¾
\90\85\82ð
\89f
\82µ
\82½
\81D");
1139 You("reflect the %s.",
1141 You("%s
\82ð
\89f
\82µ
\82½
\81D",
1142 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
1145 mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM,
1146 (int FDECL((*), (MONST_P, OBJ_P))) 0,
1147 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1148 if (!mtmp || !haseyes(mtmp->data) || notonhead)
1151 /* couldsee(mtmp->mx, mtmp->my) is implied by the fact that bhit()
1152 targetted it, so we can ignore possibility of X-ray vision */
1153 vis = canseemon(mtmp);
1154 /* ways to directly see monster (excludes X-ray vision, telepathy,
1155 extended detection, type-specific warning) */
1156 #define SEENMON (MONSEEN_NORMAL | MONSEEN_SEEINVIS | MONSEEN_INFRAVIS)
1157 how_seen = vis ? howmonseen(mtmp) : 0;
1158 /* whether monster is able to use its vision-based capabilities */
1159 monable = !mtmp->mcan && (!mtmp->minvis || perceives(mtmp->data));
1160 mlet = mtmp->data->mlet;
1161 if (mtmp->msleeping) {
1164 pline("%s is too tired to look at your %s.", Monnam(mtmp),
1166 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),
1168 } else if (!mtmp->mcansee) {
1171 pline("%s can't see anything right now.", Monnam(mtmp));
1173 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\89½
\82à
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", Monnam(mtmp));
1174 } else if (invis_mirror && !perceives(mtmp->data)) {
1177 pline("%s fails to notice your %s.", Monnam(mtmp), mirror);
1179 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8bC
\95t
\82©
\82È
\82©
\82Á
\82½
\81D", Monnam(mtmp), mirror);
1180 /* infravision doesn't produce an image in the mirror */
1181 } else if ((how_seen & SEENMON) == MONSEEN_INFRAVIS) {
1182 if (vis) /* (redundant) */
1184 pline("%s is too far away to see %sself in the dark.",
1185 Monnam(mtmp), mhim(mtmp));
1187 pline("%s
\82Í
\88Ã
\88Å
\82Å
\8e©
\95ª
\8e©
\90g
\82ð
\8c©
\82é
\82É
\82Í
\89\93\82·
\82¬
\82é
\81D", Monnam(mtmp));
1189 /* some monsters do special things */
1190 } else if (mlet == S_VAMPIRE || mlet == S_GHOST || is_vampshifter(mtmp)) {
1193 pline("%s doesn't have a reflection.", Monnam(mtmp));
1195 pline("%s
\82Í%s
\82É
\89f
\82ç
\82È
\82¢
\81D", Monnam(mtmp), mirror);
1196 } else if (monable && mtmp->data == &mons[PM_MEDUSA]) {
1198 if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!"))
1200 if (mon_reflects(mtmp, "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81I"))
1204 pline("%s is turned to stone!", Monnam(mtmp));
1206 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1209 } else if (monable && mtmp->data == &mons[PM_FLOATING_EYE]) {
1210 int tmp = d((int) mtmp->m_lev, (int) mtmp->data->mattk[0].damd);
1215 pline("%s is frozen by its reflection.", Monnam(mtmp));
1217 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
1220 You_hear("%s stop moving.", something);
1222 You_hear("
\89½
\82©
\82ª
\93®
\82«
\82ð
\82Æ
\82ß
\82½
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1223 paralyze_monst(mtmp, (int) mtmp->mfrozen + tmp);
1224 } else if (monable && mtmp->data == &mons[PM_UMBER_HULK]) {
1227 pline("%s confuses itself!", Monnam(mtmp));
1229 pline("%s
\82Í
\8d¬
\97\90\82µ
\82½
\81I", Monnam(mtmp));
1231 } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
1232 || mtmp->data == &mons[PM_INCUBUS])) {
1234 char buf[BUFSZ]; /* "She" or "He" */
1237 pline("%s admires %sself in your %s.", Monnam(mtmp), mhim(mtmp),
1240 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\82¤
\82Á
\82Æ
\82è
\82µ
\82½
\81D", Monnam(mtmp));
1243 pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
1245 pline("%s
\82Í
\82»
\82ê
\82ð
\92D
\82Á
\82½
\81I", upstart(strcpy(buf, mhe(mtmp))));
1248 pline("It steals your %s!", mirror);
1250 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\93\90\82ñ
\82¾
\81I", mirror);
1251 setnotworn(obj); /* in case mirror was wielded */
1253 (void) mpickobj(mtmp, obj);
1254 if (!tele_restrict(mtmp))
1255 (void) rloc(mtmp, TRUE);
1256 } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
1257 && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
1260 pline("%s is frightened by its reflection.", Monnam(mtmp));
1262 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\95|
\82ª
\82Á
\82½
\81D", Monnam(mtmp));
1263 monflee(mtmp, d(2, 4), FALSE, FALSE);
1264 } else if (!Blind) {
1265 if (mtmp->minvis && !See_invisible)
1267 else if ((mtmp->minvis && !perceives(mtmp->data))
1268 /* redundant: can't get here if these are true */
1269 || !haseyes(mtmp->data) || notonhead || !mtmp->mcansee)
1271 pline("%s doesn't seem to notice %s reflection.", Monnam(mtmp),
1274 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1278 pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp));
1280 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\96³
\8e\8b\82µ
\82½
\81D", Monnam(mtmp));
1289 register struct obj *obj = *optr;
1291 boolean wakem = FALSE, learno = FALSE,
1292 ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe),
1294 (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy)
1295 && !On_stairs(u.ux, u.uy));
1298 You("ring %s.", the(xname(obj)));
1300 You("%s
\82ð
\96Â
\82ç
\82µ
\82½
\81D", the(xname(obj)));
1302 if (Underwater || (u.uswallow && ordinary)) {
1304 amii_speaker(obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME);
1307 pline("But the sound is muffled.");
1309 pline("
\82µ
\82©
\82µ
\89¹
\82Í
\82©
\82«
\8fÁ
\82³
\82ê
\82½
\81D");
1311 } else if (invoking && ordinary) {
1312 /* needs to be recharged... */
1314 pline("But it makes no sound.");
1316 pline("
\82µ
\82©
\82µ
\81C
\89¹
\82Í
\96Â
\82ç
\82È
\82©
\82Á
\82½
\81D");
1317 learno = TRUE; /* help player figure out why */
1319 } else if (ordinary) {
1321 amii_speaker(obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME);
1323 if (obj->cursed && !rn2(4)
1324 /* note: once any of them are gone, we stop all of them */
1325 && !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE)
1326 && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE)
1327 && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE)
1328 && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT))
1331 You("summon %s!", a_monnam(mtmp));
1333 You("%s
\82ð
\8f¢
\8a«
\82µ
\82½
\81I", a_monnam(mtmp));
1334 if (!obj_resists(obj, 93, 100)) {
1336 pline("%s shattered!", Tobjnam(obj, "have"));
1338 pline("%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81I", xname(obj));
1346 mon_adjust_speed(mtmp, 2, (struct obj *) 0);
1348 case 2: /* no explanation; it just happens... */
1350 multi_reason = NULL;
1358 /* charged Bell of Opening */
1359 consume_obj_charge(obj, TRUE);
1365 pline1(nothing_happens);
1367 } else if (obj->cursed) {
1372 mkundead(&mm, FALSE, NO_MINVENT);
1375 } else if (invoking) {
1377 pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue"));
1379 pline("%s
\82Í
\95s
\8bC
\96¡
\82È
\89s
\82¢
\89¹
\82ð
\8fo
\82µ
\82½
\81D
\81D
\81D", xname(obj));
1381 amii_speaker(obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME);
1387 } else if (obj->blessed) {
1391 amii_speaker(obj, "ahahahDhEhCw", AMII_SOFT_VOLUME);
1396 } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1397 buried_ball_to_freedom();
1403 pline1(nothing_happens);
1407 pline("%s opens...", Something);
1409 pline("
\89½
\82©
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1414 pline("Things open around you...");
1416 pline("
\82Ü
\82í
\82è
\82Ì
\95¨
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1421 } else { /* uncursed */
1423 amii_speaker(obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME);
1428 pline1(nothing_happens);
1431 } /* charged BofO */
1434 makeknown(BELL_OF_OPENING);
1442 use_candelabrum(obj)
1443 register struct obj *obj;
1445 #if 0 /*JP*//* not used */
1446 const char *s = (obj->spe != 1) ? "candles" : "candle";
1451 You("snuff the %s.", s);
1453 You("
\82ë
\82¤
\82»
\82
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1454 end_burn(obj, TRUE);
1457 if (obj->spe <= 0) {
1459 pline("This %s has no %s.", xname(obj), s);
1461 pline("
\82±
\82Ì%s
\82É
\82Í
\82ë
\82¤
\82»
\82
\82ª
\82È
\82¢
\81D", xname(obj));
1466 You("cannot make fire under water.");
1468 You("
\90\85\92\86\82Å
\89Î
\82ð
\82¨
\82±
\82¹
\82È
\82¢
\81D");
1471 if (u.uswallow || obj->cursed) {
1474 pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"),
1477 pline("
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\82µ
\82Î
\82ç
\82
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D");
1483 There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s,
1486 pline("%s
\82É
\82Í
\82½
\82Á
\82½%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82µ
\82©
\82È
\82¢
\81D",
1487 xname(obj), obj->spe);
1491 pline("%s lit. %s dimly.", obj->spe == 1 ? "It is" : "They are",
1492 Tobjnam(obj, "shine"));
1494 pline("%s
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s
\82Í
\82Ù
\82Ì
\82©
\82É
\8bP
\82¢
\82½
\81D",
1495 xname(obj), xname(obj));
1499 pline("%s's %s burn%s", The(xname(obj)), s,
1500 (Blind ? "." : " brightly!"));
1502 pline("%s
\82Ì
\82ë
\82¤
\82»
\82
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I", The(xname(obj)),
1503 (Blind ? "" : "
\96¾
\82é
\82"));
1506 if (!invocation_pos(u.ux, u.uy) || On_stairs(u.ux, u.uy)) {
1508 pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
1510 pline("
\82ë
\82¤
\82»
\82
\82Í
\82·
\82²
\82¢
\91¬
\82³
\82Å
\94R
\82¦
\8en
\82ß
\82½
\81I");
1511 /* this used to be obj->age /= 2, rounding down; an age of
1512 1 would yield 0, confusing begin_burn() and producing an
1513 unlightable, unrefillable candelabrum; round up instead */
1514 obj->age = (obj->age + 1L) / 2L;
1516 if (obj->spe == 7) {
1519 pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
1521 pline("
\8aï
\96
\82È
\92g
\82©
\82³
\82ð%s
\82É
\8a´
\82¶
\82½
\81I", xname(obj));
1524 pline("%s with a strange light!", Tobjnam(obj, "glow"));
1526 pline("%s
\82Í
\8aï
\96
\82È
\8cõ
\82ð
\94
\82µ
\82Ä
\82¢
\82é
\81I", xname(obj));
1530 begin_burn(obj, FALSE);
1537 register struct obj *obj = *optr;
1538 register struct obj *otmp;
1540 const char *s = (obj->quan != 1) ? "candles" : "candle";
1542 const char *s = "
\82ë
\82¤
\82»
\82";
1543 char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
1550 otmp = carrying(CANDELABRUM_OF_INVOCATION);
1551 if (!otmp || otmp->spe == 7) {
1556 /*JP:
\8dÅ
\8fI
\93I
\82É
\82Í
\81u
\82ë
\82¤
\82»
\82
\82ð
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1557 /* first, minimal candelabrum suffix for formatting candles */
1559 Sprintf(qsfx, " to\033%s?", thesimpleoname(otmp));
1561 Sprintf(qsfx, "
\82ð\033%s
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", thesimpleoname(otmp));
1562 /* next, format the candles as a prefix for the candelabrum */
1564 (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1566 (void) safe_qbuf(qbuf, "", qsfx, obj, xname, thesimpleoname, s);
1567 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð\033
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1568 /* strip temporary candelabrum suffix */
1570 if ((q = strstri(qbuf, " to\033")) != 0)
1573 if ((q = strchr(qbuf, '\033')) != 0)
1575 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð
\81v*/
1577 /* last, format final "attach candles to candelabrum?" query */
1579 if (yn(safe_qbuf(qbuf, qbuf, "?", otmp, yname, thesimpleoname, "it"))
1581 if (yn(safe_qbuf(qbuf, qbuf, "
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", otmp, xname, thesimpleoname, "
\82»
\82ê"))
1586 if ((long) otmp->spe + obj->quan > 7L) {
1587 obj = splitobj(obj, 7L - (long) otmp->spe);
1588 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
1589 /* avoid a grammatical error if obj->quan gets
1590 reduced to 1 candle from more than one */
1591 s = (obj->quan != 1) ? "candles" : "candle";
1596 You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
1599 You("%ld
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ð%s%s
\82Ö
\8eæ
\82è
\82Â
\82¯
\82½
\81D",
1600 obj->quan, !otmp->spe ? "" : "
\82³
\82ç
\82É",
1603 if (!otmp->spe || otmp->age > obj->age)
1604 otmp->age = obj->age;
1605 otmp->spe += (int) obj->quan;
1606 if (otmp->lamplit && !obj->lamplit)
1608 pline_The("new %s magically %s!", s, vtense(s, "ignite"));
1610 pline("
\90V
\82µ
\82¢
\82ë
\82¤
\82»
\82
\82Í
\95s
\8ev
\8bc
\82È
\89\8a\82ð
\82 \82°
\82½
\81I");
1611 else if (!otmp->lamplit && obj->lamplit)
1613 pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
1615 pline("
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D");
1618 verbalize("You %s %s, you bought %s!",
1619 otmp->lamplit ? "burn" : "use",
1620 (obj->quan > 1L) ? "them" : "it",
1621 (obj->quan > 1L) ? "them" : "it");
1623 verbalize("
\89Î
\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1625 if (obj->quan < 7L && otmp->spe == 7)
1627 pline("%s now has seven%s candles attached.", The(xname(otmp)),
1628 otmp->lamplit ? " lit" : "");
1630 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",
1631 The(xname(otmp)), otmp->lamplit ? "
\89Î
\82Ì
\82Â
\82¢
\82½" : "");
1633 /* candelabrum's light range might increase */
1635 obj_merge_light_sources(otmp, otmp);
1636 /* candles are no longer a separate light source */
1638 end_burn(obj, TRUE);
1639 /* candles are now gone */
1644 /* call in drop, throw, and put in box, etc. */
1649 boolean candle = Is_candle(otmp);
1651 if ((candle || otmp->otyp == CANDELABRUM_OF_INVOCATION)
1655 #if 0 /*JP*//* not used */
1656 boolean many = candle ? (otmp->quan > 1L) : (otmp->spe > 1);
1659 (void) get_obj_location(otmp, &x, &y, 0);
1660 if (otmp->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1662 pline("%s%scandle%s flame%s extinguished.", Shk_Your(buf, otmp),
1663 (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"),
1664 (many ? "s are" : " is"));
1666 pline("%s%s
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, otmp),
1667 candle ? "" : "
\90C
\91ä
\82Ì");
1669 end_burn(otmp, TRUE);
1675 /* called when lit lamp is hit by water or put into a container or
1676 you've been swallowed by a monster; obj might be in transit while
1677 being thrown or dropped so don't assume that its location is valid */
1685 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1686 || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
1687 (void) get_obj_location(obj, &x, &y, 0);
1688 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1690 pline("%s %s out!", Yname2(obj), otense(obj, "go"));
1692 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", Yname2(obj));
1693 end_burn(obj, TRUE);
1696 if (snuff_candle(obj))
1702 /* Called when potentially lightable object is affected by fire_damage().
1703 Return TRUE if object was lit and FALSE otherwise --ALI */
1710 if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) {
1711 if ((obj->otyp == MAGIC_LAMP
1712 || obj->otyp == CANDELABRUM_OF_INVOCATION) && obj->spe == 0)
1714 else if (obj->otyp != MAGIC_LAMP && obj->age == 0)
1716 if (!get_obj_location(obj, &x, &y, 0))
1718 if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed)
1720 if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1721 || obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2))
1723 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1725 pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
1727 pline("%s
\82Ì
\96¾
\82©
\82è
\82ª
\82Â
\82¢
\82½
\81I", Yname2(obj));
1728 if (obj->otyp == POT_OIL)
1729 makeknown(obj->otyp);
1730 if (carried(obj) && obj->unpaid && costly_spot(u.ux, u.uy)) {
1731 /* if it catches while you have it, then it's your tough luck */
1734 verbalize("That's in addition to the cost of %s %s, of course.",
1735 yname(obj), obj->quan == 1L ? "itself" : "themselves");
1737 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ%s
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D", xname(obj));
1739 bill_dummy_object(obj);
1741 begin_burn(obj, FALSE);
1754 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1755 || obj->otyp == BRASS_LANTERN)
1757 pline("%slamp is now off.", Shk_Your(buf, obj));
1759 pline("%s
\83\89\83\93\83v
\82Ì
\93\94\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, obj));
1762 You("snuff out %s.", yname(obj));
1764 You("%s
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D", xname(obj));
1765 end_burn(obj, TRUE);
1770 pline(!Is_candle(obj) ? "This is not a diving lamp"
1771 : "Sorry, fire and water don't mix.");
1773 pline(!Is_candle(obj) ? "
\82±
\82ê
\82Í
\90ö
\90\85\97p
\82Ì
\83\89\83\93\83v
\82¶
\82á
\82È
\82¢
\81D"
1774 : "
\8ec
\94O
\82È
\82ª
\82ç
\81C
\89Î
\82Æ
\90\85\82Í
\82Ü
\82´
\82ç
\82È
\82¢
\81D");
1778 /* magic lamps with an spe == 0 (wished for) cannot be lit */
1779 if ((!Is_candle(obj) && obj->age == 0)
1780 || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
1781 if (obj->otyp == BRASS_LANTERN)
1783 Your("lamp has run out of power.");
1785 Your("
\83\89\83\93\83v
\82Ì
\93d
\97Í
\82ð
\8eg
\82¢
\90Ø
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1788 pline("This %s has no oil.", xname(obj));
1790 pline("
\82±
\82Ì%s
\82É
\82Í
\82à
\82¤
\83I
\83C
\83\8b\82ª
\82È
\82¢
\81D", xname(obj));
1793 if (obj->cursed && !rn2(2)) {
1796 pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"),
1797 otense(obj, "die"));
1799 pline("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D",
1803 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1804 || obj->otyp == BRASS_LANTERN) {
1807 pline("%slamp is now on.", Shk_Your(buf, obj));
1809 pline("%s
\83\89\83\93\83v
\82É
\93\94\82ª
\93\94\82Á
\82½
\81D", Shk_Your(buf, obj));
1810 } else { /* candle(s) */
1812 pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan),
1813 otense(obj, "burn"), Blind ? "." : " brightly!");
1815 pline("%s
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I",
1816 xname(obj), Blind ? "" : "
\96¾
\82é
\82");
1818 if (obj->unpaid && costly_spot(u.ux, u.uy)
1819 && obj->age == 20L * (long) objects[obj->otyp].oc_cost) {
1821 const char *ithem = (obj->quan > 1L) ? "them" : "it";
1823 verbalize("You burn %s, you bought %s!", ithem, ithem);
1825 verbalize("
\93\94\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1827 bill_dummy_object(obj);
1830 begin_burn(obj, FALSE);
1836 struct obj *obj; /* obj is a potion of oil */
1848 You("snuff the lit potion.");
1850 You("
\96û
\95r
\82Ì
\89Î
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1851 end_burn(obj, TRUE);
1853 * Free & add to re-merge potion. This will average the
1854 * age of the potions. Not exactly the best solution,
1860 } else if (Underwater) {
1862 There("is not enough oxygen to sustain a fire.");
1864 pline("
\89Î
\82ð
\82Â
\82¯
\82é
\82Ì
\82É
\8f\
\95ª
\82È
\8e_
\91f
\82ª
\82È
\82¢
\81D");
1868 split1off = (obj->quan > 1L);
1870 obj = splitobj(obj, 1L);
1873 You("light %spotion.%s", shk_your(buf, obj),
1874 Blind ? "" : " It gives off a dim light.");
1876 You("%s
\96û
\95r
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s", shk_your(buf, obj),
1877 Blind ? "" : "
\96û
\95r
\82Í
\88Ã
\82¢
\8cõ
\82ð
\82Í
\82È
\82Á
\82½
\81D");
1880 if (obj->unpaid && costly_spot(u.ux, u.uy)) {
1881 /* Normally, we shouldn't both partially and fully charge
1882 * for an item, but (Yendorian Fuel) Taxes are inevitable...
1886 verbalize("That's in addition to the cost of the potion, of course.");
1888 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ
\96û
\95r
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D");
1889 bill_dummy_object(obj);
1891 makeknown(obj->otyp);
1893 begin_burn(obj, FALSE); /* after shop billing */
1895 obj_extract_self(obj); /* free from inv */
1898 obj = hold_another_object(obj, "You drop %s!", doname(obj),
1900 obj = hold_another_object(obj, "
\82 \82È
\82½
\82Í%s
\82ð
\97\8e\82µ
\82½
\81I", doname(obj),
1907 static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 };
1912 struct obj *obj = getobj(cuddly, "rub");
1914 if (obj && obj->oclass == GEM_CLASS) {
1915 if (is_graystone(obj)) {
1920 pline("Sorry, I don't know how to use that.");
1922 pline("
\8ec
\94O
\81D
\8eg
\82¢
\95û
\82ª
\82í
\82©
\82ç
\82È
\82¢
\81D");
1927 if (!obj || !wield_tool(obj, "rub"))
1930 /* now uwep is obj */
1931 if (uwep->otyp == MAGIC_LAMP) {
1932 if (uwep->spe > 0 && !rn2(3)) {
1933 check_unpaid_usage(uwep, TRUE); /* unusual item use */
1934 /* bones preparation: perform the lamp transformation
1935 before releasing the djinni in case the latter turns out
1936 to be fatal (a hostile djinni has no chance to attack yet,
1937 but an indebted one who grants a wish might bestow an
1938 artifact which blasts the hero with lethal results) */
1939 uwep->otyp = OIL_LAMP;
1940 uwep->spe = 0; /* for safety */
1941 uwep->age = rn1(500, 1000);
1943 begin_burn(uwep, TRUE);
1944 djinni_from_bottle(uwep);
1945 makeknown(MAGIC_LAMP);
1947 } else if (rn2(2)) {
1949 You("%s smoke.", !Blind ? "see a puff of" : "smell");
1951 pline("
\82¯
\82Þ
\82è%s
\81D", !Blind ? "
\82ª
\95\91\82¢
\82 \82ª
\82Á
\82½" : "
\82Ì
\93õ
\82¢
\82ª
\82µ
\82½");
1953 pline1(nothing_happens);
1954 } else if (obj->otyp == BRASS_LANTERN) {
1955 /* message from Adventure */
1957 pline("Rubbing the electric lamp is not particularly rewarding.");
1959 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");
1961 pline("Anyway, nothing exciting happens.");
1963 pline("
\82â
\82Á
\82Ï
\82è
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
1965 pline1(nothing_happens);
1977 is_valid_jump_pos(x, y, magic, showmsg)
1981 if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(x, y) != 5) {
1982 /* The Knight jumping restriction still applies when riding a
1983 * horse. After all, what shape is the knight piece in chess?
1987 pline("Illegal move!");
1989 pline("
\82»
\82Ì
\88Ú
\93®
\82Í
\8cj
\94n
\92µ
\82Ñ
\82¶
\82á
\82È
\82¢
\81I");
1991 } else if (distu(x, y) > (magic ? 6 + magic * 3 : 9)) {
1996 pline("
\89\93\82·
\82¬
\82é
\81I");
1998 } else if (!cansee(x, y)) {
2001 You("cannot see where to land!");
2003 You("
\92\85\92n
\93_
\82ª
\8c©
\82¦
\82È
\82¢
\81I");
2005 } else if (!isok(x, y)) {
2008 You("cannot jump there!");
2010 You("
\82»
\82±
\82É
\82Í
\94ò
\82×
\82È
\82¢
\81I");
2016 static int jumping_is_magic;
2019 display_jump_positions(state)
2023 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
2024 } else if (state == 1) {
2027 for (dx = -4; dx <= 4; dx++)
2028 for (dy = -4; dy <= 4; dy++) {
2029 x = dx + (int) u.ux;
2030 y = dy + (int) u.uy;
2031 if (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
2032 && is_valid_jump_pos(x, y, jumping_is_magic, FALSE))
2036 tmp_at(DISP_END, 0);
2042 int magic; /* 0=Physical, otherwise skill level */
2046 if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
2047 /* normally (nolimbs || slithy) implies !Jumping,
2048 but that isn't necessarily the case for knights */
2050 You_cant("jump; you have no legs!");
2052 pline("
\91«
\82ª
\96³
\82
\82Ä
\82Í
\92µ
\82×
\82È
\82¢
\81I");
2054 } else if (!magic && !Jumping) {
2056 You_cant("jump very far.");
2058 You_cant("
\82»
\82ñ
\82È
\89\93\82
\82Ü
\82Å
\92µ
\82×
\82È
\82¢
\81D");
2060 /* if steed is immobile, can't do physical jump but can do spell one */
2061 } else if (!magic && u.usteed && stucksteed(FALSE)) {
2062 /* stucksteed gave "<steed> won't move" message */
2064 } else if (u.uswallow) {
2067 You("bounce around a little.");
2069 pline("
\94½
\93®
\82ð
\82Â
\82¯
\82½
\81D");
2073 pline("You've got to be kidding!");
2075 pline("
\8fç
\92k
\82Í
\82æ
\82µ
\82±
\82³
\82ñ
\81I");
2077 } else if (u.uinwater) {
2080 You("swish around a little.");
2082 pline("
\83X
\83C
\83X
\83C
\82Æ
\89j
\82¢
\82¾
\81D");
2086 pline("This calls for swimming, not jumping!");
2088 pline("
\82»
\82ê
\82Í
\81w
\89j
\82®
\81x
\82Å
\82 \82Á
\82Ä
\81C
\81w
\92µ
\82Ô
\81x
\82¶
\82á
\82È
\82¢
\81I");
2090 } else if (u.ustuck) {
2091 if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
2093 You("pull free from %s.", mon_nam(u.ustuck));
2095 You("%s
\82©
\82ç
\97£
\82ê
\82½
\81D", mon_nam(u.ustuck));
2101 You("writhe a little in the grasp of %s!", mon_nam(u.ustuck));
2103 You("%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\83W
\83^
\83o
\83^
\82µ
\82½
\81I", mon_nam(u.ustuck));
2107 You("cannot escape from %s!", mon_nam(u.ustuck));
2109 You("%s
\82©
\82ç
\93¦
\82ê
\82ç
\82ê
\82È
\82¢
\81I", mon_nam(u.ustuck));
2111 } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
2114 You("flail around a little.");
2116 You("
\83o
\83^
\83o
\83^
\92µ
\82ñ
\82¾
\81D");
2120 You("don't have enough traction to jump.");
2122 You("
\92µ
\82Ô
\82½
\82ß
\82Ì
\94½
\93®
\82ª
\82Â
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
2124 } else if (!magic && near_capacity() > UNENCUMBERED) {
2126 You("are carrying too much to jump!");
2128 You("
\82½
\82
\82³
\82ñ
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\92µ
\82×
\82È
\82¢
\81I");
2130 } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
2132 You("lack the strength to jump!");
2134 You("
\92µ
\82Ô
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I");
2136 } else if (!magic && Wounded_legs) {
2137 long wl = (Wounded_legs & BOTH_SIDES);
2138 const char *bp = body_part(LEG);
2140 if (wl == BOTH_SIDES)
2141 bp = makeplural(bp);
2144 pline("%s is in no shape for jumping.", Monnam(u.usteed));
2146 pline("%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D", Monnam(u.usteed));
2149 Your("%s%s %s in no shape for jumping.",
2150 (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right "
2152 bp, (wl == BOTH_SIDES) ? "are" : "is");
2154 Your("%s%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D",
2155 (wl == LEFT_SIDE) ? "
\8d¶" :
2156 (wl == RIGHT_SIDE) ? "
\89E" : "", bp);
2159 } else if (u.usteed && u.utrap) {
2161 pline("%s is stuck in a trap.", Monnam(u.usteed));
2163 pline("%s
\82Íã©
\82É
\82Ð
\82Á
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", Monnam(u.usteed));
2168 pline("Where do you want to jump?");
2170 pline("
\82Ç
\82±
\82É
\92µ
\82Ñ
\82Ü
\82·
\82©
\81H");
2173 jumping_is_magic = magic;
2174 getpos_sethilite(display_jump_positions);
2176 if (getpos(&cc, TRUE, "the desired position") < 0)
2178 if (getpos(&cc, TRUE, "
\92µ
\82Ñ
\82½
\82¢
\8fê
\8f\8a") < 0)
2179 return 0; /* user pressed ESC */
2180 if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
2187 switch (u.utraptype) {
2189 long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
2192 You("rip yourself free of the bear trap! Ouch!");
2194 You("
\8e©
\95ª
\82ð
\8cF
\82Ìã©
\82©
\82ç
\82Ð
\82«
\82Í
\82ª
\82µ
\82½
\81C
\82¢
\82Ä
\82Á
\81I");
2196 losehp(Maybe_Half_Phys(rnd(10)), "jumping out of a bear trap",
2198 losehp(Maybe_Half_Phys(rnd(10)), "
\8cF
\82Ìã©
\82©
\82ç
\94ò
\82Ñ
\8fo
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2200 set_wounded_legs(side, rn1(1000, 500));
2205 You("leap from the pit!");
2207 You("
\97\8e\82µ
\8c\8a\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2211 You("tear the web apart as you pull yourself free!");
2213 You("
\82
\82à
\82Ì
\91\83\82ð
\88ø
\82«
\97ô
\82«
\81C
\8e©
\97R
\82É
\82È
\82Á
\82½
\81I");
2214 deltrap(t_at(u.ux, u.uy));
2218 You("pull yourself above the lava!");
2220 You("
\97n
\8aâ
\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2226 You("strain your %s, but you're still %s.",
2227 makeplural(body_part(LEG)),
2228 (u.utraptype == TT_INFLOOR)
2229 ? "stuck in the floor"
2230 : "attached to the buried ball");
2232 You("%s
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\82ª
\81C
\82 \82È
\82½
\82Í
\82Ü
\82¾%s
\81D",
2233 makeplural(body_part(LEG)),
2234 (u.utraptype == TT_INFLOOR)
2235 ? "
\8f°
\82É
\82¤
\82Ü
\82Á
\82Ä
\82¢
\82é"
2236 : "
\82¤
\82Ü
\82Á
\82½
\8b\85\82Æ
\82Â
\82È
\82ª
\82Á
\82Ä
\82¢
\82é");
2238 set_wounded_legs(LEFT_SIDE, rn1(10, 11));
2239 set_wounded_legs(RIGHT_SIDE, rn1(10, 11));
2244 * Check the path from uc to cc, calling hurtle_step at each
2245 * location. The final position actually reached will be
2250 /* calculate max(abs(dx), abs(dy)) as the range */
2251 range = cc.x - uc.x;
2259 (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t) &range);
2260 teleds(cc.x, cc.y, TRUE);
2264 multi_reason = "jumping around";
2266 multi_reason = "
\92µ
\82Ë
\89ñ
\82Á
\82Ä
\82¢
\82é
\8e\9e\82É";
2268 morehungry(rnd(25));
2279 if (!mons[corpse->corpsenm].cnutrit)
2285 use_tinning_kit(obj)
2288 struct obj *corpse, *can;
2290 /* This takes only 1 move. If this is to be changed to take many
2291 * moves, we've got to deal with decaying corpses...
2293 if (obj->spe <= 0) {
2295 You("seem to be out of tins.");
2297 pline("
\8aÊ
\8bl
\82ð
\8dì
\82é
\82½
\82ß
\82Ì
\8aÊ
\82ª
\90Ø
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
2301 if (!(corpse = floorfood("tin", 2)))
2303 if (!(corpse = floorfood("
\8aÊ
\8bl
\82ß
\82É
\82·
\82é", 2)))
2305 if (corpse->oeaten) {
2307 You("cannot tin %s which is partly eaten.", something);
2309 You("
\90H
\82×
\82©
\82¯
\82Ì
\82à
\82Ì
\82ð
\8aÊ
\8bl
\82É
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2312 if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance
2316 if (poly_when_stoned(youmonst.data))
2318 You("tin %s without wearing gloves.",
2319 an(mons[corpse->corpsenm].mname));
2321 You("
\8f¬
\8eè
\82È
\82µ
\82Å%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
2322 mons[corpse->corpsenm].mname);
2326 pline("Tinning %s without wearing gloves is a fatal mistake...",
2327 an(mons[corpse->corpsenm].mname));
2329 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",
2330 mons[corpse->corpsenm].mname);
2333 Sprintf(kbuf, "trying to tin %s without gloves",
2334 an(mons[corpse->corpsenm].mname));
2336 Sprintf(kbuf, "
\8f¬
\8eè
\82ð
\82Â
\82¯
\82¸
\82É%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2337 mons[corpse->corpsenm].mname);
2342 if (is_rider(&mons[corpse->corpsenm])) {
2343 if (revive_corpse(corpse))
2345 verbalize("Yes... But War does not preserve its enemies...");
2347 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");
2350 pline_The("corpse evades your grasp.");
2352 pline("
\8e\80\91Ì
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82ð
\93¦
\82ê
\82½
\81D");
2355 if (mons[corpse->corpsenm].cnutrit == 0) {
2357 pline("That's too insubstantial to tin.");
2359 pline("
\8eÀ
\91Ì
\82ª
\82È
\82¢
\82Ì
\82Å
\8aÊ
\8bl
\82É
\82Å
\82«
\82È
\82¢
\81D");
2362 consume_obj_charge(obj, TRUE);
2364 if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
2366 static const char you_buy_it[] = "You tin it, you bought it!";
2368 static const char you_buy_it[] = "
\8aÊ
\8bl
\82É
\82µ
\82½
\82Ì
\82È
\82ç
\94\83\82Á
\82Ä
\82à
\82ç
\82¤
\82æ
\81I";
2370 can->corpsenm = corpse->corpsenm;
2371 can->cursed = obj->cursed;
2372 can->blessed = obj->blessed;
2373 can->owt = weight(can);
2375 /* Mark tinned tins. No spinach allowed... */
2376 set_tin_variety(can, HOMEMADE_TIN);
2377 if (carried(corpse)) {
2379 verbalize(you_buy_it);
2382 if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
2383 verbalize(you_buy_it);
2387 can = hold_another_object(can, "You make, but cannot pick up, %s.",
2389 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",
2390 doname(can), (const char *) 0);
2392 impossible("Tinning failed.");
2396 use_unicorn_horn(obj)
2399 #define PROP_COUNT 7 /* number of properties we're dealing with */
2400 #define ATTR_COUNT (A_MAX * 3) /* number of attribute points we might fix */
2401 int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop,
2403 int trouble_list[PROP_COUNT + ATTR_COUNT];
2405 if (obj && obj->cursed) {
2406 long lcount = (long) rn1(90, 10);
2408 switch (rn2(13) / 2) { /* case 6 is half as likely as the others */
2410 make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L
2411 : (long) rn1(ACURR(A_CON), 20),
2412 xname(obj), TRUE, SICK_NONVOMITABLE);
2415 make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
2420 You("suddenly feel %s.",
2421 Hallucination ? "trippy" : "confused");
2423 You("
\93Ë
\91R%s
\81D",
2424 Hallucination ? "
\82Ö
\82ë
\82Ö
\82ë
\82É
\82È
\82Á
\82½" : "
\8d¬
\97\90\82µ
\82½");
2426 make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
2429 make_stunned((HStun & TIMEOUT) + lcount, TRUE);
2432 (void) adjattrib(rn2(A_MAX), -1, FALSE);
2435 (void) make_hallucinated((HHallucination & TIMEOUT) + lcount,
2439 if (Deaf) /* make_deaf() won't give feedback when already deaf */
2441 pline("Nothing seems to happen.");
2443 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2444 make_deaf((HDeaf & TIMEOUT) + lcount, TRUE);
2451 * Entries in the trouble list use a very simple encoding scheme.
2453 #define prop2trbl(X) ((X) + A_MAX)
2454 #define attr2trbl(Y) (Y)
2455 #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
2456 #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
2457 #define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
2459 trouble_count = unfixable_trbl = did_prop = did_attr = 0;
2461 /* collect property troubles */
2462 if (TimedTrouble(Sick))
2464 if (TimedTrouble(Blinded) > (long) u.ucreamed
2466 && attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
2467 prop_trouble(BLINDED);
2468 if (TimedTrouble(HHallucination))
2469 prop_trouble(HALLUC);
2470 if (TimedTrouble(Vomiting))
2471 prop_trouble(VOMITING);
2472 if (TimedTrouble(HConfusion))
2473 prop_trouble(CONFUSION);
2474 if (TimedTrouble(HStun))
2475 prop_trouble(STUNNED);
2476 if (TimedTrouble(HDeaf))
2479 unfixable_trbl = unfixable_trouble_count(TRUE);
2481 /* collect attribute troubles */
2482 for (idx = 0; idx < A_MAX; idx++) {
2483 if (ABASE(idx) >= AMAX(idx))
2485 val_limit = AMAX(idx);
2486 /* don't recover strength lost from hunger */
2487 if (idx == A_STR && u.uhs >= WEAK)
2490 /* potion/spell of restore ability override sustain ability
2491 intrinsic but unicorn horn usage doesn't */
2492 unfixable_trbl += val_limit - ABASE(idx);
2495 /* don't recover more than 3 points worth of any attribute */
2496 if (val_limit > ABASE(idx) + 3)
2497 val_limit = ABASE(idx) + 3;
2499 for (val = ABASE(idx); val < val_limit; val++)
2501 /* keep track of unfixed trouble, for message adjustment below */
2502 unfixable_trbl += (AMAX(idx) - val_limit);
2505 if (trouble_count == 0) {
2506 pline1(nothing_happens);
2508 } else if (trouble_count > 1) { /* shuffle */
2511 for (i = trouble_count - 1; i > 0; i--)
2512 if ((j = rn2(i + 1)) != i) {
2513 k = trouble_list[j];
2514 trouble_list[j] = trouble_list[i];
2515 trouble_list[i] = k;
2520 * Chances for number of troubles to be fixed
2522 * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8%
2523 * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0
2525 val_limit = rn2(d(2, (obj && obj->blessed) ? 4 : 2));
2526 if (val_limit > trouble_count)
2527 val_limit = trouble_count;
2529 /* fix [some of] the troubles */
2530 for (val = 0; val < val_limit; val++) {
2531 idx = trouble_list[val];
2534 case prop2trbl(SICK):
2535 make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2538 case prop2trbl(BLINDED):
2539 make_blinded((long) u.ucreamed, TRUE);
2542 case prop2trbl(HALLUC):
2543 (void) make_hallucinated(0L, TRUE, 0L);
2546 case prop2trbl(VOMITING):
2547 make_vomiting(0L, TRUE);
2550 case prop2trbl(CONFUSION):
2551 make_confused(0L, TRUE);
2554 case prop2trbl(STUNNED):
2555 make_stunned(0L, TRUE);
2558 case prop2trbl(DEAF):
2559 make_deaf(0L, TRUE);
2563 if (idx >= 0 && idx < A_MAX) {
2567 panic("use_unicorn_horn: bad trouble? (%d)", idx);
2574 pline("This makes you feel %s!",
2575 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2579 pline("
\8bC
\95ª
\82ª%s
\82æ
\82
\82È
\82Á
\82½
\81I",
2580 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2586 pline("Nothing seems to happen.");
2588 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2590 context.botl = (did_attr || did_prop);
2601 * Timer callback routine: turn figurine into monster
2604 fig_transform(arg, timeout)
2608 struct obj *figurine = arg->a_obj;
2611 boolean cansee_spot, silent, okay_spot;
2612 boolean redraw = FALSE;
2613 boolean suppress_see = FALSE;
2614 char monnambuf[BUFSZ], carriedby[BUFSZ];
2617 debugpline0("null figurine in fig_transform()");
2620 silent = (timeout != monstermoves); /* happened while away */
2621 okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0);
2622 if (figurine->where == OBJ_INVENT || figurine->where == OBJ_MINVENT)
2623 okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]);
2624 if (!okay_spot || !figurine_location_checks(figurine, &cc, TRUE)) {
2625 /* reset the timer to try again later */
2626 (void) start_timer((long) rnd(5000), TIMER_OBJECT, FIG_TRANSFORM,
2627 obj_to_any(figurine));
2631 cansee_spot = cansee(cc.x, cc.y);
2632 mtmp = make_familiar(figurine, cc.x, cc.y, TRUE);
2634 char and_vanish[BUFSZ];
2635 struct obj *mshelter = level.objects[mtmp->mx][mtmp->my];
2636 Sprintf(monnambuf, "%s", an(m_monnam(mtmp)));
2638 /*JP:TODO:and_vanish
\82Í
\96¢
\8f\88\97\9d*/
2639 and_vanish[0] = '\0';
2640 if ((mtmp->minvis && !See_invisible)
2641 || (mtmp->data->mlet == S_MIMIC
2642 && mtmp->m_ap_type != M_AP_NOTHING))
2643 suppress_see = TRUE;
2645 if (mtmp->mundetected) {
2646 if (hides_under(mtmp->data) && mshelter) {
2647 Sprintf(and_vanish, " and %s under %s",
2648 locomotion(mtmp->data, "crawl"), doname(mshelter));
2649 } else if (mtmp->data->mlet == S_MIMIC
2650 || mtmp->data->mlet == S_EEL) {
2651 suppress_see = TRUE;
2653 Strcpy(and_vanish, " and vanish");
2656 switch (figurine->where) {
2658 if (Blind || suppress_see)
2660 You_feel("%s %s from your pack!", something,
2661 locomotion(mtmp->data, "drop"));
2663 You_feel("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82æ
\82¤
\82¾
\81I", something,
2664 jpast(locomotion(mtmp->data, "
\97\8e\82¿
\82é")));
2668 You_see("%s %s out of your pack%s!", monnambuf,
2669 locomotion(mtmp->data, "drop"), and_vanish);
2671 You("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2672 jpast(locomotion(mtmp->data,"
\97\8e\82¿
\82é")));
2677 if (cansee_spot && !silent) {
2680 pline("%s suddenly vanishes!", an(xname(figurine)));
2682 pline("%s
\82Í
\93Ë
\91R
\8fÁ
\82¦
\82½
\81I", xname(figurine));
2685 You_see("a figurine transform into %s%s!", monnambuf,
2688 You("
\90l
\8c`
\82ª
\93Ë
\91R%s
\82É
\82È
\82Á
\82½
\82Ì
\82ð
\8c©
\82½
\81I",
2691 redraw = TRUE; /* update figurine's map location */
2696 if (cansee_spot && !silent && !suppress_see) {
2698 mon = figurine->ocarry;
2699 /* figurine carrying monster might be invisible */
2700 if (canseemon(figurine->ocarry)) {
2702 Sprintf(carriedby, "%s pack", s_suffix(a_monnam(mon)));
2704 Sprintf(carriedby, "%s
\82Ì
\8a\93", s_suffix(a_monnam(mon)));
2705 } else if (is_pool(mon->mx, mon->my))
2707 Strcpy(carriedby, "empty water");
2709 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\90\85\92\86");
2712 Strcpy(carriedby, "thin air");
2714 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\8bó
\92\86");
2716 You_see("%s %s out of %s%s!", monnambuf,
2717 locomotion(mtmp->data, "drop"), carriedby,
2720 You("%s
\82ª%s
\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2721 carriedby, locomotion(mtmp->data, "
\97\8e\82¿
\82é"));
2731 impossible("figurine came to life where? (%d)",
2732 (int) figurine->where);
2736 /* free figurine now */
2737 if (carried(figurine)) {
2740 obj_extract_self(figurine);
2741 obfree(figurine, (struct obj *) 0);
2748 figurine_location_checks(obj, cc, quietly)
2755 if (carried(obj) && u.uswallow) {
2758 You("don't have enough room in here.");
2760 pline("
\82±
\82±
\82É
\82Í
\8f\
\95ª
\82È
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
2763 x = cc ? cc->x : u.ux;
2764 y = cc ? cc->y : u.uy;
2768 You("cannot put the figurine there.");
2770 You("
\82±
\82±
\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81D");
2773 if (IS_ROCK(levl[x][y].typ)
2774 && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x, y))) {
2777 You("cannot place a figurine in %s!",
2778 IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock");
2780 You("%s
\82Ì
\92\86\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81I",
2781 IS_TREE(levl[x][y].typ) ? "
\96Ø" : "
\8cÅ
\82¢
\90Î");
2785 if (sobj_at(BOULDER, x, y) && !passes_walls(&mons[obj->corpsenm])
2786 && !throws_rocks(&mons[obj->corpsenm])) {
2789 You("cannot fit the figurine on the boulder.");
2791 You("
\8aâ
\82É
\90l
\8c`
\82ð
\89\9f\82µ
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2801 register struct obj *obj = *optr;
2806 /* can't activate a figurine while swallowed */
2807 if (!figurine_location_checks(obj, (coord *) 0, FALSE))
2810 if (!getdir((char *) 0)) {
2811 context.move = multi = 0;
2818 /* Passing FALSE arg here will result in messages displayed */
2819 if (!figurine_location_checks(obj, &cc, FALSE))
2822 You("%s and it transforms.",
2823 (u.dx || u.dy) ? "set the figurine beside you"
2824 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
2825 || is_pool(cc.x, cc.y))
2826 ? "release the figurine"
2827 : (u.dz < 0 ? "toss the figurine into the air"
2828 : "set the figurine on the ground"));
2830 You("%s
\81D
\82·
\82é
\82Æ
\82»
\82ê
\82Í
\95Ï
\8c`
\82µ
\82½
\81D",
2831 (u.dx || u.dy) ? "
\82»
\82Î
\82É
\90l
\8c`
\82ð
\92u
\82¢
\82½"
2832 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
2833 || is_pool(cc.x, cc.y))
2834 ? "
\90l
\8c`
\82ð
\95ú
\82Á
\82½"
2835 : (u.dz < 0 ? "
\90l
\8c`
\82ð
\8bó
\92\86\82É
\93\8a\82°
\82½"
2836 : "
\90l
\8c`
\82ð
\92n
\96Ê
\82É
\92u
\82¢
\82½"));
2838 (void) make_familiar(obj, cc.x, cc.y, FALSE);
2839 (void) stop_timer(FIG_TRANSFORM, obj_to_any(obj));
2844 static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 };
2854 pline("%s from your %s.", Tobjnam(obj, "slip"),
2855 makeplural(body_part(FINGER)));
2857 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
2865 if ((obj->cursed || Fumbling) && !rn2(2)) {
2866 consume_obj_charge(obj, TRUE);
2869 pline("%s from your %s.", Tobjnam(obj, "slip"),
2870 makeplural(body_part(FINGER)));
2872 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
2878 otmp = getobj(lubricables, "grease");
2882 if (inaccessible_equipment(otmp, "grease", FALSE))
2884 if (inaccessible_equipment(otmp, "
\82É
\8e\89\82ð
\93h
\82é", FALSE))
2886 consume_obj_charge(obj, TRUE);
2888 if (otmp != &zeroobj) {
2890 You("cover %s with a thick layer of grease.", yname(otmp));
2892 You("%s
\82É
\8e\89\82ð
\92O
\94O
\82É
\93h
\82Á
\82½
\81D", xname(otmp));
2894 if (obj->cursed && !nohands(youmonst.data)) {
2895 incr_itimeout(&Glib, rnd(15));
2897 pline("Some of the grease gets all over your %s.",
2899 pline("
\8e\89\82ª
\8f
\82µ%s
\82É
\82Â
\82¢
\82½
\81D",
2900 makeplural(body_part(HAND)));
2903 incr_itimeout(&Glib, rnd(15));
2905 You("coat your %s with grease.", makeplural(body_part(FINGER)));
2907 You("%s
\82É
\8e\89\82ð
\93h
\82Á
\82½
\81D", makeplural(body_part(FINGER)));
2912 pline("%s empty.", Tobjnam(obj, "are"));
2914 pline("%s
\82Í
\8bó
\82Á
\82Û
\82¾
\81D", xname(obj));
2917 pline("%s to be empty.", Tobjnam(obj, "seem"));
2919 pline("%s
\82Í
\8bó
\82Á
\82Û
\82Ì
\82æ
\82¤
\82¾
\81D", xname(obj));
2924 static struct trapinfo {
2928 boolean force_bungle;
2935 trapinfo.force_bungle = 0;
2938 /* touchstones - by Ken Arnold */
2945 const char *streak_color, *choices;
2946 char stonebuf[QBUFSZ];
2948 static const char scritch[] = "\"scritch, scritch\"";
2950 static const char scritch[] = "
\81u
\83S
\83V
\81C
\83S
\83V
\81v";
2951 static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 };
2952 static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 };
2954 /* in case it was acquired while blinded */
2957 /* when the touchstone is fully known, don't bother listing extra
2958 junk as likely candidates for rubbing */
2959 choices = (tstone->otyp == TOUCHSTONE && tstone->dknown
2960 && objects[TOUCHSTONE].oc_name_known)
2964 Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan));
2966 Sprintf(stonebuf, "rub on the stone");
2967 if ((obj = getobj(choices, stonebuf)) == 0)
2970 if (obj == tstone && obj->quan == 1L) {
2972 You_cant("rub %s on itself.", the(xname(obj)));
2974 You("%s
\82ð
\82»
\82ê
\8e©
\91Ì
\82Å
\82±
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", the(xname(obj)));
2978 if (tstone->otyp == TOUCHSTONE && tstone->cursed
2979 && obj->oclass == GEM_CLASS && !is_graystone(obj)
2980 && !obj_resists(obj, 80, 100)) {
2983 pline("You feel something shatter.");
2985 You("
\89½
\82©
\82ª
\95²
\81X
\82É
\82È
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81D");
2986 else if (Hallucination)
2988 pline("Oh, wow, look at the pretty shards.");
2990 pline("
\83\8f\81[
\83H
\81I
\82È
\82ñ
\82Ä
\82«
\82ê
\82¢
\82È
\94j
\95Ð
\82È
\82ñ
\82¾
\81D");
2993 pline("A sharp crack shatters %s%s.",
2994 (obj->quan > 1L) ? "one of " : "", the(xname(obj)));
2996 pline("
\8b
\82
\82±
\82·
\82è
\82·
\82¬
\82Ä%s%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
2997 the(xname(obj)), (obj->quan > 1) ? "
\82Ì
\82Ð
\82Æ
\82Â" : "");
3006 } else if (Hallucination) {
3008 pline("Oh wow, man: Fractals!");
3010 pline("
\83\8f\81[
\83H
\81I
\83t
\83\89\83N
\83^
\83\8b\96Í
\97l
\82¾
\81I");
3018 switch (obj->oclass) {
3019 case GEM_CLASS: /* these have class-specific handling below */
3021 if (tstone->otyp != TOUCHSTONE) {
3023 } else if (obj->oclass == GEM_CLASS
3025 || (!tstone->cursed && (Role_if(PM_ARCHEOLOGIST)
3026 || Race_if(PM_GNOME))))) {
3027 makeknown(TOUCHSTONE);
3028 makeknown(obj->otyp);
3029 prinv((char *) 0, obj, 0L);
3032 /* either a ring or the touchstone was not effective */
3033 if (objects[obj->otyp].oc_material == GLASS) {
3038 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3039 break; /* gem or ring */
3042 switch (objects[obj->otyp].oc_material) {
3045 pline("%s a little more polished now.", Tobjnam(tstone, "look"));
3047 pline("%s
\82Í
\82³
\82ç
\82É
\82Â
\82â
\82ª
\8fo
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D", xname(tstone));
3051 if (!obj->known) /* note: not "whetstone" */
3053 You("must think this is a wetstone, do you?");
3055 You("
\82±
\82ê
\82Í
\93u
\90Î
\82¾
\82Æ
\8ev
\82Á
\82½
\81H");
3059 pline("%s a little wetter now.", Tobjnam(tstone, "are"));
3061 pline("%s
\82Í
\8f
\82µ
\82Ê
\82ê
\82½
\81D", xname(tstone));
3066 streak_color = "waxy";
3068 streak_color = "
\8e\89\82Á
\82Û
\82¢";
3070 break; /* okay even if not touchstone */
3073 streak_color = "wooden";
3075 streak_color = "
\82¨
\82ª
\82
\82¸
\82Ì
\82æ
\82¤
\82È";
3077 break; /* okay even if not touchstone */
3079 do_scratch = TRUE; /* scratching and streaks */
3081 streak_color = "golden";
3083 streak_color = "
\8bà
\90F
\82Ì";
3087 do_scratch = TRUE; /* scratching and streaks */
3089 streak_color = "silvery";
3091 streak_color = "
\8bâ
\90F
\82Ì";
3095 /* Objects passing the is_flimsy() test will not
3096 scratch a stone. They will leave streaks on
3097 non-touchstones and touchstones alike. */
3099 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3101 do_scratch = (tstone->otyp != TOUCHSTONE);
3104 break; /* default oclass */
3107 #if 0 /*JP*//* not used */
3108 Sprintf(stonebuf, "stone%s", plur(tstone->quan));
3112 You("make %s%sscratch marks on the %s.",
3113 streak_color ? streak_color : (const char *) "",
3114 streak_color ? " " : "", stonebuf);
3116 You("%s
\82±
\82·
\82è
\90Õ
\82ð
\90Î
\82É
\82Â
\82¯
\82½
\81D",
3117 streak_color ? streak_color : (const char *)"");
3119 else if (streak_color)
3121 You_see("%s streaks on the %s.", streak_color, stonebuf);
3123 pline("
\90Î
\82É%s
\8bØ
\82ª
\82Â
\82¢
\82½
\81D", streak_color);
3129 /* Place a landmine/bear trap. Helge Hafting */
3135 const char *what = (char *) 0;
3137 int levtyp = levl[u.ux][u.uy].typ;
3139 const char *occutext = "setting the trap";
3141 const char *occutext = "ã©
\82ð
\8ed
\8a|
\82¯
\82Ä
\82¢
\82é";
3144 if (nohands(youmonst.data))
3146 what = "without hands";
3148 what = "
\8eè
\82ª
\82È
\82¢
\82Ì
\82Å";
3151 what = "while stunned";
3153 what = "
\82
\82ç
\82
\82ç
\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å";
3154 else if (u.uswallow)
3157 is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed";
3159 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Í";
3160 else if (Underwater)
3162 what = "underwater";
3164 what = "
\90\85\96Ê
\89º
\82Å
\82Í";
3165 else if (Levitation)
3167 what = "while levitating";
3169 what = "
\95\82\82¢
\82Ä
\82¢
\82é
\8aÔ
\82Í";
3170 else if (is_pool(u.ux, u.uy))
3174 what = "
\90\85\92\86\82Å
\82Í";
3175 else if (is_lava(u.ux, u.uy))
3179 what = "
\97n
\8aâ
\82Ì
\92\86\82Å
\82Í";
3180 else if (On_stairs(u.ux, u.uy))
3182 what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder"
3185 what = (u.ux == xdnladder || u.ux == xupladder) ? "
\82Í
\82µ
\82²
\82Ì
\8fã
\82Å
\82Í"
3186 : "
\8aK
\92i
\82Ì
\8fã
\82Å
\82Í";
3188 else if (IS_FURNITURE(levtyp) || IS_ROCK(levtyp)
3189 || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy))
3193 what = "
\82±
\82±
\82Å
\82Í";
3194 else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
3196 what = (levtyp == AIR)
3200 : "in this place"; /* Air/Water Plane catch-all */
3202 what = (levtyp == AIR)
3203 ? "
\8bó
\92\86\82Å
\82Í"
3205 ? "
\89_
\82Ì
\92\86\82Å
\82Í"
3206 : "
\82±
\82±
\82Å
\82Í"; /* Air/Water Plane catch-all */
3210 You_cant("set a trap %s!", what);
3212 pline("%sã©
\82ð
\8ed
\8a|
\82¯
\82ç
\82ê
\82È
\82¢
\81I",what);
3216 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3217 if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) {
3219 You("resume setting %s%s.", shk_your(buf, otmp),
3221 You("%s
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D",
3222 defsyms[trap_to_defsym(what_trap(ttyp))].explanation);
3223 set_occupation(set_trap, occutext, 0);
3226 trapinfo.tobj = otmp;
3227 trapinfo.tx = u.ux, trapinfo.ty = u.uy;
3229 trapinfo.time_needed =
3230 (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5;
3232 trapinfo.time_needed *= 2;
3234 if (ttyp == BEAR_TRAP && tmp < 18)
3235 trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4;
3236 /*[fumbling and/or confusion and/or cursed object check(s)
3237 should be incorporated here instead of in set_trap]*/
3238 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) {
3241 if (Fumbling || otmp->cursed)
3242 chance = (rnl(10) > 3);
3244 chance = (rnl(10) > 5);
3246 You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
3248 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));
3250 Sprintf(buf, "Continue your attempt to set %s?",
3252 Sprintf(buf, "%s
\82Ì
\8ed
\8a|
\82¯
\82ð
\91±
\82¯
\82é
\81H",
3253 the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation));
3254 if (yn(buf) == 'y') {
3257 case LANDMINE: /* set it off */
3258 trapinfo.time_needed = 0;
3259 trapinfo.force_bungle = TRUE;
3261 case BEAR_TRAP: /* drop it without arming it */
3266 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I",
3267 the(defsyms[trap_to_defsym(what_trap(ttyp))]
3279 You("begin setting %s%s.", shk_your(buf, otmp),
3281 You("%s%s
\82ð
\8ed
\8a|
\82¯
\82Í
\82¶
\82ß
\82½
\81D", shk_your(buf, otmp),
3282 defsyms[trap_to_defsym(what_trap(ttyp))].explanation);
3283 set_occupation(set_trap, occutext, 0);
3291 struct obj *otmp = trapinfo.tobj;
3295 if (!otmp || !carried(otmp) || u.ux != trapinfo.tx
3296 || u.uy != trapinfo.ty) {
3302 if (--trapinfo.time_needed > 0)
3303 return 1; /* still busy */
3305 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3306 ttmp = maketrap(u.ux, u.uy, ttyp);
3310 if (*in_rooms(u.ux, u.uy, SHOPBASE)) {
3311 add_damage(u.ux, u.uy, 0L); /* schedule removal */
3313 if (!trapinfo.force_bungle)
3315 You("finish arming %s.",
3317 You("%s
\82ð
\8ed
\8a|
\82¯
\8fI
\82¦
\82½
\81D",
3318 the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation));
3319 if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
3320 || trapinfo.force_bungle)
3322 (unsigned) (trapinfo.force_bungle ? FORCEBUNGLE : 0));
3324 /* this shouldn't happen */
3326 Your("trap setting attempt fails.");
3328 You("ã©
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D");
3342 int rx, ry, proficient, res = 0;
3344 const char *msg_slipsfree = "The bullwhip slips free.";
3346 const char *msg_slipsfree = "
\95Ú
\82Í
\82Ù
\82Ç
\82¯
\82½
\81D";
3348 const char *msg_snap = "Snap!";
3350 const char *msg_snap = "
\83s
\83V
\83b
\81I";
3353 if (!wield_tool(obj, "lash"))
3358 if (!getdir((char *) 0))
3366 if (Stunned || (Confusion && !rn2(5)))
3370 if (!isok(rx, ry)) {
3374 You("
\82Í
\82¸
\82µ
\82½
\81D");
3377 mtmp = m_at(rx, ry);
3380 /* fake some proficiency checks */
3382 if (Role_if(PM_ARCHEOLOGIST))
3384 if (ACURR(A_DEX) < 6)
3386 else if (ACURR(A_DEX) >= 14)
3387 proficient += (ACURR(A_DEX) - 14);
3395 if (u.uswallow && attack(u.ustuck)) {
3397 There("is not enough room to flick your bullwhip.");
3399 pline("
\95Ú
\82ð
\91Å
\82Â
\82Ù
\82Ç
\8dL
\82
\82È
\82¢
\81D");
3401 } else if (Underwater) {
3403 There("is too much resistance to flick your bullwhip.");
3405 pline("
\90\85\82Ì
\92ï
\8dR
\82ª
\82 \82è
\82·
\82¬
\82Ä
\95Ú
\82ð
\91Å
\82Â
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
3407 } else if (u.dz < 0) {
3409 You("flick a bug off of the %s.", ceiling(u.ux, u.uy));
3411 You("%s
\82Ì
\92\8e\82ð
\91Å
\82¿
\97\8e\82µ
\82½
\81D",ceiling(u.ux,u.uy));
3413 } else if ((!u.dx && !u.dy) || (u.dz > 0)) {
3416 /* Sometimes you hit your steed by mistake */
3417 if (u.usteed && !rn2(proficient + 2)) {
3419 You("whip %s!", mon_nam(u.usteed));
3421 You("%s
\82ð
\95Ú
\91Å
\82Á
\82½
\81I", mon_nam(u.usteed));
3425 if (Levitation || u.usteed) {
3426 /* Have a shot at snaring something on the floor */
3427 otmp = level.objects[u.ux][u.uy];
3428 if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) {
3430 pline("Why beat a dead horse?");
3432 pline("
\82Ç
\82¤
\82µ
\82Ä
\8e\80\82ñ
\82¾
\94n
\82ð
\95Ú
\91Å
\82Â
\82æ
\82¤
\82È
\82±
\82Æ
\82ð
\82·
\82é
\82Ì
\81H");
3435 if (otmp && proficient) {
3437 You("wrap your bullwhip around %s on the %s.",
3438 an(singular(otmp, xname)), surface(u.ux, u.uy));
3440 You("
\95Ú
\82ð%s
\82Ì
\8fã
\82Ì%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D",
3441 surface(u.ux, u.uy), an(singular(otmp, xname)));
3443 if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1)
3444 pline1(msg_slipsfree);
3448 dam = rnd(2) + dbon() + obj->spe;
3452 You("hit your %s with your bullwhip.", body_part(FOOT));
3454 You("
\8e©
\95ª
\82Ì%s
\82ð
\8e©
\95ª
\82Å
\91Å
\82¿
\82Â
\82¯
\82½
\81D", body_part(FOOT));
3456 Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis());
3457 losehp(Maybe_Half_Phys(dam), buf, NO_KILLER_PREFIX);
3459 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82ð
\95Ú
\91Å
\82Á
\82Ä");
3460 losehp(dam, buf, KILLED_BY);
3465 } else if ((Fumbling || Glib) && !rn2(5)) {
3467 pline_The("bullwhip slips out of your %s.", body_part(HAND));
3469 pline("
\95Ú
\82ª%s
\82©
\82ç
\82·
\82×
\82è
\97\8e\82¿
\82½
\81D", body_part(HAND));
3472 } else if (u.utrap && u.utraptype == TT_PIT) {
3476 * if you're in a pit
3477 * - you are attempting to get out of the pit
3478 * or, if you are applying it towards a small monster
3479 * - then it is assumed that you are trying to hit it
3480 * else if the monster is wielding a weapon
3481 * - you are attempting to disarm a monster
3483 * - you are attempting to hit the monster.
3485 * if you're confused (and thus off the mark)
3486 * - you only end up hitting.
3489 const char *wrapped_what = (char *) 0;
3492 if (bigmonst(mtmp->data)) {
3493 wrapped_what = strcpy(buf, mon_nam(mtmp));
3494 } else if (proficient) {
3501 if (!wrapped_what) {
3502 if (IS_FURNITURE(levl[rx][ry].typ))
3503 wrapped_what = something;
3504 else if (sobj_at(BOULDER, rx, ry))
3506 wrapped_what = "a boulder";
3508 wrapped_what = "
\8aâ";
3516 You("wrap your bullwhip around %s.", wrapped_what);
3518 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", wrapped_what);
3519 if (proficient && rn2(proficient + 2)) {
3520 if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) {
3522 You("yank yourself out of the pit!");
3524 You("
\82®
\82¢
\82Æ
\88ø
\82Á
\82Ï
\82Á
\82Ä
\8c\8a\82©
\82ç
\94²
\82¯
\8fo
\82µ
\82½
\81I");
3525 teleds(cc.x, cc.y, TRUE);
3527 vision_full_recalc = 1;
3530 pline1(msg_slipsfree);
3538 if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) {
3540 pline("A monster is there that you couldn't see.");
3542 pline("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82ª
\82¢
\82é
\81D");
3543 map_invisible(rx, ry);
3545 otmp = MON_WEP(mtmp); /* can be null */
3547 char onambuf[BUFSZ];
3548 const char *mon_hand;
3549 boolean gotit = proficient && (!Fumbling || !rn2(10));
3551 Strcpy(onambuf, cxname(otmp));
3553 mon_hand = mbodypart(mtmp, HAND);
3555 mon_hand = makeplural(mon_hand);
3557 mon_hand = 0; /* lint suppression */
3560 You("wrap your bullwhip around %s.", yname(otmp));
3562 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", xname(otmp));
3563 if (gotit && mwelded(otmp)) {
3565 pline("%s welded to %s %s%c",
3566 (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp),
3567 mon_hand, !otmp->bknown ? '!' : '.');
3569 pline("%s
\82Í%s
\82Ì%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82µ
\82Ü
\82Á
\82Ä
\82¢
\82é%s",
3571 mon_nam(mtmp), mon_hand,
3572 !otmp->bknown ? "
\81I" : "
\81D");
3575 gotit = FALSE; /* can't pull it free */
3578 obj_extract_self(otmp);
3579 possibly_unwield(mtmp, FALSE);
3580 setmnotwielded(mtmp, otmp);
3582 switch (rn2(proficient + 1)) {
3584 /* to floor near you */
3586 You("yank %s to the %s!", yname(otmp),
3588 You("%s
\82ð%s
\82É
\88ø
\82«
\97\8e\82µ
\82½
\81I", xname(otmp),
3589 surface(u.ux, u.uy));
3590 place_object(otmp, u.ux, u.uy);
3597 /* proficient with whip, but maybe not
3598 so proficient at catching weapons */
3601 hitvalu = 8 + otmp->spe;
3602 hitu = thitu(hitvalu,
3603 dmgval(otmp, &youmonst),
3607 pline_The("%s hits you as you try to snatch it!",
3609 pline_The("%s
\82ð
\92D
\82¨
\82¤
\82Æ
\82µ
\82½
\82ç
\82 \82È
\82½
\82É
\93\96\82½
\82Á
\82½
\81I",
3612 place_object(otmp, u.ux, u.uy);
3617 /* right into your inventory */
3619 You("snatch %s!", yname(otmp));
3621 You("%s
\82ð
\92D
\82Á
\82½
\81I", xname(otmp));
3622 if (otmp->otyp == CORPSE
3623 && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg
3624 && !Stone_resistance
3625 && !(poly_when_stoned(youmonst.data)
3626 && polymon(PM_STONE_GOLEM))) {
3630 Sprintf(kbuf, "%s corpse",
3631 an(mons[otmp->corpsenm].mname));
3632 pline("Snatching %s is a fatal mistake.", kbuf);
3634 pline("%s
\82Ì
\8e\80\91Ì
\82ð
\92D
\82Á
\82½
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
3635 mons[otmp->corpsenm].mname);
3636 Sprintf(kbuf, "%s
\82Ì
\8e\80\91Ì
\82É
\90G
\82ê
\82Ä",
3637 mons[otmp->corpsenm].mname);
3641 otmp = hold_another_object(
3643 otmp, "You drop %s!", doname(otmp), (const char *) 0);
3645 otmp, "%s
\82ð
\97\8e\82µ
\82½
\81I", doname(otmp), (const char *) 0);
3648 /* to floor beneath mon */
3650 You("yank %s from %s %s!", the(onambuf),
3652 You("%s
\82ð%s
\82Ì%s
\82©
\82ç
\82Ð
\82Á
\82Ï
\82Á
\82½
\81I", the(xname(otmp)),
3653 s_suffix(mon_nam(mtmp)), mon_hand);
3654 obj_no_longer_held(otmp);
3655 place_object(otmp, mtmp->mx, mtmp->my);
3660 pline1(msg_slipsfree);
3664 if (mtmp->m_ap_type && !Protection_from_shape_changers
3666 stumble_onto_mimic(mtmp);
3669 You("flick your bullwhip towards %s.", mon_nam(mtmp));
3671 You("%s
\82É
\8cü
\82Á
\82Ä
\95Ú
\82ð
\91Å
\82Á
\82½
\81D", mon_nam(mtmp));
3680 } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
3681 /* it must be air -- water checked above */
3683 You("snap your whip through thin air.");
3685 You("
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë
\82Å
\95Ú
\82ð
\91Å
\82Á
\82½
\81D");
3695 not_enough_room[] = "There's not enough room here to use that.",
3697 not_enough_room[] = "
\82»
\82ê
\82ð
\8eg
\82¤
\82¾
\82¯
\82Ì
\8dL
\82³
\82ª
\82È
\82¢
\81D",
3699 where_to_hit[] = "Where do you want to hit?",
3701 where_to_hit[] = "
\82Ç
\82ê
\82ð
\91_
\82¤
\81H",
3703 cant_see_spot[] = "won't hit anything if you can't see that spot.",
3705 cant_see_spot[] = "
\8fê
\8f\8a\82ª
\8c©
\82¦
\82È
\82¯
\82ê
\82Î
\91_
\82¦
\82È
\82¢
\81D",
3707 cant_reach[] = "can't reach that spot from here.";
3709 cant_reach[] = "
\82±
\82±
\82©
\82ç
\82»
\82±
\82Ö
\82Í
\93Í
\82©
\82È
\82¢
\81D";
3711 /* find pos of monster in range, if only one monster */
3713 find_poleable_mon(pos, min_range, max_range)
3715 int min_range, max_range;
3718 struct monst *selmon = (struct monst *) 0;
3720 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
3721 if (mtmp && !DEADMONSTER(mtmp) && !mtmp->mtame
3722 && cansee(mtmp->mx, mtmp->my)
3723 && distu(mtmp->mx, mtmp->my) <= max_range
3724 && distu(mtmp->mx, mtmp->my) >= min_range) {
3731 pos->x = selmon->mx;
3732 pos->y = selmon->my;
3736 static int polearm_range_min = -1;
3737 static int polearm_range_max = -1;
3740 display_polearm_positions(state)
3744 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
3745 } else if (state == 1) {
3748 for (dx = -4; dx <= 4; dx++)
3749 for (dy = -4; dy <= 4; dy++) {
3750 x = dx + (int) u.ux;
3751 y = dy + (int) u.uy;
3752 if (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
3753 && distu(x, y) >= polearm_range_min
3754 && distu(x, y) <= polearm_range_max) {
3759 tmp_at(DISP_END, 0);
3763 /* Distance attacks by pole-weapons */
3768 int res = 0, typ, max_range, min_range, glyph;
3771 struct monst *hitm = context.polearm.hitmon;
3773 /* Are you allowed to use the pole? */
3775 pline(not_enough_room);
3779 if (!wield_tool(obj, "swing"))
3784 /* assert(obj == uwep); */
3787 * Calculate allowable range (pole's reach is always 2 steps):
3788 * unskilled and basic: orthogonal direction, 4..4;
3789 * skilled: as basic, plus knight's jump position, 4..5;
3790 * expert: as skilled, plus diagonal, 4..8.
3798 * (Note: no roles in nethack can become expert or better
3799 * for polearm skill; Yeoman in slash'em can become expert.)
3802 typ = uwep_skill_type();
3803 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
3805 else if (P_SKILL(typ) == P_SKILLED)
3808 max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
3810 polearm_range_min = min_range;
3811 polearm_range_max = max_range;
3813 /* Prompt for a location */
3814 pline(where_to_hit);
3817 if (!find_poleable_mon(&cc, min_range, max_range) && hitm
3818 && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)
3819 && distu(hitm->mx, hitm->my) <= max_range
3820 && distu(hitm->mx, hitm->my) >= min_range) {
3824 getpos_sethilite(display_polearm_positions);
3826 if (getpos(&cc, TRUE, "the spot to hit") < 0)
3828 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
3829 return res; /* ESC; uses turn iff polearm became wielded */
3831 glyph = glyph_at(cc.x, cc.y);
3832 if (distu(cc.x, cc.y) > max_range) {
3836 pline("
\89\93\82·
\82¬
\82é
\81I");
3838 } else if (distu(cc.x, cc.y) < min_range) {
3840 pline("Too close!");
3842 pline("
\8bß
\82·
\82¬
\82é
\81I");
3844 } else if (!cansee(cc.x, cc.y) && !glyph_is_monster(glyph)
3845 && !glyph_is_invisible(glyph) && !glyph_is_statue(glyph)) {
3848 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
3853 context.polearm.hitmon = NULL;
3854 /* Attack the monster there */
3856 if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *) 0) {
3857 if (attack_checks(mtmp, uwep))
3860 return 1; /* burn nutrition; maybe pass out */
3861 context.polearm.hitmon = mtmp;
3862 check_caitiff(mtmp);
3863 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
3864 (void) thitmonst(mtmp, uwep);
3865 } else if (glyph_is_statue(glyph) /* might be hallucinatory */
3866 && sobj_at(STATUE, bhitpos.x, bhitpos.y)) {
3867 struct trap *t = t_at(bhitpos.x, bhitpos.y);
3869 if (t && t->ttyp == STATUE_TRAP
3870 && activate_statue_trap(t, t->tx, t->ty, FALSE)) {
3871 ; /* feedback has been give by animate_statue() */
3873 /* Since statues look like monsters now, we say something
3874 different from "you miss" or "there's nobody there".
3875 Note: we only do this when a statue is displayed here,
3876 because the player is probably attempting to attack it;
3877 other statues obscured by anything are just ignored. */
3879 pline("Thump! Your blow bounces harmlessly off the statue.");
3881 pline("
\83S
\83c
\83\93\81I
\92¤
\91\9c\82Í
\8f\9d\82Â
\82©
\82È
\82©
\82Á
\82½
\81D");
3882 wake_nearto(bhitpos.x, bhitpos.y, 25);
3885 /* no monster here and no statue seen or remembered here */
3886 if (glyph_is_invisible(glyph)) {
3887 /* now you know that nothing is there... */
3888 unmap_object(bhitpos.x, bhitpos.y);
3889 newsym(bhitpos.x, bhitpos.y);
3892 You("miss; there is no one there to hit.");
3894 You("
\8aO
\82ê
\82½
\81D
\82»
\82±
\82É
\82Í
\89½
\82à
\82È
\82¢
\81D");
3896 u_wipe_engr(2); /* same as for melee or throwing */
3904 boolean wasblind = Blind;
3905 boolean wascreamed = u.ucreamed;
3906 boolean several = FALSE;
3908 if (obj->quan > 1L) {
3910 obj = splitobj(obj, 1L);
3914 You("give yourself a facial.");
3916 You("
\83N
\83\8a\81[
\83\80\83p
\83b
\83N
\82ð
\82µ
\82½
\81D");
3919 pline("You immerse your %s in %s%s.", body_part(FACE),
3920 several ? "one of " : "",
3921 several ? makeplural(the(xname(obj))) : the(xname(obj)));
3923 pline("%s%s
\82É%s
\82ð
\92¾
\82ß
\82½
\81D",
3925 several ? "
\82Ì
\82Ð
\82Æ
\82Â" : "", body_part(FACE));
3927 if (can_blnd((struct monst *) 0, &youmonst, AT_WEAP, obj)) {
3928 int blindinc = rnd(25);
3929 u.ucreamed += blindinc;
3930 make_blinded(Blinded + (long) blindinc, FALSE);
3931 if (!Blind || (Blind && wasblind))
3933 pline("There's %ssticky goop all over your %s.",
3934 wascreamed ? "more " : "", body_part(FACE));
3936 pline("
\82â
\82Á
\82©
\82¢
\82È
\82Ë
\82Î
\82Ë
\82Î
\82ª%s
\91S
\91Ì
\82É%s
\82Â
\82¢
\82½
\81D",
3937 body_part(FACE), wascreamed ? "
\82³
\82ç
\82É" : "");
3939 else /* Blind && !wasblind */
3941 You_cant("see through all the sticky goop on your %s.",
3943 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",
3948 /* useup() is appropriate, but we want costly_alteration()'s message */
3949 costly_alteration(obj, COST_SPLAT);
3950 obj_extract_self(obj);
3959 int res = 0, typ, max_range = 4, tohit;
3960 boolean save_confirm;
3965 /* Are you allowed to use the hook? */
3967 pline(not_enough_room);
3971 if (!wield_tool(obj, "cast"))
3976 /* assert(obj == uwep); */
3978 /* Prompt for a location */
3979 pline(where_to_hit);
3983 if (getpos(&cc, TRUE, "the spot to hit") < 0)
3985 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
3986 return res; /* ESC; uses turn iff grapnel became wielded */
3988 /* Calculate range; unlike use_pole(), there's no minimum for range */
3989 typ = uwep_skill_type();
3990 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
3992 else if (P_SKILL(typ) == P_SKILLED)
3996 if (distu(cc.x, cc.y) > max_range) {
4000 pline("
\89\93\82·
\82¬
\82é
\81I");
4002 } else if (!cansee(cc.x, cc.y)) {
4005 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4010 /* What do you want to hit? */
4012 if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) {
4013 winid tmpwin = create_nhwindow(NHW_MENU);
4016 menu_item *selected;
4018 any = zeroany; /* set all bits to zero */
4019 any.a_int = 1; /* use index+1 (cant use 0) as identifier */
4023 Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
4025 Sprintf(buf, "%s
\82É
\82 \82é
\95¨
\91Ì", surface(cc.x, cc.y));
4026 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4030 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
4033 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "
\89ö
\95¨",
4038 Sprintf(buf, "the %s", surface(cc.x, cc.y));
4040 Sprintf(buf, "%s", surface(cc.x, cc.y));
4041 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4044 end_menu(tmpwin, "Aim for what?");
4046 end_menu(tmpwin, "
\89½
\82ð
\91_
\82¤
\81H");
4048 if (select_menu(tmpwin, PICK_ONE, &selected) > 0
4049 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2))
4050 tohit = selected[0].item.a_int - 1;
4051 free((genericptr_t) selected);
4052 destroy_nhwindow(tmpwin);
4055 /* possibly scuff engraving at your feet;
4056 any engraving at the target location is unaffected */
4057 if (tohit == 2 || !rn2(2))
4058 u_wipe_engr(rnd(2));
4060 /* What did you hit? */
4063 /* FIXME -- untrap needs to deal with non-adjacent traps */
4065 case 1: /* Object */
4066 if ((otmp = level.objects[cc.x][cc.y]) != 0) {
4068 You("snag an object from the %s!", surface(cc.x, cc.y));
4070 You("%s
\82Ì
\82à
\82Ì
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I", surface(cc.x, cc.y));
4071 (void) pickup_object(otmp, 1L, FALSE);
4072 /* If pickup fails, leave it alone */
4077 case 2: /* Monster */
4079 if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *) 0)
4081 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4082 save_confirm = flags.confirm;
4083 if (verysmall(mtmp->data) && !rn2(4)
4084 && enexto(&cc, u.ux, u.uy, (struct permonst *) 0)) {
4085 flags.confirm = FALSE;
4086 (void) attack_checks(mtmp, uwep);
4087 flags.confirm = save_confirm;
4088 check_caitiff(mtmp); /* despite fact there's no damage */
4090 You("pull in %s!", mon_nam(mtmp));
4092 You("%s
\82ð
\88ø
\82Á
\92£
\82Á
\82½
\81I", mon_nam(mtmp));
4093 mtmp->mundetected = 0;
4094 rloc_to(mtmp, cc.x, cc.y);
4096 } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data))
4098 flags.confirm = FALSE;
4099 (void) attack_checks(mtmp, uwep);
4100 flags.confirm = save_confirm;
4101 check_caitiff(mtmp);
4102 (void) thitmonst(mtmp, uwep);
4106 case 3: /* Surface */
4107 if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y))
4109 pline_The("hook slices through the %s.", surface(cc.x, cc.y));
4111 pline("
\83t
\83b
\83N
\82Í%s
\82ð
\82³
\82Á
\82Æ
\90Ø
\82Á
\82½
\81D", surface(cc.x, cc.y));
4114 You("are yanked toward the %s!", surface(cc.x, cc.y));
4116 You("%s
\82Ö
\88ø
\82Á
\82Ï
\82ç
\82ê
\82½
\81I", surface(cc.x, cc.y));
4117 hurtle(sgn(cc.x - u.ux), sgn(cc.y - u.uy), 1, FALSE);
4121 default: /* Yourself (oops!) */
4122 if (P_SKILL(typ) <= P_BASIC) {
4124 You("hook yourself!");
4126 You("
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I");
4128 losehp(Maybe_Half_Phys(rn1(10, 10)), "a grappling hook",
4130 losehp(Maybe_Half_Phys(rn1(10, 10)), "
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82Ä",
4136 pline1(nothing_happens);
4140 #define BY_OBJECT ((struct monst *) 0)
4142 /* return 1 if the wand is broken, hence some time elapsed */
4148 static const char nothing_else_happens[] = "But nothing else happens...";
4150 static const char nothing_else_happens[] = "
\82µ
\82©
\82µ
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D
\81D
\81D";
4151 register int i, x, y;
4152 register struct monst *mon;
4154 boolean affects_objects;
4155 boolean shop_damage = FALSE;
4156 boolean fillmsg = FALSE;
4157 int expltype = EXPL_MAGICAL;
4158 char confirm[QBUFSZ], buf[BUFSZ];
4160 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
4162 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "
\83o
\83\8b\83T
\82Ì
\8fñ"));
4165 if (!paranoid_query(ParanoidBreakwand,
4167 "Are you really sure you want to break ",
4168 "?", obj, yname, ysimple_name, "the wand")))
4170 if (!paranoid_query(ParanoidBreakwand,
4172 "
\96{
\93\96\82É", "
\82ð
\89ó
\82·
\82Ì
\81H",
4173 obj, xname, ysimple_name, "
\8fñ")))
4177 if (nohands(youmonst.data)) {
4179 You_cant("break %s without hands!", yname(obj));
4181 You("
\8eè
\82ª
\96³
\82¢
\82Ì
\82Å%s
\82ð
\89ó
\82¹
\82È
\82¢
\81I", xname(obj));
4183 } else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
4185 You("don't have the strength to break %s!", yname(obj));
4187 You("%s
\82ð
\89ó
\82·
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I", xname(obj));
4191 pline("Raising %s high above your %s, you break it in two!", yname(obj),
4193 You("%s
\82ð%s
\82Ì
\8fã
\82É
\8d\82\82
\8cf
\82°
\81C
\93ñ
\82Â
\82É
\82Ö
\82µ
\90Ü
\82Á
\82½
\81I", xname(obj),
4196 /* [ALI] Do this first so that wand is removed from bill. Otherwise,
4197 * the freeinv() below also hides it from setpaid() which causes problems.
4200 check_unpaid(obj); /* Extra charge for use */
4201 costly_alteration(obj, COST_DSTROY);
4204 current_wand = obj; /* destroy_item might reset this */
4205 freeinv(obj); /* hide it from destroy_item instead... */
4206 setnotworn(obj); /* so we need to do this ourselves */
4208 if (!zappable(obj)) {
4209 pline(nothing_else_happens);
4210 goto discard_broken_wand;
4212 /* successful call to zappable() consumes a charge; put it back */
4214 /* might have "wrested" a final charge, taking it from 0 to -1;
4215 if so, we just brought it back up to 0, which wouldn't do much
4216 below so give it 1..3 charges now, usually making it stronger
4217 than an ordinary last charge (the wand is already gone from
4218 inventory, so perm_invent can't accidentally reveal this) */
4225 affects_objects = FALSE;
4227 switch (obj->otyp) {
4232 case WAN_ENLIGHTENMENT:
4234 case WAN_SECRET_DOOR_DETECTION:
4235 pline(nothing_else_happens);
4236 goto discard_broken_wand;
4242 expltype = EXPL_FIERY;
4244 if (expltype == EXPL_MAGICAL)
4245 expltype = EXPL_FROSTY;
4247 case WAN_MAGIC_MISSILE:
4249 explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
4250 makeknown(obj->otyp); /* explode describes the effect */
4251 goto discard_broken_wand;
4253 /* we want this before the explosion instead of at the very end */
4255 pline("A wall of force smashes down around you!");
4257 pline("
\82 \82È
\82½
\82Í
\96\82\97Í
\82Ì
\95Ç
\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81I");
4258 dmg = d(1 + obj->spe, 6); /* normally 2d12 */
4260 case WAN_CANCELLATION:
4262 case WAN_TELEPORTATION:
4263 case WAN_UNDEAD_TURNING:
4264 affects_objects = TRUE;
4270 /* magical explosion and its visual effect occur before specific effects
4272 /* [TODO? This really ought to prevent the explosion from being
4273 fatal so that we never leave a bones file where none of the
4274 surrounding targets (or underlying objects) got affected yet.] */
4275 explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS,
4278 /* prepare for potential feedback from polymorph... */
4281 /* this makes it hit us last, so that we can see the action first */
4282 for (i = 0; i <= 8; i++) {
4283 bhitpos.x = x = obj->ox + xdir[i];
4284 bhitpos.y = y = obj->oy + ydir[i];
4288 if (obj->otyp == WAN_DIGGING) {
4291 if (dig_check(BY_OBJECT, FALSE, x, y)) {
4292 if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) {
4293 /* normally, pits and holes don't anger guards, but they
4294 * do if it's a wall or door that's being dug */
4295 watch_dig((struct monst *) 0, x, y, TRUE);
4296 if (*in_rooms(x, y, SHOPBASE))
4300 * Let liquid flow into the newly created pits.
4301 * Adjust corresponding code in music.c for
4302 * drum of earthquake if you alter this sequence.
4304 typ = fillholetyp(x, y, FALSE);
4306 levl[x][y].typ = typ;
4307 liquid_flow(x, y, typ, t_at(x, y),
4311 : "Some holes are quickly filled with %s!");
4313 : "
\8c\8a\82Í
\82·
\82®
\82É%s
\82Å
\96\84\82Ü
\82Á
\82½
\81I");
4316 digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3
4317 || (!Can_dig_down(&u.uz)
4318 && !levl[x][y].candig))
4323 } else if (obj->otyp == WAN_CREATE_MONSTER) {
4324 /* u.ux,u.uy creates it near you--x,y might create it in rock */
4325 (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS);
4327 } else if (x != u.ux || y != u.uy) {
4329 * Wand breakage is targetting a square adjacent to the hero,
4330 * which might contain a monster or a pile of objects or both.
4331 * Handle objects last; avoids having undead turning raise an
4332 * undead's corpse and then attack resulting undead monster.
4333 * obj->bypass in bhitm() prevents the polymorphing of items
4334 * dropped due to monster's polymorph and prevents undead
4335 * turning that kills an undead from raising resulting corpse.
4337 if ((mon = m_at(x, y)) != 0) {
4338 (void) bhitm(mon, obj);
4339 /* if (context.botl) bot(); */
4341 if (affects_objects && level.objects[x][y]) {
4342 (void) bhitpile(obj, bhito, x, y, 0);
4344 bot(); /* potion effects */
4348 * Wand breakage is targetting the hero. Using xdir[]+ydir[]
4349 * deltas for location selection causes this case to happen
4350 * after all the surrounding squares have been handled.
4351 * Process objects first, in case damage is fatal and leaves
4352 * bones, or teleportation sends one or more of the objects to
4353 * same destination as hero (lookhere/autopickup); also avoids
4354 * the polymorphing of gear dropped due to hero's transformation.
4355 * (Unlike with monsters being hit by zaps, we can't rely on use
4356 * of obj->bypass in the zap code to accomplish that last case
4357 * since it's also used by retouch_equipment() for polyself.)
4359 if (affects_objects && level.objects[x][y]) {
4360 (void) bhitpile(obj, bhito, x, y, 0);
4362 bot(); /* potion effects */
4364 damage = zapyourself(obj, FALSE);
4367 Sprintf(buf, "killed %sself by breaking a wand", uhim());
4368 losehp(Maybe_Half_Phys(damage), buf, NO_KILLER_PREFIX);
4370 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82Å
\8fñ
\82ð
\89ó
\82µ
\82Ä
\83_
\83\81\81[
\83W
\82ð
\8eó
\82¯");
4371 losehp(Maybe_Half_Phys(damage), buf, KILLED_BY);
4375 bot(); /* blindness */
4379 /* potentially give post zap/break feedback */
4382 /* Note: if player fell thru, this call is a no-op.
4383 Damage is handled in digactualhole in that case */
4386 pay_for_damage("dig into", FALSE);
4388 pay_for_damage("
\8c\8a\82ð
\82 \82¯
\82é", FALSE);
4390 if (obj->otyp == WAN_LIGHT)
4391 litroom(TRUE, obj); /* only needs to be done once */
4393 discard_broken_wand:
4394 obj = current_wand; /* [see dozap() and destroy_item()] */
4403 add_class(cl, class)
4414 static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 };
4416 /* augment tools[] if various items are carried */
4418 setapplyclasses(class_list)
4421 register struct obj *otmp;
4423 boolean knowoil, knowtouchstone, addpotions, addstones, addfood;
4425 knowoil = objects[POT_OIL].oc_name_known;
4426 knowtouchstone = objects[TOUCHSTONE].oc_name_known;
4427 addpotions = addstones = addfood = FALSE;
4428 for (otmp = invent; otmp; otmp = otmp->nobj) {
4431 || (otmp->oclass == POTION_CLASS
4433 || (!knowoil && !objects[otyp].oc_name_known))))
4435 if (otyp == TOUCHSTONE
4436 || (is_graystone(otmp)
4438 || (!knowtouchstone && !objects[otyp].oc_name_known))))
4440 if (otyp == CREAM_PIE || otyp == EUCALYPTUS_LEAF)
4444 class_list[0] = '\0';
4445 if (addpotions || addstones)
4446 add_class(class_list, ALL_CLASSES);
4447 Strcat(class_list, tools);
4449 add_class(class_list, POTION_CLASS);
4451 add_class(class_list, GEM_CLASS);
4453 add_class(class_list, FOOD_CLASS);
4456 /* the 'a' command */
4461 register int res = 1;
4462 char class_list[MAXOCLASSES + 2];
4464 if (check_capacity((char *) 0))
4467 setapplyclasses(class_list); /* tools[] */
4468 obj = getobj(class_list, "use or apply");
4472 if (!retouch_object(&obj, FALSE))
4473 return 1; /* evading your grasp costs a turn; just be
4474 grateful that you don't drop it as well */
4476 if (obj->oclass == WAND_CLASS)
4477 return do_break_wand(obj);
4479 switch (obj->otyp) {
4482 if (obj == ublindf) {
4485 } else if (!ublindf) {
4489 You("are already %s.", ublindf->otyp == TOWEL
4490 ? "covered by a towel"
4491 : ublindf->otyp == BLINDFOLD
4492 ? "wearing a blindfold"
4493 : "wearing lenses");
4495 You("
\82à
\82¤%s
\82Ä
\82¢
\82é
\81D", ublindf->otyp == TOWEL
4496 ? "
\83^
\83I
\83\8b\82ð
\8aª
\82¢"
4497 : ublindf->otyp == BLINDFOLD
4498 ? "
\96Ú
\89B
\82µ
\82ð
\82Â
\82¯"
4499 : "
\83\8c\83\93\83Y
\82ð
\82Â
\82¯");
4504 res = use_cream_pie(obj);
4507 res = use_whip(obj);
4509 case GRAPPLING_HOOK:
4510 res = use_grapple(obj);
4516 case BAG_OF_HOLDING:
4518 res = use_container(&obj, 1);
4521 (void) bagotricks(obj, FALSE, (int *) 0);
4529 res = (pick_lock(obj) != 0);
4532 case DWARVISH_MATTOCK:
4533 res = use_pick_axe(obj);
4536 use_tinning_kit(obj);
4542 res = use_saddle(obj);
4545 use_magic_whistle(obj);
4550 case EUCALYPTUS_LEAF:
4551 /* MRKR: Every Australian knows that a gum leaf makes an excellent
4552 * whistle, especially if your pet is a tame kangaroo named Skippy.
4555 use_magic_whistle(obj);
4556 /* sometimes the blessing will be worn off */
4560 pline("%s %s.", Yobjnam2(obj, "glow"), hcolor("brown"));
4562 pline("%s
\82Í%s
\8bP
\82¢
\82½
\81D", xname(obj), jconj_adj(hcolor("
\92\83\90F
\82Ì")));
4572 res = use_stethoscope(obj);
4575 res = use_mirror(obj);
4578 case BELL_OF_OPENING:
4581 case CANDELABRUM_OF_INVOCATION:
4582 use_candelabrum(obj);
4594 light_cocktail(obj);
4596 case EXPENSIVE_CAMERA:
4597 res = use_camera(obj);
4600 res = use_towel(obj);
4603 use_crystal_ball(&obj);
4609 if (!carrying(TIN)) {
4611 You("have no tin to open.");
4613 You("
\8aÊ
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D");
4617 You("cannot open a tin without eating or discarding its contents.");
4619 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");
4622 pline("In order to eat, use the 'e' command.");
4624 pline("
\90H
\82×
\82é
\82É
\82Í
\81C'e'
\83R
\83}
\83\93\83h
\82ð
\8eg
\82¦
\82Î
\82æ
\82¢
\81D");
4628 "Opening the tin will be much easier if you wield the tin opener.");
4630 "
\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");
4637 use_unicorn_horn(obj);
4648 case DRUM_OF_EARTHQUAKE:
4649 res = do_play_instrument(obj);
4651 case HORN_OF_PLENTY: /* not a musical instrument */
4652 (void) hornoplenty(obj, FALSE);
4665 /* Pole-weapons can strike at a distance */
4667 res = use_pole(obj);
4669 } else if (is_pick(obj) || is_axe(obj)) {
4670 res = use_pick_axe(obj);
4674 pline("Sorry, I don't know how to use that.");
4676 pline("
\82»
\82ê
\82ð
\82Ç
\82¤
\82â
\82Á
\82Ä
\8eg
\82¤
\82ñ
\82¾
\82¢
\81H");
4681 if (res && obj && obj->oartifact)
4687 /* Keep track of unfixable troubles for purposes of messages saying you feel
4691 unfixable_trouble_count(is_horn)
4694 int unfixable_trbl = 0;
4700 if (Wounded_legs && !u.usteed)
4704 /* lycanthropy is undesirable, but it doesn't actually make you feel bad */
4706 if (!is_horn || (Confusion & ~TIMEOUT))
4708 if (!is_horn || (Sick & ~TIMEOUT))
4710 if (!is_horn || (HHallucination & ~TIMEOUT))
4712 if (!is_horn || (Vomiting & ~TIMEOUT))
4714 if (!is_horn || (HStun & ~TIMEOUT))
4716 if (!is_horn || (HDeaf & ~TIMEOUT))
4719 return unfixable_trbl;