OSDN Git Service

fix #36939
[jnethack/source.git] / src / were.c
1 /* NetHack 3.6  were.c  $NHDT-Date: 1432512763 2015/05/25 00:12:43 $  $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* NetHack may be freely redistributed.  See license for details. */
4
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. */
9
10 #include "hack.h"
11
12 #if 1 /*JP*/
13 STATIC_DCL char *FDECL(beastname, (const char *));
14
15 /*JP \81u\83W\83\83\83b\83J\83\8b\90l\8aÔ\81v\82©\82ç\81u\83W\83\83\83b\83J\83\8b\81v\82ð\8eæ\82è\8fo\82· */
16 STATIC_OVL char *
17 beastname(name)
18 const char *name;
19 {
20     static char werebuf[BUFSZ];
21     strcpy(werebuf, name);
22     werebuf[strlen(werebuf) - 4] = '\0';
23     return werebuf;
24 }
25 #endif
26
27 void
28 were_change(mon)
29 register struct monst *mon;
30 {
31     if (!is_were(mon->data))
32         return;
33
34     if (is_human(mon->data)) {
35         if (!Protection_from_shape_changers
36             && !rn2(night() ? (flags.moonphase == FULL_MOON ? 3 : 30)
37                             : (flags.moonphase == FULL_MOON ? 10 : 50))) {
38             new_were(mon); /* change into animal form */
39             if (!Deaf && !canseemon(mon)) {
40                 const char *howler;
41
42                 switch (monsndx(mon->data)) {
43                 case PM_WEREWOLF:
44 /*JP
45                     howler = "wolf";
46 */
47                     howler = "\98T";
48                     break;
49                 case PM_WEREJACKAL:
50 /*JP
51                     howler = "jackal";
52 */
53                     howler = "\83W\83\83\83b\83J\83\8b";
54                     break;
55                 default:
56                     howler = (char *) 0;
57                     break;
58                 }
59                 if (howler)
60 /*JP
61                     You_hear("a %s howling at the moon.", howler);
62 */
63                     You_hear("\8c\8e\96é\82É%s\82ª\96i\82¦\82é\90º\82ð\95·\82¢\82½\81D", howler);
64             }
65         }
66     } else if (!rn2(30) || Protection_from_shape_changers) {
67         new_were(mon); /* change back into human form */
68     }
69 }
70
71 int
72 counter_were(pm)
73 int pm;
74 {
75     switch (pm) {
76     case PM_WEREWOLF:
77         return (PM_HUMAN_WEREWOLF);
78     case PM_HUMAN_WEREWOLF:
79         return (PM_WEREWOLF);
80     case PM_WEREJACKAL:
81         return (PM_HUMAN_WEREJACKAL);
82     case PM_HUMAN_WEREJACKAL:
83         return (PM_WEREJACKAL);
84     case PM_WERERAT:
85         return (PM_HUMAN_WERERAT);
86     case PM_HUMAN_WERERAT:
87         return (PM_WERERAT);
88     default:
89         return NON_PM;
90     }
91 }
92
93 /* convert monsters similar to werecritters into appropriate werebeast */
94 int
95 were_beastie(pm)
96 int pm;
97 {
98     switch (pm) {
99     case PM_WERERAT:
100     case PM_SEWER_RAT:
101     case PM_GIANT_RAT:
102     case PM_RABID_RAT:
103         return PM_WERERAT;
104     case PM_WEREJACKAL:
105     case PM_JACKAL:
106     case PM_FOX:
107     case PM_COYOTE:
108         return PM_WEREJACKAL;
109     case PM_WEREWOLF:
110     case PM_WOLF:
111     case PM_WARG:
112     case PM_WINTER_WOLF:
113         return PM_WEREWOLF;
114     default:
115         break;
116     }
117     return NON_PM;
118 }
119
120 void
121 new_were(mon)
122 register struct monst *mon;
123 {
124     register int pm;
125
126     pm = counter_were(monsndx(mon->data));
127     if (pm < LOW_PM) {
128         impossible("unknown lycanthrope %s.", mon->data->mname);
129         return;
130     }
131
132     if (canseemon(mon) && !Hallucination)
133 #if 0 /*JP*/
134         pline("%s changes into a %s.", Monnam(mon),
135               is_human(&mons[pm]) ? "human" : mons[pm].mname + 4);
136 #else
137         pline("%s\82Í%s\82Ì\8ep\82É\82È\82Á\82½\81D", Monnam(mon),
138               is_human(&mons[pm]) ? "\90l\8aÔ" : beastname(mons[pm].mname));
139 #endif
140
141     set_mon_data(mon, &mons[pm], 0);
142     if (mon->msleeping || !mon->mcanmove) {
143         /* transformation wakens and/or revitalizes */
144         mon->msleeping = 0;
145         mon->mfrozen = 0; /* not asleep or paralyzed */
146         mon->mcanmove = 1;
147     }
148     /* regenerate by 1/4 of the lost hit points */
149     mon->mhp += (mon->mhpmax - mon->mhp) / 4;
150     newsym(mon->mx, mon->my);
151     mon_break_armor(mon, FALSE);
152     possibly_unwield(mon, FALSE);
153 }
154
155 int were_summon(ptr, yours, visible,
156                 genbuf) /* were-creature (even you) summons a horde */
157 register struct permonst *ptr;
158 register boolean yours;
159 int *visible; /* number of visible helpers created */
160 char *genbuf;
161 {
162     register int i, typ, pm = monsndx(ptr);
163     register struct monst *mtmp;
164     int total = 0;
165
166     *visible = 0;
167     if (Protection_from_shape_changers && !yours)
168         return 0;
169     for (i = rnd(5); i > 0; i--) {
170         switch (pm) {
171         case PM_WERERAT:
172         case PM_HUMAN_WERERAT:
173             typ =
174                 rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT;
175             if (genbuf)
176 /*JP
177                 Strcpy(genbuf, "rat");
178 */
179                 Strcpy(genbuf, "\83l\83Y\83~");
180             break;
181         case PM_WEREJACKAL:
182         case PM_HUMAN_WEREJACKAL:
183             typ = PM_JACKAL;
184             if (genbuf)
185 /*JP
186                 Strcpy(genbuf, "jackal");
187 */
188                 Strcpy(genbuf, "\83W\83\83\83b\83J\83\8b");
189             break;
190         case PM_WEREWOLF:
191         case PM_HUMAN_WEREWOLF:
192             typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF;
193             if (genbuf)
194 /*JP
195                 Strcpy(genbuf, "wolf");
196 */
197                 Strcpy(genbuf, "\98T");
198             break;
199         default:
200             continue;
201         }
202         mtmp = makemon(&mons[typ], u.ux, u.uy, NO_MM_FLAGS);
203         if (mtmp) {
204             total++;
205             if (canseemon(mtmp))
206                 *visible += 1;
207         }
208         if (yours && mtmp)
209             (void) tamedog(mtmp, (struct obj *) 0);
210     }
211     return total;
212 }
213
214 void
215 you_were()
216 {
217     char qbuf[QBUFSZ];
218     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);
219
220     if (Unchanging || (u.umonnum == u.ulycn))
221         return;
222     if (controllable_poly) {
223 #if 0 /*JP*/
224         /* `+4' => skip "were" prefix to get name of beast */
225         Sprintf(qbuf, "Do you want to change into %s?",
226                 an(mons[u.ulycn].mname + 4));
227 #else
228         Sprintf(qbuf, "%s\82É\95Ï\89»\82µ\82Ü\82·\82©\81H",
229                 beastname(mons[u.ulycn].mname));
230 #endif
231         if (yn(qbuf) == 'n')
232             return;
233     }
234     (void) polymon(u.ulycn);
235 }
236
237 void
238 you_unwere(purify)
239 boolean purify;
240 {
241     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);
242
243     if (purify) {
244 /*JP
245         You_feel("purified.");
246 */
247         You("\8fò\82ß\82ç\82ê\82½\82æ\82¤\82È\8bC\82ª\82µ\82½\81D");
248         u.ulycn = NON_PM; /* cure lycanthropy */
249     }
250     if (!Unchanging && is_were(youmonst.data)
251 /*JP
252         && (!controllable_poly || yn("Remain in beast form?") == 'n'))
253 */
254         && (!controllable_poly || yn("\8fb\82Ì\8ep\82Ì\82Ü\82Ü\82Å\82¢\82é\81H") == 'n'))
255         rehumanize();
256 }
257
258 /*were.c*/