1 /* NetHack 3.6 polyself.c $NHDT-Date: 1520797126 2018/03/11 19:38:46 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.117 $ */
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 void NDECL(polysense);
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];
53 int new_speed, old_speed = youmonst.data ? youmonst.data->mmove : 0;
55 set_mon_data(&youmonst, mdat, 0);
57 #define PROPSET(PropIndx, ON) \
60 u.uprops[PropIndx].intrinsic |= FROMFORM; \
62 u.uprops[PropIndx].intrinsic &= ~FROMFORM; \
65 PROPSET(FIRE_RES, resists_fire(&youmonst));
66 PROPSET(COLD_RES, resists_cold(&youmonst));
67 PROPSET(SLEEP_RES, resists_sleep(&youmonst));
68 PROPSET(DISINT_RES, resists_disint(&youmonst));
69 PROPSET(SHOCK_RES, resists_elec(&youmonst));
70 PROPSET(POISON_RES, resists_poison(&youmonst));
71 PROPSET(ACID_RES, resists_acid(&youmonst));
72 PROPSET(STONE_RES, resists_ston(&youmonst));
74 /* resists_drli() takes wielded weapon into account; suppress it */
75 struct obj *save_uwep = uwep;
78 PROPSET(DRAIN_RES, resists_drli(&youmonst));
81 /* resists_magm() takes wielded, worn, and carried equipment into
82 into account; cheat and duplicate its monster-specific part */
83 PROPSET(ANTIMAGIC, (dmgtype(mdat, AD_MAGM)
84 || mdat == &mons[PM_BABY_GRAY_DRAGON]
85 || dmgtype(mdat, AD_RBRE)));
86 PROPSET(SICK_RES, (mdat->mlet == S_FUNGUS || mdat == &mons[PM_GHOUL]));
88 PROPSET(STUNNED, (mdat == &mons[PM_STALKER] || is_bat(mdat)));
89 PROPSET(HALLUC_RES, dmgtype(mdat, AD_HALU));
90 PROPSET(SEE_INVIS, perceives(mdat));
91 PROPSET(TELEPAT, telepathic(mdat));
92 PROPSET(INFRAVISION, infravision(mdat));
93 PROPSET(INVIS, pm_invisible(mdat));
94 PROPSET(TELEPORT, can_teleport(mdat));
95 PROPSET(TELEPORT_CONTROL, control_teleport(mdat));
96 PROPSET(LEVITATION, is_floater(mdat));
97 PROPSET(FLYING, is_flyer(mdat));
98 PROPSET(SWIMMING, is_swimmer(mdat));
99 /* [don't touch MAGICAL_BREATHING here; both Amphibious and Breathless
100 key off of it but include different monster forms...] */
101 PROPSET(PASSES_WALLS, passes_walls(mdat));
102 PROPSET(REGENERATION, regenerates(mdat));
103 PROPSET(REFLECTING, (mdat == &mons[PM_SILVER_DRAGON]));
106 float_vs_flight(); /* maybe toggle (BFlying & I_SPECIAL) */
109 if (youmonst.movement) {
110 new_speed = mdat->mmove;
111 /* prorate unused movement if new form is slower so that
112 it doesn't get extra moves leftover from previous form;
113 if new form is faster, leave unused movement as is */
114 if (new_speed < old_speed)
115 youmonst.movement = new_speed * youmonst.movement / old_speed;
118 #ifdef STATUS_HILITES
119 status_initialize(REASSESS_ONLY);
123 /* Levitation overrides Flying; set or clear BFlying|I_SPECIAL */
127 /* floating overrides flight; normally float_up() and float_down()
128 handle this, but sometimes they're skipped */
129 if (HLevitation || ELevitation)
130 BFlying |= I_SPECIAL;
132 BFlying &= ~I_SPECIAL;
136 /* for changing into form that's immune to strangulation */
141 /* on -- maybe resume strangling */
143 /* when Strangled is already set, polymorphing from one
144 vulnerable form into another causes the counter to be reset */
145 if (uamul && uamul->otyp == AMULET_OF_STRANGULATION
146 && can_be_strangled(&youmonst)) {
150 Your("%s %s your %s!", simpleonames(uamul),
151 Strangled ? "still constricts" : "begins constricting",
152 body_part(NECK)); /* "throat" */
154 Your("%s%s%s
\82ð
\8di
\82ß%s
\81I", simpleonames(uamul),
155 Strangled ? "
\82Í
\82Ü
\82¾" : "
\82ª",
157 Strangled ? "
\82Ä
\82¢
\82é" : "
\82Í
\82¶
\82ß
\82½");
159 makeknown(AMULET_OF_STRANGULATION);
162 /* off -- maybe block strangling */
164 if (Strangled && !can_be_strangled(&youmonst)) {
168 You("are no longer being strangled.");
170 You("
\82à
\82Í
\82â
\92\82\91§
\82µ
\82Ä
\82¢
\82È
\82¢
\81D");
175 /* make a (new) human out of the player */
178 const char *fmt, *arg;
180 boolean sticky = (sticks(youmonst.data) && u.ustuck && !u.uswallow),
181 was_mimicking = (youmonst.m_ap_type == M_AP_OBJECT);
182 boolean was_blind = !!Blind;
185 u.acurr = u.macurr; /* restore old attribs */
187 u.umonnum = u.umonster;
188 flags.female = u.mfemale;
203 youmonst.m_ap_type = M_AP_NOTHING;
209 /* check whether player foolishly genocided self while poly'd */
211 /* intervening activity might have clobbered genocide info */
212 struct kinfo *kptr = find_delayed_killer(POLYMORPH);
214 if (kptr != (struct kinfo *) 0 && kptr->name[0]) {
215 killer.format = kptr->format;
216 Strcpy(killer.name, kptr->name);
218 killer.format = KILLED_BY;
220 Strcpy(killer.name, "self-genocide");
222 Strcpy(killer.name, "
\8e©
\8bs
\93I
\8bs
\8eE
\82Å");
224 dealloc_killer(kptr);
228 if (u.twoweap && !could_twoweap(youmonst.data))
231 if (u.utraptype == TT_PIT && u.utrap) {
232 u.utrap = rn1(6, 2); /* time to escape resets */
234 if (was_blind && !Blind) { /* reverting from eyeless */
236 make_blinded(0L, TRUE); /* remove blindness */
238 check_strangling(TRUE);
240 if (!Levitation && !u.ustuck && is_pool_or_lava(u.ux, u.uy))
249 /* setting u.umonster for caveman/cavewoman or priest/priestess
250 swap unintentionally makes `Upolyd' appear to be true */
251 boolean already_polyd = (boolean) Upolyd;
253 /* Some monsters are always of one sex and their sex can't be changed;
254 * Succubi/incubi can change, but are handled below.
256 * !already_polyd check necessary because is_male() and is_female()
257 * are true if the player is a priest/priestess.
260 || (!is_male(youmonst.data) && !is_female(youmonst.data)
261 && !is_neuter(youmonst.data)))
262 flags.female = !flags.female;
263 if (already_polyd) /* poly'd: also change saved sex */
264 u.mfemale = !u.mfemale;
265 max_rank_sz(); /* [this appears to be superfluous] */
266 if ((already_polyd ? u.mfemale : flags.female) && urole.name.f)
267 Strcpy(pl_character, urole.name.f);
269 Strcpy(pl_character, urole.name.m);
270 u.umonster = ((already_polyd ? u.mfemale : flags.female)
271 && urole.femalenum != NON_PM)
274 if (!already_polyd) {
275 u.umonnum = u.umonster;
276 } else if (u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS) {
277 flags.female = !flags.female;
278 /* change monster type to match new sex */
279 u.umonnum = (u.umonnum == PM_SUCCUBUS) ? PM_INCUBUS : PM_SUCCUBUS;
287 int i, oldlvl, newlvl, hpmax, enmax;
290 newlvl = oldlvl + rn1(5, -2); /* new = old + {-2,-1,0,+1,+2} */
291 if (newlvl > 127 || newlvl < 1) { /* level went below 0? */
292 goto dead; /* old level is still intact (in case of lifesaving) */
294 if (newlvl > MAXULEV)
296 /* If your level goes down, your peak level goes down by
297 the same amount so that you can't simply use blessed
298 full healing to undo the decrease. But if your level
299 goes up, your peak level does *not* undergo the same
300 adjustment; you might end up losing out on the chance
301 to regain some levels previously lost to other causes. */
303 u.ulevelmax -= (oldlvl - newlvl);
304 if (u.ulevelmax < newlvl)
305 u.ulevelmax = newlvl;
308 if (sex_change_ok && !rn2(10))
311 adjabil(oldlvl, (int) u.ulevel);
312 reset_rndmonst(NON_PM); /* new monster generation criteria */
314 /* random experience points for the new experience level */
315 u.uexp = rndexp(FALSE);
317 /* set up new attribute points (particularly Con) */
322 * remove level-gain based HP from any extra HP accumulated
323 * (the "extra" might actually be negative);
324 * modify the extra, retaining {80%, 90%, 100%, or 110%};
325 * add in newly generated set of level-gain HP.
327 * (This used to calculate new HP in direct proportion to old HP,
328 * but that was subject to abuse: accumulate a large amount of
329 * extra HP, drain level down to 1, then polyself to level 2 or 3
330 * [lifesaving capability needed to handle level 0 and -1 cases]
331 * and the extra got multiplied by 2 or 3. Repeat the level
332 * drain and polyself steps until out of lifesaving capability.)
335 for (i = 0; i < oldlvl; i++)
336 hpmax -= (int) u.uhpinc[i];
337 /* hpmax * rn1(4,8) / 10; 0.95*hpmax on average */
338 hpmax = rounddiv((long) hpmax * (long) rn1(4, 8), 10);
339 for (i = 0; (u.ulevel = i) < newlvl; i++)
341 if (hpmax < u.ulevel)
342 hpmax = u.ulevel; /* min of 1 HP per level */
343 /* retain same proportion for current HP; u.uhp * hpmax / u.uhpmax */
344 u.uhp = rounddiv((long) u.uhp * (long) hpmax, u.uhpmax);
347 * Do the same for spell power.
350 for (i = 0; i < oldlvl; i++)
351 enmax -= (int) u.ueninc[i];
352 enmax = rounddiv((long) enmax * (long) rn1(4, 8), 10);
353 for (i = 0; (u.ulevel = i) < newlvl; i++)
355 if (enmax < u.ulevel)
357 u.uen = rounddiv((long) u.uen * (long) enmax,
358 ((u.uenmax < 1) ? 1 : u.uenmax));
360 /* [should alignment record be tweaked too?] */
362 u.uhunger = rn1(500, 500);
364 make_sick(0L, (char *) 0, FALSE, SICK_ALL);
366 make_stoned(0L, (char *) 0, 0, (char *) 0);
368 if (Polymorph_control) { /* even when Stunned || Unaware */
372 dead: /* we come directly here if their experience level went to 0 or
375 Your("new form doesn't seem healthy enough to survive.");
377 Your("
\90V
\82µ
\82¢
\8ep
\82Í
\90¶
\82«
\82Ä
\82¢
\82
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
378 killer.format = KILLED_BY_AN;
380 Strcpy(killer.name, "unsuccessful polymorph");
382 Strcpy(killer.name, "
\95Ï
\89»
\82Ì
\8e¸
\94s
\82Å");
385 return; /* lifesaved */
390 polyman("feel like a new %s!",
392 polyman("%s
\82Æ
\82µ
\82Ä
\90¶
\82Ü
\82ê
\82©
\82í
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81I",
393 /* use saved gender we're about to revert to, not current */
394 ((Upolyd ? u.mfemale : flags.female) && urace.individual.f)
396 : (urace.individual.m)
401 Your("body transforms, but there is still slime on you.");
403 Your("
\91Ì
\82Í
\95Ï
\89»
\82µ
\82½
\82ª
\81C
\83X
\83\89\83C
\83\80\82ª
\82Â
\82¢
\82½
\82Ü
\82Ü
\82¾
\81D");
404 make_slimed(10L, (const char *) 0);
409 (void) encumber_msg();
411 retouch_equipment(2);
413 selftouch(no_longer_petrify_resistant);
420 char buf[BUFSZ] = DUMMY;
421 int old_light, new_light, mntmp, class, tryct;
422 boolean forcecontrol = (psflags == 1), monsterpoly = (psflags == 2),
423 draconian = (uarm && Is_dragon_armor(uarm)),
424 iswere = (u.ulycn >= LOW_PM), isvamp = is_vampire(youmonst.data),
425 controllable_poly = Polymorph_control && !(Stunned || Unaware);
429 pline("You fail to transform!");
431 pline("
\82 \82È
\82½
\82Í
\95Ï
\89»
\82É
\8e¸
\94s
\82µ
\82½
\81I");
434 /* being Stunned|Unaware doesn't negate this aspect of Poly_control */
435 if (!Polymorph_control && !forcecontrol && !draconian && !iswere
437 if (rn2(20) > ACURR(A_CON)) {
438 You1(shudder_for_moment);
440 losehp(rnd(30), "system shock", KILLED_BY_AN);
442 losehp(rnd(30), "
\83V
\83X
\83e
\83\80\83V
\83\87\83b
\83N
\82Å", KILLED_BY_AN);
443 exercise(A_CON, FALSE);
447 old_light = emits_light(youmonst.data);
450 if (monsterpoly && isvamp)
453 if (controllable_poly || forcecontrol) {
458 getlin("Become what kind of monster? [type the name]", buf);
460 getlin("
\82Ç
\82Ì
\8eí
\82Ì
\89ö
\95¨
\82É
\82È
\82é
\81H[
\96¼
\91O
\82ð
\93ü
\82ê
\82Ä
\82Ë]", buf);
461 (void) mungspaces(buf);
462 if (*buf == '\033') {
463 /* user is cancelling controlled poly */
464 if (forcecontrol) { /* wizard mode #polyself */
468 Strcpy(buf, "*"); /* resort to random */
470 if (!strcmp(buf, "*") || !strcmp(buf, "random")) {
471 /* explicitly requesting random result */
472 tryct = 0; /* will skip thats_enough_tries */
473 continue; /* end do-while(--tryct > 0) loop */
476 mntmp = name_to_mon(buf);
477 if (mntmp < LOW_PM) {
479 class = name_to_monclass(buf, &mntmp);
480 if (class && mntmp == NON_PM)
481 mntmp = mkclass_poly(class);
483 if (mntmp < LOW_PM) {
486 pline("I've never heard of such monsters.");
488 pline("
\82»
\82ñ
\82È
\89ö
\95¨
\82Í
\95·
\82¢
\82½
\82±
\82Æ
\82ª
\82È
\82¢
\81D");
491 You_cant("polymorph into any of those.");
493 pline("
\82»
\82ê
\82É
\82È
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
494 } else if (iswere && (were_beastie(mntmp) == u.ulycn
495 || mntmp == counter_were(u.ulycn)
496 || (Upolyd && mntmp == PM_HUMAN))) {
498 /* Note: humans are illegal as monsters, but an
499 * illegal monster forces newman(), which is what we
500 * want if they specified a human.... */
501 } else if (!polyok(&mons[mntmp])
502 && !(mntmp == PM_HUMAN || your_race(&mons[mntmp])
503 || mntmp == urole.malenum
504 || mntmp == urole.femalenum)) {
507 /* mkclass_poly() can pick a !polyok()
508 candidate; if so, usually try again */
510 if (rn2(3) || --tryct > 0)
512 /* no retries left; put one back on counter
513 so that end of loop decrement will yield
514 0 and trigger thats_enough_tries message */
517 pm_name = mons[mntmp].mname;
518 if (the_unique_pm(&mons[mntmp]))
519 pm_name = the(pm_name);
520 else if (!type_is_pname(&mons[mntmp]))
521 pm_name = an(pm_name);
523 You_cant("polymorph into %s.", pm_name);
525 You_cant("%s
\82É
\95Ï
\89»
\82Å
\82«
\82È
\82¢
\81D", pm_name);
528 } while (--tryct > 0);
530 pline1(thats_enough_tries);
531 /* allow skin merging, even when polymorph is controlled */
532 if (draconian && (tryct <= 0 || mntmp == armor_to_dragon(uarm->otyp)))
534 if (isvamp && (tryct <= 0 || mntmp == PM_WOLF || mntmp == PM_FOG_CLOUD
535 || is_bat(&mons[mntmp])))
537 } else if (draconian || iswere || isvamp) {
538 /* special changes that don't require polyok() */
541 mntmp = armor_to_dragon(uarm->otyp);
542 if (!(mvitals[mntmp].mvflags & G_GENOD)) {
543 /* allow G_EXTINCT */
544 if (Is_dragon_scales(uarm)) {
545 /* dragon scales remain intact as uskin */
547 You("merge with your scaly armor.");
549 You("
\97Ø
\82Ì
\8aZ
\82Æ
\88ê
\91Ì
\89»
\82µ
\82½
\81D");
550 } else { /* dragon scale mail */
551 /* d.scale mail first reverts to scales */
558 /* similar to noarmor(invent.c),
559 shorten to "<color> scale mail" */
560 dsmail = strcpy(buf, simpleonames(uarm));
562 if ((p = strstri(dsmail, " dragon ")) != 0)
563 while ((p[1] = p[8]) != '\0')
566 /* tricky phrasing; dragon scale mail
567 is singular, dragon scales are plural */
569 Your("%s reverts to scales as you merge with them.",
572 Your("%s
\82Í
\97Ø
\82É
\96ß
\82Á
\82½
\81D",
575 /* uarm->spe enchantment remains unchanged;
576 re-converting scales to mail poses risk
577 of evaporation due to over enchanting */
578 uarm->otyp += GRAY_DRAGON_SCALES - GRAY_DRAGON_SCALE_MAIL;
580 context.botl = 1; /* AC is changing */
583 uarm = (struct obj *) 0;
584 /* save/restore hack */
585 uskin->owornmask |= I_SPECIAL;
590 if (Upolyd && were_beastie(mntmp) != u.ulycn)
591 mntmp = PM_HUMAN; /* Illegal; force newman() */
596 if (mntmp < LOW_PM || (mons[mntmp].geno & G_UNIQ))
597 mntmp = (youmonst.data != &mons[PM_VAMPIRE] && !rn2(10))
599 : !rn2(4) ? PM_FOG_CLOUD : PM_VAMPIRE_BAT;
600 if (controllable_poly) {
602 Sprintf(buf, "Become %s?", an(mons[mntmp].mname));
604 Sprintf(buf, "%s
\82É
\82È
\82é
\81H", mons[mntmp].mname);
609 /* if polymon fails, "you feel" message has been given
610 so don't follow up with another polymon or newman;
611 sex_change_ok left disabled here */
612 if (mntmp == PM_HUMAN)
613 newman(); /* werecritter */
615 (void) polymon(mntmp);
616 goto made_change; /* maybe not, but this is right anyway */
619 if (mntmp < LOW_PM) {
622 /* randomly pick an "ordinary" monster */
623 mntmp = rn1(SPECIAL_PM - LOW_PM, LOW_PM);
624 if (polyok(&mons[mntmp]) && !is_placeholder(&mons[mntmp]))
626 } while (--tryct > 0);
629 /* The below polyok() fails either if everything is genocided, or if
630 * we deliberately chose something illegal to force newman().
633 if (!polyok(&mons[mntmp]) || (!forcecontrol && !rn2(5))
634 || your_race(&mons[mntmp])) {
637 (void) polymon(mntmp);
639 sex_change_ok--; /* reset */
642 new_light = emits_light(youmonst.data);
643 if (old_light != new_light) {
645 del_light_source(LS_MONSTER, monst_to_any(&youmonst));
647 ++new_light; /* otherwise it's undetectable */
649 new_light_source(u.ux, u.uy, new_light, LS_MONSTER,
650 monst_to_any(&youmonst));
654 /* (try to) make a mntmp monster out of the player;
655 returns 1 if polymorph successful */
661 boolean sticky = sticks(youmonst.data) && u.ustuck && !u.uswallow,
662 was_blind = !!Blind, dochange = FALSE;
665 if (mvitals[mntmp].mvflags & G_GENOD) { /* allow G_EXTINCT */
667 You_feel("rather %s-ish.", mons[mntmp].mname);
669 You("%s
\82Á
\82Û
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D", mons[mntmp].mname);
670 exercise(A_WIS, TRUE);
675 u.uconduct.polyselfs++;
677 /* exercise used to be at the very end but only Wis was affected
678 there since the polymorph was always in effect by then */
679 exercise(A_CON, FALSE);
680 exercise(A_WIS, TRUE);
683 /* Human to monster; save human stats */
686 u.mfemale = flags.female;
688 /* Monster to monster; restore human stats, to be
689 * immediately changed to provide stats for the new monster
693 flags.female = u.mfemale;
696 /* if stuck mimicking gold, stop immediately */
697 if (multi < 0 && youmonst.m_ap_type == M_AP_OBJECT
698 && youmonst.data->mlet != S_MIMIC)
700 /* if becoming a non-mimic, stop mimicking anything */
701 if (mons[mntmp].mlet != S_MIMIC) {
702 /* as in polyman() */
703 youmonst.m_ap_type = M_AP_NOTHING;
705 if (is_male(&mons[mntmp])) {
708 } else if (is_female(&mons[mntmp])) {
711 } else if (!is_neuter(&mons[mntmp]) && mntmp != u.ulycn) {
712 if (sex_change_ok && !rn2(10))
717 Strcpy(buf, (u.umonnum != mntmp) ? "" : "new ");
718 #else /*
\93ú
\96{
\8cê
\82Æ
\82µ
\82Ä
\95s
\8e©
\91R
\82É
\82È
\82é
\82Ì
\82Å
\88ê
\92U
\82»
\82Ì
\82Ü
\82Ü
\82É
\82·
\82é*/
722 flags.female = !flags.female;
724 Strcat(buf, (is_male(&mons[mntmp]) || is_female(&mons[mntmp]))
725 ? "" : flags.female ? "female " : "male ");
727 Strcat(buf, (is_male(&mons[mntmp]) || is_female(&mons[mntmp]))
728 ? "" : flags.female ? "
\8f\97\82Ì" : "
\92j
\82Ì");
731 Strcat(buf, mons[mntmp].mname);
733 You("%s %s!", (u.umonnum != mntmp) ? "turn into" : "feel like", an(buf));
735 You("%s%s
\81I", an(buf), (u.umonnum != mntmp) ? "
\82É
\82È
\82Á
\82½" : "
\82Ì
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½");
737 if (Stoned && poly_when_stoned(&mons[mntmp])) {
738 /* poly_when_stoned already checked stone golem genocide */
739 mntmp = PM_STONE_GOLEM;
741 make_stoned(0L, "You turn to stone!", 0, (char *) 0);
743 make_stoned(0L, "
\90Î
\82É
\82È
\82Á
\82½
\81I", 0, (char *) 0);
746 u.mtimedone = rn1(500, 500);
750 /* New stats for monster, to last only as long as polymorphed.
751 * Currently only strength gets changed.
753 if (strongmonst(&mons[mntmp]))
754 ABASE(A_STR) = AMAX(A_STR) = STR18(100);
756 if (Stone_resistance && Stoned) { /* parnes@eniac.seas.upenn.edu */
758 make_stoned(0L, "You no longer seem to be petrifying.", 0,
760 make_stoned(0L, "
\90Î
\89»
\82©
\82ç
\89ð
\95ú
\82³
\82ê
\82½
\82æ
\82¤
\82¾
\81D", 0,
763 if (Sick_resistance && Sick) {
764 make_sick(0L, (char *) 0, FALSE, SICK_ALL);
766 You("no longer feel sick.");
768 You("
\95a
\8bC
\82©
\82ç
\89ð
\95ú
\82³
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
771 if (flaming(youmonst.data)) {
773 make_slimed(0L, "The slime burns away!");
775 make_slimed(0L, "
\83X
\83\89\83C
\83\80\82Í
\94R
\82¦
\82½
\81I");
776 } else if (mntmp == PM_GREEN_SLIME) {
778 make_slimed(0L, (char *) 0);
781 check_strangling(FALSE); /* maybe stop strangling */
782 if (nohands(youmonst.data))
786 mlvl = adj_lev(&mons[mntmp]);
787 * We can't do the above, since there's no such thing as an
788 * "experience level of you as a monster" for a polymorphed character.
790 mlvl = (int) mons[mntmp].mlevel;
791 if (youmonst.data->mlet == S_DRAGON && mntmp >= PM_GRAY_DRAGON) {
792 u.mhmax = In_endgame(&u.uz) ? (8 * mlvl) : (4 * mlvl + d(mlvl, 4));
793 } else if (is_golem(youmonst.data)) {
794 u.mhmax = golemhp(mntmp);
799 u.mhmax = d(mlvl, 8);
800 if (is_home_elemental(&mons[mntmp]))
805 if (u.ulevel < mlvl) {
806 /* Low level characters can't become high level monsters for long */
808 /* DRS/NS 2.2.6 messes up -- Peter Kendell */
809 int mtd = u.mtimedone, ulv = u.ulevel;
811 u.mtimedone = mtd * ulv / mlvl;
813 u.mtimedone = u.mtimedone * u.ulevel / mlvl;
817 if (uskin && mntmp != armor_to_dragon(uskin->otyp))
821 (void) hideunder(&youmonst);
823 if (u.utraptype == TT_PIT && u.utrap) {
824 u.utrap = rn1(6, 2); /* time to escape resets */
826 if (was_blind && !Blind) { /* previous form was eyeless */
828 make_blinded(0L, TRUE); /* remove blindness */
830 newsym(u.ux, u.uy); /* Change symbol */
832 if (!sticky && !u.uswallow && u.ustuck && sticks(youmonst.data))
834 else if (sticky && !sticks(youmonst.data))
837 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("%s now feels soothing.", hliquid("lava"));
961 pline_The("%s
\82ª
\90¸
\90_
\82ð
\97\8e\82¿
\82Â
\82©
\82¹
\82Ä
\82
\82ê
\82é
\81D", hliquid("
\97n
\8aâ"));
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 */
1003 vision_full_recalc = 1;
1005 (void) encumber_msg();
1007 retouch_equipment(2);
1008 /* this might trigger a recursive call to polymon() [stone golem
1009 wielding cockatrice corpse and hit by stone-to-flesh, becomes
1010 flesh golem above, now gets transformed back into stone golem] */
1012 selftouch(no_longer_petrify_resistant);
1019 register struct obj *otmp;
1021 if (breakarm(youmonst.data)) {
1022 if ((otmp = uarm) != 0) {
1026 You("break out of your armor!");
1028 You("
\8aZ
\82ð
\89ó
\82µ
\82½
\81I");
1029 exercise(A_STR, FALSE);
1030 (void) Armor_gone();
1033 if ((otmp = uarmc) != 0) {
1034 if (otmp->oartifact) {
1036 Your("%s falls off!", cloak_simple_name(otmp));
1038 Your("%s
\82Í
\92E
\82°
\97\8e\82¿
\82½
\81I", cloak_simple_name(otmp));
1043 Your("%s tears apart!", cloak_simple_name(otmp));
1045 Your("%s
\82Í
\82¸
\82½
\82¸
\82½
\82É
\88ø
\82«
\97ô
\82©
\82ê
\82½
\81I", cloak_simple_name(otmp));
1052 Your("shirt rips to shreds!");
1054 Your("
\83V
\83\83\83c
\82Í
\88ø
\82«
\97ô
\82©
\82ê
\82½
\81I");
1057 } else if (sliparm(youmonst.data)) {
1058 if (((otmp = uarm) != 0) && (racial_exception(&youmonst, otmp) < 1)) {
1062 Your("armor falls around you!");
1064 Your("
\8aZ
\82Í
\82 \82È
\82½
\82Ì
\82Ü
\82í
\82è
\82É
\97\8e\82¿
\82½
\81I");
1065 (void) Armor_gone();
1068 if ((otmp = uarmc) != 0) {
1069 if (is_whirly(youmonst.data))
1071 Your("%s falls, unsupported!", cloak_simple_name(otmp));
1073 Your("%s
\82Í
\82·
\82Æ
\82ñ
\82Æ
\97\8e\82¿
\82½
\81I", cloak_simple_name(otmp));
1076 You("shrink out of your %s!", cloak_simple_name(otmp));
1078 You("%s
\82©
\82ç
\8fk
\82Ý
\8fo
\82½
\81I", cloak_simple_name(otmp));
1082 if ((otmp = uarmu) != 0) {
1083 if (is_whirly(youmonst.data))
1085 You("seep right through your shirt!");
1087 You("
\83V
\83\83\83c
\82©
\82ç
\82µ
\82Ý
\8fo
\82½
\81I");
1090 You("become much too small for your shirt!");
1092 You("
\83V
\83\83\83c
\82æ
\82è
\82¸
\82Á
\82Æ
\8f¬
\82³
\82
\82È
\82Á
\82½
\81I");
1093 setworn((struct obj *) 0, otmp->owornmask & W_ARMU);
1097 if (has_horns(youmonst.data)) {
1098 if ((otmp = uarmh) != 0) {
1099 if (is_flimsy(otmp) && !donning(otmp)) {
1101 char hornbuf[BUFSZ];
1103 /* Future possibilities: This could damage/destroy helmet */
1104 Sprintf(hornbuf, "horn%s", plur(num_horns(youmonst.data)));
1105 Your("%s %s through %s.", hornbuf, vtense(hornbuf, "pierce"),
1108 Your("
\8ap
\82ª%s
\82ð
\82Â
\82ç
\82Ê
\82¢
\82½
\81D", yname(otmp));
1114 Your("%s falls to the %s!", helm_simple_name(otmp),
1115 surface(u.ux, u.uy));
1117 Your("%s
\82Í%s
\82É
\97\8e\82¿
\82½
\81I", helm_simple_name(otmp),
1118 surface(u.ux, u.uy));
1120 (void) Helmet_off();
1125 if (nohands(youmonst.data) || verysmall(youmonst.data)) {
1126 if ((otmp = uarmg) != 0) {
1129 /* Drop weapon along with gloves */
1131 You("drop your gloves%s!", uwep ? " and weapon" : "");
1133 You("
\8f¬
\8eè%s
\82ð
\97\8e\82µ
\82½
\81I", uwep ? "
\82â
\95\90\8aí" : "");
1135 (void) Gloves_off();
1138 if ((otmp = uarms) != 0) {
1140 You("can no longer hold your shield!");
1142 You("
\82à
\82¤
\8f\82\82ð
\8e\9d\82Á
\82Ä
\82ç
\82ê
\82È
\82¢
\81I");
1143 (void) Shield_off();
1146 if ((otmp = uarmh) != 0) {
1150 Your("%s falls to the %s!", helm_simple_name(otmp),
1151 surface(u.ux, u.uy));
1153 Your("%s
\82Í%s
\82É
\97\8e\82¿
\82½
\81I", helm_simple_name(otmp),
1154 surface(u.ux, u.uy));
1156 (void) Helmet_off();
1160 if (nohands(youmonst.data) || verysmall(youmonst.data)
1161 || slithy(youmonst.data) || youmonst.data->mlet == S_CENTAUR) {
1162 if ((otmp = uarmf) != 0) {
1165 if (is_whirly(youmonst.data))
1167 Your("boots fall away!");
1169 Your("
\8cC
\82Í
\92E
\82°
\97\8e\82¿
\82½
\81I");
1172 Your("boots %s off your feet!",
1173 verysmall(youmonst.data) ? "slide" : "are pushed");
1175 Your("
\8cC
\82Í
\82 \82È
\82½
\82Ì
\91«
\82©
\82ç%s
\81I",
1176 verysmall(youmonst.data) ? "
\8a\8a\82è
\97\8e\82¿
\82½" : "
\92E
\82°
\97\8e\82¿
\82½");
1190 const char *what, *which, *whichtoo;
1192 const char *which, *whichtoo;
1194 boolean candropwep, candropswapwep, updateinv = TRUE;
1197 /* !alone check below is currently superfluous but in the
1198 * future it might not be so if there are monsters which cannot
1199 * wear gloves but can wield weapons
1201 if (!alone || cantwield(youmonst.data)) {
1202 candropwep = canletgo(uwep, "");
1203 candropswapwep = !u.twoweap || canletgo(uswapwep, "");
1206 what = (candropwep && candropswapwep) ? "drop" : "release";
1209 which = is_sword(uwep) ? "sword" : weapon_descr(uwep);
1211 which = is_sword(uwep) ? "
\8c\95" : weapon_descr(uwep);
1215 is_sword(uswapwep) ? "sword" : weapon_descr(uswapwep);
1217 is_sword(uswapwep) ? "
\8c\95" : weapon_descr(uswapwep);
1218 if (strcmp(which, whichtoo))
1222 which = "
\95\90\8aí";
1224 #if 0 /*JP*//*
\95¡
\90\94\8c`
\82É
\82µ
\82È
\82¢*/
1225 if (uwep->quan != 1L || u.twoweap)
1226 which = makeplural(which);
1230 You("find you must %s %s %s!", what,
1231 the_your[!!strncmp(which, "corpse", 6)], which);
1233 You("%s
\82ð
\97\8e\82Æ
\82µ
\82½
\82±
\82Æ
\82É
\8bC
\82Ã
\82¢
\82½
\81I", which);
1236 /* if either uwep or wielded uswapwep is flagged as 'in_use'
1237 then don't drop it or explicitly update inventory; leave
1238 those actions to caller (or caller's caller, &c) */
1244 else if (candropswapwep)
1251 else if (candropwep)
1256 } else if (!could_twoweap(youmonst.data)) {
1265 /* You can't revert back while unchanging */
1269 killer.format = NO_KILLER_PREFIX;
1270 Strcpy(killer.name, "killed while stuck in creature form");
1272 killer.format = KILLED_BY;
1273 Strcpy(killer.name, "
\8c³
\82Ì
\8ep
\82Ö
\96ß
\82ê
\82¸
\82É");
1276 } else if (uamul && uamul->otyp == AMULET_OF_UNCHANGING) {
1277 Your("%s %s!", simpleonames(uamul), otense(uamul, "fail"));
1279 makeknown(AMULET_OF_UNCHANGING);
1283 if (emits_light(youmonst.data))
1284 del_light_source(LS_MONSTER, monst_to_any(&youmonst));
1286 polyman("return to %s form!", urace.adj);
1288 polyman("%s
\82É
\96ß
\82Á
\82½
\81I", urace.adj);
1291 /* can only happen if some bit of code reduces u.uhp
1292 instead of u.mh while poly'd */
1294 Your("old form was not healthy enough to survive.");
1296 Your("
\8c³
\82Ì
\8ep
\82Í
\90¶
\82«
\82Ä
\82¢
\82
\82¾
\82¯
\82Ì
\97Í
\82ª
\82È
\82¢
\81D");
1298 Sprintf(killer.name, "reverting to unhealthy %s form", urace.adj);
1300 Sprintf(killer.name, "
\95s
\8c\92\8dN
\82È%s
\82Ì
\8ep
\82É
\96ß
\82Á
\82Ä", urace.adj);
1301 killer.format = KILLED_BY;
1307 vision_full_recalc = 1;
1308 (void) encumber_msg();
1310 retouch_equipment(2);
1312 selftouch(no_longer_petrify_resistant);
1318 struct attack *mattk;
1322 You_cant("breathe. Sorry.");
1324 You_cant("
\91§
\82ð
\93f
\82
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D
\8ec
\94O
\81D");
1329 You("don't have enough energy to breathe!");
1331 You("
\91§
\82ð
\93f
\82
\82Ì
\82É
\8f\
\95ª
\82È
\83G
\83l
\83\8b\83M
\81[
\82ª
\82È
\82©
\82Á
\82½
\81D");
1337 if (!getdir((char *) 0))
1340 mattk = attacktype_fordmg(youmonst.data, AT_BREA, AD_ANY);
1342 impossible("bad breath attack?"); /* mouthwash needed... */
1343 else if (!u.dx && !u.dy && !u.dz)
1346 buzz((int) (20 + mattk->adtyp - 1), (int) mattk->damn, u.ux, u.uy,
1355 struct attack *mattk;
1357 if (!getdir((char *) 0))
1359 mattk = attacktype_fordmg(youmonst.data, AT_SPIT, AD_ANY);
1361 impossible("bad spit attack?");
1363 switch (mattk->adtyp) {
1366 otmp = mksobj(BLINDING_VENOM, TRUE, FALSE);
1369 impossible("bad attack type in dospit");
1372 otmp = mksobj(ACID_VENOM, TRUE, FALSE);
1375 otmp->spe = 1; /* to indicate it's yours */
1376 throwit(otmp, 0L, FALSE);
1385 if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1387 pline_The("ball and chain are buried firmly in the %s.",
1388 surface(u.ux, u.uy));
1390 pline_The("
\8b\85\82Æ
\8d½
\82Í%s
\82É
\82µ
\82Á
\82©
\82è
\82Æ
\96\84\82Ü
\82Á
\82Ä
\82¢
\82é
\81D.",
1391 surface(u.ux, u.uy));
1396 You("are not chained to anything!");
1398 You("
\89½
\82à
\82Â
\82È
\82ª
\82ê
\82Ä
\82¢
\82È
\82¢
\81I");
1408 register struct trap *ttmp = t_at(u.ux, u.uy);
1410 if (Levitation || Is_airlevel(&u.uz) || Underwater
1411 || Is_waterlevel(&u.uz)) {
1413 You("must be on the ground to spin a web.");
1415 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");
1420 You("release web fluid inside %s.", mon_nam(u.ustuck));
1422 You("%s
\82Ì
\93à
\82Å
\82
\82à
\82Ì
\91\83\82ð
\93f
\82«
\8fo
\82µ
\82½
\81D", mon_nam(u.ustuck));
1423 if (is_animal(u.ustuck->data)) {
1424 expels(u.ustuck, u.ustuck->data, TRUE);
1427 if (is_whirly(u.ustuck->data)) {
1430 for (i = 0; i < NATTK; i++)
1431 if (u.ustuck->data->mattk[i].aatyp == AT_ENGL)
1434 impossible("Swallower has no engulfing attack?");
1439 switch (u.ustuck->data->mattk[i].adtyp) {
1442 Strcpy(sweep, "ignites and ");
1444 Strcpy(sweep, "
\94
\89Î
\82µ");
1448 Strcpy(sweep, "fries and ");
1450 Strcpy(sweep, "
\8fÅ
\82°");
1454 Strcpy(sweep, "freezes, shatters and ");
1456 Strcpy(sweep, "
\93\80\82è
\82Â
\82«
\81C
\82±
\82È
\82²
\82È
\82É
\82È
\82è");
1460 pline_The("web %sis swept away!", sweep);
1462 pline("
\82
\82à
\82Ì
\91\83\82Í%s
\82È
\82
\82È
\82Á
\82½
\81I", sweep);
1465 } /* default: a nasty jelly-like creature */
1467 pline_The("web dissolves into %s.", mon_nam(u.ustuck));
1469 pline("
\82
\82à
\82Ì
\91\83\82Í
\95ª
\89ð
\82µ
\82Ä%s
\82É
\82È
\82Á
\82½
\81D", mon_nam(u.ustuck));
1474 You("cannot spin webs while stuck in a trap.");
1476 You("ã©
\82É
\82Í
\82Ü
\82Á
\82Ä
\82¢
\82é
\8aÔ
\82Í
\82
\82à
\82Ì
\91\83\82ð
\92£
\82ê
\82È
\82¢
\81D");
1479 exercise(A_DEX, TRUE);
1481 switch (ttmp->ttyp) {
1485 You("spin a web, covering up the pit.");
1487 You("
\82
\82à
\82Ì
\91\83\82ð
\92£
\82è
\81C
\97\8e\82µ
\8c\8a\82ð
\95¢
\82Á
\82½
\81D");
1489 bury_objs(u.ux, u.uy);
1494 pline_The("squeaky board is muffled.");
1496 pline("
\82«
\82µ
\82Þ
\94Â
\82Í
\95¢
\82í
\82ê
\82½
\81D");
1503 case VIBRATING_SQUARE:
1505 Your("webbing vanishes!");
1507 Your("
\82
\82à
\82Ì
\91\83\82Í
\8fÁ
\82¦
\82½
\81I");
1511 You("make the web thicker.");
1513 You("
\82
\82à
\82Ì
\91\83\82ð
\82æ
\82è
\8cú
\82
\82µ
\82½
\81D");
1518 You("web over the %s.",
1519 (ttmp->ttyp == TRAPDOOR) ? "trap door" : "hole");
1521 You("%s
\82ð
\82
\82à
\82Ì
\91\83\82Å
\95¢
\82Á
\82½
\81D",
1522 (ttmp->ttyp == TRAPDOOR) ? "
\97\8e\82µ
\94à" : "
\8c\8a");
1527 case ROLLING_BOULDER_TRAP:
1529 You("spin a web, jamming the trigger.");
1531 You("
\82
\82à
\82Ì
\91\83\82ð
\92£
\82Á
\82Ä
\81C
\83X
\83C
\83b
\83`
\82ð
\93®
\82©
\82È
\82
\82µ
\82½
\81D");
1547 You("have triggered a trap!");
1549 You("ã©
\82ð
\8en
\93®
\82³
\82¹
\82Ä
\82µ
\82Ü
\82Á
\82½
\81I");
1553 impossible("Webbing over trap type %d?", ttmp->ttyp);
1556 } else if (On_stairs(u.ux, u.uy)) {
1557 /* cop out: don't let them hide the stairs */
1559 Your("web fails to impede access to the %s.",
1560 (levl[u.ux][u.uy].typ == STAIRS) ? "stairs" : "ladder");
1562 Your("
\82
\82à
\82Ì
\91\83\82Í%s
\82Ö
\82Ì
\88Ú
\93®
\82ð
\8e×
\96\82\82Å
\82«
\82È
\82¢
\81D",
1563 (levl[u.ux][u.uy].typ == STAIRS) ? "
\8aK
\92i" : "
\82Í
\82µ
\82²");
1567 ttmp = maketrap(u.ux, u.uy, WEB);
1581 You("lack the energy to send forth a call for help!");
1583 You("
\8f\95\82¯
\82ð
\8cÄ
\82Ô
\82¾
\82¯
\82Ì
\91Ì
\97Í
\82ª
\82È
\82¢
\81I");
1590 You("call upon your brethren for help!");
1592 You("
\92\87\8aÔ
\82ð
\8cÄ
\82ñ
\82¾
\81I");
1593 exercise(A_WIS, TRUE);
1594 if (!were_summon(youmonst.data, TRUE, &placeholder, (char *) 0))
1596 pline("But none arrive.");
1598 pline("
\82µ
\82©
\82µ
\81C
\89½
\82à
\97\88\82È
\82¢
\81D");
1605 register struct monst *mtmp;
1611 for (i = 0; i < NATTK; i++) {
1612 if (youmonst.data->mattk[i].aatyp == AT_GAZE) {
1613 adtyp = youmonst.data->mattk[i].adtyp;
1617 if (adtyp != AD_CONF && adtyp != AD_FIRE) {
1618 impossible("gaze attack %d?", adtyp);
1624 You_cant("see anything to gaze at.");
1626 You("
\96Ú
\82ª
\8c©
\82¦
\82È
\82¢
\82Ì
\82Å
\81C
\82É
\82ç
\82ß
\82È
\82¢
\81D");
1628 } else if (Hallucination) {
1630 You_cant("gaze at anything you can see.");
1632 You_cant("
\8c©
\82¦
\82é
\82à
\82Ì
\82ð
\89½
\82à
\82É
\82ç
\82ß
\82È
\82¢
\81D");
1637 You("lack the energy to use your special gaze!");
1639 You("
\82É
\82ç
\82Þ
\82¾
\82¯
\82Ì
\91Ì
\97Í
\82ª
\82È
\82¢
\81I");
1645 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1646 if (DEADMONSTER(mtmp))
1648 if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)) {
1650 if (Invis && !perceives(mtmp->data)) {
1652 pline("%s seems not to notice your gaze.", Monnam(mtmp));
1654 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\82É
\82ç
\82Ý
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1655 } else if (mtmp->minvis && !See_invisible) {
1657 You_cant("see where to gaze at %s.", Monnam(mtmp));
1659 You("%s
\82Í
\8c©
\82¦
\82È
\82¢
\82Ì
\82Å
\81C
\82É
\82ç
\82ß
\82È
\82¢", Monnam(mtmp));
1660 } else if (mtmp->m_ap_type == M_AP_FURNITURE
1661 || mtmp->m_ap_type == M_AP_OBJECT) {
1664 } else if (flags.safe_dog && mtmp->mtame && !Confusion) {
1666 You("avoid gazing at %s.", y_monnam(mtmp));
1668 You("%s
\82©
\82ç
\96Ú
\82ð
\82»
\82ç
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D", y_monnam(mtmp));
1670 if (flags.confirm && mtmp->mpeaceful && !Confusion) {
1672 Sprintf(qbuf, "Really %s %s?",
1673 (adtyp == AD_CONF) ? "confuse" : "attack",
1676 Sprintf(qbuf, "
\96{
\93\96\82É%s
\82ð%s
\81H",
1678 (adtyp == AD_CONF) ? "
\8d¬
\97\90\82³
\82¹
\82é" : "
\8dU
\8c\82\82·
\82é");
1680 if (yn(qbuf) != 'y')
1683 setmangry(mtmp, TRUE);
1684 if (!mtmp->mcanmove || mtmp->mstun || mtmp->msleeping
1685 || !mtmp->mcansee || !haseyes(mtmp->data)) {
1689 /* No reflection check for consistency with when a monster
1690 * gazes at *you*--only medusa gaze gets reflected then.
1692 if (adtyp == AD_CONF) {
1695 Your("gaze confuses %s!", mon_nam(mtmp));
1697 Your("
\82É
\82ç
\82Ý
\82Í%s
\82ð
\8d¬
\97\90\82³
\82¹
\82½
\81I", mon_nam(mtmp));
1700 pline("%s is getting more and more confused.",
1702 pline("%s
\82Í
\82Ü
\82·
\82Ü
\82·
\8d¬
\97\90\82µ
\82½
\81I",
1705 } else if (adtyp == AD_FIRE) {
1706 int dmg = d(2, 6), lev = (int) u.ulevel;
1709 You("attack %s with a fiery gaze!", mon_nam(mtmp));
1711 You("
\89\8a\82Ì
\82É
\82ç
\82Ý
\82Å%s
\82ð
\8dU
\8c\82\82µ
\82½
\81I", mon_nam(mtmp));
1712 if (resists_fire(mtmp)) {
1714 pline_The("fire doesn't burn %s!", mon_nam(mtmp));
1716 pline("%s
\82Í
\89\8a\82Å
\94R
\82¦
\82È
\82©
\82Á
\82½
\81I", mon_nam(mtmp));
1720 (void) destroy_mitem(mtmp, SCROLL_CLASS, AD_FIRE);
1722 (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE);
1724 (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE);
1730 /* For consistency with passive() in uhitm.c, this only
1731 * affects you if the monster is still alive.
1733 if (DEADMONSTER(mtmp))
1736 if (mtmp->data == &mons[PM_FLOATING_EYE] && !mtmp->mcan) {
1739 You("are frozen by %s gaze!",
1740 s_suffix(mon_nam(mtmp)));
1742 You("%s
\82Ì
\82É
\82ç
\82Ý
\82Å
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81I",
1745 nomul((u.ulevel > 6 || rn2(4))
1746 ? -d((int) mtmp->m_lev + 1,
1747 (int) mtmp->data->mattk[0].damd)
1750 multi_reason = "frozen by a monster's gaze";
1752 multi_reason = "
\89ö
\95¨
\82Ì
\82É
\82ç
\82Ý
\82Å
\8dd
\92¼
\82µ
\82Ä
\82¢
\82é
\8e\9e\82É";
1757 You("stiffen momentarily under %s gaze.",
1758 s_suffix(mon_nam(mtmp)));
1760 You("%s
\82Ì
\82É
\82ç
\82Ý
\82Å
\88ê
\8fu
\8dd
\92¼
\82µ
\82½
\81D",
1764 /* Technically this one shouldn't affect you at all because
1765 * the Medusa gaze is an active monster attack that only
1766 * works on the monster's turn, but for it to *not* have an
1767 * effect would be too weird.
1769 if (mtmp->data == &mons[PM_MEDUSA] && !mtmp->mcan) {
1771 pline("Gazing at the awake %s is not a very good idea.",
1773 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",
1775 /* as if gazing at a sleeping anything is fruitful... */
1777 You("turn to stone...");
1779 You("
\90Î
\82É
\82È
\82Á
\82½
\81D
\81D
\81D");
1780 killer.format = KILLED_BY;
1782 Strcpy(killer.name, "deliberately meeting Medusa's gaze");
1784 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Ä");
1792 You("gaze at no place in particular.");
1794 You("
\8eÀ
\8dÛ
\82É
\82Í
\89½
\82à
\82É
\82ç
\82ß
\82È
\82©
\82Á
\82½
\81D");
1801 boolean ismimic = youmonst.data->mlet == S_MIMIC,
1802 on_ceiling = is_clinger(youmonst.data) || Flying;
1804 /* can't hide while being held (or holding) or while trapped
1805 (except for floor hiders [trapper or mimic] in pits) */
1806 if (u.ustuck || (u.utrap && (u.utraptype != TT_PIT || on_ceiling))) {
1808 You_cant("hide while you're %s.",
1809 !u.ustuck ? "trapped"
1810 : u.uswallow ? (is_animal(u.ustuck->data) ? "swallowed"
1812 : !sticks(youmonst.data) ? "being held"
1813 : (humanoid(u.ustuck->data) ? "holding someone"
1814 : "holding that creature"));
1816 You_cant("%s
\8aÔ
\82Í
\89B
\82ê
\82ç
\82ê
\82È
\82¢
\81D",
1817 !u.ustuck ? "
\95ß
\82Ü
\82Á
\82Ä
\82¢
\82é"
1818 : u.uswallow ? "
\88ù
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é"
1819 : !sticks(youmonst.data) ? "
\95ß
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82é"
1820 : humanoid(u.ustuck->data) ? "
\92N
\82©
\82ð
\82Â
\82©
\82ñ
\82Å
\82¢
\82é"
1821 : "
\89ö
\95¨
\82ð
\82Â
\82©
\82ñ
\82Å
\82¢
\82é");
1824 || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) {
1826 youmonst.m_ap_type = M_AP_NOTHING;
1831 /* note: the eel and hides_under cases are hypothetical;
1832 such critters aren't offered the option of hiding via #monster */
1833 if (youmonst.data->mlet == S_EEL && !is_pool(u.ux, u.uy)) {
1834 if (IS_FOUNTAIN(levl[u.ux][u.uy].typ))
1836 The("fountain is not deep enough to hide in.");
1838 The("
\90ò
\82Í
\89B
\82ê
\82ç
\82ê
\82é
\82Ù
\82Ç
\90[
\82
\82È
\82¢
\81D");
1841 There("is no %s to hide in here.", hliquid("water"));
1843 There("
\82±
\82±
\82É
\82Í
\89B
\82ê
\82é
\82½
\82ß
\82Ì%s
\82ª
\82È
\82¢
\81D", hliquid("
\90\85"));
1847 if (hides_under(youmonst.data) && !level.objects[u.ux][u.uy]) {
1849 There("is nothing to hide under here.");
1851 There("
\82±
\82±
\82É
\82Í
\89B
\82ê
\82ç
\82ê
\82é
\82à
\82Ì
\82ª
\82È
\82¢
\81D");
1855 /* Planes of Air and Water */
1856 if (on_ceiling && !has_ceiling(&u.uz)) {
1858 There("is nowhere to hide above you.");
1860 There("
\82 \82È
\82½
\82Ì
\8fã
\82É
\82Í
\89B
\82ê
\82ç
\82ê
\82é
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
1864 if ((is_hider(youmonst.data) && !Flying) /* floor hider */
1865 && (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))) {
1867 There("is nowhere to hide beneath you.");
1869 There("
\82 \82È
\82½
\82Ì
\89º
\82É
\82Í
\89B
\82ê
\82ç
\82ê
\82é
\8fê
\8f\8a\82ª
\82È
\82¢
\81D");
1873 /* TODO? inhibit floor hiding at furniture locations, or
1874 * else make youhiding() give smarter messages at such spots.
1877 if (u.uundetected || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) {
1878 youhiding(FALSE, 1); /* "you are already hiding" */
1883 /* should bring up a dialog "what would you like to imitate?" */
1884 youmonst.m_ap_type = M_AP_OBJECT;
1885 youmonst.mappearance = STRANGE_OBJECT;
1889 youhiding(FALSE, 0); /* "you are now hiding" */
1896 struct permonst *savedat = youmonst.data;
1898 if (is_vampire(youmonst.data)) {
1900 if (savedat != youmonst.data) {
1902 You("transform into %s.", an(youmonst.data->mname));
1904 You("%s
\82Ì
\8ep
\82É
\82È
\82Á
\82½
\81D", youmonst.data->mname);
1914 struct monst *mtmp, *nmon;
1918 You("concentrate but lack the energy to maintain doing so.");
1920 You("
\8fW
\92\86\82µ
\82½
\81D
\82µ
\82©
\82µ
\83G
\83l
\83\8b\83M
\81[
\82ª
\91«
\82è
\82È
\82¢
\81D");
1927 You("concentrate.");
1929 You("
\8fW
\92\86\82µ
\82½
\81D");
1931 pline("A wave of psychic energy pours out.");
1933 pline("
\90¸
\90_
\83G
\83l
\83\8b\83M
\81[
\94g
\82ª
\95ú
\8eU
\82µ
\82½
\81D");
1934 for (mtmp = fmon; mtmp; mtmp = nmon) {
1938 if (DEADMONSTER(mtmp))
1940 if (distu(mtmp->mx, mtmp->my) > BOLT_LIM * BOLT_LIM)
1942 if (mtmp->mpeaceful)
1944 u_sen = telepathic(mtmp->data) && !mtmp->mcansee;
1945 if (u_sen || (telepathic(mtmp->data) && rn2(2)) || !rn2(10)) {
1947 You("lock in on %s %s.", s_suffix(mon_nam(mtmp)),
1949 : telepathic(mtmp->data) ? "latent telepathy" : "mind");
1951 pline("%s
\82Ì%s
\82è
\8d\9e\82ñ
\82¾
\81D", mon_nam(mtmp),
1952 u_sen ? "
\90¸
\90_
\82É
\93ü"
1953 : telepathic(mtmp->data) ? "
\90ö
\8dÝ
\93I
\90¸
\90_
\82É
\93ü" : "
\90[
\91w
\88Ó
\8e¯
\82É
\90ö");
1955 mtmp->mhp -= rnd(15);
1967 pline("%s is no longer in your clutches.", Monnam(u.ustuck));
1969 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8eè
\82©
\82ç
\93¦
\82ê
\82½
\81D", Monnam(u.ustuck));
1980 Your("skin returns to its original form.");
1982 Your("
\94ç
\95\86\82Í
\96{
\97\88\82Ì
\8ep
\82É
\96ß
\82Á
\82½
\81D");
1984 uskin = (struct obj *) 0;
1985 /* undo save/restore hack */
1986 uarm->owornmask &= ~I_SPECIAL;
1991 mbodypart(mon, part)
1995 static NEARDATA const char
1997 *humanoid_parts[] = { "arm", "eye", "face", "finger",
1998 "fingertip", "foot", "hand", "handed",
1999 "head", "leg", "light headed", "neck",
2000 "spine", "toe", "hair", "blood",
2001 "lung", "nose", "stomach" },
2003 *humanoid_parts[] = { "
\98r", "
\96Ú", "
\8aç", "
\8ew",
2004 "
\8ew
\90æ", "
\91«", "
\8eè", "
\8eè
\82É
\82·
\82é",
2005 "
\93ª", "
\91«", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ",
2006 "
\94w
\8d\9c", "
\92Ü
\90æ", "
\94¯", "
\8c\8c",
2007 "
\94x", "
\95@", "
\88Ý"},
2010 *jelly_parts[] = { "pseudopod", "dark spot", "front",
2011 "pseudopod extension", "pseudopod extremity",
2012 "pseudopod root", "grasp", "grasped",
2013 "cerebral area", "lower pseudopod", "viscous",
2014 "middle", "surface", "pseudopod extremity",
2015 "ripples", "juices", "surface", "sensor",
2018 *jelly_parts[] = { "
\8b[
\8e\97\90G
\8eè", "
\8d\95\82¢
\94Á
\93_", "
\91O
\96Ê",
2019 "
\8b[
\8e\97\90G
\8eè
\82Ì
\90æ", "
\8b[
\8e\97\90G
\8eè",
2020 "
\8b[
\8e\97\90G
\8eè
\82Ì
\8a²", "
\90G
\8eè", "
\88¬
\82é",
2021 "
\94]
\82Ì
\97Ì
\88æ", "
\89º
\95û
\82Ì
\8b[
\8e\97\90G
\8eè", "
\82Ë
\82Î
\82Ë
\82Î
\82µ
\82Ä
\82«
\82½",
2022 "
\92\86\8aÔ
\97Ì
\88æ", "
\95\
\96Ê", "
\8b[
\8e\97\90G
\8eè",
2023 "
\94g
\96ä", "
\91Ì
\89t", "
\95\
\96Ê", "
\8a´
\8ao
\8aí",
2027 *animal_parts[] = { "forelimb", "eye", "face",
2028 "foreclaw", "claw tip", "rear claw",
2029 "foreclaw", "clawed", "head",
2030 "rear limb", "light headed", "neck",
2031 "spine", "rear claw tip", "fur",
2032 "blood", "lung", "nose",
2035 *animal_parts[] = { "
\91O
\91«", "
\96Ú", "
\8aç",
2036 "
\91O
\92Ü", "
\92Ü
\90æ", "
\8cã
\92Ü",
2037 "
\91O
\92Ü", "
\82Ð
\82Á
\82©
\82¯
\82é", "
\93ª",
2038 "
\8cã
\91«", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ",
2039 "
\94w
\8d\9c", "
\8cã
\92Ü
\90æ", "
\96Ñ
\94ç",
2040 "
\8c\8c", "
\94x", "
\95@",
2044 *bird_parts[] = { "wing", "eye", "face", "wing",
2045 "wing tip", "foot", "wing", "winged",
2046 "head", "leg", "light headed", "neck",
2047 "spine", "toe", "feathers", "blood",
2048 "lung", "bill", "stomach" },
2050 *bird_parts[] = { "
\97\83", "
\96Ú", "
\8aç", "
\97\83",
2051 "
\97\83\82Ì
\90æ", "
\91«", "
\97\83", "
\97\83\82É
\82Æ
\82é",
2052 "
\93ª", "
\91«", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ",
2053 "
\94w
\8d\9c", "
\92Ü
\90æ", "
\89H
\96Ñ", "
\8c\8c",
2054 "
\94x", "
\82
\82¿
\82Î
\82µ", "
\88Ý" },
2057 *horse_parts[] = { "foreleg", "eye", "face",
2058 "forehoof", "hoof tip", "rear hoof",
2059 "forehoof", "hooved", "head",
2060 "rear leg", "light headed", "neck",
2061 "backbone", "rear hoof tip", "mane",
2062 "blood", "lung", "nose",
2065 *horse_parts[] = { "
\91O
\91«", "
\96Ú", "
\8aç",
2066 "
\91O
\92û", "
\92û", "
\8cã
\92û",
2067 "
\91O
\92Ü", "
\92û
\82É
\82Í
\82³
\82Þ", "
\93ª",
2068 "
\8cã
\91«", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ",
2069 "
\94w
\8d\9c", "
\8cã
\92Ü
\90æ", "
\82½
\82Ä
\82ª
\82Ý",
2070 "
\8c\8c", "
\94x", "
\95@",
2074 *sphere_parts[] = { "appendage", "optic nerve", "body", "tentacle",
2075 "tentacle tip", "lower appendage", "tentacle",
2076 "tentacled", "body", "lower tentacle",
2077 "rotational", "equator", "body",
2078 "lower tentacle tip", "cilia", "life force",
2079 "retina", "olfactory nerve", "interior" },
2081 *sphere_parts[] = { "
\93Ë
\8bN", "
\8e\8b\8ao
\90_
\8co", "
\91Ì", "
\90G
\8eè",
2082 "
\90G
\8eè
\82Ì
\90æ", "
\89º
\82Ì
\93Ë
\8bN", "
\90G
\8eè",
2083 "
\90G
\8eè
\82É
\8e\9d\82Â", "
\91Ì", "
\89º
\82Ì
\90G
\8eè",
2084 "
\89ñ
\93]
\82µ
\82½", "
\92\86\90S
\90ü", "
\91Ì",
2085 "
\89º
\82Ì
\90G
\8eè
\82Ì
\90æ", "
\91@
\96Ñ", "
\90¶
\96½
\97Í",
2086 "
\96Ô
\96\8c", "
\9ak
\8ao
\92\86\90\95", "
\93à
\95\94" },
2089 *fungus_parts[] = { "mycelium", "visual area", "front",
2090 "hypha", "hypha", "root",
2091 "strand", "stranded", "cap area",
2092 "rhizome", "sporulated", "stalk",
2093 "root", "rhizome tip", "spores",
2094 "juices", "gill", "gill",
2097 *fungus_parts[] = { "
\8bÛ
\8e\85\91Ì", "
\8e\8b\8ao
\97Ì
\88æ", "
\91O",
2098 "
\8bÛ
\8e\85", "
\8bÛ
\8e\85", "
\8dª",
2099 "
\90G
\8eè", "
\90G
\8eè
\82É
\82©
\82ç
\82Ý
\82Â
\82¯
\82é", "
\8eP",
2100 "
\8dª
\8cs", "
\8d¬
\97\90\82·
\82é", "
\8e²",
2101 "
\8dª", "
\8dª
\8cs
\82Ì
\90æ", "
\89è
\96E",
2102 "
\91Ì
\89t", "
\82¦
\82ç", "
\82¦
\82ç",
2106 *vortex_parts[] = { "region", "eye", "front",
2107 "minor current", "minor current", "lower current",
2108 "swirl", "swirled", "central core",
2109 "lower current", "addled", "center",
2110 "currents", "edge", "currents",
2111 "life force", "center", "leading edge",
2114 *vortex_parts[] = { "
\97Ì
\88æ", "
\96Ú", "
\91O",
2115 "
\8f¬
\82³
\82¢
\97¬
\82ê", "
\8f¬
\82³
\82¢
\97¬
\82ê", "
\89º
\95\94\82Ì
\97¬
\82ê",
2116 "
\89Q
\8aª", "
\89Q
\82É
\8aª
\82", "
\89Q
\82Ì
\92\86\90S",
2117 "
\89º
\95\94\82Ì
\97¬
\82ê", "
\8d¬
\97\90\82µ
\82½", "
\92\86\90S
\95\94",
2118 "
\97¬
\82ê", "
\8aO
\8eü", "
\8bC
\97¬",
2119 "
\90¶
\96½
\97Í", "
\92\86\90S", "
\91O
\89\8f",
2123 *snake_parts[] = { "vestigial limb", "eye", "face", "large scale",
2124 "large scale tip", "rear region", "scale gap",
2125 "scale gapped", "head", "rear region",
2126 "light headed", "neck", "length", "rear scale",
2127 "scales", "blood", "lung", "forked tongue",
2130 *snake_parts[] = { "
\91Þ
\89»
\82µ
\82½
\91«", "
\96Ú", "
\8aç", "
\91å
\82«
\82È
\97Ø",
2131 "
\91å
\82«
\82È
\97Ø
\82Ì
\90æ", "
\8cã
\95\94\95ª", "
\97Ø
\82Ì
\8c\84\8aÔ",
2132 "
\97Ø
\82Ì
\8c\84\8aÔ
\82É
\82Â
\82¯
\82é", "
\93ª", "
\8cã
\95\94\95ª",
2133 "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\8eñ", "
\91Ì", "
\8cã
\95\94\95ª
\82Ì
\8aZ",
2134 "
\97Ø", "
\8c\8c", "
\94x", "
\90ã",
2138 *worm_parts[] = { "anterior segment", "light sensitive cell",
2139 "clitellum", "setae", "setae", "posterior segment",
2140 "segment", "segmented", "anterior segment",
2141 "posterior", "over stretched", "clitellum",
2142 "length", "posterior setae", "setae", "blood",
2143 "skin", "prostomium", "stomach" },
2145 *worm_parts[] = { "
\91O
\8bæ", "
\8a´
\8cõ
\90«
\8d×
\96E",
2146 "
\8aÂ
\91Ñ", "
\8ap", "
\8ap", "
\8cã
\8bæ",
2147 "
\90ß", "
\90ß
\82É
\82Â
\82¯
\82é", "
\91O
\8bæ",
2148 "
\8cã
\95\94", "
\90L
\82Ñ
\82·
\82¬
\82½", "
\8aÂ
\91Ñ",
2149 "
\91Ì", "
\8cã
\95\94\82Ì
\8ap", "
\8ap", "
\8c\8c",
2150 "
\94ç
\95\86", "
\8cû
\91O
\97t", "
\88Ý" },
2153 *fish_parts[] = { "fin", "eye", "premaxillary", "pelvic axillary",
2154 "pelvic fin", "anal fin", "pectoral fin", "finned",
2155 "head", "peduncle", "played out", "gills",
2156 "dorsal fin", "caudal fin", "scales", "blood",
2157 "gill", "nostril", "stomach" };
2159 *fish_parts[] = { "
\82Ð
\82ê", "
\96Ú", "
\8aç", "
\82Ð
\82ê
\82Ì
\90æ",
2160 "
\82Ð
\82ê
\82Ì
\90æ", "
\94ö
\82Ñ
\82ê", "
\8b¹
\82Ð
\82ê", "
\82Ð
\82ê
\82Å
\8e\9d\82Â",
2161 "
\93ª", "
\94ö
\95¿", "
\82ß
\82Ü
\82¢
\82ª
\82µ
\82½", "
\82¦
\82ç",
2162 "
\94w
\82Ñ
\82ê", "
\94ö
\82Ñ
\82ê", "
\97Ø", "
\8c\8c",
2163 "
\82¦
\82ç", "
\95@", "
\88Ý" };
2165 #if 0 /*JP*//*
\8eg
\82í
\82È
\82¢*/
2166 /* claw attacks are overloaded in mons[]; most humanoids with
2167 such attacks should still reference hands rather than claws */
2168 static const char not_claws[] = {
2169 S_HUMAN, S_MUMMY, S_ZOMBIE, S_ANGEL, S_NYMPH, S_LEPRECHAUN,
2170 S_QUANTMECH, S_VAMPIRE, S_ORC, S_GIANT, /* quest nemeses */
2171 '\0' /* string terminator; assert( S_xxx != 0 ); */
2174 struct permonst *mptr = mon->data;
2177 /* paw
\82Í
\8c¢
\82Æ
\82©
\94L
\82Ì
\8eè
\81Cclaw
\82Í
\83^
\83J
\82Ì
\91«
\82Ì
\82æ
\82¤
\82È
\82©
\82¬
\82Â
\82ß
\81C
2178 \82Ç
\82¿
\82ç
\82à
\93ú
\96{
\8cê
\82¶
\82á
\81u
\8eè
\81v
\82Å
\82¢
\82¢
\82Å
\82µ
\82å
\82¤
\81D
2180 /* some special cases */
2181 if (mptr->mlet == S_DOG || mptr->mlet == S_FELINE
2182 || mptr->mlet == S_RODENT || mptr == &mons[PM_OWLBEAR]) {
2192 return horse_parts[part]; /* "foreleg", "rear leg" */
2194 break; /* for other parts, use animal_parts[] below */
2196 } else if (mptr->mlet == S_YETI) { /* excl. owlbear due to 'if' above */
2197 /* opposable thumbs, hence "hands", "arms", "legs", &c */
2198 return humanoid_parts[part]; /* yeti/sasquatch, monkey/ape */
2200 if ((part == HAND || part == HANDED)
2201 && (humanoid(mptr) && attacktype(mptr, AT_CLAW)
2202 && !index(not_claws, mptr->mlet) && mptr != &mons[PM_STONE_GOLEM]
2203 && mptr != &mons[PM_INCUBUS] && mptr != &mons[PM_SUCCUBUS]))
2204 return (part == HAND) ? "claw" : "clawed";
2206 #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*/
2207 if ((mptr == &mons[PM_MUMAK] || mptr == &mons[PM_MASTODON])
2211 if (mptr == &mons[PM_SHARK] && part == HAIR)
2213 return "skin"; /* sharks don't have scales */
2215 return "
\93ª"; /* sharks don't have scales */
2217 if ((mptr == &mons[PM_JELLYFISH] || mptr == &mons[PM_KRAKEN])
2218 && (part == ARM || part == FINGER || part == HAND || part == FOOT
2224 if (mptr == &mons[PM_FLOATING_EYE] && part == EYE)
2228 return "
\8ap
\96\8c";
2229 if (humanoid(mptr) && (part == ARM || part == FINGER || part == FINGERTIP
2230 || part == HAND || part == HANDED))
2231 return humanoid_parts[part];
2232 if (mptr == &mons[PM_RAVEN])
2233 return bird_parts[part];
2234 if (mptr->mlet == S_CENTAUR || mptr->mlet == S_UNICORN
2235 || (mptr == &mons[PM_ROTHE] && part != HAIR))
2236 return horse_parts[part];
2237 if (mptr->mlet == S_LIGHT) {
2241 else if (part == ARM || part == FINGER || part == FINGERTIP
2247 if (part == HANDED || part == ARM || part == FINGER
2248 || part == FINGERTIP || part == HAND) {
2253 if (mptr == &mons[PM_STALKER] && part == HEAD)
2258 if (mptr->mlet == S_EEL && mptr != &mons[PM_JELLYFISH])
2259 return fish_parts[part];
2260 if (mptr->mlet == S_WORM)
2261 return worm_parts[part];
2262 if (slithy(mptr) || (mptr->mlet == S_DRAGON && part == HAIR))
2263 return snake_parts[part];
2264 if (mptr->mlet == S_EYE)
2265 return sphere_parts[part];
2266 if (mptr->mlet == S_JELLY || mptr->mlet == S_PUDDING
2267 || mptr->mlet == S_BLOB || mptr == &mons[PM_JELLYFISH])
2268 return jelly_parts[part];
2269 if (mptr->mlet == S_VORTEX || mptr->mlet == S_ELEMENTAL)
2270 return vortex_parts[part];
2271 if (mptr->mlet == S_FUNGUS)
2272 return fungus_parts[part];
2274 return humanoid_parts[part];
2275 return animal_parts[part];
2282 return mbodypart(&youmonst, part);
2288 /* Returns gender of polymorphed player;
2289 * 0/1=same meaning as flags.female, 2=none.
2291 if (is_neuter(youmonst.data) || !humanoid(youmonst.data))
2293 return flags.female;
2297 ugolemeffects(damtype, dam)
2302 /* We won't bother with "slow"/"haste" since players do not
2303 * have a monster-specific slow/haste so there is no way to
2304 * restore the old velocity once they are back to human.
2306 if (u.umonnum != PM_FLESH_GOLEM && u.umonnum != PM_IRON_GOLEM)
2310 if (u.umonnum == PM_FLESH_GOLEM)
2311 heal = (dam + 5) / 6; /* Approx 1 per die */
2314 if (u.umonnum == PM_IRON_GOLEM)
2318 if (heal && (u.mh < u.mhmax)) {
2324 pline("Strangely, you feel better than before.");
2326 pline("
\8aï
\96
\82È
\82±
\82Æ
\82É
\81C
\91O
\82æ
\82è
\8bC
\95ª
\82ª
\82æ
\82
\82È
\82Á
\82½
\81D");
2327 exercise(A_STR, TRUE);
2332 armor_to_dragon(atyp)
2336 case GRAY_DRAGON_SCALE_MAIL:
2337 case GRAY_DRAGON_SCALES:
2338 return PM_GRAY_DRAGON;
2339 case SILVER_DRAGON_SCALE_MAIL:
2340 case SILVER_DRAGON_SCALES:
2341 return PM_SILVER_DRAGON;
2342 #if 0 /* DEFERRED */
2343 case SHIMMERING_DRAGON_SCALE_MAIL:
2344 case SHIMMERING_DRAGON_SCALES:
2345 return PM_SHIMMERING_DRAGON;
2347 case RED_DRAGON_SCALE_MAIL:
2348 case RED_DRAGON_SCALES:
2349 return PM_RED_DRAGON;
2350 case ORANGE_DRAGON_SCALE_MAIL:
2351 case ORANGE_DRAGON_SCALES:
2352 return PM_ORANGE_DRAGON;
2353 case WHITE_DRAGON_SCALE_MAIL:
2354 case WHITE_DRAGON_SCALES:
2355 return PM_WHITE_DRAGON;
2356 case BLACK_DRAGON_SCALE_MAIL:
2357 case BLACK_DRAGON_SCALES:
2358 return PM_BLACK_DRAGON;
2359 case BLUE_DRAGON_SCALE_MAIL:
2360 case BLUE_DRAGON_SCALES:
2361 return PM_BLUE_DRAGON;
2362 case GREEN_DRAGON_SCALE_MAIL:
2363 case GREEN_DRAGON_SCALES:
2364 return PM_GREEN_DRAGON;
2365 case YELLOW_DRAGON_SCALE_MAIL:
2366 case YELLOW_DRAGON_SCALES:
2367 return PM_YELLOW_DRAGON;
2373 /* some species have awareness of other species */
2377 short warnidx = NON_PM;
2379 context.warntype.speciesidx = NON_PM;
2380 context.warntype.species = 0;
2381 context.warntype.polyd = 0;
2382 HWarn_of_mon &= ~FROMRACE;
2384 switch (u.umonnum) {
2385 case PM_PURPLE_WORM:
2386 warnidx = PM_SHRIEKER;
2389 case PM_VAMPIRE_LORD:
2390 context.warntype.polyd = M2_HUMAN | M2_ELF;
2391 HWarn_of_mon |= FROMRACE;
2394 if (warnidx >= LOW_PM) {
2395 context.warntype.speciesidx = warnidx;
2396 context.warntype.species = &mons[warnidx];
2397 HWarn_of_mon |= FROMRACE;
2401 /* True iff hero's role or race has been genocided */
2405 return (boolean) ((mvitals[urole.malenum].mvflags & G_GENOD)
2406 || (urole.femalenum != NON_PM
2407 && (mvitals[urole.femalenum].mvflags & G_GENOD))
2408 || (mvitals[urace.malenum].mvflags & G_GENOD)
2409 || (urace.femalenum != NON_PM
2410 && (mvitals[urace.femalenum].mvflags & G_GENOD)));
2413 /* how hero feels "inside" after self-genocide of role or race */
2417 /* self-genocide used to always say "you feel dead inside" but that
2418 seems silly when you're polymorphed into something undead;
2419 monkilled() distinguishes between living (killed) and non (destroyed)
2420 for monster death message; we refine the nonliving aspect a bit */
2422 return !nonliving(youmonst.data)
2423 ? "dead" /* living, including demons */
2424 : !weirdnonliving(youmonst.data)
2425 ? "condemned" /* undead plus manes */
2426 : "empty"; /* golems plus vortices */
2428 return !nonliving(youmonst.data)
2429 ? "
\8e\80\82ñ
\82¾" /* living, including demons */
2430 : !weirdnonliving(youmonst.data)
2431 ? "
\94j
\89ó
\82³
\82ê
\82½" /* undead plus manes */
2432 : "
\82È
\82
\82È
\82Á
\82½"; /* golems plus vortices */