1 /* NetHack 3.6 polyself.c $NHDT-Date: 1448496566 2015/11/26 00:09:26 $ $NHDT-Branch: master $:$NHDT-Revision: 1.104 $ */
2 /* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */
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. */
11 * Polymorph self routine.
13 * Note: the light source handling code assumes that both youmonst.m_id
14 * and youmonst.mx will always remain 0 when it handles the case of the
15 * player polymorphed into a light-emitting monster.
17 * Transformation sequences:
18 * /-> polymon poly into monster form
20 * \-> newman -> polyman fail to poly, get human form
22 * rehumanize -> polyman return to original form
24 * polymon (called directly) usually golem petrification
29 STATIC_DCL void FDECL(check_strangling, (BOOLEAN_P));
30 STATIC_DCL void FDECL(polyman, (const char *, const char *));
31 STATIC_DCL void NDECL(break_armor);
32 STATIC_DCL void FDECL(drop_weapon, (int));
33 STATIC_DCL void NDECL(uunstick);
34 STATIC_DCL int FDECL(armor_to_dragon, (int));
35 STATIC_DCL void NDECL(newman);
36 STATIC_DCL boolean FDECL(polysense, (struct permonst *));
38 STATIC_VAR const char no_longer_petrify_resistant[] =
40 "No longer petrify-resistant, you";
42 "
\90Î
\89»
\82Ö
\82Ì
\92ï
\8dR
\97Í
\82ª
\82È
\82
\82È
\82Á
\82Ä
\81C
\82 \82È
\82½
\82Í";
44 /* controls whether taking on new form or becoming new man can also
45 change sex (ought to be an arg to polymon() and newman() instead) */
46 STATIC_VAR int sex_change_ok = 0;
48 /* update the youmonst.data structure pointer and intrinsics */
52 struct permonst *mdat = &mons[u.umonnum];
54 set_mon_data(&youmonst, mdat, 0);
56 #define PROPSET(PropIndx, ON) \
59 u.uprops[PropIndx].intrinsic |= FROMFORM; \
61 u.uprops[PropIndx].intrinsic &= ~FROMFORM; \
64 PROPSET(FIRE_RES, resists_fire(&youmonst));
65 PROPSET(COLD_RES, resists_cold(&youmonst));
66 PROPSET(SLEEP_RES, resists_sleep(&youmonst));
67 PROPSET(DISINT_RES, resists_disint(&youmonst));
68 PROPSET(SHOCK_RES, resists_elec(&youmonst));
69 PROPSET(POISON_RES, resists_poison(&youmonst));
70 PROPSET(ACID_RES, resists_acid(&youmonst));
71 PROPSET(STONE_RES, resists_ston(&youmonst));
73 /* resists_drli() takes wielded weapon into account; suppress it */
74 struct obj *save_uwep = uwep;
77 PROPSET(DRAIN_RES, resists_drli(&youmonst));
80 /* resists_magm() takes wielded, worn, and carried equipment into
81 into account; cheat and duplicate its monster-specific part */
82 PROPSET(ANTIMAGIC, (dmgtype(mdat, AD_MAGM)
83 || mdat == &mons[PM_BABY_GRAY_DRAGON]
84 || dmgtype(mdat, AD_RBRE)));
85 PROPSET(SICK_RES, (mdat->mlet == S_FUNGUS || mdat == &mons[PM_GHOUL]));
87 PROPSET(STUNNED, (mdat == &mons[PM_STALKER] || is_bat(mdat)));
88 PROPSET(HALLUC_RES, dmgtype(mdat, AD_HALU));
89 PROPSET(SEE_INVIS, perceives(mdat));
90 PROPSET(TELEPAT, telepathic(mdat));
91 PROPSET(INFRAVISION, infravision(mdat));
92 PROPSET(INVIS, pm_invisible(mdat));
93 PROPSET(TELEPORT, can_teleport(mdat));
94 PROPSET(TELEPORT_CONTROL, control_teleport(mdat));
95 PROPSET(LEVITATION, is_floater(mdat));
96 PROPSET(FLYING, is_flyer(mdat));
97 PROPSET(SWIMMING, is_swimmer(mdat));
98 /* [don't touch MAGICAL_BREATHING here; both Amphibious and Breathless
99 key off of it but include different monster forms...] */
100 PROPSET(PASSES_WALLS, passes_walls(mdat));
101 PROPSET(REGENERATION, regenerates(mdat));
102 PROPSET(REFLECTING, (mdat == &mons[PM_SILVER_DRAGON]));
104 float_vs_flight(); /* maybe toggle (BFlying & I_SPECIAL) */
108 #ifdef STATUS_VIA_WINDOWPORT
109 status_initialize(REASSESS_ONLY);
113 /* Levitation overrides Flying; set or clear BFlying|I_SPECIAL */
117 /* floating overrides flight; normally float_up() and float_down()
118 handle this, but sometimes they're skipped */
119 if (HLevitation || ELevitation)
120 BFlying |= I_SPECIAL;
122 BFlying &= ~I_SPECIAL;
125 /* for changing into form that's immune to strangulation */
130 /* on -- maybe resume strangling */
132 /* when Strangled is already set, polymorphing from one
133 vulnerable form into another causes the counter to be reset */
134 if (uamul && uamul->otyp == AMULET_OF_STRANGULATION
135 && can_be_strangled(&youmonst)) {
137 Your("%s %s your %s!", simpleonames(uamul),
138 Strangled ? "still constricts" : "begins constricting",
139 body_part(NECK)); /* "throat" */
141 Your("%s%s%s
\82ð
\8di
\82ß%s
\81I", simpleonames(uamul),
142 Strangled ? "
\82Í
\82Ü
\82¾" : "
\82ª",
144 Strangled ? "
\82Ä
\82¢
\82é" : "
\82Í
\82¶
\82ß
\82½");
147 makeknown(AMULET_OF_STRANGULATION);
150 /* off -- maybe block strangling */
152 if (Strangled && !can_be_strangled(&youmonst)) {
155 You("are no longer being strangled.");
157 You("
\82à
\82Í
\82â
\92\82\91§
\82µ
\82Ä
\82¢
\82È
\82¢
\81D");
162 /* make a (new) human out of the player */
165 const char *fmt, *arg;
167 boolean sticky = (sticks(youmonst.data) && u.ustuck && !u.uswallow),
168 was_mimicking = (youmonst.m_ap_type == M_AP_OBJECT);
169 boolean was_blind = !!Blind;
172 u.acurr = u.macurr; /* restore old attribs */
174 u.umonnum = u.umonster;
175 flags.female = u.mfemale;
190 youmonst.m_ap_type = M_AP_NOTHING;
196 /* check whether player foolishly genocided self while poly'd */
197 if ((mvitals[urole.malenum].mvflags & G_GENOD)
198 || (urole.femalenum != NON_PM
199 && (mvitals[urole.femalenum].mvflags & G_GENOD))
200 || (mvitals[urace.malenum].mvflags & G_GENOD)
201 || (urace.femalenum != NON_PM
202 && (mvitals[urace.femalenum].mvflags & G_GENOD))) {
203 /* intervening activity might have clobbered genocide info */
204 struct kinfo *kptr = find_delayed_killer(POLYMORPH);
206 if (kptr != (struct kinfo *) 0 && kptr->name[0]) {
207 killer.format = kptr->format;
208 Strcpy(killer.name, kptr->name);
210 killer.format = KILLED_BY;
212 Strcpy(killer.name, "self-genocide");
214 Strcpy(killer.name, "
\8e©
\8bs
\93I
\8bs
\8eE
\82Å");
216 dealloc_killer(kptr);
220 if (u.twoweap && !could_twoweap(youmonst.data))
223 if (u.utraptype == TT_PIT && u.utrap) {
224 u.utrap = rn1(6, 2); /* time to escape resets */
226 if (was_blind && !Blind) { /* reverting from eyeless */
228 make_blinded(0L, TRUE); /* remove blindness */
230 check_strangling(TRUE);
232 if (!Levitation && !u.ustuck && is_pool_or_lava(u.ux, u.uy))
241 /* setting u.umonster for caveman/cavewoman or priest/priestess
242 swap unintentionally makes `Upolyd' appear to be true */
243 boolean already_polyd = (boolean) Upolyd;
245 /* Some monsters are always of one sex and their sex can't be changed;
246 * Succubi/incubi can change, but are handled below.
248 * !already_polyd check necessary because is_male() and is_female()
249 * are true if the player is a priest/priestess.
252 || (!is_male(youmonst.data) && !is_female(youmonst.data)
253 && !is_neuter(youmonst.data)))
254 flags.female = !flags.female;
255 if (already_polyd) /* poly'd: also change saved sex */
256 u.mfemale = !u.mfemale;
257 max_rank_sz(); /* [this appears to be superfluous] */
258 if ((already_polyd ? u.mfemale : flags.female) && urole.name.f)
259 Strcpy(pl_character, urole.name.f);
261 Strcpy(pl_character, urole.name.m);
262 u.umonster = ((already_polyd ? u.mfemale : flags.female)
263 && urole.femalenum != NON_PM)
266 if (!already_polyd) {
267 u.umonnum = u.umonster;
268 } else if (u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS) {
269 flags.female = !flags.female;
270 /* change monster type to match new sex */
271 u.umonnum = (u.umonnum == PM_SUCCUBUS) ? PM_INCUBUS : PM_SUCCUBUS;
279 int i, oldlvl, newlvl, hpmax, enmax;
282 newlvl = oldlvl + rn1(5, -2); /* new = old + {-2,-1,0,+1,+2} */
283 if (newlvl > 127 || newlvl < 1) { /* level went below 0? */
284 goto dead; /* old level is still intact (in case of lifesaving) */
286 if (newlvl > MAXULEV)
288 /* If your level goes down, your peak level goes down by
289 the same amount so that you can't simply use blessed
290 full healing to undo the decrease. But if your level
291 goes up, your peak level does *not* undergo the same
292 adjustment; you might end up losing out on the chance
293 to regain some levels previously lost to other causes. */
295 u.ulevelmax -= (oldlvl - newlvl);
296 if (u.ulevelmax < newlvl)
297 u.ulevelmax = newlvl;
300 if (sex_change_ok && !rn2(10))
303 adjabil(oldlvl, (int) u.ulevel);
304 reset_rndmonst(NON_PM); /* new monster generation criteria */
306 /* random experience points for the new experience level */
307 u.uexp = rndexp(FALSE);
309 /* set up new attribute points (particularly Con) */
314 * remove level-gain based HP from any extra HP accumulated
315 * (the "extra" might actually be negative);
316 * modify the extra, retaining {80%, 90%, 100%, or 110%};
317 * add in newly generated set of level-gain HP.
319 * (This used to calculate new HP in direct proportion to old HP,
320 * but that was subject to abuse: accumulate a large amount of
321 * extra HP, drain level down to 1, then polyself to level 2 or 3
322 * [lifesaving capability needed to handle level 0 and -1 cases]
323 * and the extra got multiplied by 2 or 3. Repeat the level
324 * drain and polyself steps until out of lifesaving capability.)
327 for (i = 0; i < oldlvl; i++)
328 hpmax -= (int) u.uhpinc[i];
329 /* hpmax * rn1(4,8) / 10; 0.95*hpmax on average */
330 hpmax = rounddiv((long) hpmax * (long) rn1(4, 8), 10);
331 for (i = 0; (u.ulevel = i) < newlvl; i++)
333 if (hpmax < u.ulevel)
334 hpmax = u.ulevel; /* min of 1 HP per level */
335 /* retain same proportion for current HP; u.uhp * hpmax / u.uhpmax */
336 u.uhp = rounddiv((long) u.uhp * (long) hpmax, u.uhpmax);
339 * Do the same for spell power.
342 for (i = 0; i < oldlvl; i++)
343 enmax -= (int) u.ueninc[i];
344 enmax = rounddiv((long) enmax * (long) rn1(4, 8), 10);
345 for (i = 0; (u.ulevel = i) < newlvl; i++)
347 if (enmax < u.ulevel)
349 u.uen = rounddiv((long) u.uen * (long) enmax,
350 ((u.uenmax < 1) ? 1 : u.uenmax));
352 /* [should alignment record be tweaked too?] */
354 u.uhunger = rn1(500, 500);
356 make_sick(0L, (char *) 0, FALSE, SICK_ALL);
358 make_stoned(0L, (char *) 0, 0, (char *) 0);
360 if (Polymorph_control) { /* even when Stunned || Unaware */
364 dead: /* we come directly here if their experience level went to 0 or
367 Your("new form doesn't seem healthy enough to survive.");
369 Your("
\90V
\82µ
\82¢
\8ep
\82Í
\90¶
\82«
\82Ä
\82¢
\82
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
370 killer.format = KILLED_BY_AN;
372 Strcpy(killer.name, "unsuccessful polymorph");
374 Strcpy(killer.name, "
\95Ï
\89»
\82Ì
\8e¸
\94s
\82Å");
377 (void) polysense(youmonst.data);
378 return; /* lifesaved */
383 polyman("feel like a new %s!",
385 polyman("%s
\82Æ
\82µ
\82Ä
\90¶
\82Ü
\82ê
\82©
\82í
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I",
386 /* use saved gender we're about to revert to, not current */
387 (u.mfemale && urace.individual.f)
389 : (urace.individual.m) ? urace.individual.m : urace.noun);
392 Your("body transforms, but there is still slime on you.");
394 Your("
\91Ì
\82Í
\95Ï
\89»
\82µ
\82½
\82ª
\81C
\83X
\83\89\83C
\83\80\82ª
\82Â
\82¢
\82½
\82Ü
\82Ü
\82¾
\81D");
395 make_slimed(10L, (const char *) 0);
398 (void) polysense(youmonst.data);
401 (void) encumber_msg();
403 retouch_equipment(2);
405 selftouch(no_longer_petrify_resistant);
413 int old_light, new_light, mntmp, class, tryct;
414 boolean forcecontrol = (psflags == 1), monsterpoly = (psflags == 2),
415 draconian = (uarm && Is_dragon_armor(uarm)),
416 iswere = (u.ulycn >= LOW_PM), isvamp = is_vampire(youmonst.data),
417 controllable_poly = Polymorph_control && !(Stunned || Unaware);
421 pline("You fail to transform!");
423 pline("
\82 \82È
\82½
\82Í
\95Ï
\89»
\82É
\8e¸
\94s
\82µ
\82½
\81I");
426 /* being Stunned|Unaware doesn't negate this aspect of Poly_control */
427 if (!Polymorph_control && !forcecontrol && !draconian && !iswere
429 if (rn2(20) > ACURR(A_CON)) {
430 You1(shudder_for_moment);
432 losehp(rnd(30), "system shock", KILLED_BY_AN);
434 losehp(rnd(30), "
\83V
\83X
\83e
\83\80\83V
\83\87\83b
\83N
\82Å", KILLED_BY_AN);
435 exercise(A_CON, FALSE);
439 old_light = emits_light(youmonst.data);
442 if (monsterpoly && isvamp)
445 if (controllable_poly || forcecontrol) {
450 getlin("Become what kind of monster? [type the name]", buf);
452 getlin("
\82Ç
\82Ì
\8eí
\82Ì
\89ö
\95¨
\82É
\82È
\82é
\81H[
\96¼
\91O
\82ð
\93ü
\82ê
\82Ä
\82Ë]", buf);
453 (void) mungspaces(buf);
454 if (*buf == '\033') {
455 /* user is cancelling controlled poly */
456 if (forcecontrol) { /* wizard mode #polyself */
460 Strcpy(buf, "*"); /* resort to random */
462 if (!strcmp(buf, "*") || !strcmp(buf, "random")) {
463 /* explicitly requesting random result */
464 tryct = 0; /* will skip thats_enough_tries */
465 continue; /* end do-while(--tryct > 0) loop */
468 mntmp = name_to_mon(buf);
469 if (mntmp < LOW_PM) {
471 class = name_to_monclass(buf, &mntmp);
472 if (class && mntmp == NON_PM)
473 mntmp = mkclass_poly(class);
475 if (mntmp < LOW_PM) {
478 pline("I've never heard of such monsters.");
480 pline("
\82»
\82ñ
\82È
\89ö
\95¨
\82Í
\95·
\82¢
\82½
\82±
\82Æ
\82ª
\82È
\82¢
\81D");
483 You_cant("polymorph into any of those.");
485 pline("
\82»
\82ê
\82É
\82È
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
486 } else if (iswere && (were_beastie(mntmp) == u.ulycn
487 || mntmp == counter_were(u.ulycn)
488 || (Upolyd && mntmp == PM_HUMAN))) {
490 /* Note: humans are illegal as monsters, but an
491 * illegal monster forces newman(), which is what we
492 * want if they specified a human.... */
493 } else if (!polyok(&mons[mntmp])
494 && !(mntmp == PM_HUMAN || your_race(&mons[mntmp])
495 || mntmp == urole.malenum
496 || mntmp == urole.femalenum)) {
499 /* mkclass_poly() can pick a !polyok()
500 candidate; if so, usually try again */
502 if (rn2(3) || --tryct > 0)
504 /* no retries left; put one back on counter
505 so that end of loop decrement will yield
506 0 and trigger thats_enough_tries message */
509 pm_name = mons[mntmp].mname;
510 if (the_unique_pm(&mons[mntmp]))
511 pm_name = the(pm_name);
512 else if (!type_is_pname(&mons[mntmp]))
513 pm_name = an(pm_name);
515 You_cant("polymorph into %s.", pm_name);
517 You_cant("%s
\82É
\95Ï
\89»
\82Å
\82«
\82È
\82¢
\81D", pm_name);
520 } while (--tryct > 0);
522 pline1(thats_enough_tries);
523 /* allow skin merging, even when polymorph is controlled */
524 if (draconian && (tryct <= 0 || mntmp == armor_to_dragon(uarm->otyp)))
526 if (isvamp && (tryct <= 0 || mntmp == PM_WOLF || mntmp == PM_FOG_CLOUD
527 || is_bat(&mons[mntmp])))
529 } else if (draconian || iswere || isvamp) {
530 /* special changes that don't require polyok() */
533 mntmp = armor_to_dragon(uarm->otyp);
534 if (!(mvitals[mntmp].mvflags & G_GENOD)) {
535 /* allow G_EXTINCT */
536 if (Is_dragon_scales(uarm)) {
537 /* dragon scales remain intact as uskin */
539 You("merge with your scaly armor.");
541 You("
\97Ø
\82Ì
\8aZ
\82Æ
\88ê
\91Ì
\89»
\82µ
\82½
\81D");
542 } else { /* dragon scale mail */
543 /* d.scale mail first reverts to scales */
550 /* similar to noarmor(invent.c),
551 shorten to "<color> scale mail" */
552 dsmail = strcpy(buf, simpleonames(uarm));
554 if ((p = strstri(dsmail, " dragon ")) != 0)
555 while ((p[1] = p[8]) != '\0')
558 /* tricky phrasing; dragon scale mail
559 is singular, dragon scales are plural */
561 Your("%s reverts to scales as you merge with them.",
564 Your("%s
\82Í
\97Ø
\82É
\96ß
\82Á
\82½
\81D",
567 /* uarm->spe enchantment remains unchanged;
568 re-converting scales to mail poses risk
569 of evaporation due to over enchanting */
570 uarm->otyp += GRAY_DRAGON_SCALES - GRAY_DRAGON_SCALE_MAIL;
572 context.botl = 1; /* AC is changing */
575 uarm = (struct obj *) 0;
576 /* save/restore hack */
577 uskin->owornmask |= I_SPECIAL;
582 if (Upolyd && were_beastie(mntmp) != u.ulycn)
583 mntmp = PM_HUMAN; /* Illegal; force newman() */
588 if (mntmp < LOW_PM || (mons[mntmp].geno & G_UNIQ))
589 mntmp = (youmonst.data != &mons[PM_VAMPIRE] && !rn2(10))
591 : !rn2(4) ? PM_FOG_CLOUD : PM_VAMPIRE_BAT;
592 if (controllable_poly) {
594 Sprintf(buf, "Become %s?", an(mons[mntmp].mname));
596 Sprintf(buf, "%s
\82É
\82È
\82é
\81H", mons[mntmp].mname);
601 /* if polymon fails, "you feel" message has been given
602 so don't follow up with another polymon or newman;
603 sex_change_ok left disabled here */
604 if (mntmp == PM_HUMAN)
605 newman(); /* werecritter */
607 (void) polymon(mntmp);
608 goto made_change; /* maybe not, but this is right anyway */
611 if (mntmp < LOW_PM) {
614 /* randomly pick an "ordinary" monster */
615 mntmp = rn1(SPECIAL_PM - LOW_PM, LOW_PM);
616 if (polyok(&mons[mntmp]) && !is_placeholder(&mons[mntmp]))
618 } while (--tryct > 0);
621 /* The below polyok() fails either if everything is genocided, or if
622 * we deliberately chose something illegal to force newman().
625 if (!polyok(&mons[mntmp]) || (!forcecontrol && !rn2(5))
626 || your_race(&mons[mntmp])) {
629 (void) polymon(mntmp);
631 sex_change_ok--; /* reset */
634 new_light = emits_light(youmonst.data);
635 if (old_light != new_light) {
637 del_light_source(LS_MONSTER, monst_to_any(&youmonst));
639 ++new_light; /* otherwise it's undetectable */
641 new_light_source(u.ux, u.uy, new_light, LS_MONSTER,
642 monst_to_any(&youmonst));
646 /* (try to) make a mntmp monster out of the player;
647 returns 1 if polymorph successful */
652 boolean sticky = sticks(youmonst.data) && u.ustuck && !u.uswallow,
653 was_blind = !!Blind, dochange = FALSE;
656 if (mvitals[mntmp].mvflags & G_GENOD) { /* allow G_EXTINCT */
658 You_feel("rather %s-ish.", mons[mntmp].mname);
660 You("%s
\82Á
\82Û
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D", mons[mntmp].mname);
661 exercise(A_WIS, TRUE);
666 u.uconduct.polyselfs++;
668 /* exercise used to be at the very end but only Wis was affected
669 there since the polymorph was always in effect by then */
670 exercise(A_CON, FALSE);
671 exercise(A_WIS, TRUE);
674 /* Human to monster; save human stats */
677 u.mfemale = flags.female;
679 /* Monster to monster; restore human stats, to be
680 * immediately changed to provide stats for the new monster
684 flags.female = u.mfemale;
687 /* if stuck mimicking gold, stop immediately */
688 if (multi < 0 && youmonst.m_ap_type == M_AP_OBJECT
689 && youmonst.data->mlet != S_MIMIC)
691 /* if becoming a non-mimic, stop mimicking anything */
692 if (mons[mntmp].mlet != S_MIMIC) {
693 /* as in polyman() */
694 youmonst.m_ap_type = M_AP_NOTHING;
696 if (is_male(&mons[mntmp])) {
699 } else if (is_female(&mons[mntmp])) {
702 } else if (!is_neuter(&mons[mntmp]) && mntmp != u.ulycn) {
703 if (sex_change_ok && !rn2(10))
707 flags.female = !flags.female;
710 (u.umonnum != mntmp) ? "turn into a" : "feel like a new",
711 (is_male(&mons[mntmp]) || is_female(&mons[mntmp]))
713 : flags.female ? "female " : "male ",
716 You("%s%s
\82É
\82È
\82Á
\82½%s
\81I",
717 (is_male(&mons[mntmp]) || is_female(&mons[mntmp]))
719 : flags.female ? "
\8f\97\82Ì" : "
\92j
\82Ì",
721 (u.umonnum != mntmp) ? "" : "
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½");
724 if (u.umonnum != mntmp)
726 You("turn into %s!", an(mons[mntmp].mname));
728 You("%s
\82É
\82È
\82Á
\82½
\81I", mons[mntmp].mname);
731 You_feel("like a new %s!", mons[mntmp].mname);
733 You("
\95Ê
\82Ì%s
\82É
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I", mons[mntmp].mname);
735 if (Stoned && poly_when_stoned(&mons[mntmp])) {
736 /* poly_when_stoned already checked stone golem genocide */
737 mntmp = PM_STONE_GOLEM;
739 make_stoned(0L, "You turn to stone!", 0, (char *) 0);
741 make_stoned(0L, "
\90Î
\82É
\82È
\82Á
\82½
\81I", 0, (char *) 0);
744 u.mtimedone = rn1(500, 500);
748 /* New stats for monster, to last only as long as polymorphed.
749 * Currently only strength gets changed.
751 if (strongmonst(&mons[mntmp]))
752 ABASE(A_STR) = AMAX(A_STR) = STR18(100);
754 if (Stone_resistance && Stoned) { /* parnes@eniac.seas.upenn.edu */
756 make_stoned(0L, "You no longer seem to be petrifying.", 0,
758 make_stoned(0L, "
\90Î
\89»
\82©
\82ç
\89ð
\95ú
\82³
\82ê
\82½
\82æ
\82¤
\82¾
\81D", 0,
761 if (Sick_resistance && Sick) {
762 make_sick(0L, (char *) 0, FALSE, SICK_ALL);
764 You("no longer feel sick.");
766 You("
\95a
\8bC
\82©
\82ç
\89ð
\95ú
\82³
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
769 if (flaming(youmonst.data)) {
771 make_slimed(0L, "The slime burns away!");
773 make_slimed(0L, "
\83X
\83\89\83C
\83\80\82Í
\94R
\82¦
\82½
\81I");
774 } else if (mntmp == PM_GREEN_SLIME) {
776 make_slimed(0L, (char *) 0);
779 check_strangling(FALSE); /* maybe stop strangling */
780 if (nohands(youmonst.data))
784 mlvl = adj_lev(&mons[mntmp]);
785 * We can't do the above, since there's no such thing as an
786 * "experience level of you as a monster" for a polymorphed character.
788 mlvl = (int) mons[mntmp].mlevel;
789 if (youmonst.data->mlet == S_DRAGON && mntmp >= PM_GRAY_DRAGON) {
790 u.mhmax = In_endgame(&u.uz) ? (8 * mlvl) : (4 * mlvl + d(mlvl, 4));
791 } else if (is_golem(youmonst.data)) {
792 u.mhmax = golemhp(mntmp);
797 u.mhmax = d(mlvl, 8);
798 if (is_home_elemental(&mons[mntmp]))
803 if (u.ulevel < mlvl) {
804 /* Low level characters can't become high level monsters for long */
806 /* DRS/NS 2.2.6 messes up -- Peter Kendell */
807 int mtd = u.mtimedone, ulv = u.ulevel;
809 u.mtimedone = mtd * ulv / mlvl;
811 u.mtimedone = u.mtimedone * u.ulevel / mlvl;
815 if (uskin && mntmp != armor_to_dragon(uskin->otyp))
819 (void) hideunder(&youmonst);
821 if (u.utraptype == TT_PIT && u.utrap) {
822 u.utrap = rn1(6, 2); /* time to escape resets */
824 if (was_blind && !Blind) { /* previous form was eyeless */
826 make_blinded(0L, TRUE); /* remove blindness */
828 newsym(u.ux, u.uy); /* Change symbol */
830 if (!sticky && !u.uswallow && u.ustuck && sticks(youmonst.data))
832 else if (sticky && !sticks(youmonst.data))
835 if (touch_petrifies(u.usteed->data) && !Stone_resistance && rnl(3)) {
839 pline("%s touch %s.", no_longer_petrify_resistant,
842 pline("%s
\82Í%s
\82É
\90G
\82ê
\82½
\81D", no_longer_petrify_resistant,
846 Sprintf(buf, "riding %s", an(u.usteed->data->mname));
848 Sprintf(buf, "%s
\82É
\8fæ
\82Á
\82Ä", u.usteed->data->mname);
851 if (!can_ride(u.usteed))
852 dismount_steed(DISMOUNT_POLY);
857 static const char use_thec[] = "Use the command #%s to %s.";
859 static const char use_thec[] = "#%s
\83R
\83}
\83\93\83h
\82Å%s
\82±
\82Æ
\82ª
\82Å
\82«
\82é
\81D";
860 static const char monsterc[] = "monster";
862 if (can_breathe(youmonst.data))
864 pline(use_thec, monsterc, "use your breath weapon");
866 pline(use_thec,monsterc, "
\91§
\82ð
\93f
\82«
\82©
\82¯
\82é");
867 if (attacktype(youmonst.data, AT_SPIT))
869 pline(use_thec, monsterc, "spit venom");
871 pline(use_thec,monsterc, "
\93Å
\82ð
\93f
\82");
872 if (youmonst.data->mlet == S_NYMPH)
874 pline(use_thec, monsterc, "remove an iron ball");
876 pline(use_thec,monsterc, "
\93S
\8b\85\82ð
\82Í
\82¸
\82·");
877 if (attacktype(youmonst.data, AT_GAZE))
879 pline(use_thec, monsterc, "gaze at monsters");
881 pline(use_thec,monsterc, "
\89ö
\95¨
\82ðáÉ
\82Þ");
882 if (is_hider(youmonst.data))
884 pline(use_thec, monsterc, "hide");
886 pline(use_thec,monsterc, "
\89B
\82ê
\82é");
887 if (is_were(youmonst.data))
889 pline(use_thec, monsterc, "summon help");
891 pline(use_thec,monsterc, "
\92\87\8aÔ
\82ð
\8f¢
\8a«
\82·
\82é");
892 if (webmaker(youmonst.data))
894 pline(use_thec, monsterc, "spin a web");
896 pline(use_thec,monsterc, "
\82
\82à
\82Ì
\91\83\82ð
\92£
\82é");
897 if (u.umonnum == PM_GREMLIN)
899 pline(use_thec, monsterc, "multiply in a fountain");
901 pline(use_thec,monsterc, "
\90ò
\82Ì
\92\86\82Å
\95ª
\97ô
\82·
\82é");
902 if (is_unicorn(youmonst.data))
904 pline(use_thec, monsterc, "use your horn");
906 pline(use_thec,monsterc, "
\8ap
\82ð
\8eg
\82¤");
907 if (is_mind_flayer(youmonst.data))
909 pline(use_thec, monsterc, "emit a mental blast");
911 pline(use_thec,monsterc, "
\90¸
\90_
\94g
\82ð
\94
\90¶
\82³
\82¹
\82é");
912 if (youmonst.data->msound == MS_SHRIEK) /* worthless, actually */
914 pline(use_thec, monsterc, "shriek");
916 pline(use_thec,monsterc, "
\8bà
\90Ø
\82è
\90º
\82ð
\82 \82°
\82é");
917 if (is_vampire(youmonst.data))
919 pline(use_thec, monsterc, "change shape");
921 pline(use_thec, monsterc, "
\8ep
\82ð
\95Ï
\82¦
\82é");
923 if (lays_eggs(youmonst.data) && flags.female)
925 pline(use_thec, "sit", "lay an egg");
927 pline(use_thec, "sit", "
\97\91\82ð
\8eY
\82Þ");
930 /* you now know what an egg of your type looks like */
931 if (lays_eggs(youmonst.data)) {
932 learn_egg_type(u.umonnum);
933 /* make queen bees recognize killer bee eggs */
934 learn_egg_type(egg_type_from_parent(u.umonnum, TRUE));
937 if ((!Levitation && !u.ustuck && !Flying && is_pool_or_lava(u.ux, u.uy))
938 || (Underwater && !Swimming))
940 if (Passes_walls && u.utrap
941 && (u.utraptype == TT_INFLOOR || u.utraptype == TT_BURIEDBALL)) {
943 if (u.utraptype == TT_INFLOOR)
945 pline_The("rock seems to no longer trap you.");
947 pline("
\8aâ
\82É
\95Â
\82¶
\8d\9e\82ß
\82ç
\82ê
\82é
\82±
\82Æ
\82Í
\82È
\82¢
\82¾
\82ë
\82¤
\81D");
950 pline_The("buried ball is no longer bound to you.");
952 pline_The("
\96\84\82Ü
\82Á
\82½
\8b\85\82ª
\8e×
\96\82\82É
\82È
\82é
\82±
\82Æ
\82Í
\82È
\82¢
\82¾
\82ë
\82¤
\81D");
953 buried_ball_to_freedom();
955 } else if (likes_lava(youmonst.data) && u.utrap
956 && u.utraptype == TT_LAVA) {
959 pline_The("lava now feels soothing.");
961 pline("
\97n
\8aâ
\82ª
\90¸
\90_
\82ð
\97\8e\82¿
\82Â
\82©
\82¹
\82Ä
\82
\82ê
\82é
\81D");
963 if (amorphous(youmonst.data) || is_whirly(youmonst.data)
964 || unsolid(youmonst.data)) {
967 You("slip out of the iron chain.");
969 You("
\93S
\82Ì
\8d½
\82©
\82ç
\82·
\82é
\82è
\82Æ
\94²
\82¯
\82½
\81D");
971 } else if (u.utrap && u.utraptype == TT_BURIEDBALL) {
973 You("slip free of the buried ball and chain.");
975 You("
\96\84\82Ü
\82Á
\82Ä
\82¢
\82é
\8b\85\82Æ
\8d½
\82©
\82ç
\82·
\82é
\82è
\82Æ
\94²
\82¯
\82½
\81D");
976 buried_ball_to_freedom();
979 if (u.utrap && (u.utraptype == TT_WEB || u.utraptype == TT_BEARTRAP)
980 && (amorphous(youmonst.data) || is_whirly(youmonst.data)
981 || unsolid(youmonst.data) || (youmonst.data->msize <= MZ_SMALL
982 && u.utraptype == TT_BEARTRAP))) {
984 You("are no longer stuck in the %s.",
985 u.utraptype == TT_WEB ? "web" : "bear trap");
987 You("%s
\82©
\82ç
\92E
\8fo
\82µ
\82½
\81D",
988 u.utraptype == TT_WEB ? "
\82
\82à
\82Ì
\91\83" : "
\8cF
\82Ìã©");
990 /* probably should burn webs too if PM_FIRE_ELEMENTAL */
993 if (webmaker(youmonst.data) && u.utrap && u.utraptype == TT_WEB) {
995 You("orient yourself on the web.");
997 You("
\82
\82à
\82Ì
\91\83\82É
\93K
\89\9e\82µ
\82½
\81D");
1000 check_strangling(TRUE); /* maybe start strangling */
1001 (void) polysense(youmonst.data);
1004 vision_full_recalc = 1;
1006 (void) encumber_msg();
1008 retouch_equipment(2);
1009 /* this might trigger a recursive call to polymon() [stone golem
1010 wielding cockatrice corpse and hit by stone-to-flesh, becomes
1011 flesh golem above, now gets transformed back into stone golem] */
1013 selftouch(no_longer_petrify_resistant);
1020 register struct obj *otmp;
1022 if (breakarm(youmonst.data)) {
1023 if ((otmp = uarm) != 0) {
1027 You("break out of your armor!");
1029 You("
\8aZ
\82ð
\89ó
\82µ
\82½
\81I");
1030 exercise(A_STR, FALSE);
1031 (void) Armor_gone();
1034 if ((otmp = uarmc) != 0) {
1035 if (otmp->oartifact) {
1037 Your("%s falls off!", cloak_simple_name(otmp));
1039 Your("%s
\82Í
\92E
\82°
\97\8e\82¿
\82½
\81I", cloak_simple_name(otmp));
1044 Your("%s tears apart!", cloak_simple_name(otmp));
1046 Your("%s
\82Í
\82¸
\82½
\82¸
\82½
\82É
\88ø
\82«
\97ô
\82©
\82ê
\82½
\81I", cloak_simple_name(otmp));
1053 Your("shirt rips to shreds!");
1055 Your("
\83V
\83\83\83c
\82Í
\88ø
\82«
\97ô
\82©
\82ê
\82½
\81I");
1058 } else if (sliparm(youmonst.data)) {
1059 if (((otmp = uarm) != 0) && (racial_exception(&youmonst, otmp) < 1)) {
1063 Your("armor falls around you!");
1065 Your("
\8aZ
\82Í
\82 \82È
\82½
\82Ì
\82Ü
\82í
\82è
\82É
\97\8e\82¿
\82½
\81I");
1066 (void) Armor_gone();
1069 if ((otmp = uarmc) != 0) {
1070 if (is_whirly(youmonst.data))
1072 Your("%s falls, unsupported!", cloak_simple_name(otmp));
1074 Your("%s
\82Í
\82·
\82Æ
\82ñ
\82Æ
\97\8e\82¿
\82½
\81I", cloak_simple_name(otmp));
1077 You("shrink out of your %s!", cloak_simple_name(otmp));
1079 You("%s
\82©
\82ç
\8fk
\82Ý
\8fo
\82½
\81I", cloak_simple_name(otmp));
1083 if ((otmp = uarmu) != 0) {
1084 if (is_whirly(youmonst.data))
1086 You("seep right through your shirt!");
1088 You("
\83V
\83\83\83c
\82©
\82ç
\82µ
\82Ý
\8fo
\82½
\81I");
1091 You("become much too small for your shirt!");
1093 You("
\83V
\83\83\83c
\82æ
\82è
\82¸
\82Á
\82Æ
\8f¬
\82³
\82
\82È
\82Á
\82½
\81I");
1094 setworn((struct obj *) 0, otmp->owornmask & W_ARMU);
1098 if (has_horns(youmonst.data)) {
1099 if ((otmp = uarmh) != 0) {
1100 if (is_flimsy(otmp) && !donning(otmp)) {
1102 char hornbuf[BUFSZ];
1104 /* Future possibilities: This could damage/destroy helmet */
1105 Sprintf(hornbuf, "horn%s", plur(num_horns(youmonst.data)));
1106 Your("%s %s through %s.", hornbuf, vtense(hornbuf, "pierce"),
1109 Your("
\8ap
\82ª%s
\82ð
\82Â
\82ç
\82Ê
\82¢
\82½
\81D", yname(otmp));
1115 Your("%s falls to the %s!", helm_simple_name(otmp),
1116 surface(u.ux, u.uy));
1118 Your("%s
\82Í%s
\82É
\97\8e\82¿
\82½
\81I", helm_simple_name(otmp),
1119 surface(u.ux, u.uy));
1121 (void) Helmet_off();
1126 if (nohands(youmonst.data) || verysmall(youmonst.data)) {
1127 if ((otmp = uarmg) != 0) {
1130 /* Drop weapon along with gloves */
1132 You("drop your gloves%s!", uwep ? " and weapon" : "");
1134 You("
\8f¬
\8eè%s
\82ð
\97\8e\82µ
\82½
\81I", uwep ? "
\82â
\95\90\8aí" : "");
1136 (void) Gloves_off();
1139 if ((otmp = uarms) != 0) {
1141 You("can no longer hold your shield!");
1143 You("
\82à
\82¤
\8f\82\82ð
\8e\9d\82Á
\82Ä
\82ç
\82ê
\82È
\82¢
\81I");
1144 (void) Shield_off();
1147 if ((otmp = uarmh) != 0) {
1151 Your("%s falls to the %s!", helm_simple_name(otmp),
1152 surface(u.ux, u.uy));
1154 Your("%s
\82Í%s
\82É
\97\8e\82¿
\82½
\81I", helm_simple_name(otmp),
1155 surface(u.ux, u.uy));
1157 (void) Helmet_off();
1161 if (nohands(youmonst.data) || verysmall(youmonst.data)
1162 || slithy(youmonst.data) || youmonst.data->mlet == S_CENTAUR) {
1163 if ((otmp = uarmf) != 0) {
1166 if (is_whirly(youmonst.data))
1168 Your("boots fall away!");
1170 Your("
\8cC
\82Í
\92E
\82°
\97\8e\82¿
\82½
\81I");
1173 Your("boots %s off your feet!",
1174 verysmall(youmonst.data) ? "slide" : "are pushed");
1176 Your("
\8cC
\82Í
\82 \82È
\82½
\82Ì
\91«
\82©
\82ç%s
\81I",
1177 verysmall(youmonst.data) ? "
\8a\8a\82è
\97\8e\82¿
\82½" : "
\92E
\82°
\97\8e\82¿
\82½");
1191 const char *what, *which, *whichtoo;
1193 const char *which, *whichtoo;
1195 boolean candropwep, candropswapwep;
1198 /* !alone check below is currently superfluous but in the
1199 * future it might not be so if there are monsters which cannot
1200 * wear gloves but can wield weapons
1202 if (!alone || cantwield(youmonst.data)) {
1203 candropwep = canletgo(uwep, "");
1204 candropswapwep = !u.twoweap || canletgo(uswapwep, "");
1207 what = (candropwep && candropswapwep) ? "drop" : "release";
1210 which = is_sword(uwep) ? "sword" : weapon_descr(uwep);
1212 which = is_sword(uwep) ? "
\8c\95" : weapon_descr(uwep);
1216 is_sword(uswapwep) ? "sword" : weapon_descr(uswapwep);
1218 is_sword(uswapwep) ? "
\8c\95" : weapon_descr(uswapwep);
1219 if (strcmp(which, whichtoo))
1223 which = "
\95\90\8aí";
1225 #if 0 /*JP*//*
\95¡
\90\94\8c`
\82É
\82µ
\82È
\82¢*/
1226 if (uwep->quan != 1L || u.twoweap)
1227 which = makeplural(which);
1231 You("find you must %s %s %s!", what,
1232 the_your[!!strncmp(which, "corpse", 6)], which);
1234 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\82±
\82Æ
\82É
\8bC
\82Ã
\82¢
\82½
\81I", which);
1248 } else if (!could_twoweap(youmonst.data)) {
1257 /* You can't revert back while unchanging */
1258 if (Unchanging && (u.mh < 1)) {
1260 killer.format = NO_KILLER_PREFIX;
1261 Strcpy(killer.name, "killed while stuck in creature form");
1263 killer.format = KILLED_BY;
1264 Strcpy(killer.name, "
\8c³
\82Ì
\8ep
\82Ö
\96ß
\82ê
\82¸
\82É");
1269 if (emits_light(youmonst.data))
1270 del_light_source(LS_MONSTER, monst_to_any(&youmonst));
1272 polyman("return to %s form!", urace.adj);
1274 polyman("%s
\82É
\96ß
\82Á
\82½
\81I", urace.adj);
1277 /* can only happen if some bit of code reduces u.uhp
1278 instead of u.mh while poly'd */
1280 Your("old form was not healthy enough to survive.");
1282 Your("
\8c³
\82Ì
\8ep
\82Í
\90¶
\82«
\82Ä
\82¢
\82
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81D");
1284 Sprintf(killer.name, "reverting to unhealthy %s form", urace.adj);
1286 Sprintf(killer.name, "
\95s
\8c\92\8dN
\82È%s
\82Ì
\8ep
\82É
\96ß
\82Á
\82Ä", urace.adj);
1287 killer.format = KILLED_BY;
1293 vision_full_recalc = 1;
1294 (void) encumber_msg();
1296 retouch_equipment(2);
1298 selftouch(no_longer_petrify_resistant);
1304 struct attack *mattk;
1308 You_cant("breathe. Sorry.");
1310 You_cant("
\91§
\82ð
\93f
\82
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D
\8ec
\94O
\81D");
1315 You("don't have enough energy to breathe!");
1317 You("
\91§
\82ð
\93f
\82
\82Ì
\82É
\8f\
\95ª
\82È
\83G
\83l
\83\8b\83M
\81[
\82ª
\82È
\82©
\82Á
\82½
\81D");
1323 if (!getdir((char *) 0))
1326 mattk = attacktype_fordmg(youmonst.data, AT_BREA, AD_ANY);
1328 impossible("bad breath attack?"); /* mouthwash needed... */
1329 else if (!u.dx && !u.dy && !u.dz)
1332 buzz((int) (20 + mattk->adtyp - 1), (int) mattk->damn, u.ux, u.uy,
1341 struct attack *mattk;
1343 if (!getdir((char *) 0))
1345 mattk = attacktype_fordmg(youmonst.data, AT_SPIT, AD_ANY);
1347 impossible("bad spit attack?");
1349 switch (mattk->adtyp) {
1352 otmp = mksobj(BLINDING_VENOM, TRUE, FALSE);
1355 impossible("bad attack type in dospit");
1358 otmp = mksobj(ACID_VENOM, TRUE, FALSE);
1361 otmp->spe = 1; /* to indicate it's yours */
1362 throwit(otmp, 0L, FALSE);
1371 if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1373 pline_The("ball and chain are buried firmly in the %s.",
1374 surface(u.ux, u.uy));
1376 pline_The("
\8b\85\82Æ
\8d½
\82Í%s
\82É
\82µ
\82Á
\82©
\82è
\82Æ
\96\84\82Ü
\82Á
\82Ä
\82¢
\82é
\81D.",
1377 surface(u.ux, u.uy));
1382 You("are not chained to anything!");
1384 You("
\89½
\82à
\82Â
\82È
\82ª
\82ê
\82Ä
\82¢
\82È
\82¢
\81I");
1394 register struct trap *ttmp = t_at(u.ux, u.uy);
1396 if (Levitation || Is_airlevel(&u.uz) || Underwater
1397 || Is_waterlevel(&u.uz)) {
1399 You("must be on the ground to spin a web.");
1401 You("
\82
\82à
\82Ì
\91\83\82ð
\92£
\82é
\82É
\82Í
\92n
\96Ê
\82Ì
\8fã
\82É
\82¢
\82È
\82
\82Ä
\82Í
\82È
\82ç
\82È
\82¢
\81D");
1406 You("release web fluid inside %s.", mon_nam(u.ustuck));
1408 You("%s
\82Ì
\93à
\82Å
\82
\82à
\82Ì
\91\83\82ð
\93f
\82«
\8fo
\82µ
\82½
\81D", mon_nam(u.ustuck));
1409 if (is_animal(u.ustuck->data)) {
1410 expels(u.ustuck, u.ustuck->data, TRUE);
1413 if (is_whirly(u.ustuck->data)) {
1416 for (i = 0; i < NATTK; i++)
1417 if (u.ustuck->data->mattk[i].aatyp == AT_ENGL)
1420 impossible("Swallower has no engulfing attack?");
1425 switch (u.ustuck->data->mattk[i].adtyp) {
1428 Strcpy(sweep, "ignites and ");
1430 Strcpy(sweep, "
\94
\89Î
\82µ");
1434 Strcpy(sweep, "fries and ");
1436 Strcpy(sweep, "
\8fÅ
\82°");
1440 Strcpy(sweep, "freezes, shatters and ");
1442 Strcpy(sweep, "
\93\80\82è
\82Â
\82«
\81C
\82±
\82È
\82²
\82È
\82É
\82È
\82è");
1446 pline_The("web %sis swept away!", sweep);
1448 pline("
\82
\82à
\82Ì
\91\83\82Í%s
\82È
\82
\82È
\82Á
\82½
\81I", sweep);
1451 } /* default: a nasty jelly-like creature */
1453 pline_The("web dissolves into %s.", mon_nam(u.ustuck));
1455 pline("
\82
\82à
\82Ì
\91\83\82Í
\95ª
\89ð
\82µ
\82Ä%s
\82É
\82È
\82Á
\82½
\81D", mon_nam(u.ustuck));
1460 You("cannot spin webs while stuck in a trap.");
1462 You("ã©
\82É
\82Í
\82Ü
\82Á
\82Ä
\82¢
\82é
\8aÔ
\82Í
\82
\82à
\82Ì
\91\83\82ð
\92£
\82ê
\82È
\82¢
\81D");
1465 exercise(A_DEX, TRUE);
1467 switch (ttmp->ttyp) {
1471 You("spin a web, covering up the pit.");
1473 You("
\82
\82à
\82Ì
\91\83\82ð
\92£
\82è
\81C
\97\8e\82µ
\8c\8a\82ð
\95¢
\82Á
\82½
\81D");
1475 bury_objs(u.ux, u.uy);
1480 pline_The("squeaky board is muffled.");
1482 pline("
\82«
\82µ
\82Þ
\94Â
\82Í
\95¢
\82í
\82ê
\82½
\81D");
1489 case VIBRATING_SQUARE:
1491 Your("webbing vanishes!");
1493 Your("
\82
\82à
\82Ì
\91\83\82Í
\8fÁ
\82¦
\82½
\81I");
1497 You("make the web thicker.");
1499 You("
\82
\82à
\82Ì
\91\83\82ð
\82æ
\82è
\8cú
\82
\82µ
\82½
\81D");
1504 You("web over the %s.",
1505 (ttmp->ttyp == TRAPDOOR) ? "trap door" : "hole");
1507 You("%s
\82ð
\82
\82à
\82Ì
\91\83\82Å
\95¢
\82Á
\82½
\81D",
1508 (ttmp->ttyp == TRAPDOOR) ? "
\97\8e\82µ
\94à" : "
\8c\8a");
1513 case ROLLING_BOULDER_TRAP:
1515 You("spin a web, jamming the trigger.");
1517 You("
\82
\82à
\82Ì
\91\83\82ð
\92£
\82Á
\82Ä
\81C
\83X
\83C
\83b
\83`
\82ð
\93®
\82©
\82È
\82
\82µ
\82½
\81D");
1533 You("have triggered a trap!");
1535 You("ã©
\82ð
\8en
\93®
\82³
\82¹
\82Ä
\82µ
\82Ü
\82Á
\82½
\81I");
1539 impossible("Webbing over trap type %d?", ttmp->ttyp);
1542 } else if (On_stairs(u.ux, u.uy)) {
1543 /* cop out: don't let them hide the stairs */
1545 Your("web fails to impede access to the %s.",
1546 (levl[u.ux][u.uy].typ == STAIRS) ? "stairs" : "ladder");
1548 Your("
\82
\82à
\82Ì
\91\83\82Í%s
\82Ö
\82Ì
\88Ú
\93®
\82ð
\8e×
\96\82\82Å
\82«
\82È
\82¢
\81D",
1549 (levl[u.ux][u.uy].typ == STAIRS) ? "
\8aK
\92i" : "
\82Í
\82µ
\82²");
1553 ttmp = maketrap(u.ux, u.uy, WEB);
1567 You("lack the energy to send forth a call for help!");
1569 You("
\8f\95\82¯
\82ð
\8cÄ
\82Ô
\82¾
\82¯
\82Ì
\91Ì
\97Í
\82ª
\82È
\82¢
\81I");
1576 You("call upon your brethren for help!");
1578 You("
\92\87\8aÔ
\82ð
\8cÄ
\82ñ
\82¾
\81I");
1579 exercise(A_WIS, TRUE);
1580 if (!were_summon(youmonst.data, TRUE, &placeholder, (char *) 0))
1582 pline("But none arrive.");
1584 pline("
\82µ
\82©
\82µ
\81C
\89½
\82à
\97\88\82È
\82¢
\81D");
1591 register struct monst *mtmp;
1597 for (i = 0; i < NATTK; i++) {
1598 if (youmonst.data->mattk[i].aatyp == AT_GAZE) {
1599 adtyp = youmonst.data->mattk[i].adtyp;
1603 if (adtyp != AD_CONF && adtyp != AD_FIRE) {
1604 impossible("gaze attack %d?", adtyp);
1610 You_cant("see anything to gaze at.");
1612 You("
\96Ú
\82ª
\8c©
\82¦
\82È
\82¢
\82Ì
\82Å
\81C
\82É
\82ç
\82ß
\82È
\82¢
\81D");
1614 } else if (Hallucination) {
1616 You_cant("gaze at anything you can see.");
1618 You_cant("
\8c©
\82¦
\82é
\82à
\82Ì
\82ð
\89½
\82à
\82É
\82ç
\82ß
\82È
\82¢
\81D");
1623 You("lack the energy to use your special gaze!");
1625 You("
\82É
\82ç
\82Þ
\82¾
\82¯
\82Ì
\91Ì
\97Í
\82ª
\82È
\82¢
\81I");
1631 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1632 if (DEADMONSTER(mtmp))
1634 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)) {
1636 if (Invis && !perceives(mtmp->data)) {
1638 pline("%s seems not to notice your gaze.", Monnam(mtmp));
1640 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1641 } else if (mtmp->minvis && !See_invisible) {
1643 You_cant("see where to gaze at %s.", Monnam(mtmp));
1645 You("%s
\82Í
\8c©
\82¦
\82È
\82¢
\82Ì
\82Å
\81C
\82É
\82ç
\82ß
\82È
\82¢", Monnam(mtmp));
1646 } else if (mtmp->m_ap_type == M_AP_FURNITURE
1647 || mtmp->m_ap_type == M_AP_OBJECT) {
1650 } else if (flags.safe_dog && mtmp->mtame && !Confusion) {
1652 You("avoid gazing at %s.", y_monnam(mtmp));
1654 You("%s
\82©
\82ç
\96Ú
\82ð
\82»
\82ç
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D", y_monnam(mtmp));
1656 if (flags.confirm && mtmp->mpeaceful && !Confusion) {
1658 Sprintf(qbuf, "Really %s %s?",
1659 (adtyp == AD_CONF) ? "confuse" : "attack",
1662 Sprintf(qbuf, "
\96{
\93\96\82É%s
\82ð%s
\81H",
1664 (adtyp == AD_CONF) ? "
\8d¬
\97\90\82³
\82¹
\82é" : "
\8dU
\8c\82\82·
\82é");
1666 if (yn(qbuf) != 'y')
1670 if (!mtmp->mcanmove || mtmp->mstun || mtmp->msleeping
1671 || !mtmp->mcansee || !haseyes(mtmp->data)) {
1675 /* No reflection check for consistency with when a monster
1676 * gazes at *you*--only medusa gaze gets reflected then.
1678 if (adtyp == AD_CONF) {
1681 Your("gaze confuses %s!", mon_nam(mtmp));
1683 Your("
\82É
\82ç
\82Ý
\82Í%s
\82ð
\8d¬
\97\90\82³
\82¹
\82½
\81I", mon_nam(mtmp));
1686 pline("%s is getting more and more confused.",
1688 pline("%s
\82Í
\82Ü
\82·
\82Ü
\82·
\8d¬
\97\90\82µ
\82½
\81I",
1691 } else if (adtyp == AD_FIRE) {
1692 int dmg = d(2, 6), lev = (int) u.ulevel;
1695 You("attack %s with a fiery gaze!", mon_nam(mtmp));
1697 You("
\89\8a\82Ì
\82É
\82ç
\82Ý
\82Å%s
\82ð
\8dU
\8c\82\82µ
\82½
\81I", mon_nam(mtmp));
1698 if (resists_fire(mtmp)) {
1700 pline_The("fire doesn't burn %s!", mon_nam(mtmp));
1702 pline("%s
\82Í
\89\8a\82Å
\94R
\82¦
\82È
\82©
\82Á
\82½
\81I", mon_nam(mtmp));
1706 (void) destroy_mitem(mtmp, SCROLL_CLASS, AD_FIRE);
1708 (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE);
1710 (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE);
1716 /* For consistency with passive() in uhitm.c, this only
1717 * affects you if the monster is still alive.
1719 if (DEADMONSTER(mtmp))
1722 if (mtmp->data == &mons[PM_FLOATING_EYE] && !mtmp->mcan) {
1725 You("are frozen by %s gaze!",
1727 You("%s
\82Ì
\82É
\82ç
\82Ý
\82Å
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I",
1728 s_suffix(mon_nam(mtmp)));
1729 nomul((u.ulevel > 6 || rn2(4))
1730 ? -d((int) mtmp->m_lev + 1,
1731 (int) mtmp->data->mattk[0].damd)
1734 multi_reason = "frozen by a monster's gaze";
1736 multi_reason = "
\89ö
\95¨
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82Ä
\82¢
\82é
\8e\9e\82É";
1741 You("stiffen momentarily under %s gaze.",
1743 You("%s
\82Ì
\82É
\82ç
\82Ý
\82Å
\88ê
\8fu
\8dd
\92¼
\82µ
\82½
\81D",
1744 s_suffix(mon_nam(mtmp)));
1746 /* Technically this one shouldn't affect you at all because
1747 * the Medusa gaze is an active monster attack that only
1748 * works on the monster's turn, but for it to *not* have an
1749 * effect would be too weird.
1751 if (mtmp->data == &mons[PM_MEDUSA] && !mtmp->mcan) {
1753 pline("Gazing at the awake %s is not a very good idea.",
1755 pline("
\96Ú
\82ð
\8ao
\82Ü
\82µ
\82Ä
\82¢
\82é%s
\82ð
\82É
\82ç
\82Þ
\82Ì
\82Í
\8c«
\82¢
\82±
\82Æ
\82¶
\82á
\82È
\82¢
\81D",
1757 /* as if gazing at a sleeping anything is fruitful... */
1759 You("turn to stone...");
1761 You("
\90Î
\82É
\82È
\82Á
\82½
\81D
\81D
\81D");
1762 killer.format = KILLED_BY;
1764 Strcpy(killer.name, "deliberately meeting Medusa's gaze");
1766 Strcpy(killer.name, "
\82í
\82´
\82í
\82´
\83\81\83f
\83\85\81[
\83T
\82Ì
\82É
\82ç
\82Ý
\82ð
\82Ü
\82Æ
\82à
\82É
\8c©
\82Ä");
1774 You("gaze at no place in particular.");
1776 You("
\8eÀ
\8dÛ
\82É
\82Í
\89½
\82à
\82É
\82ç
\82ß
\82È
\82©
\82Á
\82½
\81D");
1783 boolean ismimic = youmonst.data->mlet == S_MIMIC,
1784 on_ceiling = is_clinger(youmonst.data) || Flying;
1786 /* can't hide while being held (or holding) or while trapped
1787 (except for floor hiders [trapper or mimic] in pits) */
1788 if (u.ustuck || (u.utrap && (u.utraptype != TT_PIT || on_ceiling))) {
1790 You_cant("hide while you're %s.",
1791 !u.ustuck ? "trapped" : !sticks(youmonst.data)
1793 : humanoid(u.ustuck->data)
1795 : "holding that creature");
1797 You_cant("%s
\8aÔ
\82Í
\89B
\82ê
\82ç
\82ê
\82È
\82¢
\81D",
1798 !u.ustuck ? "
\95ß
\82Ü
\82Á
\82Ä
\82¢
\82é" : !sticks(youmonst.data)
1799 ? "
\95ß
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82é"
1800 : humanoid(u.ustuck->data)
1801 ? "
\92N
\82©
\82ð
\82Â
\82©
\82ñ
\82Å
\82¢
\82é"
1802 : "
\89ö
\95¨
\82ð
\82Â
\82©
\82ñ
\82Å
\82¢
\82é");
1805 || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) {
1807 youmonst.m_ap_type = M_AP_NOTHING;
1812 /* note: the eel and hides_under cases are hypothetical;
1813 such critters aren't offered the option of hiding via #monster */
1814 if (youmonst.data->mlet == S_EEL && !is_pool(u.ux, u.uy)) {
1815 if (IS_FOUNTAIN(levl[u.ux][u.uy].typ))
1817 The("fountain is not deep enough to hide in.");
1819 The("
\90ò
\82Í
\89B
\82ê
\82ç
\82ê
\82é
\82Ù
\82Ç
\90[
\82
\82È
\82¢
\81D");
1822 There("is no water to hide in here.");
1824 There("
\82±
\82±
\82É
\82Í
\89B
\82ê
\82é
\82½
\82ß
\82Ì
\90\85\82ª
\82È
\82¢
\81D");
1828 if (hides_under(youmonst.data) && !level.objects[u.ux][u.uy]) {
1830 There("is nothing to hide under here.");
1832 There("
\82±
\82±
\82É
\82Í
\89B
\82ê
\82ç
\82ê
\82é
\82à
\82Ì
\82ª
\82È
\82¢
\81D");
1836 /* Planes of Air and Water */
1837 if (on_ceiling && !has_ceiling(&u.uz)) {
1839 There("is nowhere to hide above you.");
1841 There("
\82 \82È
\82½
\82Ì
\8fã
\82É
\82Í
\89B
\82ê
\82ç
\82ê
\82é
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
1845 if ((is_hider(youmonst.data) && !Flying) /* floor hider */
1846 && (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))) {
1848 There("is nowhere to hide beneath you.");
1850 There("
\82 \82È
\82½
\82Ì
\89º
\82É
\82Í
\89B
\82ê
\82ç
\82ê
\82é
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
1854 /* TODO? inhibit floor hiding at furniture locations, or
1855 * else make youhiding() give smarter messages at such spots.
1858 if (u.uundetected || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) {
1859 youhiding(FALSE, 1); /* "you are already hiding" */
1864 /* should bring up a dialog "what would you like to imitate?" */
1865 youmonst.m_ap_type = M_AP_OBJECT;
1866 youmonst.mappearance = STRANGE_OBJECT;
1870 youhiding(FALSE, 0); /* "you are now hiding" */
1877 struct permonst *savedat = youmonst.data;
1879 if (is_vampire(youmonst.data)) {
1881 if (savedat != youmonst.data) {
1883 You("transform into %s.", an(youmonst.data->mname));
1885 You("%s
\82Ì
\8ep
\82É
\82È
\82Á
\82½
\81D", youmonst.data->mname);
1895 struct monst *mtmp, *nmon;
1899 You("concentrate but lack the energy to maintain doing so.");
1901 You("
\8fW
\92\86\82µ
\82½
\81D
\82µ
\82©
\82µ
\83G
\83l
\83\8b\83M
\81[
\82ª
\91«
\82è
\82È
\82¢
\81D");
1908 You("concentrate.");
1910 You("
\8fW
\92\86\82µ
\82½
\81D");
1912 pline("A wave of psychic energy pours out.");
1914 pline("
\90¸
\90_
\83G
\83l
\83\8b\83M
\81[
\94g
\82ª
\95ú
\8eU
\82µ
\82½
\81D");
1915 for (mtmp = fmon; mtmp; mtmp = nmon) {
1919 if (DEADMONSTER(mtmp))
1921 if (distu(mtmp->mx, mtmp->my) > BOLT_LIM * BOLT_LIM)
1923 if (mtmp->mpeaceful)
1925 u_sen = telepathic(mtmp->data) && !mtmp->mcansee;
1926 if (u_sen || (telepathic(mtmp->data) && rn2(2)) || !rn2(10)) {
1928 You("lock in on %s %s.", s_suffix(mon_nam(mtmp)),
1930 : telepathic(mtmp->data) ? "latent telepathy" : "mind");
1932 pline("%s
\82Ì%s
\82è
\8d\9e\82ñ
\82¾
\81D", mon_nam(mtmp),
1933 u_sen ? "
\90¸
\90_
\82É
\93ü"
1934 : telepathic(mtmp->data) ? "
\90ö
\8dÝ
\93I
\90¸
\90_
\82É
\93ü" : "
\90[
\91w
\88Ó
\8e¯
\82É
\90ö");
1936 mtmp->mhp -= rnd(15);
1948 pline("%s is no longer in your clutches.", Monnam(u.ustuck));
1950 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82©
\82ç
\93¦
\82ê
\82½
\81D", Monnam(u.ustuck));
1961 Your("skin returns to its original form.");
1963 Your("
\94ç
\95\86\82Í
\96{
\97\88\82Ì
\8ep
\82É
\96ß
\82Á
\82½
\81D");
1965 uskin = (struct obj *) 0;
1966 /* undo save/restore hack */
1967 uarm->owornmask &= ~I_SPECIAL;
1972 mbodypart(mon, part)
1976 static NEARDATA const char
1978 *humanoid_parts[] = { "arm", "eye", "face", "finger",
1979 "fingertip", "foot", "hand", "handed",
1980 "head", "leg", "light headed", "neck",
1981 "spine", "toe", "hair", "blood",
1982 "lung", "nose", "stomach" },
1984 *humanoid_parts[] = { "
\98r", "
\96Ú", "
\8aç", "
\8ew",
1985 "
\8ew
\90æ", "
\91«", "
\8eè", "
\8eè
\82É
\82·
\82é",
1986 "
\93ª", "
\91«", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ",
1987 "
\94w
\8d\9c", "
\92Ü
\90æ", "
\94¯", "
\8c\8c",
1988 "
\94x", "
\95@", "
\88Ý"},
1991 *jelly_parts[] = { "pseudopod", "dark spot", "front",
1992 "pseudopod extension", "pseudopod extremity",
1993 "pseudopod root", "grasp", "grasped",
1994 "cerebral area", "lower pseudopod", "viscous",
1995 "middle", "surface", "pseudopod extremity",
1996 "ripples", "juices", "surface", "sensor",
1999 *jelly_parts[] = { "
\8b[
\8e\97\90G
\8eè", "
\8d\95\82¢
\94Á
\93_", "
\91O
\96Ê",
2000 "
\8b[
\8e\97\90G
\8eè
\82Ì
\90æ", "
\8b[
\8e\97\90G
\8eè",
2001 "
\8b[
\8e\97\90G
\8eè
\82Ì
\8a²", "
\90G
\8eè", "
\88¬
\82é",
2002 "
\94]
\82Ì
\97Ì
\88æ", "
\89º
\95û
\82Ì
\8b[
\8e\97\90G
\8eè", "
\82Ë
\82Î
\82Ë
\82Î
\82µ
\82Ä
\82«
\82½",
2003 "
\92\86\8aÔ
\97Ì
\88æ", "
\95\
\96Ê", "
\8b[
\8e\97\90G
\8eè",
2004 "
\94g
\96ä", "
\91Ì
\89t", "
\95\
\96Ê", "
\8a´
\8ao
\8aí",
2008 *animal_parts[] = { "forelimb", "eye", "face",
2009 "foreclaw", "claw tip", "rear claw",
2010 "foreclaw", "clawed", "head",
2011 "rear limb", "light headed", "neck",
2012 "spine", "rear claw tip", "fur",
2013 "blood", "lung", "nose",
2016 *animal_parts[] = { "
\91O
\91«", "
\96Ú", "
\8aç",
2017 "
\91O
\92Ü", "
\92Ü
\90æ", "
\8cã
\92Ü",
2018 "
\91O
\92Ü", "
\82Ð
\82Á
\82©
\82¯
\82é", "
\93ª",
2019 "
\8cã
\91«", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ",
2020 "
\94w
\8d\9c", "
\8cã
\92Ü
\90æ", "
\96Ñ
\94ç",
2021 "
\8c\8c", "
\94x", "
\95@",
2025 *bird_parts[] = { "wing", "eye", "face", "wing",
2026 "wing tip", "foot", "wing", "winged",
2027 "head", "leg", "light headed", "neck",
2028 "spine", "toe", "feathers", "blood",
2029 "lung", "bill", "stomach" },
2031 *bird_parts[] = { "
\97\83", "
\96Ú", "
\8aç", "
\97\83",
2032 "
\97\83\82Ì
\90æ", "
\91«", "
\97\83", "
\97\83\82É
\82Æ
\82é",
2033 "
\93ª", "
\91«", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ",
2034 "
\94w
\8d\9c", "
\92Ü
\90æ", "
\89H
\96Ñ", "
\8c\8c",
2035 "
\94x", "
\82
\82¿
\82Î
\82µ", "
\88Ý" },
2038 *horse_parts[] = { "foreleg", "eye", "face",
2039 "forehoof", "hoof tip", "rear hoof",
2040 "forehoof", "hooved", "head",
2041 "rear leg", "light headed", "neck",
2042 "backbone", "rear hoof tip", "mane",
2043 "blood", "lung", "nose",
2046 *horse_parts[] = { "
\91O
\91«", "
\96Ú", "
\8aç",
2047 "
\91O
\92û", "
\92û", "
\8cã
\92û",
2048 "
\91O
\92Ü", "
\92û
\82É
\82Í
\82³
\82Þ", "
\93ª",
2049 "
\8cã
\91«", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ",
2050 "
\94w
\8d\9c", "
\8cã
\92Ü
\90æ", "
\82½
\82Ä
\82ª
\82Ý",
2051 "
\8c\8c", "
\94x", "
\95@",
2055 *sphere_parts[] = { "appendage", "optic nerve", "body", "tentacle",
2056 "tentacle tip", "lower appendage", "tentacle",
2057 "tentacled", "body", "lower tentacle",
2058 "rotational", "equator", "body",
2059 "lower tentacle tip", "cilia", "life force",
2060 "retina", "olfactory nerve", "interior" },
2062 *sphere_parts[] = { "
\93Ë
\8bN", "
\8e\8b\8ao
\90_
\8co", "
\91Ì", "
\90G
\8eè",
2063 "
\90G
\8eè
\82Ì
\90æ", "
\89º
\82Ì
\93Ë
\8bN", "
\90G
\8eè",
2064 "
\90G
\8eè
\82É
\8e\9d\82Â", "
\91Ì", "
\89º
\82Ì
\90G
\8eè",
2065 "
\89ñ
\93]
\82µ
\82½", "
\92\86\90S
\90ü", "
\91Ì",
2066 "
\89º
\82Ì
\90G
\8eè
\82Ì
\90æ", "
\91@
\96Ñ", "
\90¶
\96½
\97Í",
2067 "
\96Ô
\96\8c", "
\9ak
\8ao
\92\86\90\95", "
\93à
\95\94" },
2070 *fungus_parts[] = { "mycelium", "visual area", "front",
2071 "hypha", "hypha", "root",
2072 "strand", "stranded", "cap area",
2073 "rhizome", "sporulated", "stalk",
2074 "root", "rhizome tip", "spores",
2075 "juices", "gill", "gill",
2078 *fungus_parts[] = { "
\8bÛ
\8e\85\91Ì", "
\8e\8b\8ao
\97Ì
\88æ", "
\91O",
2079 "
\8bÛ
\8e\85", "
\8bÛ
\8e\85", "
\8dª",
2080 "
\90G
\8eè", "
\90G
\8eè
\82É
\82©
\82ç
\82Ý
\82Â
\82¯
\82é", "
\8eP",
2081 "
\8dª
\8cs", "
\8d¬
\97\90\82·
\82é", "
\8e²",
2082 "
\8dª", "
\8dª
\8cs
\82Ì
\90æ", "
\89è
\96E",
2083 "
\91Ì
\89t", "
\82¦
\82ç", "
\82¦
\82ç",
2087 *vortex_parts[] = { "region", "eye", "front",
2088 "minor current", "minor current", "lower current",
2089 "swirl", "swirled", "central core",
2090 "lower current", "addled", "center",
2091 "currents", "edge", "currents",
2092 "life force", "center", "leading edge",
2095 *vortex_parts[] = { "
\97Ì
\88æ", "
\96Ú", "
\91O",
2096 "
\8f¬
\82³
\82¢
\97¬
\82ê", "
\8f¬
\82³
\82¢
\97¬
\82ê", "
\89º
\95\94\82Ì
\97¬
\82ê",
2097 "
\89Q
\8aª", "
\89Q
\82É
\8aª
\82", "
\89Q
\82Ì
\92\86\90S",
2098 "
\89º
\95\94\82Ì
\97¬
\82ê", "
\8d¬
\97\90\82µ
\82½", "
\92\86\90S
\95\94",
2099 "
\97¬
\82ê", "
\8aO
\8eü", "
\8bC
\97¬",
2100 "
\90¶
\96½
\97Í", "
\92\86\90S", "
\91O
\89\8f",
2104 *snake_parts[] = { "vestigial limb", "eye", "face", "large scale",
2105 "large scale tip", "rear region", "scale gap",
2106 "scale gapped", "head", "rear region",
2107 "light headed", "neck", "length", "rear scale",
2108 "scales", "blood", "lung", "forked tongue",
2111 *snake_parts[] = { "
\91Þ
\89»
\82µ
\82½
\91«", "
\96Ú", "
\8aç", "
\91å
\82«
\82È
\97Ø",
2112 "
\91å
\82«
\82È
\97Ø
\82Ì
\90æ", "
\8cã
\95\94\95ª", "
\97Ø
\82Ì
\8c\84\8aÔ",
2113 "
\97Ø
\82Ì
\8c\84\8aÔ
\82É
\82Â
\82¯
\82é", "
\93ª", "
\8cã
\95\94\95ª",
2114 "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ", "
\91Ì", "
\8cã
\95\94\95ª
\82Ì
\8aZ",
2115 "
\97Ø", "
\8c\8c", "
\94x", "
\90ã",
2119 *worm_parts[] = { "anterior segment", "light sensitive cell",
2120 "clitellum", "setae", "setae", "posterior segment",
2121 "segment", "segmented", "anterior segment",
2122 "posterior", "over stretched", "clitellum",
2123 "length", "posterior setae", "setae", "blood",
2124 "skin", "prostomium", "stomach" },
2126 *worm_parts[] = { "
\91O
\8bæ", "
\8a´
\8cõ
\90«
\8d×
\96E",
2127 "
\8aÂ
\91Ñ", "
\8ap", "
\8ap", "
\8cã
\8bæ",
2128 "
\90ß", "
\90ß
\82É
\82Â
\82¯
\82é", "
\91O
\8bæ",
2129 "
\8cã
\95\94", "
\90L
\82Ñ
\82·
\82¬
\82½", "
\8aÂ
\91Ñ",
2130 "
\91Ì", "
\8cã
\95\94\82Ì
\8ap", "
\8ap", "
\8c\8c",
2131 "
\94ç
\95\86", "
\8cû
\91O
\97t", "
\88Ý" },
2134 *fish_parts[] = { "fin", "eye", "premaxillary", "pelvic axillary",
2135 "pelvic fin", "anal fin", "pectoral fin", "finned",
2136 "head", "peduncle", "played out", "gills",
2137 "dorsal fin", "caudal fin", "scales", "blood",
2138 "gill", "nostril", "stomach" };
2140 *fish_parts[] = { "
\82Ð
\82ê", "
\96Ú", "
\8aç", "
\82Ð
\82ê
\82Ì
\90æ",
2141 "
\82Ð
\82ê
\82Ì
\90æ", "
\94ö
\82Ñ
\82ê", "
\8b¹
\82Ð
\82ê", "
\82Ð
\82ê
\82Å
\8e\9d\82Â",
2142 "
\93ª", "
\94ö
\95¿", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\82¦
\82ç",
2143 "
\94w
\82Ñ
\82ê", "
\94ö
\82Ñ
\82ê", "
\97Ø", "
\8c\8c",
2144 "
\82¦
\82ç", "
\95@", "
\88Ý" };
2146 #if 0 /*JP*//*
\8eg
\82í
\82È
\82¢*/
2147 /* claw attacks are overloaded in mons[]; most humanoids with
2148 such attacks should still reference hands rather than claws */
2149 static const char not_claws[] = {
2150 S_HUMAN, S_MUMMY, S_ZOMBIE, S_ANGEL, S_NYMPH, S_LEPRECHAUN,
2151 S_QUANTMECH, S_VAMPIRE, S_ORC, S_GIANT, /* quest nemeses */
2152 '\0' /* string terminator; assert( S_xxx != 0 ); */
2155 struct permonst *mptr = mon->data;
2158 /* paw
\82Í
\8c¢
\82Æ
\82©
\94L
\82Ì
\8eè
\81Cclaw
\82Í
\83^
\83J
\82Ì
\91«
\82Ì
\82æ
\82¤
\82È
\82©
\82¬
\82Â
\82ß
\81C
2159 \82Ç
\82¿
\82ç
\82à
\93ú
\96{
\8cê
\82¶
\82á
\81u
\8eè
\81v
\82Å
\82¢
\82¢
\82Å
\82µ
\82å
\82¤
\81D
2161 /* some special cases */
2162 if (mptr->mlet == S_DOG || mptr->mlet == S_FELINE
2163 || mptr->mlet == S_RODENT || mptr == &mons[PM_OWLBEAR]) {
2173 return horse_parts[part]; /* "foreleg", "rear leg" */
2175 break; /* for other parts, use animal_parts[] below */
2177 } else if (mptr->mlet == S_YETI) { /* excl. owlbear due to 'if' above */
2178 /* opposable thumbs, hence "hands", "arms", "legs", &c */
2179 return humanoid_parts[part]; /* yeti/sasquatch, monkey/ape */
2181 if ((part == HAND || part == HANDED)
2182 && (humanoid(mptr) && attacktype(mptr, AT_CLAW)
2183 && !index(not_claws, mptr->mlet) && mptr != &mons[PM_STONE_GOLEM]
2184 && mptr != &mons[PM_INCUBUS] && mptr != &mons[PM_SUCCUBUS]))
2185 return (part == HAND) ? "claw" : "clawed";
2187 #if 0 /*JP*//*trunk
\82Í
\8fÛ
\82Ì
\95@
\82ð
\88Ó
\96¡
\82·
\82é
\82»
\82¤
\82Å
\82·
\81B
\93ú
\96{
\8cê
\82Å
\82Í
\92P
\82É
\95@
\82Å
\82¢
\82¢
\82©
\82Æ
\81B*/
2188 if ((mptr == &mons[PM_MUMAK] || mptr == &mons[PM_MASTODON])
2192 if (mptr == &mons[PM_SHARK] && part == HAIR)
2194 return "skin"; /* sharks don't have scales */
2196 return "
\93ª"; /* sharks don't have scales */
2198 if ((mptr == &mons[PM_JELLYFISH] || mptr == &mons[PM_KRAKEN])
2199 && (part == ARM || part == FINGER || part == HAND || part == FOOT
2205 if (mptr == &mons[PM_FLOATING_EYE] && part == EYE)
2209 return "
\8ap
\96\8c";
2210 if (humanoid(mptr) && (part == ARM || part == FINGER || part == FINGERTIP
2211 || part == HAND || part == HANDED))
2212 return humanoid_parts[part];
2213 if (mptr == &mons[PM_RAVEN])
2214 return bird_parts[part];
2215 if (mptr->mlet == S_CENTAUR || mptr->mlet == S_UNICORN
2216 || (mptr == &mons[PM_ROTHE] && part != HAIR))
2217 return horse_parts[part];
2218 if (mptr->mlet == S_LIGHT) {
2222 else if (part == ARM || part == FINGER || part == FINGERTIP
2228 if (part == HANDED || part == ARM || part == FINGER
2229 || part == FINGERTIP || part == HAND) {
2234 if (mptr == &mons[PM_STALKER] && part == HEAD)
2239 if (mptr->mlet == S_EEL && mptr != &mons[PM_JELLYFISH])
2240 return fish_parts[part];
2241 if (mptr->mlet == S_WORM)
2242 return worm_parts[part];
2243 if (slithy(mptr) || (mptr->mlet == S_DRAGON && part == HAIR))
2244 return snake_parts[part];
2245 if (mptr->mlet == S_EYE)
2246 return sphere_parts[part];
2247 if (mptr->mlet == S_JELLY || mptr->mlet == S_PUDDING
2248 || mptr->mlet == S_BLOB || mptr == &mons[PM_JELLYFISH])
2249 return jelly_parts[part];
2250 if (mptr->mlet == S_VORTEX || mptr->mlet == S_ELEMENTAL)
2251 return vortex_parts[part];
2252 if (mptr->mlet == S_FUNGUS)
2253 return fungus_parts[part];
2255 return humanoid_parts[part];
2256 return animal_parts[part];
2263 return mbodypart(&youmonst, part);
2269 /* Returns gender of polymorphed player;
2270 * 0/1=same meaning as flags.female, 2=none.
2272 if (is_neuter(youmonst.data) || !humanoid(youmonst.data))
2274 return flags.female;
2278 ugolemeffects(damtype, dam)
2283 /* We won't bother with "slow"/"haste" since players do not
2284 * have a monster-specific slow/haste so there is no way to
2285 * restore the old velocity once they are back to human.
2287 if (u.umonnum != PM_FLESH_GOLEM && u.umonnum != PM_IRON_GOLEM)
2291 if (u.umonnum == PM_FLESH_GOLEM)
2292 heal = (dam + 5) / 6; /* Approx 1 per die */
2295 if (u.umonnum == PM_IRON_GOLEM)
2299 if (heal && (u.mh < u.mhmax)) {
2305 pline("Strangely, you feel better than before.");
2307 pline("
\8aï
\96
\82È
\82±
\82Æ
\82É
\81C
\91O
\82æ
\82è
\8bC
\95ª
\82ª
\82æ
\82
\82È
\82Á
\82½
\81D");
2308 exercise(A_STR, TRUE);
2313 armor_to_dragon(atyp)
2317 case GRAY_DRAGON_SCALE_MAIL:
2318 case GRAY_DRAGON_SCALES:
2319 return PM_GRAY_DRAGON;
2320 case SILVER_DRAGON_SCALE_MAIL:
2321 case SILVER_DRAGON_SCALES:
2322 return PM_SILVER_DRAGON;
2323 #if 0 /* DEFERRED */
2324 case SHIMMERING_DRAGON_SCALE_MAIL:
2325 case SHIMMERING_DRAGON_SCALES:
2326 return PM_SHIMMERING_DRAGON;
2328 case RED_DRAGON_SCALE_MAIL:
2329 case RED_DRAGON_SCALES:
2330 return PM_RED_DRAGON;
2331 case ORANGE_DRAGON_SCALE_MAIL:
2332 case ORANGE_DRAGON_SCALES:
2333 return PM_ORANGE_DRAGON;
2334 case WHITE_DRAGON_SCALE_MAIL:
2335 case WHITE_DRAGON_SCALES:
2336 return PM_WHITE_DRAGON;
2337 case BLACK_DRAGON_SCALE_MAIL:
2338 case BLACK_DRAGON_SCALES:
2339 return PM_BLACK_DRAGON;
2340 case BLUE_DRAGON_SCALE_MAIL:
2341 case BLUE_DRAGON_SCALES:
2342 return PM_BLUE_DRAGON;
2343 case GREEN_DRAGON_SCALE_MAIL:
2344 case GREEN_DRAGON_SCALES:
2345 return PM_GREEN_DRAGON;
2346 case YELLOW_DRAGON_SCALE_MAIL:
2347 case YELLOW_DRAGON_SCALES:
2348 return PM_YELLOW_DRAGON;
2355 * Some species have awareness of other species
2359 struct permonst *mptr;
2363 context.warntype.speciesidx = 0;
2364 context.warntype.species = 0;
2365 context.warntype.polyd = 0;
2367 switch (monsndx(mptr)) {
2368 case PM_PURPLE_WORM:
2369 warnidx = PM_SHRIEKER;
2372 case PM_VAMPIRE_LORD:
2373 context.warntype.polyd = M2_HUMAN | M2_ELF;
2374 HWarn_of_mon |= FROMRACE;
2378 context.warntype.speciesidx = warnidx;
2379 context.warntype.species = &mons[warnidx];
2380 HWarn_of_mon |= FROMRACE;
2383 context.warntype.speciesidx = 0;
2384 context.warntype.species = 0;
2385 HWarn_of_mon &= ~FROMRACE;