Source:Were.c

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. 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. 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 */ 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.    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.    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.   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.   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*/