Fandom

Wikihack

Source:SLASH'EM 0.0.7E7F2/were.c

2,035pages on
this wiki
Add New Page
Talk0

Below is the full text to were.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/were.c#line123]], for example.

The latest source code for vanilla NetHack is at Source code.


The NetHack General Public License applies to screenshots, source code and other content from NetHack.
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_HUMAN_WEREWOLF:	howler = "wolf";    break;
26.   		    case PM_HUMAN_WEREJACKAL:	howler = "jackal";  break;
27.   		    case PM_HUMAN_WEREPANTHER:	howler = "panther"; break;
28.   		    case PM_HUMAN_WERETIGER:	howler = "tiger";   break;
29.   		    default:			howler = (char *)0; break;
30.   		    }
31.   		    if (howler)
32.   			You_hear("a %s howling at the moon.", howler);
33.   		}
34.   	    }
35.   	} else if (!rn2(30) || Protection_from_shape_changers) {
36.   	    new_were(mon);		/* change back into human form */
37.   	}
38.   }
39.   
40.   #endif /* OVL0 */
41.   #ifdef OVLB
42.   
43.   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.   	    case PM_WEREPANTHER:      return(PM_HUMAN_WEREPANTHER);            
55.   	    case PM_HUMAN_WEREPANTHER:return(PM_WEREPANTHER);
56.   	    case PM_WERETIGER:        return(PM_HUMAN_WERETIGER);
57.   	    case PM_HUMAN_WERETIGER:  return(PM_WERETIGER);
58.   	    case PM_WERESNAKE:        return(PM_HUMAN_WERESNAKE);
59.   	    case PM_HUMAN_WERESNAKE:  return(PM_WERESNAKE);
60.   	    case PM_WERESPIDER:       return(PM_HUMAN_WERESPIDER);
61.   	    case PM_HUMAN_WERESPIDER: return(PM_WERESPIDER);
62.   	    default:		      return(0);
63.   	}
64.   }
65.   
66.   void
67.   new_were(mon)
68.   register struct monst *mon;
69.   {
70.   	register int pm;
71.   
72.   	pm = counter_were(monsndx(mon->data));
73.   	if(!pm) {
74.   	    impossible("unknown lycanthrope %s.", mon->data->mname);
75.   	    return;
76.   	}
77.   
78.   	if(canseemon(mon) && !Hallucination)
79.   	    pline("%s changes into a %s.", Monnam(mon),
80.   			is_human(&mons[pm]) ? "human" :
81.   			mons[pm].mname+4);
82.   
83.   	set_mon_data(mon, &mons[pm], 0);
84.   	if (mon->msleeping || !mon->mcanmove) {
85.   	    /* transformation wakens and/or revitalizes */
86.   	    mon->msleeping = 0;
87.   	    mon->mfrozen = 0;	/* not asleep or paralyzed */
88.   	    mon->mcanmove = 1;
89.   	}
90.   	/* regenerate by 1/4 of the lost hit points */
91.   	mon->mhp += (mon->mhpmax - mon->mhp) / 4;
92.   	newsym(mon->mx,mon->my);
93.   	mon_break_armor(mon, FALSE);
94.   	possibly_unwield(mon, FALSE);
95.   	(void) stop_timer(UNPOLY_MON, (genericptr_t) mon);
96.   	(void) start_timer(rn1(1000,1000), TIMER_MONSTER,
97.   		UNPOLY_MON, (genericptr_t) mon);
98.   }
99.   
100.  int
101.  were_summon(ptr,yours,visible,genbuf)	/* were-creature (even you) summons a horde */
102.  register struct permonst *ptr;
103.  register boolean yours;
104.  int *visible;			/* number of visible helpers created */
105.  char *genbuf;
106.  {
107.  	register int i, typ, pm = monsndx(ptr);
108.  	register struct monst *mtmp;
109.  	int total = 0;
110.  
111.  	*visible = 0;
112.  	if(Protection_from_shape_changers && !yours)
113.  		return 0;
114.  	/*
115.  	 * Allow lycanthropes in normal form to summon hordes as well.  --ALI
116.  	 */
117.  	if (pm == PM_PLAYERMON)
118.  	    pm = urace.malenum;
119.  	for(i = rnd(2); i > 0; i--) {
120.  	   switch(pm) {
121.  
122.  		case PM_WERERAT:
123.  		case PM_HUMAN_WERERAT:
124.  			typ = rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT ;
125.  			if (genbuf) Strcpy(genbuf, "rat");
126.  			break;
127.  		case PM_WEREJACKAL:
128.  		case PM_HUMAN_WEREJACKAL:
129.  			typ = PM_JACKAL;
130.  			if (genbuf) Strcpy(genbuf, "jackal");
131.  			break;
132.  		case PM_WEREWOLF:
133.  		case PM_HUMAN_WEREWOLF:
134.  			typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF ;
135.  			if (genbuf) Strcpy(genbuf, "wolf");
136.  			break;
137.  		case PM_WEREPANTHER:
138.  		case PM_HUMAN_WEREPANTHER:
139.  			typ = rn2(5) ? PM_JAGUAR : PM_PANTHER ;
140.  			if (genbuf) Strcpy(genbuf, "large cat");
141.  			break;
142.  		case PM_WERETIGER:
143.  		case PM_HUMAN_WERETIGER:
144.  			typ = rn2(5) ? PM_JAGUAR : PM_TIGER ;
145.  			if (genbuf) Strcpy(genbuf, "large cat");
146.  			break;
147.  		case PM_WERESNAKE:
148.  		case PM_HUMAN_WERESNAKE:
149.  			typ = rn2(5) ? PM_SNAKE : PM_PIT_VIPER ;
150.  			if (genbuf) Strcpy(genbuf, "snake");
151.  			break;
152.  		case PM_WERESPIDER:
153.  		case PM_HUMAN_WERESPIDER:
154.  			typ = rn2(5) ? PM_CAVE_SPIDER : PM_RECLUSE_SPIDER ;
155.  			if (genbuf) Strcpy(genbuf, "spider");
156.  			break;
157.  		default:
158.  			continue;
159.  	    }
160.  	    mtmp = makemon(&mons[typ], u.ux, u.uy, NO_MM_FLAGS);
161.  	    if (mtmp) {
162.  		total++;
163.  		if (canseemon(mtmp)) *visible += 1;
164.  	    }
165.  	    if (yours && mtmp)
166.  		(void) tamedog(mtmp, (struct obj *) 0);
167.  	}
168.  	return total;
169.  }
170.  
171.  void
172.  you_were()
173.  {
174.  	char qbuf[QBUFSZ];
175.  
176.  	if (Unchanging || (u.umonnum == u.ulycn)) return;
177.  	if (Polymorph_control) {
178.  	    /* `+4' => skip "were" prefix to get name of beast */
179.  	    Sprintf(qbuf, "Do you want to change into %s? ",
180.  		    an(mons[u.ulycn].mname+4));
181.  	    if(yn(qbuf) == 'n') return;
182.  	}
183.  	(void) polymon(u.ulycn);
184.  }
185.  
186.  void
187.  you_unwere(purify)
188.  boolean purify;
189.  {
190.  	boolean in_wereform = (u.umonnum == u.ulycn);
191.  
192.  	if (purify) {
193.  	    if (Race_if(PM_HUMAN_WEREWOLF)) {
194.  		/* An attempt to purify you has been made! */
195.  		if (in_wereform && Unchanging) {
196.  		    killer_format = NO_KILLER_PREFIX;
197.  		    killer = "purified while stuck in creature form";
198.  		    pline_The("purification was deadly...");
199.  		    done(DIED);
200.  		} else {
201.  		    You_feel("very bad!");
202.  		    if (in_wereform)
203.  			rehumanize();
204.  		    (void) adjattrib(A_STR, -rn1(3,3), 2);
205.  		    (void) adjattrib(A_CON, -rn1(3,3), 1);
206.  		    losehp(u.uhp - (u.uhp > 10 ? rnd(5) : 1), "purification",
207.  			    KILLED_BY);
208.  		}
209.  		return;
210.  	    }
211.  	    You_feel("purified.");
212.  	    u.ulycn = NON_PM;	/* cure lycanthropy */
213.  	    upermonst.mflags2 &= ~M2_WERE;
214.  	}
215.  	if (!Unchanging && in_wereform &&
216.  		(!Polymorph_control || yn("Remain in beast form?") == 'n'))
217.  	    rehumanize();
218.  }
219.  
220.  #endif /* OVLB */
221.  
222.  /*were.c*/

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.