Below is the full text to src/were.c from NetHack 3.4.3. To link to a particular line, write [[were.c#line123]], for example.
Top of file
Edit
1. /* SCCS Id: @(#)were.c 3.4 2002/11/07 */
2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3. /* NetHack may be freely redistributed. See license for details. */
4.
5. #include "hack.h"
6.
were_change
Edit
7. #ifdef OVL0
8.
9. void
10. were_change(mon)
11. register struct monst *mon;
12. {
13. if (!is_were(mon->data))
14. return;
15.
16. if (is_human(mon->data)) {
17. if (!Protection_from_shape_changers &&
18. !rn2(night() ? (flags.moonphase == FULL_MOON ? 3 : 30)
19. : (flags.moonphase == FULL_MOON ? 10 : 50))) {
20. new_were(mon); /* change into animal form */
21. if (flags.soundok && !canseemon(mon)) {
22. const char *howler;
23.
24. switch (monsndx(mon->data)) {
25. case PM_WEREWOLF: howler = "wolf"; break;
26. case PM_WEREJACKAL: howler = "jackal"; break;
27. default: howler = (char *)0; break;
28. }
29. if (howler)
30. You_hear("a %s howling at the moon.", howler);
31. }
32. }
33. } else if (!rn2(30) || Protection_from_shape_changers) {
34. new_were(mon); /* change back into human form */
35. }
36. }
37.
38. #endif /* OVL0 */
counter_were
Edit
39. #ifdef OVLB
40.
41. STATIC_DCL int FDECL(counter_were,(int));
42.
43. STATIC_OVL int
44. counter_were(pm)
45. int pm;
46. {
47. switch(pm) {
48. case PM_WEREWOLF: return(PM_HUMAN_WEREWOLF);
49. case PM_HUMAN_WEREWOLF: return(PM_WEREWOLF);
50. case PM_WEREJACKAL: return(PM_HUMAN_WEREJACKAL);
51. case PM_HUMAN_WEREJACKAL: return(PM_WEREJACKAL);
52. case PM_WERERAT: return(PM_HUMAN_WERERAT);
53. case PM_HUMAN_WERERAT: return(PM_WERERAT);
54. default: return(0);
55. }
56. }
57.
new_were
Edit
58. void
59. new_were(mon)
60. register struct monst *mon;
61. {
62. register int pm;
63.
64. pm = counter_were(monsndx(mon->data));
65. if(!pm) {
66. impossible("unknown lycanthrope %s.", mon->data->mname);
67. return;
68. }
69.
70. if(canseemon(mon) && !Hallucination)
71. pline("%s changes into a %s.", Monnam(mon),
72. is_human(&mons[pm]) ? "human" :
73. mons[pm].mname+4);
74.
75. set_mon_data(mon, &mons[pm], 0);
76. if (mon->msleeping || !mon->mcanmove) {
77. /* transformation wakens and/or revitalizes */
78. mon->msleeping = 0;
79. mon->mfrozen = 0; /* not asleep or paralyzed */
80. mon->mcanmove = 1;
81. }
82. /* regenerate by 1/4 of the lost hit points */
83. mon->mhp += (mon->mhpmax - mon->mhp) / 4;
84. newsym(mon->mx,mon->my);
85. mon_break_armor(mon, FALSE);
86. possibly_unwield(mon, FALSE);
87. }
88.
were_summon
Edit
89. int
90. were_summon(ptr,yours,visible,genbuf) /* were-creature (even you) summons a horde */
91. register struct permonst *ptr;
92. register boolean yours;
93. int *visible; /* number of visible helpers created */
94. char *genbuf;
95. {
96. register int i, typ, pm = monsndx(ptr);
97. register struct monst *mtmp;
98. int total = 0;
99.
100. *visible = 0;
101. if(Protection_from_shape_changers && !yours)
102. return 0;
103. for(i = rnd(5); i > 0; i--) {
104. switch(pm) {
105.
106. case PM_WERERAT:
107. case PM_HUMAN_WERERAT:
108. typ = rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT ;
109. if (genbuf) Strcpy(genbuf, "rat");
110. break;
111. case PM_WEREJACKAL:
112. case PM_HUMAN_WEREJACKAL:
113. typ = PM_JACKAL;
114. if (genbuf) Strcpy(genbuf, "jackal");
115. break;
116. case PM_WEREWOLF:
117. case PM_HUMAN_WEREWOLF:
118. typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF ;
119. if (genbuf) Strcpy(genbuf, "wolf");
120. break;
121. default:
122. continue;
123. }
124. mtmp = makemon(&mons[typ], u.ux, u.uy, NO_MM_FLAGS);
125. if (mtmp) {
126. total++;
127. if (canseemon(mtmp)) *visible += 1;
128. }
129. if (yours && mtmp)
130. (void) tamedog(mtmp, (struct obj *) 0);
131. }
132. return total;
133. }
134.
you_were
Edit
135. void
136. you_were()
137. {
138. char qbuf[QBUFSZ];
139.
140. if (Unchanging || (u.umonnum == u.ulycn)) return;
141. if (Polymorph_control) {
142. /* `+4' => skip "were" prefix to get name of beast */
143. Sprintf(qbuf, "Do you want to change into %s? ",
144. an(mons[u.ulycn].mname+4));
145. if(yn(qbuf) == 'n') return;
146. }
147. (void) polymon(u.ulycn);
148. }
149.
you_unwere
Edit
150. void
151. you_unwere(purify)
152. boolean purify;
153. {
154. if (purify) {
155. You_feel("purified.");
156. u.ulycn = NON_PM; /* cure lycanthropy */
157. }
158. if (!Unchanging && is_were(youmonst.data) &&
159. (!Polymorph_control || yn("Remain in beast form?") == 'n'))
160. rehumanize();
161. }
162.
163. #endif /* OVLB */
164.
165. /*were.c*/