OSDN Git Service

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