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;
244 struct permonst *mptr;
246 struct obj *corpse = sobj_at(CORPSE, rx, ry),
247 *statue = sobj_at(STATUE, rx, ry);
249 if (!can_reach_floor(TRUE)) { /* levitation or unskilled riding */
250 corpse = 0; /* can't reach corpse on floor */
251 /* you can't reach tiny statues (even though you can fight
252 tiny monsters while levitating--consistency, what's that?) */
253 while (statue && mons[statue->corpsenm].msize == MZ_TINY)
254 statue = nxtobj(statue, STATUE, TRUE);
256 /* when both corpse and statue are present, pick the uppermost one */
257 if (corpse && statue) {
258 if (nxtobj(statue, CORPSE, TRUE) == corpse)
259 corpse = 0; /* corpse follows statue; ignore it */
261 statue = 0; /* corpse precedes statue; ignore statue */
263 more_corpses = (corpse && nxtobj(corpse, CORPSE, TRUE));
265 /* additional stethoscope messages from jyoung@apanix.apana.org.au */
266 if (!corpse && !statue) {
267 ; /* nothing to do */
269 } else if (Hallucination) {
273 Strcpy(buf, "You're both stoned");
275 Strcpy(buf, "
\90Î
\82¾");
276 #if 0 /*JP*//*
\91ã
\96¼
\8e\8c\8f\88\97\9d\82Í
\95s
\97v*/
277 } else if (corpse->quan == 1L && !more_corpses) {
278 int gndr = 2; /* neuter: "it" */
279 struct monst *mtmp = get_mtraits(corpse, FALSE);
281 /* (most corpses don't retain the monster's sex, so
282 we're usually forced to use generic pronoun here) */
284 mptr = &mons[mtmp->mnum];
285 /* can't use mhe() here; it calls pronoun_gender() which
286 expects monster to be on the map (visibility check) */
287 if ((humanoid(mptr) || (mptr->geno & G_UNIQ)
288 || type_is_pname(mptr)) && !is_neuter(mptr))
289 gndr = (int) mtmp->female;
291 mptr = &mons[corpse->corpsenm];
294 else if (is_male(mptr))
297 Sprintf(buf, "%s's dead", genders[gndr].he); /* "he"/"she"/"it" */
298 buf[0] = highc(buf[0]);
300 } else { /* plural */
302 Strcpy(buf, "They're dead");
304 Strcpy(buf, "
\8e\80\82ñ
\82Å
\82é
\82º");
306 /* variations on "He's dead, Jim." (Star Trek's Dr McCoy) */
308 You_hear("a voice say, \"%s, Jim.\"", buf);
310 You_hear("
\81u
\82»
\82¢
\82Â
\82Í%s
\81C
\83W
\83\80\81v
\82Æ
\82¢
\82¤
\90º
\82ª
\95·
\82±
\82¦
\82½
\81D", buf);
315 boolean here = (rx == u.ux && ry == u.uy),
316 one = (corpse->quan == 1L && !more_corpses), reviver = FALSE;
318 if (Role_if(PM_HEALER)) {
319 /* ok to reset `corpse' here; we're done with it */
321 if (obj_has_timer(corpse, REVIVE_MON))
324 corpse = nxtobj(corpse, CORPSE, TRUE);
325 } while (corpse && !reviver);
328 You("determine that %s unfortunate being%s %s%s dead.",
329 one ? (here ? "this" : "that") : (here ? "these" : "those"),
330 one ? "" : "s", one ? "is" : "are", reviver ? " mostly" : "");
332 You("%s
\95s
\8dK
\82È
\90¶
\82«
\95¨
\82Í%s
\8e\80\82ñ
\82Å
\82¢
\82é
\82Æ
\8c\8b\98_
\82µ
\82½
\81D",
333 here ? "
\82±
\82Ì" : "
\82»
\82Ì",
334 reviver ? "
\82Ù
\82Ú" : "");
338 } else { /* statue */
339 const char *what, *how;
342 mptr = &mons[statue->corpsenm];
343 if (Blind) { /* ignore statue->dknown; it'll always be set */
344 Sprintf(buf, "%s %s",
345 (rx == u.ux && ry == u.uy) ? "This" : "That",
346 humanoid(mptr) ? "person" : "creature");
350 if (!type_is_pname(mptr))
353 #else /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\83V
\83\93\83v
\83\8b\82É*/
354 if (Blind) { /* ignore statue->dknown; it'll always be set */
355 what = (rx == u.ux && ry == u.uy) ? "
\82±
\82ê" : "
\82 \82ê";
357 what = mons[statue->corpsenm].mname;
364 if (Role_if(PM_HEALER)) {
365 struct trap *ttmp = t_at(rx, ry);
367 if (ttmp && ttmp->ttyp == STATUE_TRAP)
369 how = "extraordinary";
371 how = "
\95À
\8aO
\82ê
\82½";
372 else if (Has_contents(statue))
376 how = "
\92\8d\96Ú
\82·
\82×
\82«";
380 pline("%s is in %s health for a statue.", what, how);
382 pline("
\92¤
\91\9c\82Æ
\82µ
\82Ä
\82Ì%s
\82Í%s
\8dì
\95i
\82¾
\81D", what, how);
385 return FALSE; /* no corpse or statue */
389 static const char hollow_str[] = "a hollow sound. This must be a secret %s!";
391 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";
393 /* Strictly speaking it makes no sense for usage of a stethoscope to
394 not take any time; however, unless it did, the stethoscope would be
395 almost useless. As a compromise, one use per turn is free, another
396 uses up the turn; this makes curse status have a tangible effect. */
399 register struct obj *obj;
404 boolean interference = (u.uswallow && is_whirly(u.ustuck->data)
405 && !rn2(Role_if(PM_HEALER) ? 10 : 3));
407 if (nohands(youmonst.data)) {
409 You("have no hands!"); /* not `body_part(HAND)' */
411 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I");
416 You_cant("hear anything!");
418 You("
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81I");
420 } else if (!freehand()) {
422 You("have no free %s.", body_part(HAND));
424 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81D", body_part(HAND));
427 if (!getdir((char *) 0))
430 res = (moves == context.stethoscope_move)
431 && (youmonst.movement == context.stethoscope_movement);
432 context.stethoscope_move = moves;
433 context.stethoscope_movement = youmonst.movement;
435 if (u.usteed && u.dz > 0) {
438 pline("%s interferes.", Monnam(u.ustuck));
440 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
441 mstatusline(u.ustuck);
443 mstatusline(u.usteed);
445 } else if (u.uswallow && (u.dx || u.dy || u.dz)) {
446 mstatusline(u.ustuck);
448 } else if (u.uswallow && interference) {
450 pline("%s interferes.", Monnam(u.ustuck));
452 pline("%s
\82ª
\82¶
\82á
\82Ü
\82ð
\82µ
\82½
\81D", Monnam(u.ustuck));
453 mstatusline(u.ustuck);
458 You_hear("faint splashing.");
460 You_hear("
\82©
\82·
\82©
\82É
\83o
\83V
\83\83\83o
\83V
\83\83\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
461 else if (u.dz < 0 || !can_reach_floor(TRUE))
462 cant_reach_floor(u.ux, u.uy, (u.dz < 0), TRUE);
463 else if (its_dead(u.ux, u.uy, &res))
464 ; /* message already given */
465 else if (Is_stronghold(&u.uz))
467 You_hear("the crackling of hellfire.");
469 You_hear("
\92n
\8d\96\82Ì
\89\8a\82ª
\83p
\83`
\83p
\83`
\94R
\82¦
\82Ä
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
472 pline_The("%s seems healthy enough.", surface(u.ux, u.uy));
474 pline("%s
\82Í
\8f[
\95ª
\8c\92\8dN
\82Ì
\82æ
\82¤
\82¾
\81D", surface(u.ux,u.uy));
476 } else if (obj->cursed && !rn2(2)) {
478 You_hear("your heart beat.");
480 You_hear("
\8e©
\95ª
\82Ì
\90S
\91\9f\82Ì
\8cÛ
\93®
\82ð
\95·
\82¢
\82½
\81D");
483 if (Stunned || (Confusion && !rn2(5)))
485 if (!u.dx && !u.dy) {
493 You_hear("a faint typing noise.");
495 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");
498 if ((mtmp = m_at(rx, ry)) != 0) {
499 const char *mnm = x_monnam(mtmp, ARTICLE_A, (const char *) 0,
500 SUPPRESS_IT | SUPPRESS_INVISIBLE, FALSE);
502 if (mtmp->mundetected) {
503 if (!canspotmon(mtmp))
505 There("is %s hidden there.", mnm);
507 pline("
\82±
\82±
\82É%s
\82ª
\89B
\82ê
\82Ä
\82¢
\82é
\81D", mnm);
508 mtmp->mundetected = 0;
509 newsym(mtmp->mx, mtmp->my);
510 } else if (mtmp->mappearance) {
511 const char *what = "thing";
513 switch (mtmp->m_ap_type) {
515 what = simple_typename(mtmp->mappearance);
517 case M_AP_MONSTER: /* ignore Hallucination here */
518 what = mons[mtmp->mappearance].mname;
521 what = defsyms[mtmp->mappearance].explanation;
526 pline("That %s is really %s", what, mnm);
528 pline("
\82±
\82Ì%s
\82Í
\8eÀ
\8dÛ
\82É
\82Í%s
\81D", what, mnm);
529 } else if (flags.verbose && !canspotmon(mtmp)) {
531 There("is %s there.", mnm);
533 pline("
\82±
\82±
\82É
\82Í%s
\82ª
\82¢
\82é
\81D", mnm);
536 if (!canspotmon(mtmp))
537 map_invisible(rx, ry);
540 if (glyph_is_invisible(levl[rx][ry].glyph)) {
541 unmap_object(rx, ry);
544 pline_The("invisible monster must have moved.");
546 pline_The("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82Í
\88Ú
\93®
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
552 You_hear(hollow_str, "door");
554 You_hear(hollow_str, "
\94à");
555 cvt_sdoor_to_door(lev); /* ->typ = DOOR */
560 You_hear(hollow_str, "passage");
562 You_hear(hollow_str, "
\92Ê
\98H");
564 unblock_point(rx, ry);
569 if (!its_dead(rx, ry, &res))
571 You("hear nothing special."); /* not You_hear() */
573 pline("
\93Á
\82É
\89½
\82à
\95·
\82±
\82¦
\82È
\82¢
\81D");
579 static const char whistle_str[] = "produce a %s whistling sound.";
581 static const char whistle_str[] = "
\93J
\82ð
\90\81\82¢
\82Ä%s
\89¹
\82ð
\82½
\82Ä
\82½
\81D";
587 if (!can_blow(&youmonst)) {
589 You("are incapable of using the whistle.");
591 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
592 } else if (Underwater) {
594 You("blow bubbles through %s.", yname(obj));
596 You("%s
\82ð
\92Ê
\82µ
\82Ä
\96A
\82ð
\8fo
\82µ
\82½
\81D", xname(obj));
599 You(whistle_str, obj->cursed ? "shrill" : "high");
601 You(whistle_str, obj->cursed ? "
\95s
\8bC
\96¡
\82È" : "
\82©
\82ñ
\8d\82\82¢");
607 use_magic_whistle(obj)
610 register struct monst *mtmp, *nextmon;
612 if (!can_blow(&youmonst)) {
614 You("are incapable of using the whistle.");
616 You("
\93J
\82ð
\8eg
\82¤
\94\
\97Í
\82ª
\82È
\82¢
\81D");
617 } else if (obj->cursed && !rn2(2)) {
619 You("produce a %shigh-pitched humming noise.",
620 Underwater ? "very " : "");
622 You("%s
\8d\82\82¢
\92²
\8eq
\82Ì
\82¤
\82È
\82é
\82æ
\82¤
\82È
\89¹
\82ð
\82½
\82Ä
\82½
\81D",
623 Underwater ? "
\82Æ
\82Ä
\82à" : "");
627 int pet_cnt = 0, omx, omy;
629 /* it's magic! it works underwater too (at a higher pitch) */
632 Hallucination ? "normal" : Underwater ? "strange, high-pitched"
636 Hallucination ? "
\93J
\82Ì
\82æ
\82¤
\82È" : Underwater ? "
\95s
\8ev
\8bc
\82È
\8d\82\82¢
\92²
\8eq
\82Ì"
637 : "
\95s
\8ev
\8bc
\82È");
639 for (mtmp = fmon; mtmp; mtmp = nextmon) {
640 nextmon = mtmp->nmon; /* trap might kill mon */
641 if (DEADMONSTER(mtmp))
643 /* steed is already at your location, so not affected;
644 this avoids trap issues if you're on a trap location */
645 if (mtmp == u.usteed)
648 if (mtmp->mtrapped) {
649 /* no longer in previous trap (affects mintrap) */
651 fill_pit(mtmp->mx, mtmp->my);
653 /* mimic must be revealed before we know whether it
654 actually moves because line-of-sight may change */
657 omx = mtmp->mx, omy = mtmp->my;
659 if (mtmp->mx != omx || mtmp->my != omy) {
660 mtmp->mundetected = 0; /* reveal non-mimic hider */
661 if (canspotmon(mtmp))
663 if (mintrap(mtmp) == 2)
669 makeknown(obj->otyp);
677 return (boolean) (abs(u.ux - x) > n || abs(u.uy - y) > n);
686 for (obj = invent; obj; obj = obj->nobj)
687 if (obj->otyp == LEASH && obj->leashmon != 0)
692 /* otmp is about to be destroyed or stolen */
695 register struct obj *otmp;
697 register struct monst *mtmp;
699 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
700 if (mtmp->m_id == (unsigned) otmp->leashmon)
705 /* mtmp is about to die, or become untame */
707 m_unleash(mtmp, feedback)
708 register struct monst *mtmp;
711 register struct obj *otmp;
716 pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp));
718 pline("%s
\82Í
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82Ä
\93¦
\82ê
\82½
\81I", Monnam(mtmp));
721 Your("leash falls slack.");
723 Your("
\95R
\82ª
\82½
\82é
\82ñ
\82Å
\97\8e\82¿
\82½
\81D");
725 for (otmp = invent; otmp; otmp = otmp->nobj)
726 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
731 /* player is about to die (for bones) */
735 register struct obj *otmp;
736 register struct monst *mtmp;
738 for (otmp = invent; otmp; otmp = otmp->nobj)
739 if (otmp->otyp == LEASH)
741 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
751 return (boolean) (mtmp->mnum != PM_LONG_WORM);
760 register struct monst *mtmp;
763 if (!obj->leashmon && number_leashed() >= MAXLEASHED) {
765 You("cannot leash any more pets.");
767 You("
\82±
\82ê
\88È
\8fã
\83y
\83b
\83g
\82É
\95R
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
771 if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
774 if ((cc.x == u.ux) && (cc.y == u.uy)) {
775 if (u.usteed && u.dz > 0) {
781 pline("Leash yourself? Very funny...");
783 pline("
\8e©
\95ª
\82ð
\94\9b\82é
\81H
\95Ï
\82È
\82Ì
\81D
\81D
\81D");
787 if (!(mtmp = m_at(cc.x, cc.y))) {
789 There("is no creature there.");
791 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
795 spotmon = canspotmon(mtmp);
801 There("is no creature there.");
803 pline("
\82»
\82±
\82É
\82Í
\90¶
\82«
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
806 pline("%s %s leashed!", Monnam(mtmp),
807 (!obj->leashmon) ? "cannot be" : "is not");
809 pline("%s
\82Í
\95R
\82Å%s
\81I", Monnam(mtmp),
810 (!obj->leashmon) ? "
\8c\8b\82×
\82È
\82¢" : "
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢");
814 if (!obj->leashmon) {
815 if (mtmp->mleashed) {
817 pline("This %s is already leashed.",
818 spotmon ? l_monnam(mtmp) : "monster");
820 pline("%s
\82Í
\82·
\82Å
\82É
\8c\8b\82Ñ
\82Â
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D",
821 spotmon ? l_monnam(mtmp) : "
\89ö
\95¨");
825 if (!leashable(mtmp)) {
827 pline("The leash won't fit onto %s%s.", spotmon ? "your " : "",
830 pline("
\95R
\82Í%s
\82É
\8d\87\82í
\82È
\82¢
\81D",
837 You("slip the leash around %s%s.", spotmon ? "your " : "",
840 You("%s
\82ð
\95R
\82Å
\8c\8b\82Ñ
\82Â
\82¯
\82½
\81D",
844 obj->leashmon = (int) mtmp->m_id;
848 if (obj->leashmon != (int) mtmp->m_id) {
850 pline("This leash is not attached to that creature.");
852 pline("
\82±
\82Ì
\95R
\82Í
\82»
\82ê
\82É
\82Í
\8c\8b\82Î
\82ê
\82Ä
\82¢
\82È
\82¢
\81D");
857 pline_The("leash would not come off!");
859 pline("
\95R
\82ª
\82Í
\82¸
\82ê
\82È
\82¢
\81I");
866 You("remove the leash from %s%s.", spotmon ? "your " : "",
869 You("%s
\82©
\82ç
\95R
\82ð
\82Í
\82¸
\82µ
\82½
\81D",
876 /* assuming mtmp->mleashed has been checked */
885 if (otmp->otyp == LEASH && otmp->leashmon == (int) mtmp->m_id)
889 return (struct obj *) 0;
895 register struct monst *mtmp;
896 register struct obj *otmp;
898 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
899 if (DEADMONSTER(mtmp))
901 if (mtmp->mleashed) {
902 if (distu(mtmp->mx, mtmp->my) > 2)
904 if (distu(mtmp->mx, mtmp->my) > 2) {
905 for (otmp = invent; otmp; otmp = otmp->nobj)
906 if (otmp->otyp == LEASH
907 && otmp->leashmon == (int) mtmp->m_id) {
911 You_feel("%s leash go slack.",
912 (number_leashed() > 1) ? "a" : "the");
914 You("
\95R
\82ª
\82½
\82é
\82ñ
\82¾
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
922 /* no pack mules for the Amulet */
923 if (u.usteed && mon_has_amulet(u.usteed))
932 register struct obj *otmp;
933 register struct monst *mtmp;
935 for (otmp = invent; otmp; otmp = otmp->nobj) {
936 if (otmp->otyp != LEASH || otmp->leashmon == 0)
938 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
939 if (DEADMONSTER(mtmp))
941 if ((int) mtmp->m_id == otmp->leashmon)
945 impossible("leash in use isn't attached to anything?");
949 if (dist2(u.ux, u.uy, mtmp->mx, mtmp->my)
950 > dist2(x, y, mtmp->mx, mtmp->my)) {
951 if (!um_dist(mtmp->mx, mtmp->my, 3)) {
952 ; /* still close enough */
953 } else if (otmp->cursed && !breathless(mtmp->data)) {
954 if (um_dist(mtmp->mx, mtmp->my, 5)
955 || (mtmp->mhp -= rnd(2)) <= 0) {
956 long save_pacifism = u.uconduct.killer;
959 Your("leash chokes %s to death!", mon_nam(mtmp));
961 pline("%s
\82Í
\8di
\82ß
\8eE
\82³
\82ê
\82½
\81I",mon_nam(mtmp));
962 /* hero might not have intended to kill pet, but
963 that's the result of his actions; gain experience,
964 lose pacifism, take alignment and luck hit, make
965 corpse less likely to remain tame after revival */
966 xkilled(mtmp, 0); /* no "you kill it" message */
967 /* life-saving doesn't ordinarily reset this */
969 u.uconduct.killer = save_pacifism;
972 pline("%s is choked by the leash!", Monnam(mtmp));
974 pline("%s
\82Í
\95R
\82Å
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82½
\81I", Monnam(mtmp));
975 /* tameness eventually drops to 1 here (never 0) */
976 if (mtmp->mtame && rn2(mtmp->mtame))
980 if (um_dist(mtmp->mx, mtmp->my, 5)) {
982 pline("%s leash snaps loose!", s_suffix(Monnam(mtmp)));
984 pline("%s
\82Ì
\95R
\82Í
\83p
\83`
\83\93\82Æ
\8aO
\82ê
\82½
\81I", Monnam(mtmp));
985 m_unleash(mtmp, FALSE);
988 You("pull on the leash.");
990 You("
\95R
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\81D");
991 if (mtmp->data->msound != MS_SILENT)
1012 return ((ACURR(A_CHA) > 14)
1013 ? ((poly_gender() == 1)
1019 /*JP
\8cê
\8a²
\82Å
\8eg
\82¤ */
1026 #define WEAK 3 /* from eat.c */
1029 static const char look_str[] = "look %s.";
1031 static const char look_str[] = "%s
\8c©
\82¦
\82é
\81D";
1037 const char *mirror, *uvisage;
1041 boolean vis, invis_mirror, useeit, monable;
1043 if (!getdir((char *) 0))
1045 invis_mirror = Invis;
1046 useeit = !Blind && (!invis_mirror || See_invisible);
1047 uvisage = beautiful();
1048 mirror = simpleonames(obj); /* "mirror" or "looking glass" */
1049 if (obj->cursed && !rn2(2)) {
1052 pline_The("%s fogs up and doesn't reflect!", mirror);
1054 pline("%s
\82Í
\93Ü
\82è
\81C
\89f
\82ç
\82È
\82
\82È
\82Á
\82½
\81I", mirror);
1057 if (!u.dx && !u.dy && !u.dz) {
1060 You_cant("see your %s %s.", uvisage, body_part(FACE));
1062 You_cant("
\8e©
\95ª
\82Ì%s
\82¢%s
\82ð
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", uvisage, body_part(FACE));
1064 if (u.umonnum == PM_FLOATING_EYE) {
1067 You("stiffen momentarily under your gaze.");
1069 pline("
\88ê
\8fu
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82½
\81D");
1073 pline("Yow! The %s stares back!", mirror);
1075 pline("
\82¨
\82ì
\81I%s
\82ª
\82 \82È
\82½
\82ð
\82É
\82ç
\82Ý
\95Ô
\82µ
\82½
\81I", mirror);
1078 pline("Yikes! You've frozen yourself!");
1080 pline("
\82¨
\82ì
\81I
\82 \82È
\82½
\82Í
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I");
1081 if (!Hallucination || !rn2(4)) {
1082 nomul(-rnd(MAXULEV + 6 - u.ulevel));
1084 multi_reason = "gazing into a mirror";
1086 multi_reason = "
\8b¾
\82É
\94½
\8eË
\82µ
\82½
\8e\8b\90ü
\82Å
\8dd
\92¼
\82µ
\82Ä
\82¢
\82é
\8aÔ
\82É";
1088 nomovemsg = 0; /* default, "you can move again" */
1090 } else if (youmonst.data->mlet == S_VAMPIRE)
1092 You("don't have a reflection.");
1094 You("
\8b¾
\82É
\89f
\82ç
\82È
\82©
\82Á
\82½
\81D");
1095 else if (u.umonnum == PM_UMBER_HULK) {
1097 pline("Huh? That doesn't look like you!");
1099 pline("
\82Ù
\82¦
\81H
\8eÊ
\82Á
\82Ä
\82é
\82Ì
\82Í
\82 \82È
\82½
\82¶
\82á
\82È
\82¢
\82Ý
\82½
\82¢
\82¾
\81I");
1100 make_confused(HConfusion + d(3, 4), FALSE);
1101 } else if (Hallucination)
1102 You(look_str, hcolor((char *) 0));
1105 You(look_str, "peaked");
1107 You(look_str, "
\8aç
\90F
\82ª
\88«
\82");
1108 else if (u.uhs >= WEAK)
1110 You(look_str, "undernourished");
1112 You(look_str, "
\89h
\97{
\8e¸
\92²
\82Ì
\82æ
\82¤
\82É");
1115 You("look as %s as ever.", uvisage);
1117 You("
\82 \82¢
\82©
\82í
\82ç
\82¸%s
\82
\8c©
\82¦
\82é
\81D", uvisage);
1123 You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)),
1124 mbodypart(u.ustuck, STOMACH));
1130 You(Hallucination ? "give the fish a chance to fix their makeup."
1131 : "reflect the murky water.");
1133 You(Hallucination ? "
\8b\9b\82É
\89»
\8fÏ
\92¼
\82µ
\82Ì
\8b@
\89ï
\82ð
\97^
\82¦
\82½
\81D"
1134 : "
\82 \82È
\82½
\82Í
\97\84\82ñ
\82¾
\90\85\82ð
\89f
\82µ
\82½
\81D");
1141 You("reflect the %s.",
1143 You("%s
\82ð
\89f
\82µ
\82½
\81D",
1144 (u.dz > 0) ? surface(u.ux, u.uy) : ceiling(u.ux, u.uy));
1147 mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM,
1148 (int FDECL((*), (MONST_P, OBJ_P))) 0,
1149 (int FDECL((*), (OBJ_P, OBJ_P))) 0, &obj);
1150 if (!mtmp || !haseyes(mtmp->data) || notonhead)
1153 /* couldsee(mtmp->mx, mtmp->my) is implied by the fact that bhit()
1154 targetted it, so we can ignore possibility of X-ray vision */
1155 vis = canseemon(mtmp);
1156 /* ways to directly see monster (excludes X-ray vision, telepathy,
1157 extended detection, type-specific warning) */
1158 #define SEENMON (MONSEEN_NORMAL | MONSEEN_SEEINVIS | MONSEEN_INFRAVIS)
1159 how_seen = vis ? howmonseen(mtmp) : 0;
1160 /* whether monster is able to use its vision-based capabilities */
1161 monable = !mtmp->mcan && (!mtmp->minvis || perceives(mtmp->data));
1162 mlet = mtmp->data->mlet;
1163 if (mtmp->msleeping) {
1166 pline("%s is too tired to look at your %s.", Monnam(mtmp),
1168 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),
1170 } else if (!mtmp->mcansee) {
1173 pline("%s can't see anything right now.", Monnam(mtmp));
1175 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\89½
\82à
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", Monnam(mtmp));
1176 } else if (invis_mirror && !perceives(mtmp->data)) {
1179 pline("%s fails to notice your %s.", Monnam(mtmp), mirror);
1181 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82É
\8bC
\95t
\82©
\82È
\82©
\82Á
\82½
\81D", Monnam(mtmp), mirror);
1182 /* infravision doesn't produce an image in the mirror */
1183 } else if ((how_seen & SEENMON) == MONSEEN_INFRAVIS) {
1184 if (vis) /* (redundant) */
1186 pline("%s is too far away to see %sself in the dark.",
1187 Monnam(mtmp), mhim(mtmp));
1189 pline("%s
\82Í
\88Ã
\88Å
\82Å
\8e©
\95ª
\8e©
\90g
\82ð
\8c©
\82é
\82É
\82Í
\89\93\82·
\82¬
\82é
\81D", Monnam(mtmp));
1191 /* some monsters do special things */
1192 } else if (mlet == S_VAMPIRE || mlet == S_GHOST || is_vampshifter(mtmp)) {
1195 pline("%s doesn't have a reflection.", Monnam(mtmp));
1197 pline("%s
\82Í%s
\82É
\89f
\82ç
\82È
\82¢
\81D", Monnam(mtmp), mirror);
1198 } else if (monable && mtmp->data == &mons[PM_MEDUSA]) {
1200 if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!"))
1202 if (mon_reflects(mtmp, "
\82É
\82ç
\82Ý
\82Í%s
\82Ì%s
\82Å
\94½
\8eË
\82µ
\82½
\81I"))
1206 pline("%s is turned to stone!", Monnam(mtmp));
1208 pline("%s
\82Í
\90Î
\82É
\82È
\82Á
\82½
\81I", Monnam(mtmp));
1211 } else if (monable && mtmp->data == &mons[PM_FLOATING_EYE]) {
1212 int tmp = d((int) mtmp->m_lev, (int) mtmp->data->mattk[0].damd);
1217 pline("%s is frozen by its reflection.", Monnam(mtmp));
1219 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D", Monnam(mtmp));
1222 You_hear("%s stop moving.", something);
1224 You_hear("
\89½
\82©
\82ª
\93®
\82«
\82ð
\82Æ
\82ß
\82½
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1225 paralyze_monst(mtmp, (int) mtmp->mfrozen + tmp);
1226 } else if (monable && mtmp->data == &mons[PM_UMBER_HULK]) {
1229 pline("%s confuses itself!", Monnam(mtmp));
1231 pline("%s
\82Í
\8d¬
\97\90\82µ
\82½
\81I", Monnam(mtmp));
1233 } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
1234 || mtmp->data == &mons[PM_INCUBUS])) {
1236 char buf[BUFSZ]; /* "She" or "He" */
1239 pline("%s admires %sself in your %s.", Monnam(mtmp), mhim(mtmp),
1242 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\82¤
\82Á
\82Æ
\82è
\82µ
\82½
\81D", Monnam(mtmp));
1245 pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
1247 pline("%s
\82Í
\82»
\82ê
\82ð
\92D
\82Á
\82½
\81I", upstart(strcpy(buf, mhe(mtmp))));
1250 pline("It steals your %s!", mirror);
1252 pline("
\89½
\8eÒ
\82©
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\93\90\82ñ
\82¾
\81I", mirror);
1253 setnotworn(obj); /* in case mirror was wielded */
1255 (void) mpickobj(mtmp, obj);
1256 if (!tele_restrict(mtmp))
1257 (void) rloc(mtmp, TRUE);
1258 } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
1259 && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
1262 pline("%s is frightened by its reflection.", Monnam(mtmp));
1264 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\8c©
\82Ä
\95|
\82ª
\82Á
\82½
\81D", Monnam(mtmp));
1265 monflee(mtmp, d(2, 4), FALSE, FALSE);
1266 } else if (!Blind) {
1267 if (mtmp->minvis && !See_invisible)
1269 else if ((mtmp->minvis && !perceives(mtmp->data))
1270 /* redundant: can't get here if these are true */
1271 || !haseyes(mtmp->data) || notonhead || !mtmp->mcansee)
1273 pline("%s doesn't seem to notice %s reflection.", Monnam(mtmp),
1276 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1280 pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp));
1282 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8ep
\82ð
\96³
\8e\8b\82µ
\82½
\81D", Monnam(mtmp));
1291 register struct obj *obj = *optr;
1293 boolean wakem = FALSE, learno = FALSE,
1294 ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe),
1296 (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy)
1297 && !On_stairs(u.ux, u.uy));
1300 You("ring %s.", the(xname(obj)));
1302 You("%s
\82ð
\96Â
\82ç
\82µ
\82½
\81D", the(xname(obj)));
1304 if (Underwater || (u.uswallow && ordinary)) {
1306 amii_speaker(obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME);
1309 pline("But the sound is muffled.");
1311 pline("
\82µ
\82©
\82µ
\89¹
\82Í
\82©
\82«
\8fÁ
\82³
\82ê
\82½
\81D");
1313 } else if (invoking && ordinary) {
1314 /* needs to be recharged... */
1316 pline("But it makes no sound.");
1318 pline("
\82µ
\82©
\82µ
\81C
\89¹
\82Í
\96Â
\82ç
\82È
\82©
\82Á
\82½
\81D");
1319 learno = TRUE; /* help player figure out why */
1321 } else if (ordinary) {
1323 amii_speaker(obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME);
1325 if (obj->cursed && !rn2(4)
1326 /* note: once any of them are gone, we stop all of them */
1327 && !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE)
1328 && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE)
1329 && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE)
1330 && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT))
1333 You("summon %s!", a_monnam(mtmp));
1335 You("%s
\82ð
\8f¢
\8a«
\82µ
\82½
\81I", a_monnam(mtmp));
1336 if (!obj_resists(obj, 93, 100)) {
1338 pline("%s shattered!", Tobjnam(obj, "have"));
1340 pline("%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81I", xname(obj));
1348 mon_adjust_speed(mtmp, 2, (struct obj *) 0);
1350 case 2: /* no explanation; it just happens... */
1352 multi_reason = NULL;
1360 /* charged Bell of Opening */
1361 consume_obj_charge(obj, TRUE);
1367 pline1(nothing_happens);
1369 } else if (obj->cursed) {
1374 mkundead(&mm, FALSE, NO_MINVENT);
1377 } else if (invoking) {
1379 pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue"));
1381 pline("%s
\82Í
\95s
\8bC
\96¡
\82È
\89s
\82¢
\89¹
\82ð
\8fo
\82µ
\82½
\81D
\81D
\81D", xname(obj));
1383 amii_speaker(obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME);
1389 } else if (obj->blessed) {
1393 amii_speaker(obj, "ahahahDhEhCw", AMII_SOFT_VOLUME);
1398 } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1399 buried_ball_to_freedom();
1405 pline1(nothing_happens);
1409 pline("%s opens...", Something);
1411 pline("
\89½
\82©
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1416 pline("Things open around you...");
1418 pline("
\82Ü
\82í
\82è
\82Ì
\95¨
\82ª
\8aJ
\82¢
\82½
\81D
\81D
\81D");
1423 } else { /* uncursed */
1425 amii_speaker(obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME);
1430 pline1(nothing_happens);
1433 } /* charged BofO */
1436 makeknown(BELL_OF_OPENING);
1444 use_candelabrum(obj)
1445 register struct obj *obj;
1447 #if 0 /*JP*//* not used */
1448 const char *s = (obj->spe != 1) ? "candles" : "candle";
1453 You("snuff the %s.", s);
1455 You("
\82ë
\82¤
\82»
\82
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1456 end_burn(obj, TRUE);
1459 if (obj->spe <= 0) {
1461 pline("This %s has no %s.", xname(obj), s);
1463 pline("
\82±
\82Ì%s
\82É
\82Í
\82ë
\82¤
\82»
\82
\82ª
\82È
\82¢
\81D", xname(obj));
1468 You("cannot make fire under water.");
1470 You("
\90\85\92\86\82Å
\89Î
\82ð
\82¨
\82±
\82¹
\82È
\82¢
\81D");
1473 if (u.uswallow || obj->cursed) {
1476 pline_The("%s %s for a moment, then %s.", s, vtense(s, "flicker"),
1479 pline("
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\82µ
\82Î
\82ç
\82
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D");
1485 There("%s only %d %s in %s.", vtense(s, "are"), obj->spe, s,
1488 pline("%s
\82É
\82Í
\82½
\82Á
\82½%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82µ
\82©
\82È
\82¢
\81D",
1489 xname(obj), obj->spe);
1493 pline("%s lit. %s dimly.", obj->spe == 1 ? "It is" : "They are",
1494 Tobjnam(obj, "shine"));
1496 pline("%s
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s
\82Í
\82Ù
\82Ì
\82©
\82É
\8bP
\82¢
\82½
\81D",
1497 xname(obj), xname(obj));
1501 pline("%s's %s burn%s", The(xname(obj)), s,
1502 (Blind ? "." : " brightly!"));
1504 pline("%s
\82Ì
\82ë
\82¤
\82»
\82
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I", The(xname(obj)),
1505 (Blind ? "" : "
\96¾
\82é
\82"));
1508 if (!invocation_pos(u.ux, u.uy) || On_stairs(u.ux, u.uy)) {
1510 pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
1512 pline("
\82ë
\82¤
\82»
\82
\82Í
\82·
\82²
\82¢
\91¬
\82³
\82Å
\94R
\82¦
\8en
\82ß
\82½
\81I");
1513 /* this used to be obj->age /= 2, rounding down; an age of
1514 1 would yield 0, confusing begin_burn() and producing an
1515 unlightable, unrefillable candelabrum; round up instead */
1516 obj->age = (obj->age + 1L) / 2L;
1518 if (obj->spe == 7) {
1521 pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
1523 pline("
\8aï
\96
\82È
\92g
\82©
\82³
\82ð%s
\82É
\8a´
\82¶
\82½
\81I", xname(obj));
1526 pline("%s with a strange light!", Tobjnam(obj, "glow"));
1528 pline("%s
\82Í
\8aï
\96
\82È
\8cõ
\82ð
\94
\82µ
\82Ä
\82¢
\82é
\81I", xname(obj));
1532 begin_burn(obj, FALSE);
1539 register struct obj *obj = *optr;
1540 register struct obj *otmp;
1542 const char *s = (obj->quan != 1) ? "candles" : "candle";
1544 const char *s = "
\82ë
\82¤
\82»
\82";
1545 char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
1552 otmp = carrying(CANDELABRUM_OF_INVOCATION);
1553 if (!otmp || otmp->spe == 7) {
1558 /*JP:
\8dÅ
\8fI
\93I
\82É
\82Í
\81u
\82ë
\82¤
\82»
\82
\82ð
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1559 /* first, minimal candelabrum suffix for formatting candles */
1561 Sprintf(qsfx, " to\033%s?", thesimpleoname(otmp));
1563 Sprintf(qsfx, "
\82ð\033%s
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", thesimpleoname(otmp));
1564 /* next, format the candles as a prefix for the candelabrum */
1566 (void) safe_qbuf(qbuf, "Attach ", qsfx, obj, yname, thesimpleoname, s);
1568 (void) safe_qbuf(qbuf, "", qsfx, obj, xname, thesimpleoname, s);
1569 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð\033
\90C
\91ä
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H
\81v*/
1570 /* strip temporary candelabrum suffix */
1572 if ((q = strstri(qbuf, " to\033")) != 0)
1575 if ((q = strchr(qbuf, '\033')) != 0)
1577 /*JP:
\81u(
\82ë
\82¤
\82»
\82)
\82ð
\81v*/
1579 /* last, format final "attach candles to candelabrum?" query */
1581 if (yn(safe_qbuf(qbuf, qbuf, "?", otmp, yname, thesimpleoname, "it"))
1583 if (yn(safe_qbuf(qbuf, qbuf, "
\82É
\8eæ
\82è
\82Â
\82¯
\82Ü
\82·
\82©
\81H", otmp, xname, thesimpleoname, "
\82»
\82ê"))
1588 if ((long) otmp->spe + obj->quan > 7L) {
1589 obj = splitobj(obj, 7L - (long) otmp->spe);
1590 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
1591 /* avoid a grammatical error if obj->quan gets
1592 reduced to 1 candle from more than one */
1593 s = (obj->quan != 1) ? "candles" : "candle";
1598 You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
1601 You("%ld
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ð%s%s
\82Ö
\8eæ
\82è
\82Â
\82¯
\82½
\81D",
1602 obj->quan, !otmp->spe ? "" : "
\82³
\82ç
\82É",
1605 if (!otmp->spe || otmp->age > obj->age)
1606 otmp->age = obj->age;
1607 otmp->spe += (int) obj->quan;
1608 if (otmp->lamplit && !obj->lamplit)
1610 pline_The("new %s magically %s!", s, vtense(s, "ignite"));
1612 pline("
\90V
\82µ
\82¢
\82ë
\82¤
\82»
\82
\82Í
\95s
\8ev
\8bc
\82È
\89\8a\82ð
\82 \82°
\82½
\81I");
1613 else if (!otmp->lamplit && obj->lamplit)
1615 pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
1617 pline("
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D");
1620 verbalize("You %s %s, you bought %s!",
1621 otmp->lamplit ? "burn" : "use",
1622 (obj->quan > 1L) ? "them" : "it",
1623 (obj->quan > 1L) ? "them" : "it");
1625 verbalize("
\89Î
\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1627 if (obj->quan < 7L && otmp->spe == 7)
1629 pline("%s now has seven%s candles attached.", The(xname(otmp)),
1630 otmp->lamplit ? " lit" : "");
1632 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",
1633 The(xname(otmp)), otmp->lamplit ? "
\89Î
\82Ì
\82Â
\82¢
\82½" : "");
1635 /* candelabrum's light range might increase */
1637 obj_merge_light_sources(otmp, otmp);
1638 /* candles are no longer a separate light source */
1640 end_burn(obj, TRUE);
1641 /* candles are now gone */
1646 /* call in drop, throw, and put in box, etc. */
1651 boolean candle = Is_candle(otmp);
1653 if ((candle || otmp->otyp == CANDELABRUM_OF_INVOCATION)
1657 #if 0 /*JP*//* not used */
1658 boolean many = candle ? (otmp->quan > 1L) : (otmp->spe > 1);
1661 (void) get_obj_location(otmp, &x, &y, 0);
1662 if (otmp->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1664 pline("%s%scandle%s flame%s extinguished.", Shk_Your(buf, otmp),
1665 (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"),
1666 (many ? "s are" : " is"));
1668 pline("%s%s
\82ë
\82¤
\82»
\82
\82Ì
\89\8a\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, otmp),
1669 candle ? "" : "
\90C
\91ä
\82Ì");
1671 end_burn(otmp, TRUE);
1677 /* called when lit lamp is hit by water or put into a container or
1678 you've been swallowed by a monster; obj might be in transit while
1679 being thrown or dropped so don't assume that its location is valid */
1687 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1688 || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
1689 (void) get_obj_location(obj, &x, &y, 0);
1690 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1692 pline("%s %s out!", Yname2(obj), otense(obj, "go"));
1694 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", Yname2(obj));
1695 end_burn(obj, TRUE);
1698 if (snuff_candle(obj))
1704 /* Called when potentially lightable object is affected by fire_damage().
1705 Return TRUE if object was lit and FALSE otherwise --ALI */
1712 if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) {
1713 if ((obj->otyp == MAGIC_LAMP
1714 || obj->otyp == CANDELABRUM_OF_INVOCATION) && obj->spe == 0)
1716 else if (obj->otyp != MAGIC_LAMP && obj->age == 0)
1718 if (!get_obj_location(obj, &x, &y, 0))
1720 if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed)
1722 if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1723 || obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2))
1725 if (obj->where == OBJ_MINVENT ? cansee(x, y) : !Blind)
1727 pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
1729 pline("%s
\82Ì
\96¾
\82©
\82è
\82ª
\82Â
\82¢
\82½
\81I", Yname2(obj));
1730 if (obj->otyp == POT_OIL)
1731 makeknown(obj->otyp);
1732 if (carried(obj) && obj->unpaid && costly_spot(u.ux, u.uy)) {
1733 /* if it catches while you have it, then it's your tough luck */
1736 verbalize("That's in addition to the cost of %s %s, of course.",
1737 yname(obj), obj->quan == 1L ? "itself" : "themselves");
1739 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ%s
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D", xname(obj));
1741 bill_dummy_object(obj);
1743 begin_burn(obj, FALSE);
1756 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1757 || obj->otyp == BRASS_LANTERN)
1759 pline("%slamp is now off.", Shk_Your(buf, obj));
1761 pline("%s
\83\89\83\93\83v
\82Ì
\93\94\82Í
\8fÁ
\82¦
\82½
\81D", Shk_Your(buf, obj));
1764 You("snuff out %s.", yname(obj));
1766 You("%s
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D", xname(obj));
1767 end_burn(obj, TRUE);
1772 pline(!Is_candle(obj) ? "This is not a diving lamp"
1773 : "Sorry, fire and water don't mix.");
1775 pline(!Is_candle(obj) ? "
\82±
\82ê
\82Í
\90ö
\90\85\97p
\82Ì
\83\89\83\93\83v
\82¶
\82á
\82È
\82¢
\81D"
1776 : "
\8ec
\94O
\82È
\82ª
\82ç
\81C
\89Î
\82Æ
\90\85\82Í
\82Ü
\82´
\82ç
\82È
\82¢
\81D");
1780 /* magic lamps with an spe == 0 (wished for) cannot be lit */
1781 if ((!Is_candle(obj) && obj->age == 0)
1782 || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) {
1783 if (obj->otyp == BRASS_LANTERN)
1785 Your("lamp has run out of power.");
1787 Your("
\83\89\83\93\83v
\82Ì
\93d
\97Í
\82ð
\8eg
\82¢
\90Ø
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
1790 pline("This %s has no oil.", xname(obj));
1792 pline("
\82±
\82Ì%s
\82É
\82Í
\82à
\82¤
\83I
\83C
\83\8b\82ª
\82È
\82¢
\81D", xname(obj));
1795 if (obj->cursed && !rn2(2)) {
1798 pline("%s for a moment, then %s.", Tobjnam(obj, "flicker"),
1799 otense(obj, "die"));
1801 pline("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\93_
\96Å
\82µ
\81C
\8fÁ
\82¦
\82½
\81D",
1805 if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
1806 || obj->otyp == BRASS_LANTERN) {
1809 pline("%slamp is now on.", Shk_Your(buf, obj));
1811 pline("%s
\83\89\83\93\83v
\82É
\93\94\82ª
\93\94\82Á
\82½
\81D", Shk_Your(buf, obj));
1812 } else { /* candle(s) */
1814 pline("%s flame%s %s%s", s_suffix(Yname2(obj)), plur(obj->quan),
1815 otense(obj, "burn"), Blind ? "." : " brightly!");
1817 pline("%s
\82Í%s
\94R
\82¦
\82 \82ª
\82Á
\82½
\81I",
1818 xname(obj), Blind ? "" : "
\96¾
\82é
\82");
1820 if (obj->unpaid && costly_spot(u.ux, u.uy)
1821 && obj->age == 20L * (long) objects[obj->otyp].oc_cost) {
1823 const char *ithem = (obj->quan > 1L) ? "them" : "it";
1825 verbalize("You burn %s, you bought %s!", ithem, ithem);
1827 verbalize("
\93\94\82ð
\82Â
\82¯
\82½
\82È
\82ç
\81C
\94\83\82Á
\82Ä
\82à
\82ç
\82¨
\82¤
\81I");
1829 bill_dummy_object(obj);
1832 begin_burn(obj, FALSE);
1838 struct obj *obj; /* obj is a potion of oil */
1850 You("snuff the lit potion.");
1852 You("
\96û
\95r
\82Ì
\89Î
\82ð
\90\81\82«
\8fÁ
\82µ
\82½
\81D");
1853 end_burn(obj, TRUE);
1855 * Free & add to re-merge potion. This will average the
1856 * age of the potions. Not exactly the best solution,
1862 } else if (Underwater) {
1864 There("is not enough oxygen to sustain a fire.");
1866 pline("
\89Î
\82ð
\82Â
\82¯
\82é
\82Ì
\82É
\8f\
\95ª
\82È
\8e_
\91f
\82ª
\82È
\82¢
\81D");
1870 split1off = (obj->quan > 1L);
1872 obj = splitobj(obj, 1L);
1875 You("light %spotion.%s", shk_your(buf, obj),
1876 Blind ? "" : " It gives off a dim light.");
1878 You("%s
\96û
\95r
\82É
\89Î
\82ð
\82Â
\82¯
\82½
\81D%s", shk_your(buf, obj),
1879 Blind ? "" : "
\96û
\95r
\82Í
\88Ã
\82¢
\8cõ
\82ð
\82Í
\82È
\82Á
\82½
\81D");
1882 if (obj->unpaid && costly_spot(u.ux, u.uy)) {
1883 /* Normally, we shouldn't both partially and fully charge
1884 * for an item, but (Yendorian Fuel) Taxes are inevitable...
1888 verbalize("That's in addition to the cost of the potion, of course.");
1890 verbalize("
\82±
\82ê
\82Í
\82à
\82¿
\82ë
\82ñ
\96û
\95r
\82Ì
\92l
\92i
\82Æ
\82Í
\95Ê
\82¾
\82æ
\81D");
1891 bill_dummy_object(obj);
1893 makeknown(obj->otyp);
1895 begin_burn(obj, FALSE); /* after shop billing */
1897 obj_extract_self(obj); /* free from inv */
1900 obj = hold_another_object(obj, "You drop %s!", doname(obj),
1902 obj = hold_another_object(obj, "
\82 \82È
\82½
\82Í%s
\82ð
\97\8e\82µ
\82½
\81I", doname(obj),
1909 static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 };
1914 struct obj *obj = getobj(cuddly, "rub");
1916 if (obj && obj->oclass == GEM_CLASS) {
1917 if (is_graystone(obj)) {
1922 pline("Sorry, I don't know how to use that.");
1924 pline("
\8ec
\94O
\81D
\8eg
\82¢
\95û
\82ª
\82í
\82©
\82ç
\82È
\82¢
\81D");
1929 if (!obj || !wield_tool(obj, "rub"))
1932 /* now uwep is obj */
1933 if (uwep->otyp == MAGIC_LAMP) {
1934 if (uwep->spe > 0 && !rn2(3)) {
1935 check_unpaid_usage(uwep, TRUE); /* unusual item use */
1936 /* bones preparation: perform the lamp transformation
1937 before releasing the djinni in case the latter turns out
1938 to be fatal (a hostile djinni has no chance to attack yet,
1939 but an indebted one who grants a wish might bestow an
1940 artifact which blasts the hero with lethal results) */
1941 uwep->otyp = OIL_LAMP;
1942 uwep->spe = 0; /* for safety */
1943 uwep->age = rn1(500, 1000);
1945 begin_burn(uwep, TRUE);
1946 djinni_from_bottle(uwep);
1947 makeknown(MAGIC_LAMP);
1949 } else if (rn2(2)) {
1951 You("%s smoke.", !Blind ? "see a puff of" : "smell");
1953 pline("
\82¯
\82Þ
\82è%s
\81D", !Blind ? "
\82ª
\95\91\82¢
\82 \82ª
\82Á
\82½" : "
\82Ì
\93õ
\82¢
\82ª
\82µ
\82½");
1955 pline1(nothing_happens);
1956 } else if (obj->otyp == BRASS_LANTERN) {
1957 /* message from Adventure */
1959 pline("Rubbing the electric lamp is not particularly rewarding.");
1961 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");
1963 pline("Anyway, nothing exciting happens.");
1965 pline("
\82â
\82Á
\82Ï
\82è
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
1967 pline1(nothing_happens);
1979 is_valid_jump_pos(x, y, magic, showmsg)
1983 if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(x, y) != 5) {
1984 /* The Knight jumping restriction still applies when riding a
1985 * horse. After all, what shape is the knight piece in chess?
1989 pline("Illegal move!");
1991 pline("
\82»
\82Ì
\88Ú
\93®
\82Í
\8cj
\94n
\92µ
\82Ñ
\82¶
\82á
\82È
\82¢
\81I");
1993 } else if (distu(x, y) > (magic ? 6 + magic * 3 : 9)) {
1998 pline("
\89\93\82·
\82¬
\82é
\81I");
2000 } else if (!cansee(x, y)) {
2003 You("cannot see where to land!");
2005 You("
\92\85\92n
\93_
\82ª
\8c©
\82¦
\82È
\82¢
\81I");
2007 } else if (!isok(x, y)) {
2010 You("cannot jump there!");
2012 You("
\82»
\82±
\82É
\82Í
\94ò
\82×
\82È
\82¢
\81I");
2018 static int jumping_is_magic;
2021 display_jump_positions(state)
2025 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
2026 } else if (state == 1) {
2029 for (dx = -4; dx <= 4; dx++)
2030 for (dy = -4; dy <= 4; dy++) {
2031 x = dx + (int) u.ux;
2032 y = dy + (int) u.uy;
2033 if (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
2034 && is_valid_jump_pos(x, y, jumping_is_magic, FALSE))
2038 tmp_at(DISP_END, 0);
2044 int magic; /* 0=Physical, otherwise skill level */
2048 if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
2049 /* normally (nolimbs || slithy) implies !Jumping,
2050 but that isn't necessarily the case for knights */
2052 You_cant("jump; you have no legs!");
2054 pline("
\91«
\82ª
\96³
\82
\82Ä
\82Í
\92µ
\82×
\82È
\82¢
\81I");
2056 } else if (!magic && !Jumping) {
2058 You_cant("jump very far.");
2060 You_cant("
\82»
\82ñ
\82È
\89\93\82
\82Ü
\82Å
\92µ
\82×
\82È
\82¢
\81D");
2062 /* if steed is immobile, can't do physical jump but can do spell one */
2063 } else if (!magic && u.usteed && stucksteed(FALSE)) {
2064 /* stucksteed gave "<steed> won't move" message */
2066 } else if (u.uswallow) {
2069 You("bounce around a little.");
2071 pline("
\94½
\93®
\82ð
\82Â
\82¯
\82½
\81D");
2075 pline("You've got to be kidding!");
2077 pline("
\8fç
\92k
\82Í
\82æ
\82µ
\82±
\82³
\82ñ
\81I");
2079 } else if (u.uinwater) {
2082 You("swish around a little.");
2084 pline("
\83X
\83C
\83X
\83C
\82Æ
\89j
\82¢
\82¾
\81D");
2088 pline("This calls for swimming, not jumping!");
2090 pline("
\82»
\82ê
\82Í
\81w
\89j
\82®
\81x
\82Å
\82 \82Á
\82Ä
\81C
\81w
\92µ
\82Ô
\81x
\82¶
\82á
\82È
\82¢
\81I");
2092 } else if (u.ustuck) {
2093 if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
2095 You("pull free from %s.", mon_nam(u.ustuck));
2097 You("%s
\82©
\82ç
\97£
\82ê
\82½
\81D", mon_nam(u.ustuck));
2103 You("writhe a little in the grasp of %s!", mon_nam(u.ustuck));
2105 You("%s
\82©
\82ç
\93¦
\82ê
\82æ
\82¤
\82Æ
\83W
\83^
\83o
\83^
\82µ
\82½
\81I", mon_nam(u.ustuck));
2109 You("cannot escape from %s!", mon_nam(u.ustuck));
2111 You("%s
\82©
\82ç
\93¦
\82ê
\82ç
\82ê
\82È
\82¢
\81I", mon_nam(u.ustuck));
2113 } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
2116 You("flail around a little.");
2118 You("
\83o
\83^
\83o
\83^
\92µ
\82ñ
\82¾
\81D");
2122 You("don't have enough traction to jump.");
2124 You("
\92µ
\82Ô
\82½
\82ß
\82Ì
\94½
\93®
\82ª
\82Â
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
2126 } else if (!magic && near_capacity() > UNENCUMBERED) {
2128 You("are carrying too much to jump!");
2130 You("
\82½
\82
\82³
\82ñ
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\92µ
\82×
\82È
\82¢
\81I");
2132 } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
2134 You("lack the strength to jump!");
2136 You("
\92µ
\82Ô
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I");
2138 } else if (!magic && Wounded_legs) {
2139 long wl = (Wounded_legs & BOTH_SIDES);
2140 const char *bp = body_part(LEG);
2142 if (wl == BOTH_SIDES)
2143 bp = makeplural(bp);
2146 pline("%s is in no shape for jumping.", Monnam(u.usteed));
2148 pline("%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D", Monnam(u.usteed));
2151 Your("%s%s %s in no shape for jumping.",
2152 (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right "
2154 bp, (wl == BOTH_SIDES) ? "are" : "is");
2156 Your("%s%s
\82Í
\92µ
\82×
\82é
\8fó
\91Ô
\82Å
\82Í
\82È
\82¢
\81D",
2157 (wl == LEFT_SIDE) ? "
\8d¶" :
2158 (wl == RIGHT_SIDE) ? "
\89E" : "", bp);
2161 } else if (u.usteed && u.utrap) {
2163 pline("%s is stuck in a trap.", Monnam(u.usteed));
2165 pline("%s
\82Íã©
\82É
\82Ð
\82Á
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", Monnam(u.usteed));
2170 pline("Where do you want to jump?");
2172 pline("
\82Ç
\82±
\82É
\92µ
\82Ñ
\82Ü
\82·
\82©
\81H");
2175 jumping_is_magic = magic;
2176 getpos_sethilite(display_jump_positions);
2178 if (getpos(&cc, TRUE, "the desired position") < 0)
2180 if (getpos(&cc, TRUE, "
\92µ
\82Ñ
\82½
\82¢
\8fê
\8f\8a") < 0)
2181 return 0; /* user pressed ESC */
2182 if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
2189 switch (u.utraptype) {
2191 long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
2194 You("rip yourself free of the bear trap! Ouch!");
2196 You("
\8e©
\95ª
\82ð
\8cF
\82Ìã©
\82©
\82ç
\82Ð
\82«
\82Í
\82ª
\82µ
\82½
\81C
\82¢
\82Ä
\82Á
\81I");
2198 losehp(Maybe_Half_Phys(rnd(10)), "jumping out of a bear trap",
2200 losehp(Maybe_Half_Phys(rnd(10)), "
\8cF
\82Ìã©
\82©
\82ç
\94ò
\82Ñ
\8fo
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2202 set_wounded_legs(side, rn1(1000, 500));
2207 You("leap from the pit!");
2209 You("
\97\8e\82µ
\8c\8a\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2213 You("tear the web apart as you pull yourself free!");
2215 You("
\82
\82à
\82Ì
\91\83\82ð
\88ø
\82«
\97ô
\82«
\81C
\8e©
\97R
\82É
\82È
\82Á
\82½
\81I");
2216 deltrap(t_at(u.ux, u.uy));
2220 You("pull yourself above the lava!");
2222 You("
\97n
\8aâ
\82©
\82ç
\94ò
\82Ñ
\8fo
\82½
\81I");
2228 You("strain your %s, but you're still %s.",
2229 makeplural(body_part(LEG)),
2230 (u.utraptype == TT_INFLOOR)
2231 ? "stuck in the floor"
2232 : "attached to the buried ball");
2234 You("%s
\82ð
\88ø
\82Á
\82Ï
\82Á
\82½
\82ª
\81C
\82 \82È
\82½
\82Í
\82Ü
\82¾%s
\81D",
2235 makeplural(body_part(LEG)),
2236 (u.utraptype == TT_INFLOOR)
2237 ? "
\8f°
\82É
\82¤
\82Ü
\82Á
\82Ä
\82¢
\82é"
2238 : "
\82¤
\82Ü
\82Á
\82½
\8b\85\82Æ
\82Â
\82È
\82ª
\82Á
\82Ä
\82¢
\82é");
2240 set_wounded_legs(LEFT_SIDE, rn1(10, 11));
2241 set_wounded_legs(RIGHT_SIDE, rn1(10, 11));
2246 * Check the path from uc to cc, calling hurtle_step at each
2247 * location. The final position actually reached will be
2252 /* calculate max(abs(dx), abs(dy)) as the range */
2253 range = cc.x - uc.x;
2261 (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t) &range);
2262 teleds(cc.x, cc.y, TRUE);
2266 multi_reason = "jumping around";
2268 multi_reason = "
\92µ
\82Ë
\89ñ
\82Á
\82Ä
\82¢
\82é
\8e\9e\82É";
2270 morehungry(rnd(25));
2281 if (!mons[corpse->corpsenm].cnutrit)
2287 use_tinning_kit(obj)
2290 struct obj *corpse, *can;
2292 /* This takes only 1 move. If this is to be changed to take many
2293 * moves, we've got to deal with decaying corpses...
2295 if (obj->spe <= 0) {
2297 You("seem to be out of tins.");
2299 pline("
\8aÊ
\8bl
\82ð
\8dì
\82é
\82½
\82ß
\82Ì
\8aÊ
\82ª
\90Ø
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
2303 if (!(corpse = floorfood("tin", 2)))
2305 if (!(corpse = floorfood("
\8aÊ
\8bl
\82ß
\82É
\82·
\82é", 2)))
2307 if (corpse->oeaten) {
2309 You("cannot tin %s which is partly eaten.", something);
2311 You("
\90H
\82×
\82©
\82¯
\82Ì
\82à
\82Ì
\82ð
\8aÊ
\8bl
\82É
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2314 if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance
2318 if (poly_when_stoned(youmonst.data))
2320 You("tin %s without wearing gloves.",
2321 an(mons[corpse->corpsenm].mname));
2323 You("
\8f¬
\8eè
\82È
\82µ
\82Å%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
2324 mons[corpse->corpsenm].mname);
2328 pline("Tinning %s without wearing gloves is a fatal mistake...",
2329 an(mons[corpse->corpsenm].mname));
2331 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",
2332 mons[corpse->corpsenm].mname);
2335 Sprintf(kbuf, "trying to tin %s without gloves",
2336 an(mons[corpse->corpsenm].mname));
2338 Sprintf(kbuf, "
\8f¬
\8eè
\82ð
\82Â
\82¯
\82¸
\82É%s
\82ð
\8aÊ
\8bl
\82É
\82µ
\82æ
\82¤
\82Æ
\82µ
\82Ä",
2339 mons[corpse->corpsenm].mname);
2344 if (is_rider(&mons[corpse->corpsenm])) {
2345 if (revive_corpse(corpse))
2347 verbalize("Yes... But War does not preserve its enemies...");
2349 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");
2352 pline_The("corpse evades your grasp.");
2354 pline("
\8e\80\91Ì
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82ð
\93¦
\82ê
\82½
\81D");
2357 if (mons[corpse->corpsenm].cnutrit == 0) {
2359 pline("That's too insubstantial to tin.");
2361 pline("
\8eÀ
\91Ì
\82ª
\82È
\82¢
\82Ì
\82Å
\8aÊ
\8bl
\82É
\82Å
\82«
\82È
\82¢
\81D");
2364 consume_obj_charge(obj, TRUE);
2366 if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
2368 static const char you_buy_it[] = "You tin it, you bought it!";
2370 static const char you_buy_it[] = "
\8aÊ
\8bl
\82É
\82µ
\82½
\82Ì
\82È
\82ç
\94\83\82Á
\82Ä
\82à
\82ç
\82¤
\82æ
\81I";
2372 can->corpsenm = corpse->corpsenm;
2373 can->cursed = obj->cursed;
2374 can->blessed = obj->blessed;
2375 can->owt = weight(can);
2377 /* Mark tinned tins. No spinach allowed... */
2378 set_tin_variety(can, HOMEMADE_TIN);
2379 if (carried(corpse)) {
2381 verbalize(you_buy_it);
2384 if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
2385 verbalize(you_buy_it);
2389 can = hold_another_object(can, "You make, but cannot pick up, %s.",
2391 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",
2392 doname(can), (const char *) 0);
2394 impossible("Tinning failed.");
2398 use_unicorn_horn(obj)
2401 #define PROP_COUNT 7 /* number of properties we're dealing with */
2402 #define ATTR_COUNT (A_MAX * 3) /* number of attribute points we might fix */
2403 int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop,
2405 int trouble_list[PROP_COUNT + ATTR_COUNT];
2407 if (obj && obj->cursed) {
2408 long lcount = (long) rn1(90, 10);
2410 switch (rn2(13) / 2) { /* case 6 is half as likely as the others */
2412 make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L
2413 : (long) rn1(ACURR(A_CON), 20),
2414 xname(obj), TRUE, SICK_NONVOMITABLE);
2417 make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
2422 You("suddenly feel %s.",
2423 Hallucination ? "trippy" : "confused");
2425 You("
\93Ë
\91R%s
\81D",
2426 Hallucination ? "
\82Ö
\82ë
\82Ö
\82ë
\82É
\82È
\82Á
\82½" : "
\8d¬
\97\90\82µ
\82½");
2428 make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
2431 make_stunned((HStun & TIMEOUT) + lcount, TRUE);
2434 (void) adjattrib(rn2(A_MAX), -1, FALSE);
2437 (void) make_hallucinated((HHallucination & TIMEOUT) + lcount,
2441 if (Deaf) /* make_deaf() won't give feedback when already deaf */
2443 pline("Nothing seems to happen.");
2445 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2446 make_deaf((HDeaf & TIMEOUT) + lcount, TRUE);
2453 * Entries in the trouble list use a very simple encoding scheme.
2455 #define prop2trbl(X) ((X) + A_MAX)
2456 #define attr2trbl(Y) (Y)
2457 #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
2458 #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
2459 #define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
2461 trouble_count = unfixable_trbl = did_prop = did_attr = 0;
2463 /* collect property troubles */
2464 if (TimedTrouble(Sick))
2466 if (TimedTrouble(Blinded) > (long) u.ucreamed
2468 && attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
2469 prop_trouble(BLINDED);
2470 if (TimedTrouble(HHallucination))
2471 prop_trouble(HALLUC);
2472 if (TimedTrouble(Vomiting))
2473 prop_trouble(VOMITING);
2474 if (TimedTrouble(HConfusion))
2475 prop_trouble(CONFUSION);
2476 if (TimedTrouble(HStun))
2477 prop_trouble(STUNNED);
2478 if (TimedTrouble(HDeaf))
2481 unfixable_trbl = unfixable_trouble_count(TRUE);
2483 /* collect attribute troubles */
2484 for (idx = 0; idx < A_MAX; idx++) {
2485 if (ABASE(idx) >= AMAX(idx))
2487 val_limit = AMAX(idx);
2488 /* don't recover strength lost from hunger */
2489 if (idx == A_STR && u.uhs >= WEAK)
2492 /* potion/spell of restore ability override sustain ability
2493 intrinsic but unicorn horn usage doesn't */
2494 unfixable_trbl += val_limit - ABASE(idx);
2497 /* don't recover more than 3 points worth of any attribute */
2498 if (val_limit > ABASE(idx) + 3)
2499 val_limit = ABASE(idx) + 3;
2501 for (val = ABASE(idx); val < val_limit; val++)
2503 /* keep track of unfixed trouble, for message adjustment below */
2504 unfixable_trbl += (AMAX(idx) - val_limit);
2507 if (trouble_count == 0) {
2508 pline1(nothing_happens);
2510 } else if (trouble_count > 1) { /* shuffle */
2513 for (i = trouble_count - 1; i > 0; i--)
2514 if ((j = rn2(i + 1)) != i) {
2515 k = trouble_list[j];
2516 trouble_list[j] = trouble_list[i];
2517 trouble_list[i] = k;
2522 * Chances for number of troubles to be fixed
2524 * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8%
2525 * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0
2527 val_limit = rn2(d(2, (obj && obj->blessed) ? 4 : 2));
2528 if (val_limit > trouble_count)
2529 val_limit = trouble_count;
2531 /* fix [some of] the troubles */
2532 for (val = 0; val < val_limit; val++) {
2533 idx = trouble_list[val];
2536 case prop2trbl(SICK):
2537 make_sick(0L, (char *) 0, TRUE, SICK_ALL);
2540 case prop2trbl(BLINDED):
2541 make_blinded((long) u.ucreamed, TRUE);
2544 case prop2trbl(HALLUC):
2545 (void) make_hallucinated(0L, TRUE, 0L);
2548 case prop2trbl(VOMITING):
2549 make_vomiting(0L, TRUE);
2552 case prop2trbl(CONFUSION):
2553 make_confused(0L, TRUE);
2556 case prop2trbl(STUNNED):
2557 make_stunned(0L, TRUE);
2560 case prop2trbl(DEAF):
2561 make_deaf(0L, TRUE);
2565 if (idx >= 0 && idx < A_MAX) {
2569 panic("use_unicorn_horn: bad trouble? (%d)", idx);
2576 pline("This makes you feel %s!",
2577 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2581 pline("
\8bC
\95ª
\82ª%s
\82æ
\82
\82È
\82Á
\82½
\81I",
2582 (did_prop + did_attr) == (trouble_count + unfixable_trbl)
2588 pline("Nothing seems to happen.");
2590 pline("
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D");
2592 context.botl = (did_attr || did_prop);
2603 * Timer callback routine: turn figurine into monster
2606 fig_transform(arg, timeout)
2610 struct obj *figurine = arg->a_obj;
2613 boolean cansee_spot, silent, okay_spot;
2614 boolean redraw = FALSE;
2615 boolean suppress_see = FALSE;
2616 char monnambuf[BUFSZ], carriedby[BUFSZ];
2619 debugpline0("null figurine in fig_transform()");
2622 silent = (timeout != monstermoves); /* happened while away */
2623 okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0);
2624 if (figurine->where == OBJ_INVENT || figurine->where == OBJ_MINVENT)
2625 okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]);
2626 if (!okay_spot || !figurine_location_checks(figurine, &cc, TRUE)) {
2627 /* reset the timer to try again later */
2628 (void) start_timer((long) rnd(5000), TIMER_OBJECT, FIG_TRANSFORM,
2629 obj_to_any(figurine));
2633 cansee_spot = cansee(cc.x, cc.y);
2634 mtmp = make_familiar(figurine, cc.x, cc.y, TRUE);
2636 char and_vanish[BUFSZ];
2637 struct obj *mshelter = level.objects[mtmp->mx][mtmp->my];
2638 Sprintf(monnambuf, "%s", an(m_monnam(mtmp)));
2640 /*JP:TODO:and_vanish
\82Í
\96¢
\8f\88\97\9d*/
2641 and_vanish[0] = '\0';
2642 if ((mtmp->minvis && !See_invisible)
2643 || (mtmp->data->mlet == S_MIMIC
2644 && mtmp->m_ap_type != M_AP_NOTHING))
2645 suppress_see = TRUE;
2647 if (mtmp->mundetected) {
2648 if (hides_under(mtmp->data) && mshelter) {
2649 Sprintf(and_vanish, " and %s under %s",
2650 locomotion(mtmp->data, "crawl"), doname(mshelter));
2651 } else if (mtmp->data->mlet == S_MIMIC
2652 || mtmp->data->mlet == S_EEL) {
2653 suppress_see = TRUE;
2655 Strcpy(and_vanish, " and vanish");
2658 switch (figurine->where) {
2660 if (Blind || suppress_see)
2662 You_feel("%s %s from your pack!", something,
2663 locomotion(mtmp->data, "drop"));
2665 You_feel("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82æ
\82¤
\82¾
\81I", something,
2666 jpast(locomotion(mtmp->data, "
\97\8e\82¿
\82é")));
2670 You_see("%s %s out of your pack%s!", monnambuf,
2671 locomotion(mtmp->data, "drop"), and_vanish);
2673 You("%s
\82ª
\82 \82È
\82½
\82Ì
\8a\93\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2674 jpast(locomotion(mtmp->data,"
\97\8e\82¿
\82é")));
2679 if (cansee_spot && !silent) {
2682 pline("%s suddenly vanishes!", an(xname(figurine)));
2684 pline("%s
\82Í
\93Ë
\91R
\8fÁ
\82¦
\82½
\81I", xname(figurine));
2687 You_see("a figurine transform into %s%s!", monnambuf,
2690 You("
\90l
\8c`
\82ª
\93Ë
\91R%s
\82É
\82È
\82Á
\82½
\82Ì
\82ð
\8c©
\82½
\81I",
2693 redraw = TRUE; /* update figurine's map location */
2698 if (cansee_spot && !silent && !suppress_see) {
2700 mon = figurine->ocarry;
2701 /* figurine carrying monster might be invisible */
2702 if (canseemon(figurine->ocarry)) {
2704 Sprintf(carriedby, "%s pack", s_suffix(a_monnam(mon)));
2706 Sprintf(carriedby, "%s
\82Ì
\8a\93", s_suffix(a_monnam(mon)));
2707 } else if (is_pool(mon->mx, mon->my))
2709 Strcpy(carriedby, "empty water");
2711 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\90\85\92\86");
2714 Strcpy(carriedby, "thin air");
2716 Strcpy(carriedby, "
\89½
\82à
\82È
\82¢
\8bó
\92\86");
2718 You_see("%s %s out of %s%s!", monnambuf,
2719 locomotion(mtmp->data, "drop"), carriedby,
2722 You("%s
\82ª%s
\82©
\82ç%s
\82Ì
\82ð
\8c©
\82½
\81I", monnambuf,
2723 carriedby, locomotion(mtmp->data, "
\97\8e\82¿
\82é"));
2733 impossible("figurine came to life where? (%d)",
2734 (int) figurine->where);
2738 /* free figurine now */
2739 if (carried(figurine)) {
2742 obj_extract_self(figurine);
2743 obfree(figurine, (struct obj *) 0);
2750 figurine_location_checks(obj, cc, quietly)
2757 if (carried(obj) && u.uswallow) {
2760 You("don't have enough room in here.");
2762 pline("
\82±
\82±
\82É
\82Í
\8f\
\95ª
\82È
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
2765 x = cc ? cc->x : u.ux;
2766 y = cc ? cc->y : u.uy;
2770 You("cannot put the figurine there.");
2772 You("
\82±
\82±
\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81D");
2775 if (IS_ROCK(levl[x][y].typ)
2776 && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x, y))) {
2779 You("cannot place a figurine in %s!",
2780 IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock");
2782 You("%s
\82Ì
\92\86\82É
\82Í
\90l
\8c`
\82ð
\92u
\82¯
\82È
\82¢
\81I",
2783 IS_TREE(levl[x][y].typ) ? "
\96Ø" : "
\8cÅ
\82¢
\90Î");
2787 if (sobj_at(BOULDER, x, y) && !passes_walls(&mons[obj->corpsenm])
2788 && !throws_rocks(&mons[obj->corpsenm])) {
2791 You("cannot fit the figurine on the boulder.");
2793 You("
\8aâ
\82É
\90l
\8c`
\82ð
\89\9f\82µ
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2803 register struct obj *obj = *optr;
2808 /* can't activate a figurine while swallowed */
2809 if (!figurine_location_checks(obj, (coord *) 0, FALSE))
2812 if (!getdir((char *) 0)) {
2813 context.move = multi = 0;
2820 /* Passing FALSE arg here will result in messages displayed */
2821 if (!figurine_location_checks(obj, &cc, FALSE))
2824 You("%s and it transforms.",
2825 (u.dx || u.dy) ? "set the figurine beside you"
2826 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
2827 || is_pool(cc.x, cc.y))
2828 ? "release the figurine"
2829 : (u.dz < 0 ? "toss the figurine into the air"
2830 : "set the figurine on the ground"));
2832 You("%s
\81D
\82·
\82é
\82Æ
\82»
\82ê
\82Í
\95Ï
\8c`
\82µ
\82½
\81D",
2833 (u.dx || u.dy) ? "
\82»
\82Î
\82É
\90l
\8c`
\82ð
\92u
\82¢
\82½"
2834 : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)
2835 || is_pool(cc.x, cc.y))
2836 ? "
\90l
\8c`
\82ð
\95ú
\82Á
\82½"
2837 : (u.dz < 0 ? "
\90l
\8c`
\82ð
\8bó
\92\86\82É
\93\8a\82°
\82½"
2838 : "
\90l
\8c`
\82ð
\92n
\96Ê
\82É
\92u
\82¢
\82½"));
2840 (void) make_familiar(obj, cc.x, cc.y, FALSE);
2841 (void) stop_timer(FIG_TRANSFORM, obj_to_any(obj));
2846 static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 };
2856 pline("%s from your %s.", Tobjnam(obj, "slip"),
2857 makeplural(body_part(FINGER)));
2859 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
2867 if ((obj->cursed || Fumbling) && !rn2(2)) {
2868 consume_obj_charge(obj, TRUE);
2871 pline("%s from your %s.", Tobjnam(obj, "slip"),
2872 makeplural(body_part(FINGER)));
2874 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82©
\82ç
\8a\8a\82è
\97\8e\82¿
\82½
\81D", xname(obj),
2880 otmp = getobj(lubricables, "grease");
2884 if (inaccessible_equipment(otmp, "grease", FALSE))
2886 if (inaccessible_equipment(otmp, "
\82É
\8e\89\82ð
\93h
\82é", FALSE))
2888 consume_obj_charge(obj, TRUE);
2890 if (otmp != &zeroobj) {
2892 You("cover %s with a thick layer of grease.", yname(otmp));
2894 You("%s
\82É
\8e\89\82ð
\92O
\94O
\82É
\93h
\82Á
\82½
\81D", xname(otmp));
2896 if (obj->cursed && !nohands(youmonst.data)) {
2897 incr_itimeout(&Glib, rnd(15));
2899 pline("Some of the grease gets all over your %s.",
2901 pline("
\8e\89\82ª
\8f
\82µ%s
\82É
\82Â
\82¢
\82½
\81D",
2902 makeplural(body_part(HAND)));
2905 incr_itimeout(&Glib, rnd(15));
2907 You("coat your %s with grease.", makeplural(body_part(FINGER)));
2909 You("%s
\82É
\8e\89\82ð
\93h
\82Á
\82½
\81D", makeplural(body_part(FINGER)));
2914 pline("%s empty.", Tobjnam(obj, "are"));
2916 pline("%s
\82Í
\8bó
\82Á
\82Û
\82¾
\81D", xname(obj));
2919 pline("%s to be empty.", Tobjnam(obj, "seem"));
2921 pline("%s
\82Í
\8bó
\82Á
\82Û
\82Ì
\82æ
\82¤
\82¾
\81D", xname(obj));
2926 static struct trapinfo {
2930 boolean force_bungle;
2937 trapinfo.force_bungle = 0;
2940 /* touchstones - by Ken Arnold */
2947 const char *streak_color, *choices;
2948 char stonebuf[QBUFSZ];
2950 static const char scritch[] = "\"scritch, scritch\"";
2952 static const char scritch[] = "
\81u
\83S
\83V
\81C
\83S
\83V
\81v";
2953 static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 };
2954 static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 };
2956 /* in case it was acquired while blinded */
2959 /* when the touchstone is fully known, don't bother listing extra
2960 junk as likely candidates for rubbing */
2961 choices = (tstone->otyp == TOUCHSTONE && tstone->dknown
2962 && objects[TOUCHSTONE].oc_name_known)
2966 Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan));
2968 Sprintf(stonebuf, "rub on the stone");
2969 if ((obj = getobj(choices, stonebuf)) == 0)
2972 if (obj == tstone && obj->quan == 1L) {
2974 You_cant("rub %s on itself.", the(xname(obj)));
2976 You("%s
\82ð
\82»
\82ê
\8e©
\91Ì
\82Å
\82±
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", the(xname(obj)));
2980 if (tstone->otyp == TOUCHSTONE && tstone->cursed
2981 && obj->oclass == GEM_CLASS && !is_graystone(obj)
2982 && !obj_resists(obj, 80, 100)) {
2985 pline("You feel something shatter.");
2987 You("
\89½
\82©
\82ª
\95²
\81X
\82É
\82È
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81D");
2988 else if (Hallucination)
2990 pline("Oh, wow, look at the pretty shards.");
2992 pline("
\83\8f\81[
\83H
\81I
\82È
\82ñ
\82Ä
\82«
\82ê
\82¢
\82È
\94j
\95Ð
\82È
\82ñ
\82¾
\81D");
2995 pline("A sharp crack shatters %s%s.",
2996 (obj->quan > 1L) ? "one of " : "", the(xname(obj)));
2998 pline("
\8b
\82
\82±
\82·
\82è
\82·
\82¬
\82Ä%s%s
\82Í
\95²
\81X
\82É
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
2999 the(xname(obj)), (obj->quan > 1) ? "
\82Ì
\82Ð
\82Æ
\82Â" : "");
3008 } else if (Hallucination) {
3010 pline("Oh wow, man: Fractals!");
3012 pline("
\83\8f\81[
\83H
\81I
\83t
\83\89\83N
\83^
\83\8b\96Í
\97l
\82¾
\81I");
3020 switch (obj->oclass) {
3021 case GEM_CLASS: /* these have class-specific handling below */
3023 if (tstone->otyp != TOUCHSTONE) {
3025 } else if (obj->oclass == GEM_CLASS
3027 || (!tstone->cursed && (Role_if(PM_ARCHEOLOGIST)
3028 || Race_if(PM_GNOME))))) {
3029 makeknown(TOUCHSTONE);
3030 makeknown(obj->otyp);
3031 prinv((char *) 0, obj, 0L);
3034 /* either a ring or the touchstone was not effective */
3035 if (objects[obj->otyp].oc_material == GLASS) {
3040 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3041 break; /* gem or ring */
3044 switch (objects[obj->otyp].oc_material) {
3047 pline("%s a little more polished now.", Tobjnam(tstone, "look"));
3049 pline("%s
\82Í
\82³
\82ç
\82É
\82Â
\82â
\82ª
\8fo
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D", xname(tstone));
3053 if (!obj->known) /* note: not "whetstone" */
3055 You("must think this is a wetstone, do you?");
3057 You("
\82±
\82ê
\82Í
\93u
\90Î
\82¾
\82Æ
\8ev
\82Á
\82½
\81H");
3061 pline("%s a little wetter now.", Tobjnam(tstone, "are"));
3063 pline("%s
\82Í
\8f
\82µ
\82Ê
\82ê
\82½
\81D", xname(tstone));
3068 streak_color = "waxy";
3070 streak_color = "
\8e\89\82Á
\82Û
\82¢";
3072 break; /* okay even if not touchstone */
3075 streak_color = "wooden";
3077 streak_color = "
\82¨
\82ª
\82
\82¸
\82Ì
\82æ
\82¤
\82È";
3079 break; /* okay even if not touchstone */
3081 do_scratch = TRUE; /* scratching and streaks */
3083 streak_color = "golden";
3085 streak_color = "
\8bà
\90F
\82Ì";
3089 do_scratch = TRUE; /* scratching and streaks */
3091 streak_color = "silvery";
3093 streak_color = "
\8bâ
\90F
\82Ì";
3097 /* Objects passing the is_flimsy() test will not
3098 scratch a stone. They will leave streaks on
3099 non-touchstones and touchstones alike. */
3101 streak_color = c_obj_colors[objects[obj->otyp].oc_color];
3103 do_scratch = (tstone->otyp != TOUCHSTONE);
3106 break; /* default oclass */
3109 #if 0 /*JP*//* not used */
3110 Sprintf(stonebuf, "stone%s", plur(tstone->quan));
3114 You("make %s%sscratch marks on the %s.",
3115 streak_color ? streak_color : (const char *) "",
3116 streak_color ? " " : "", stonebuf);
3118 You("%s
\82±
\82·
\82è
\90Õ
\82ð
\90Î
\82É
\82Â
\82¯
\82½
\81D",
3119 streak_color ? streak_color : (const char *)"");
3121 else if (streak_color)
3123 You_see("%s streaks on the %s.", streak_color, stonebuf);
3125 pline("
\90Î
\82É%s
\8bØ
\82ª
\82Â
\82¢
\82½
\81D", streak_color);
3131 /* Place a landmine/bear trap. Helge Hafting */
3137 const char *what = (char *) 0;
3139 int levtyp = levl[u.ux][u.uy].typ;
3141 const char *occutext = "setting the trap";
3143 const char *occutext = "ã©
\82ð
\8ed
\8a|
\82¯
\82Ä
\82¢
\82é";
3146 if (nohands(youmonst.data))
3148 what = "without hands";
3150 what = "
\8eè
\82ª
\82È
\82¢
\82Ì
\82Å";
3153 what = "while stunned";
3155 what = "
\82
\82ç
\82
\82ç
\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å";
3156 else if (u.uswallow)
3159 is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed";
3161 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Í";
3162 else if (Underwater)
3164 what = "underwater";
3166 what = "
\90\85\96Ê
\89º
\82Å
\82Í";
3167 else if (Levitation)
3169 what = "while levitating";
3171 what = "
\95\82\82¢
\82Ä
\82¢
\82é
\8aÔ
\82Í";
3172 else if (is_pool(u.ux, u.uy))
3176 what = "
\90\85\92\86\82Å
\82Í";
3177 else if (is_lava(u.ux, u.uy))
3181 what = "
\97n
\8aâ
\82Ì
\92\86\82Å
\82Í";
3182 else if (On_stairs(u.ux, u.uy))
3184 what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder"
3187 what = (u.ux == xdnladder || u.ux == xupladder) ? "
\82Í
\82µ
\82²
\82Ì
\8fã
\82Å
\82Í"
3188 : "
\8aK
\92i
\82Ì
\8fã
\82Å
\82Í";
3190 else if (IS_FURNITURE(levtyp) || IS_ROCK(levtyp)
3191 || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy))
3195 what = "
\82±
\82±
\82Å
\82Í";
3196 else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
3198 what = (levtyp == AIR)
3202 : "in this place"; /* Air/Water Plane catch-all */
3204 what = (levtyp == AIR)
3205 ? "
\8bó
\92\86\82Å
\82Í"
3207 ? "
\89_
\82Ì
\92\86\82Å
\82Í"
3208 : "
\82±
\82±
\82Å
\82Í"; /* Air/Water Plane catch-all */
3212 You_cant("set a trap %s!", what);
3214 pline("%sã©
\82ð
\8ed
\8a|
\82¯
\82ç
\82ê
\82È
\82¢
\81I",what);
3218 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3219 if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) {
3221 You("resume setting %s%s.", shk_your(buf, otmp),
3223 You("%s
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D",
3224 defsyms[trap_to_defsym(what_trap(ttyp))].explanation);
3225 set_occupation(set_trap, occutext, 0);
3228 trapinfo.tobj = otmp;
3229 trapinfo.tx = u.ux, trapinfo.ty = u.uy;
3231 trapinfo.time_needed =
3232 (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5;
3234 trapinfo.time_needed *= 2;
3236 if (ttyp == BEAR_TRAP && tmp < 18)
3237 trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4;
3238 /*[fumbling and/or confusion and/or cursed object check(s)
3239 should be incorporated here instead of in set_trap]*/
3240 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) {
3243 if (Fumbling || otmp->cursed)
3244 chance = (rnl(10) > 3);
3246 chance = (rnl(10) > 5);
3248 You("aren't very skilled at reaching from %s.", mon_nam(u.usteed));
3250 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));
3252 Sprintf(buf, "Continue your attempt to set %s?",
3254 Sprintf(buf, "%s
\82Ì
\8ed
\8a|
\82¯
\82ð
\91±
\82¯
\82é
\81H",
3255 the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation));
3256 if (yn(buf) == 'y') {
3259 case LANDMINE: /* set it off */
3260 trapinfo.time_needed = 0;
3261 trapinfo.force_bungle = TRUE;
3263 case BEAR_TRAP: /* drop it without arming it */
3268 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I",
3269 the(defsyms[trap_to_defsym(what_trap(ttyp))]
3281 You("begin setting %s%s.", shk_your(buf, otmp),
3283 You("%s%s
\82ð
\8ed
\8a|
\82¯
\82Í
\82¶
\82ß
\82½
\81D", shk_your(buf, otmp),
3284 defsyms[trap_to_defsym(what_trap(ttyp))].explanation);
3285 set_occupation(set_trap, occutext, 0);
3293 struct obj *otmp = trapinfo.tobj;
3297 if (!otmp || !carried(otmp) || u.ux != trapinfo.tx
3298 || u.uy != trapinfo.ty) {
3304 if (--trapinfo.time_needed > 0)
3305 return 1; /* still busy */
3307 ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP;
3308 ttmp = maketrap(u.ux, u.uy, ttyp);
3312 if (*in_rooms(u.ux, u.uy, SHOPBASE)) {
3313 add_damage(u.ux, u.uy, 0L); /* schedule removal */
3315 if (!trapinfo.force_bungle)
3317 You("finish arming %s.",
3319 You("%s
\82ð
\8ed
\8a|
\82¯
\8fI
\82¦
\82½
\81D",
3320 the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation));
3321 if (((otmp->cursed || Fumbling) && (rnl(10) > 5))
3322 || trapinfo.force_bungle)
3324 (unsigned) (trapinfo.force_bungle ? FORCEBUNGLE : 0));
3326 /* this shouldn't happen */
3328 Your("trap setting attempt fails.");
3330 You("ã©
\82ð
\8ed
\8a|
\82¯
\82é
\82Ì
\82É
\8e¸
\94s
\82µ
\82½
\81D");
3344 int rx, ry, proficient, res = 0;
3346 const char *msg_slipsfree = "The bullwhip slips free.";
3348 const char *msg_slipsfree = "
\95Ú
\82Í
\82Ù
\82Ç
\82¯
\82½
\81D";
3350 const char *msg_snap = "Snap!";
3352 const char *msg_snap = "
\83s
\83V
\83b
\81I";
3355 if (!wield_tool(obj, "lash"))
3360 if (!getdir((char *) 0))
3368 if (Stunned || (Confusion && !rn2(5)))
3372 if (!isok(rx, ry)) {
3376 You("
\82Í
\82¸
\82µ
\82½
\81D");
3379 mtmp = m_at(rx, ry);
3382 /* fake some proficiency checks */
3384 if (Role_if(PM_ARCHEOLOGIST))
3386 if (ACURR(A_DEX) < 6)
3388 else if (ACURR(A_DEX) >= 14)
3389 proficient += (ACURR(A_DEX) - 14);
3397 if (u.uswallow && attack(u.ustuck)) {
3399 There("is not enough room to flick your bullwhip.");
3401 pline("
\95Ú
\82ð
\91Å
\82Â
\82Ù
\82Ç
\8dL
\82
\82È
\82¢
\81D");
3403 } else if (Underwater) {
3405 There("is too much resistance to flick your bullwhip.");
3407 pline("
\90\85\82Ì
\92ï
\8dR
\82ª
\82 \82è
\82·
\82¬
\82Ä
\95Ú
\82ð
\91Å
\82Â
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
3409 } else if (u.dz < 0) {
3411 You("flick a bug off of the %s.", ceiling(u.ux, u.uy));
3413 You("%s
\82Ì
\92\8e\82ð
\91Å
\82¿
\97\8e\82µ
\82½
\81D",ceiling(u.ux,u.uy));
3415 } else if ((!u.dx && !u.dy) || (u.dz > 0)) {
3418 /* Sometimes you hit your steed by mistake */
3419 if (u.usteed && !rn2(proficient + 2)) {
3421 You("whip %s!", mon_nam(u.usteed));
3423 You("%s
\82ð
\95Ú
\91Å
\82Á
\82½
\81I", mon_nam(u.usteed));
3427 if (Levitation || u.usteed) {
3428 /* Have a shot at snaring something on the floor */
3429 otmp = level.objects[u.ux][u.uy];
3430 if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) {
3432 pline("Why beat a dead horse?");
3434 pline("
\82Ç
\82¤
\82µ
\82Ä
\8e\80\82ñ
\82¾
\94n
\82ð
\95Ú
\91Å
\82Â
\82æ
\82¤
\82È
\82±
\82Æ
\82ð
\82·
\82é
\82Ì
\81H");
3437 if (otmp && proficient) {
3439 You("wrap your bullwhip around %s on the %s.",
3440 an(singular(otmp, xname)), surface(u.ux, u.uy));
3442 You("
\95Ú
\82ð%s
\82Ì
\8fã
\82Ì%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D",
3443 surface(u.ux, u.uy), an(singular(otmp, xname)));
3445 if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1)
3446 pline1(msg_slipsfree);
3450 dam = rnd(2) + dbon() + obj->spe;
3454 You("hit your %s with your bullwhip.", body_part(FOOT));
3456 You("
\8e©
\95ª
\82Ì%s
\82ð
\8e©
\95ª
\82Å
\91Å
\82¿
\82Â
\82¯
\82½
\81D", body_part(FOOT));
3458 Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis());
3459 losehp(Maybe_Half_Phys(dam), buf, NO_KILLER_PREFIX);
3461 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82ð
\95Ú
\91Å
\82Á
\82Ä");
3462 losehp(dam, buf, KILLED_BY);
3467 } else if ((Fumbling || Glib) && !rn2(5)) {
3469 pline_The("bullwhip slips out of your %s.", body_part(HAND));
3471 pline("
\95Ú
\82ª%s
\82©
\82ç
\82·
\82×
\82è
\97\8e\82¿
\82½
\81D", body_part(HAND));
3474 } else if (u.utrap && u.utraptype == TT_PIT) {
3478 * if you're in a pit
3479 * - you are attempting to get out of the pit
3480 * or, if you are applying it towards a small monster
3481 * - then it is assumed that you are trying to hit it
3482 * else if the monster is wielding a weapon
3483 * - you are attempting to disarm a monster
3485 * - you are attempting to hit the monster.
3487 * if you're confused (and thus off the mark)
3488 * - you only end up hitting.
3491 const char *wrapped_what = (char *) 0;
3494 if (bigmonst(mtmp->data)) {
3495 wrapped_what = strcpy(buf, mon_nam(mtmp));
3496 } else if (proficient) {
3503 if (!wrapped_what) {
3504 if (IS_FURNITURE(levl[rx][ry].typ))
3505 wrapped_what = something;
3506 else if (sobj_at(BOULDER, rx, ry))
3508 wrapped_what = "a boulder";
3510 wrapped_what = "
\8aâ";
3518 You("wrap your bullwhip around %s.", wrapped_what);
3520 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", wrapped_what);
3521 if (proficient && rn2(proficient + 2)) {
3522 if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) {
3524 You("yank yourself out of the pit!");
3526 You("
\82®
\82¢
\82Æ
\88ø
\82Á
\82Ï
\82Á
\82Ä
\8c\8a\82©
\82ç
\94²
\82¯
\8fo
\82µ
\82½
\81I");
3527 teleds(cc.x, cc.y, TRUE);
3529 vision_full_recalc = 1;
3532 pline1(msg_slipsfree);
3540 if (!canspotmon(mtmp) && !glyph_is_invisible(levl[rx][ry].glyph)) {
3542 pline("A monster is there that you couldn't see.");
3544 pline("
\8c©
\82¦
\82È
\82¢
\89ö
\95¨
\82ª
\82¢
\82é
\81D");
3545 map_invisible(rx, ry);
3547 otmp = MON_WEP(mtmp); /* can be null */
3549 char onambuf[BUFSZ];
3550 const char *mon_hand;
3551 boolean gotit = proficient && (!Fumbling || !rn2(10));
3553 Strcpy(onambuf, cxname(otmp));
3555 mon_hand = mbodypart(mtmp, HAND);
3557 mon_hand = makeplural(mon_hand);
3559 mon_hand = 0; /* lint suppression */
3562 You("wrap your bullwhip around %s.", yname(otmp));
3564 You("
\95Ú
\82ð%s
\82É
\82©
\82ç
\82Ü
\82¹
\82½
\81D", xname(otmp));
3565 if (gotit && mwelded(otmp)) {
3567 pline("%s welded to %s %s%c",
3568 (otmp->quan == 1L) ? "It is" : "They are", mhis(mtmp),
3569 mon_hand, !otmp->bknown ? '!' : '.');
3571 pline("%s
\82Í%s
\82Ì%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82µ
\82Ü
\82Á
\82Ä
\82¢
\82é%s",
3573 mon_nam(mtmp), mon_hand,
3574 !otmp->bknown ? "
\81I" : "
\81D");
3577 gotit = FALSE; /* can't pull it free */
3580 obj_extract_self(otmp);
3581 possibly_unwield(mtmp, FALSE);
3582 setmnotwielded(mtmp, otmp);
3584 switch (rn2(proficient + 1)) {
3586 /* to floor near you */
3588 You("yank %s to the %s!", yname(otmp),
3590 You("%s
\82ð%s
\82É
\88ø
\82«
\97\8e\82µ
\82½
\81I", xname(otmp),
3591 surface(u.ux, u.uy));
3592 place_object(otmp, u.ux, u.uy);
3599 /* proficient with whip, but maybe not
3600 so proficient at catching weapons */
3603 hitvalu = 8 + otmp->spe;
3604 hitu = thitu(hitvalu,
3605 dmgval(otmp, &youmonst),
3609 pline_The("%s hits you as you try to snatch it!",
3611 pline_The("%s
\82ð
\92D
\82¨
\82¤
\82Æ
\82µ
\82½
\82ç
\82 \82È
\82½
\82É
\93\96\82½
\82Á
\82½
\81I",
3614 place_object(otmp, u.ux, u.uy);
3619 /* right into your inventory */
3621 You("snatch %s!", yname(otmp));
3623 You("%s
\82ð
\92D
\82Á
\82½
\81I", xname(otmp));
3624 if (otmp->otyp == CORPSE
3625 && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg
3626 && !Stone_resistance
3627 && !(poly_when_stoned(youmonst.data)
3628 && polymon(PM_STONE_GOLEM))) {
3632 Sprintf(kbuf, "%s corpse",
3633 an(mons[otmp->corpsenm].mname));
3634 pline("Snatching %s is a fatal mistake.", kbuf);
3636 pline("%s
\82Ì
\8e\80\91Ì
\82ð
\92D
\82Á
\82½
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
3637 mons[otmp->corpsenm].mname);
3638 Sprintf(kbuf, "%s
\82Ì
\8e\80\91Ì
\82É
\90G
\82ê
\82Ä",
3639 mons[otmp->corpsenm].mname);
3643 otmp = hold_another_object(
3645 otmp, "You drop %s!", doname(otmp), (const char *) 0);
3647 otmp, "%s
\82ð
\97\8e\82µ
\82½
\81I", doname(otmp), (const char *) 0);
3650 /* to floor beneath mon */
3652 You("yank %s from %s %s!", the(onambuf),
3654 You("%s
\82ð%s
\82Ì%s
\82©
\82ç
\82Ð
\82Á
\82Ï
\82Á
\82½
\81I", the(xname(otmp)),
3655 s_suffix(mon_nam(mtmp)), mon_hand);
3656 obj_no_longer_held(otmp);
3657 place_object(otmp, mtmp->mx, mtmp->my);
3662 pline1(msg_slipsfree);
3666 if (mtmp->m_ap_type && !Protection_from_shape_changers
3668 stumble_onto_mimic(mtmp);
3671 You("flick your bullwhip towards %s.", mon_nam(mtmp));
3673 You("%s
\82É
\8cü
\82Á
\82Ä
\95Ú
\82ð
\91Å
\82Á
\82½
\81D", mon_nam(mtmp));
3682 } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) {
3683 /* it must be air -- water checked above */
3685 You("snap your whip through thin air.");
3687 You("
\89½
\82à
\82È
\82¢
\82Æ
\82±
\82ë
\82Å
\95Ú
\82ð
\91Å
\82Á
\82½
\81D");
3697 not_enough_room[] = "There's not enough room here to use that.",
3699 not_enough_room[] = "
\82»
\82ê
\82ð
\8eg
\82¤
\82¾
\82¯
\82Ì
\8dL
\82³
\82ª
\82È
\82¢
\81D",
3701 where_to_hit[] = "Where do you want to hit?",
3703 where_to_hit[] = "
\82Ç
\82ê
\82ð
\91_
\82¤
\81H",
3705 cant_see_spot[] = "won't hit anything if you can't see that spot.",
3707 cant_see_spot[] = "
\8fê
\8f\8a\82ª
\8c©
\82¦
\82È
\82¯
\82ê
\82Î
\91_
\82¦
\82È
\82¢
\81D",
3709 cant_reach[] = "can't reach that spot from here.";
3711 cant_reach[] = "
\82±
\82±
\82©
\82ç
\82»
\82±
\82Ö
\82Í
\93Í
\82©
\82È
\82¢
\81D";
3713 /* find pos of monster in range, if only one monster */
3715 find_poleable_mon(pos, min_range, max_range)
3717 int min_range, max_range;
3720 struct monst *selmon = (struct monst *) 0;
3722 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
3723 if (mtmp && !DEADMONSTER(mtmp) && !mtmp->mtame
3724 && cansee(mtmp->mx, mtmp->my)
3725 && distu(mtmp->mx, mtmp->my) <= max_range
3726 && distu(mtmp->mx, mtmp->my) >= min_range) {
3733 pos->x = selmon->mx;
3734 pos->y = selmon->my;
3738 static int polearm_range_min = -1;
3739 static int polearm_range_max = -1;
3742 display_polearm_positions(state)
3746 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
3747 } else if (state == 1) {
3750 for (dx = -4; dx <= 4; dx++)
3751 for (dy = -4; dy <= 4; dy++) {
3752 x = dx + (int) u.ux;
3753 y = dy + (int) u.uy;
3754 if (isok(x, y) && ACCESSIBLE(levl[x][y].typ)
3755 && distu(x, y) >= polearm_range_min
3756 && distu(x, y) <= polearm_range_max) {
3761 tmp_at(DISP_END, 0);
3765 /* Distance attacks by pole-weapons */
3770 int res = 0, typ, max_range, min_range, glyph;
3773 struct monst *hitm = context.polearm.hitmon;
3775 /* Are you allowed to use the pole? */
3777 pline(not_enough_room);
3781 if (!wield_tool(obj, "swing"))
3786 /* assert(obj == uwep); */
3789 * Calculate allowable range (pole's reach is always 2 steps):
3790 * unskilled and basic: orthogonal direction, 4..4;
3791 * skilled: as basic, plus knight's jump position, 4..5;
3792 * expert: as skilled, plus diagonal, 4..8.
3800 * (Note: no roles in nethack can become expert or better
3801 * for polearm skill; Yeoman in slash'em can become expert.)
3804 typ = uwep_skill_type();
3805 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
3807 else if (P_SKILL(typ) == P_SKILLED)
3810 max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
3812 polearm_range_min = min_range;
3813 polearm_range_max = max_range;
3815 /* Prompt for a location */
3816 pline(where_to_hit);
3819 if (!find_poleable_mon(&cc, min_range, max_range) && hitm
3820 && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my)
3821 && distu(hitm->mx, hitm->my) <= max_range
3822 && distu(hitm->mx, hitm->my) >= min_range) {
3826 getpos_sethilite(display_polearm_positions);
3828 if (getpos(&cc, TRUE, "the spot to hit") < 0)
3830 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
3831 return res; /* ESC; uses turn iff polearm became wielded */
3833 glyph = glyph_at(cc.x, cc.y);
3834 if (distu(cc.x, cc.y) > max_range) {
3838 pline("
\89\93\82·
\82¬
\82é
\81I");
3840 } else if (distu(cc.x, cc.y) < min_range) {
3842 pline("Too close!");
3844 pline("
\8bß
\82·
\82¬
\82é
\81I");
3846 } else if (!cansee(cc.x, cc.y) && !glyph_is_monster(glyph)
3847 && !glyph_is_invisible(glyph) && !glyph_is_statue(glyph)) {
3850 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
3855 context.polearm.hitmon = NULL;
3856 /* Attack the monster there */
3858 if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *) 0) {
3859 if (attack_checks(mtmp, uwep))
3862 return 1; /* burn nutrition; maybe pass out */
3863 context.polearm.hitmon = mtmp;
3864 check_caitiff(mtmp);
3865 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
3866 (void) thitmonst(mtmp, uwep);
3867 } else if (glyph_is_statue(glyph) /* might be hallucinatory */
3868 && sobj_at(STATUE, bhitpos.x, bhitpos.y)) {
3869 struct trap *t = t_at(bhitpos.x, bhitpos.y);
3871 if (t && t->ttyp == STATUE_TRAP
3872 && activate_statue_trap(t, t->tx, t->ty, FALSE)) {
3873 ; /* feedback has been give by animate_statue() */
3875 /* Since statues look like monsters now, we say something
3876 different from "you miss" or "there's nobody there".
3877 Note: we only do this when a statue is displayed here,
3878 because the player is probably attempting to attack it;
3879 other statues obscured by anything are just ignored. */
3881 pline("Thump! Your blow bounces harmlessly off the statue.");
3883 pline("
\83S
\83c
\83\93\81I
\92¤
\91\9c\82Í
\8f\9d\82Â
\82©
\82È
\82©
\82Á
\82½
\81D");
3884 wake_nearto(bhitpos.x, bhitpos.y, 25);
3887 /* no monster here and no statue seen or remembered here */
3888 if (glyph_is_invisible(glyph)) {
3889 /* now you know that nothing is there... */
3890 unmap_object(bhitpos.x, bhitpos.y);
3891 newsym(bhitpos.x, bhitpos.y);
3894 You("miss; there is no one there to hit.");
3896 You("
\8aO
\82ê
\82½
\81D
\82»
\82±
\82É
\82Í
\89½
\82à
\82È
\82¢
\81D");
3898 u_wipe_engr(2); /* same as for melee or throwing */
3906 boolean wasblind = Blind;
3907 boolean wascreamed = u.ucreamed;
3908 boolean several = FALSE;
3910 if (obj->quan > 1L) {
3912 obj = splitobj(obj, 1L);
3916 You("give yourself a facial.");
3918 You("
\83N
\83\8a\81[
\83\80\83p
\83b
\83N
\82ð
\82µ
\82½
\81D");
3921 pline("You immerse your %s in %s%s.", body_part(FACE),
3922 several ? "one of " : "",
3923 several ? makeplural(the(xname(obj))) : the(xname(obj)));
3925 pline("%s%s
\82É%s
\82ð
\92¾
\82ß
\82½
\81D",
3927 several ? "
\82Ì
\82Ð
\82Æ
\82Â" : "", body_part(FACE));
3929 if (can_blnd((struct monst *) 0, &youmonst, AT_WEAP, obj)) {
3930 int blindinc = rnd(25);
3931 u.ucreamed += blindinc;
3932 make_blinded(Blinded + (long) blindinc, FALSE);
3933 if (!Blind || (Blind && wasblind))
3935 pline("There's %ssticky goop all over your %s.",
3936 wascreamed ? "more " : "", body_part(FACE));
3938 pline("
\82â
\82Á
\82©
\82¢
\82È
\82Ë
\82Î
\82Ë
\82Î
\82ª%s
\91S
\91Ì
\82É%s
\82Â
\82¢
\82½
\81D",
3939 body_part(FACE), wascreamed ? "
\82³
\82ç
\82É" : "");
3941 else /* Blind && !wasblind */
3943 You_cant("see through all the sticky goop on your %s.",
3945 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",
3950 /* useup() is appropriate, but we want costly_alteration()'s message */
3951 costly_alteration(obj, COST_SPLAT);
3952 obj_extract_self(obj);
3961 int res = 0, typ, max_range = 4, tohit;
3962 boolean save_confirm;
3967 /* Are you allowed to use the hook? */
3969 pline(not_enough_room);
3973 if (!wield_tool(obj, "cast"))
3978 /* assert(obj == uwep); */
3980 /* Prompt for a location */
3981 pline(where_to_hit);
3985 if (getpos(&cc, TRUE, "the spot to hit") < 0)
3987 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0)
3988 return res; /* ESC; uses turn iff grapnel became wielded */
3990 /* Calculate range; unlike use_pole(), there's no minimum for range */
3991 typ = uwep_skill_type();
3992 if (typ == P_NONE || P_SKILL(typ) <= P_BASIC)
3994 else if (P_SKILL(typ) == P_SKILLED)
3998 if (distu(cc.x, cc.y) > max_range) {
4002 pline("
\89\93\82·
\82¬
\82é
\81I");
4004 } else if (!cansee(cc.x, cc.y)) {
4007 } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */
4012 /* What do you want to hit? */
4014 if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) {
4015 winid tmpwin = create_nhwindow(NHW_MENU);
4018 menu_item *selected;
4020 any = zeroany; /* set all bits to zero */
4021 any.a_int = 1; /* use index+1 (cant use 0) as identifier */
4025 Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
4027 Sprintf(buf, "%s
\82É
\82 \82é
\95¨
\91Ì", surface(cc.x, cc.y));
4028 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4032 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
4035 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "
\89ö
\95¨",
4040 Sprintf(buf, "the %s", surface(cc.x, cc.y));
4042 Sprintf(buf, "%s", surface(cc.x, cc.y));
4043 add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
4046 end_menu(tmpwin, "Aim for what?");
4048 end_menu(tmpwin, "
\89½
\82ð
\91_
\82¤
\81H");
4050 if (select_menu(tmpwin, PICK_ONE, &selected) > 0
4051 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2))
4052 tohit = selected[0].item.a_int - 1;
4053 free((genericptr_t) selected);
4054 destroy_nhwindow(tmpwin);
4057 /* possibly scuff engraving at your feet;
4058 any engraving at the target location is unaffected */
4059 if (tohit == 2 || !rn2(2))
4060 u_wipe_engr(rnd(2));
4062 /* What did you hit? */
4065 /* FIXME -- untrap needs to deal with non-adjacent traps */
4067 case 1: /* Object */
4068 if ((otmp = level.objects[cc.x][cc.y]) != 0) {
4070 You("snag an object from the %s!", surface(cc.x, cc.y));
4072 You("%s
\82Ì
\82à
\82Ì
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I", surface(cc.x, cc.y));
4073 (void) pickup_object(otmp, 1L, FALSE);
4074 /* If pickup fails, leave it alone */
4079 case 2: /* Monster */
4081 if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *) 0)
4083 notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
4084 save_confirm = flags.confirm;
4085 if (verysmall(mtmp->data) && !rn2(4)
4086 && enexto(&cc, u.ux, u.uy, (struct permonst *) 0)) {
4087 flags.confirm = FALSE;
4088 (void) attack_checks(mtmp, uwep);
4089 flags.confirm = save_confirm;
4090 check_caitiff(mtmp); /* despite fact there's no damage */
4092 You("pull in %s!", mon_nam(mtmp));
4094 You("%s
\82ð
\88ø
\82Á
\92£
\82Á
\82½
\81I", mon_nam(mtmp));
4095 mtmp->mundetected = 0;
4096 rloc_to(mtmp, cc.x, cc.y);
4098 } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data))
4100 flags.confirm = FALSE;
4101 (void) attack_checks(mtmp, uwep);
4102 flags.confirm = save_confirm;
4103 check_caitiff(mtmp);
4104 (void) thitmonst(mtmp, uwep);
4108 case 3: /* Surface */
4109 if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y))
4111 pline_The("hook slices through the %s.", surface(cc.x, cc.y));
4113 pline("
\83t
\83b
\83N
\82Í%s
\82ð
\82³
\82Á
\82Æ
\90Ø
\82Á
\82½
\81D", surface(cc.x, cc.y));
4116 You("are yanked toward the %s!", surface(cc.x, cc.y));
4118 You("%s
\82Ö
\88ø
\82Á
\82Ï
\82ç
\82ê
\82½
\81I", surface(cc.x, cc.y));
4119 hurtle(sgn(cc.x - u.ux), sgn(cc.y - u.uy), 1, FALSE);
4123 default: /* Yourself (oops!) */
4124 if (P_SKILL(typ) <= P_BASIC) {
4126 You("hook yourself!");
4128 You("
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82½
\81I");
4130 losehp(Maybe_Half_Phys(rn1(10, 10)), "a grappling hook",
4132 losehp(Maybe_Half_Phys(rn1(10, 10)), "
\8e©
\95ª
\8e©
\90g
\82ð
\88ø
\82Á
\8a|
\82¯
\82Ä",
4138 pline1(nothing_happens);
4142 #define BY_OBJECT ((struct monst *) 0)
4144 /* return 1 if the wand is broken, hence some time elapsed */
4150 static const char nothing_else_happens[] = "But nothing else happens...";
4152 static const char nothing_else_happens[] = "
\82µ
\82©
\82µ
\81C
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D
\81D
\81D";
4153 register int i, x, y;
4154 register struct monst *mon;
4156 boolean affects_objects;
4157 boolean shop_damage = FALSE;
4158 boolean fillmsg = FALSE;
4159 int expltype = EXPL_MAGICAL;
4160 char confirm[QBUFSZ], buf[BUFSZ];
4162 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
4164 boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "
\83o
\83\8b\83T
\82Ì
\8fñ"));
4167 if (!paranoid_query(ParanoidBreakwand,
4169 "Are you really sure you want to break ",
4170 "?", obj, yname, ysimple_name, "the wand")))
4172 if (!paranoid_query(ParanoidBreakwand,
4174 "
\96{
\93\96\82É", "
\82ð
\89ó
\82·
\82Ì
\81H",
4175 obj, xname, ysimple_name, "
\8fñ")))
4179 if (nohands(youmonst.data)) {
4181 You_cant("break %s without hands!", yname(obj));
4183 You("
\8eè
\82ª
\96³
\82¢
\82Ì
\82Å%s
\82ð
\89ó
\82¹
\82È
\82¢
\81I", xname(obj));
4185 } else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
4187 You("don't have the strength to break %s!", yname(obj));
4189 You("%s
\82ð
\89ó
\82·
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81I", xname(obj));
4193 pline("Raising %s high above your %s, you break it in two!", yname(obj),
4195 You("%s
\82ð%s
\82Ì
\8fã
\82É
\8d\82\82
\8cf
\82°
\81C
\93ñ
\82Â
\82É
\82Ö
\82µ
\90Ü
\82Á
\82½
\81I", xname(obj),
4198 /* [ALI] Do this first so that wand is removed from bill. Otherwise,
4199 * the freeinv() below also hides it from setpaid() which causes problems.
4202 check_unpaid(obj); /* Extra charge for use */
4203 costly_alteration(obj, COST_DSTROY);
4206 current_wand = obj; /* destroy_item might reset this */
4207 freeinv(obj); /* hide it from destroy_item instead... */
4208 setnotworn(obj); /* so we need to do this ourselves */
4210 if (!zappable(obj)) {
4211 pline(nothing_else_happens);
4212 goto discard_broken_wand;
4214 /* successful call to zappable() consumes a charge; put it back */
4216 /* might have "wrested" a final charge, taking it from 0 to -1;
4217 if so, we just brought it back up to 0, which wouldn't do much
4218 below so give it 1..3 charges now, usually making it stronger
4219 than an ordinary last charge (the wand is already gone from
4220 inventory, so perm_invent can't accidentally reveal this) */
4227 affects_objects = FALSE;
4229 switch (obj->otyp) {
4234 case WAN_ENLIGHTENMENT:
4236 case WAN_SECRET_DOOR_DETECTION:
4237 pline(nothing_else_happens);
4238 goto discard_broken_wand;
4244 expltype = EXPL_FIERY;
4246 if (expltype == EXPL_MAGICAL)
4247 expltype = EXPL_FROSTY;
4249 case WAN_MAGIC_MISSILE:
4251 explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
4252 makeknown(obj->otyp); /* explode describes the effect */
4253 goto discard_broken_wand;
4255 /* we want this before the explosion instead of at the very end */
4257 pline("A wall of force smashes down around you!");
4259 pline("
\82 \82È
\82½
\82Í
\96\82\97Í
\82Ì
\95Ç
\82É
\82Â
\82Â
\82Ü
\82ê
\82½
\81I");
4260 dmg = d(1 + obj->spe, 6); /* normally 2d12 */
4262 case WAN_CANCELLATION:
4264 case WAN_TELEPORTATION:
4265 case WAN_UNDEAD_TURNING:
4266 affects_objects = TRUE;
4272 /* magical explosion and its visual effect occur before specific effects
4274 /* [TODO? This really ought to prevent the explosion from being
4275 fatal so that we never leave a bones file where none of the
4276 surrounding targets (or underlying objects) got affected yet.] */
4277 explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS,
4280 /* prepare for potential feedback from polymorph... */
4283 /* this makes it hit us last, so that we can see the action first */
4284 for (i = 0; i <= 8; i++) {
4285 bhitpos.x = x = obj->ox + xdir[i];
4286 bhitpos.y = y = obj->oy + ydir[i];
4290 if (obj->otyp == WAN_DIGGING) {
4293 if (dig_check(BY_OBJECT, FALSE, x, y)) {
4294 if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) {
4295 /* normally, pits and holes don't anger guards, but they
4296 * do if it's a wall or door that's being dug */
4297 watch_dig((struct monst *) 0, x, y, TRUE);
4298 if (*in_rooms(x, y, SHOPBASE))
4302 * Let liquid flow into the newly created pits.
4303 * Adjust corresponding code in music.c for
4304 * drum of earthquake if you alter this sequence.
4306 typ = fillholetyp(x, y, FALSE);
4308 levl[x][y].typ = typ;
4309 liquid_flow(x, y, typ, t_at(x, y),
4313 : "Some holes are quickly filled with %s!");
4315 : "
\8c\8a\82Í
\82·
\82®
\82É%s
\82Å
\96\84\82Ü
\82Á
\82½
\81I");
4318 digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3
4319 || (!Can_dig_down(&u.uz)
4320 && !levl[x][y].candig))
4325 } else if (obj->otyp == WAN_CREATE_MONSTER) {
4326 /* u.ux,u.uy creates it near you--x,y might create it in rock */
4327 (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS);
4329 } else if (x != u.ux || y != u.uy) {
4331 * Wand breakage is targetting a square adjacent to the hero,
4332 * which might contain a monster or a pile of objects or both.
4333 * Handle objects last; avoids having undead turning raise an
4334 * undead's corpse and then attack resulting undead monster.
4335 * obj->bypass in bhitm() prevents the polymorphing of items
4336 * dropped due to monster's polymorph and prevents undead
4337 * turning that kills an undead from raising resulting corpse.
4339 if ((mon = m_at(x, y)) != 0) {
4340 (void) bhitm(mon, obj);
4341 /* if (context.botl) bot(); */
4343 if (affects_objects && level.objects[x][y]) {
4344 (void) bhitpile(obj, bhito, x, y, 0);
4346 bot(); /* potion effects */
4350 * Wand breakage is targetting the hero. Using xdir[]+ydir[]
4351 * deltas for location selection causes this case to happen
4352 * after all the surrounding squares have been handled.
4353 * Process objects first, in case damage is fatal and leaves
4354 * bones, or teleportation sends one or more of the objects to
4355 * same destination as hero (lookhere/autopickup); also avoids
4356 * the polymorphing of gear dropped due to hero's transformation.
4357 * (Unlike with monsters being hit by zaps, we can't rely on use
4358 * of obj->bypass in the zap code to accomplish that last case
4359 * since it's also used by retouch_equipment() for polyself.)
4361 if (affects_objects && level.objects[x][y]) {
4362 (void) bhitpile(obj, bhito, x, y, 0);
4364 bot(); /* potion effects */
4366 damage = zapyourself(obj, FALSE);
4369 Sprintf(buf, "killed %sself by breaking a wand", uhim());
4370 losehp(Maybe_Half_Phys(damage), buf, NO_KILLER_PREFIX);
4372 Strcpy(buf, "
\8e©
\95ª
\8e©
\90g
\82Å
\8fñ
\82ð
\89ó
\82µ
\82Ä
\83_
\83\81\81[
\83W
\82ð
\8eó
\82¯");
4373 losehp(Maybe_Half_Phys(damage), buf, KILLED_BY);
4377 bot(); /* blindness */
4381 /* potentially give post zap/break feedback */
4384 /* Note: if player fell thru, this call is a no-op.
4385 Damage is handled in digactualhole in that case */
4388 pay_for_damage("dig into", FALSE);
4390 pay_for_damage("
\8c\8a\82ð
\82 \82¯
\82é", FALSE);
4392 if (obj->otyp == WAN_LIGHT)
4393 litroom(TRUE, obj); /* only needs to be done once */
4395 discard_broken_wand:
4396 obj = current_wand; /* [see dozap() and destroy_item()] */
4405 add_class(cl, class)
4416 static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 };
4418 /* augment tools[] if various items are carried */
4420 setapplyclasses(class_list)
4423 register struct obj *otmp;
4425 boolean knowoil, knowtouchstone, addpotions, addstones, addfood;
4427 knowoil = objects[POT_OIL].oc_name_known;
4428 knowtouchstone = objects[TOUCHSTONE].oc_name_known;
4429 addpotions = addstones = addfood = FALSE;
4430 for (otmp = invent; otmp; otmp = otmp->nobj) {
4433 || (otmp->oclass == POTION_CLASS
4435 || (!knowoil && !objects[otyp].oc_name_known))))
4437 if (otyp == TOUCHSTONE
4438 || (is_graystone(otmp)
4440 || (!knowtouchstone && !objects[otyp].oc_name_known))))
4442 if (otyp == CREAM_PIE || otyp == EUCALYPTUS_LEAF)
4446 class_list[0] = '\0';
4447 if (addpotions || addstones)
4448 add_class(class_list, ALL_CLASSES);
4449 Strcat(class_list, tools);
4451 add_class(class_list, POTION_CLASS);
4453 add_class(class_list, GEM_CLASS);
4455 add_class(class_list, FOOD_CLASS);
4458 /* the 'a' command */
4463 register int res = 1;
4464 char class_list[MAXOCLASSES + 2];
4466 if (check_capacity((char *) 0))
4469 setapplyclasses(class_list); /* tools[] */
4470 obj = getobj(class_list, "use or apply");
4474 if (!retouch_object(&obj, FALSE))
4475 return 1; /* evading your grasp costs a turn; just be
4476 grateful that you don't drop it as well */
4478 if (obj->oclass == WAND_CLASS)
4479 return do_break_wand(obj);
4481 switch (obj->otyp) {
4484 if (obj == ublindf) {
4487 } else if (!ublindf) {
4491 You("are already %s.", ublindf->otyp == TOWEL
4492 ? "covered by a towel"
4493 : ublindf->otyp == BLINDFOLD
4494 ? "wearing a blindfold"
4495 : "wearing lenses");
4497 You("
\82à
\82¤%s
\82Ä
\82¢
\82é
\81D", ublindf->otyp == TOWEL
4498 ? "
\83^
\83I
\83\8b\82ð
\8aª
\82¢"
4499 : ublindf->otyp == BLINDFOLD
4500 ? "
\96Ú
\89B
\82µ
\82ð
\82Â
\82¯"
4501 : "
\83\8c\83\93\83Y
\82ð
\82Â
\82¯");
4506 res = use_cream_pie(obj);
4509 res = use_whip(obj);
4511 case GRAPPLING_HOOK:
4512 res = use_grapple(obj);
4518 case BAG_OF_HOLDING:
4520 res = use_container(&obj, 1);
4523 (void) bagotricks(obj, FALSE, (int *) 0);
4531 res = (pick_lock(obj) != 0);
4534 case DWARVISH_MATTOCK:
4535 res = use_pick_axe(obj);
4538 use_tinning_kit(obj);
4544 res = use_saddle(obj);
4547 use_magic_whistle(obj);
4552 case EUCALYPTUS_LEAF:
4553 /* MRKR: Every Australian knows that a gum leaf makes an excellent
4554 * whistle, especially if your pet is a tame kangaroo named Skippy.
4557 use_magic_whistle(obj);
4558 /* sometimes the blessing will be worn off */
4562 pline("%s %s.", Yobjnam2(obj, "glow"), hcolor("brown"));
4564 pline("%s
\82Í%s
\8bP
\82¢
\82½
\81D", xname(obj), jconj_adj(hcolor("
\92\83\90F
\82Ì")));
4574 res = use_stethoscope(obj);
4577 res = use_mirror(obj);
4580 case BELL_OF_OPENING:
4583 case CANDELABRUM_OF_INVOCATION:
4584 use_candelabrum(obj);
4596 light_cocktail(obj);
4598 case EXPENSIVE_CAMERA:
4599 res = use_camera(obj);
4602 res = use_towel(obj);
4605 use_crystal_ball(&obj);
4611 if (!carrying(TIN)) {
4613 You("have no tin to open.");
4615 You("
\8aÊ
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D");
4619 You("cannot open a tin without eating or discarding its contents.");
4621 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");
4624 pline("In order to eat, use the 'e' command.");
4626 pline("
\90H
\82×
\82é
\82É
\82Í
\81C'e'
\83R
\83}
\83\93\83h
\82ð
\8eg
\82¦
\82Î
\82æ
\82¢
\81D");
4630 "Opening the tin will be much easier if you wield the tin opener.");
4632 "
\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");
4639 use_unicorn_horn(obj);
4650 case DRUM_OF_EARTHQUAKE:
4651 res = do_play_instrument(obj);
4653 case HORN_OF_PLENTY: /* not a musical instrument */
4654 (void) hornoplenty(obj, FALSE);
4667 /* Pole-weapons can strike at a distance */
4669 res = use_pole(obj);
4671 } else if (is_pick(obj) || is_axe(obj)) {
4672 res = use_pick_axe(obj);
4676 pline("Sorry, I don't know how to use that.");
4678 pline("
\82»
\82ê
\82ð
\82Ç
\82¤
\82â
\82Á
\82Ä
\8eg
\82¤
\82ñ
\82¾
\82¢
\81H");
4683 if (res && obj && obj->oartifact)
4689 /* Keep track of unfixable troubles for purposes of messages saying you feel
4693 unfixable_trouble_count(is_horn)
4696 int unfixable_trbl = 0;
4702 if (Wounded_legs && !u.usteed)
4706 /* lycanthropy is undesirable, but it doesn't actually make you feel bad */
4708 if (!is_horn || (Confusion & ~TIMEOUT))
4710 if (!is_horn || (Sick & ~TIMEOUT))
4712 if (!is_horn || (HHallucination & ~TIMEOUT))
4714 if (!is_horn || (Vomiting & ~TIMEOUT))
4716 if (!is_horn || (HStun & ~TIMEOUT))
4718 if (!is_horn || (HDeaf & ~TIMEOUT))
4721 return unfixable_trbl;