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[]
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.
The NetHack General Public License applies to screenshots, source code and other content from NetHack. |
5. #include "hack.h" 6.
were_change[]
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[]
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[]
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[]
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[]
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[]
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*/