Source:NetHack 1.3d/dog.c

Below is the full text to dog.c from the source code of NetHack 1.3d. To link to a particular line, write [[NetHack 1.3d/dog.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /*	SCCS Id: @(#)dog.c	1.3	87/07/14 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* dog.c - version 1.0.3 */ 4.    5.    #include	"hack.h"  6.    extern struct monst *makemon; 7.   #include "edog.h"  8.    #include "mkroom.h"  9. 10.  struct permonst li_dog = 11.  	{ "little dog", 'd',2,18,6,0,1,6,sizeof(struct edog) }; 12.  struct permonst dog = 13.  	{ "dog", 'd',4,16,5,0,1,6,sizeof(struct edog) }; 14.  struct permonst la_dog = 15.  	{ "large dog", 'd',6,15,4,0,2,4,sizeof(struct edog) }; 16.   17.   struct monst * 18.  makedog{ 19.  register struct monst *mtmp = makemon(&li_dog,u.ux,u.uy); 20.  	if(!mtmp) return((struct monst *) 0); /* dogs were genocided */ 21.  	initedog(mtmp); 22.  	return(mtmp); 23.  }  24.    25.   initedog(mtmp) register struct monst *mtmp; { 26.  	mtmp->mtame = mtmp->mpeaceful = 1; 27.  #ifdef WALKIES 28.  	mtmp->mleashed = 0; 29.  #endif 30.  	EDOG(mtmp)->hungrytime = 1000 + moves; 31.  	EDOG(mtmp)->eattime = 0; 32.  	EDOG(mtmp)->droptime = 0; 33.  	EDOG(mtmp)->dropdist = 10000; 34.  	EDOG(mtmp)->apport = 10; 35.  	EDOG(mtmp)->whistletime = 0; 36.  }  37.    38.   /* attach the monsters that went down (or up) together with @ */ 39.  struct monst *mydogs = 0; 40.  struct monst *fallen_down = 0;	/* monsters that fell through a trapdoor */ 41.  	/* they will appear on the next level @ goes to, even if he goes up! */ 42.    43.   losedogs{ 44.  register struct monst *mtmp; 45.  	while(mtmp = mydogs){ 46.  		mydogs = mtmp->nmon; 47.  		mtmp->nmon = fmon; 48.  		fmon = mtmp; 49.  		mnexto(mtmp); 50.  	}  51.   	while(mtmp = fallen_down){ 52.  		fallen_down = mtmp->nmon; 53.  		mtmp->nmon = fmon; 54.  #ifdef WALKIES 55.  		mtmp->mleashed = 0; 56.  #endif 57.  		fmon = mtmp; 58.  		rloc(mtmp); 59.  	}  60.   }  61.    62.   keepdogs{ 63.  register struct monst *mtmp; 64.  	for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 65.  	    if(dist(mtmp->mx,mtmp->my) < 3 && follower(mtmp)  66.   		&& !mtmp->msleep && !mtmp->mfroz) { 67.  #ifdef DGKMOD 68.  		/* Bug "fix" for worm changing levels collapsing dungeon 69.  		 */  70.   		if (mtmp->data->mlet == 'w') { 71.  			if (canseemon(mtmp) || (Blind && Telepat)) 72.  				pline("The worm can't fit down the stairwell!"); 73.  #ifdef WALKIES 74.  			pline("The leash slides off the slimy worm!"); 75.  			mtmp->mleashed = 0; 76.  #endif 77.  			continue; 78.  		}  79.   #endif 80.  		relmon(mtmp); 81.  		mtmp->nmon = mydogs; 82.  		mydogs = mtmp; 83.  		unpmon(mtmp); 84.  		keepdogs;	/* we destroyed the link, so use recursion */ 85.  		return;		/* (admittedly somewhat primitive) */ 86.  	}  87.   }  88.    89.   fall_down(mtmp) register struct monst *mtmp; { 90.  	relmon(mtmp); 91.  	mtmp->nmon = fallen_down; 92.  	fallen_down = mtmp; 93.  #ifdef WALKIES 94.  	if (mtmp->mleashed)  { 95.   96.   		pline("The leash comes off!"); 97.  		mtmp->mleashed = 0; 98.  	}  99.   #endif 100. 	unpmon(mtmp); 101. 	mtmp->mtame = 0; 102. }  103.   104.  /* return quality of food; the lower the better */ 105. dogfood(obj) register struct obj *obj; { 106. 	switch(obj->olet) { 107. 	case FOOD_SYM: 108. 	    return(  109.  		(obj->otyp == TRIPE_RATION) ? DOGFOOD :  110.  		(obj->otyp < CARROT) ? ACCFOOD :  111.  		(obj->otyp < CORPSE) ? MANFOOD :  112.  		(poisonous(obj) || obj->age + 50 <= moves || 113. 		    obj->otyp == DEAD_COCKATRICE)  114.  			? POISON : CADAVER  115.  	    ); 116. 	default: 117. 	    if(!obj->cursed) return(APPORT); 118. 	    /* fall into next case */ 119. 	case BALL_SYM: 120. 	case CHAIN_SYM: 121. 	case ROCK_SYM: 122. 	    return(UNDEF); 123. 	}  124.  }  125.   126.  /* return roomnumber or -1 */ 127. inroom(x,y) xchar x,y; { 128. #ifndef QUEST 129. 	register struct mkroom *croom = &rooms[0]; 130. 	while(croom->hx >= 0){ 131. 		if(croom->hx >= x-1 && croom->lx <= x+1 &&  132.  		   croom->hy >= y-1 && croom->ly <= y+1) 133. 			return(croom - rooms); 134. 		croom++; 135. 	}  136.  #endif 137. 	return(-1);	/* not in room or on door */ 138. }  139.   140.  tamedog(mtmp, obj) 141. register struct monst *mtmp; 142. register struct obj *obj; 143. {  144.  	register struct monst *mtmp2; 145.  146.  	/* worst case, at least he'll be peaceful. */ 147.  	mtmp->mpeaceful = 1; 148. 	if(flags.moonphase == FULL_MOON && night && rn2(6)) 149. 		return(0); 150.  151.  	/* If we cannot tame him, at least he's no longer afraid. */ 152.  	mtmp->mflee = 0; 153. 	mtmp->mfleetim = 0; 154. 	if(mtmp->mtame || mtmp->mfroz ||  155.  #ifndef NOWORM  156.  	   mtmp->wormno ||  157.  #endif  158.  	   mtmp->isshk || mtmp->isgd || index(" @12", mtmp->data->mlet)) 159. 		return(0);			/* no tame long worms? */ 160.  	if(obj) { 161. 		if(dogfood(obj) >= MANFOOD) return(0); 162. 		if(cansee(mtmp->mx,mtmp->my)){ 163. 			pline("%s devours the %s.", Monnam(mtmp),  164.  				objects[obj->otyp].oc_name); 165. 		}  166.  		obfree(obj, (struct obj *) 0); 167. 	}  168.  	mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth); 169. 	*mtmp2 = *mtmp; 170. 	mtmp2->mxlth = sizeof(struct edog); 171. 	if(mtmp->mnamelth) (void) strcpy(NAME(mtmp2), NAME(mtmp)); 172. 	initedog(mtmp2); 173. 	replmon(mtmp,mtmp2); 174. 	return(1); 175. }