OSDN Git Service

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