Source:NetHack 3.0.0/timeout.c

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

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

1.   /*	SCCS Id: @(#)timeout.c	3.0	87/07/06 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.   /* He is being petrified - dialogue by inmet!tower */ 8.   static const char *stoned_texts[] = { 9.   	"You are slowing down.",		/* 5 */ 10.  	"Your limbs are stiffening.",		/* 4 */ 11.  	"Your limbs have turned to stone.",	/* 3 */ 12.  	"You have turned to stone.",		/* 2 */ 13.  	"You are a statue." /* 1 */ 14.   };  15.    16.   static void 17.  stoned_dialogue { 18.  	register long i = (Stoned & TIMEOUT); 19.   20.   	if(i > 0 && i <= SIZE(stoned_texts)) 21.  		pline(stoned_texts[SIZE(stoned_texts) - i]); 22.  	if(i == 5) 23.  		Fast &= ~(TIMEOUT|INTRINSIC); 24.  	if(i == 3) 25.  		nomul(-3); 26.  }  27.    28.   static const char *choke_texts[] = { 29.  	"You find it hard to breathe.", 30.  	"You're gasping for air.", 31.  	"You can no longer breathe.", 32.  	"You're turning blue.", 33.  	"You suffocate." 34.  };  35.    36.   static void 37.  choke_dialogue 38.  {  39.   	register long i = (Strangled & TIMEOUT); 40.   41.   	if(i > 0 && i <= SIZE(choke_texts)) 42.  		pline(choke_texts[SIZE(choke_texts) - i]); 43.  }  44.    45.   void 46.  timeout 47.  {  48.   	register struct prop *upp; 49.  	int sleeptime; 50.   51.   	if(Stoned) stoned_dialogue; 52.  	if(Strangled) choke_dialogue; 53.  #ifdef POLYSELF 54.  	if(u.mtimedone) if(!--u.mtimedone) rehumanize; 55.  #endif 56.  	if(u.ucreamed) u.ucreamed--; 57.  	if(u.uluck && moves % (u.uhave_amulet 58.  #ifdef THEOLOGY 59.  		|| u.ugangr 60.  #endif 61.  		? 300 : 600) == 0) {  62.   	/* Cursed luckstones stop bad luck from timing out; blessed luckstones 63.  	 * stop good luck from timing out; normal luckstones stop both; 64.  	 * neither is stopped if you don't have a luckstone. 65.  	 */  66.   	    register int time_luck = stone_luck(FALSE); 67.  	    boolean nostone = !carrying(LUCKSTONE); 68.   69.   	    if(u.uluck > 0 && (nostone || time_luck < 0)) 70.  		u.uluck--; 71.  	    else if(u.uluck < 0 && (nostone || time_luck > 0)) 72.  		u.uluck++; 73.  	}  74.    75.   	for(upp = u.uprops; upp < u.uprops+SIZE(u.uprops); upp++) 76.  	    if((upp->p_flgs & TIMEOUT) && !(--upp->p_flgs & TIMEOUT)) { 77.  		if(upp->p_tofn) (*upp->p_tofn); 78.  		else switch(upp - u.uprops){ 79.  		case STONED: 80.  			killer = "cockatrice"; 81.  			done("stoned"); 82.  			break; 83.  		case SICK: 84.  			You("die from food poisoning."); 85.  			killer = u.usick_cause; 86.  			done("died"); 87.  			break; 88.  		case FAST: 89.  			You("feel yourself slowing down."); 90.  			break; 91.  		case CONFUSION: 92.  			HConfusion = 1; /* So make_confused works properly */ 93.  			make_confused(0L, TRUE); 94.  			break; 95.  		case STUN: 96.  			HStun = 1; 97.  			make_stunned(0L, TRUE); 98.  			break; 99.  		case BLINDED: 100. 			Blinded = 1; 101. 			make_blinded(0L, TRUE); 102. 			break; 103. 		case INVIS: 104. 			on_scr(u.ux,u.uy); 105. 			if (!Invis && !See_invisible) 106. 				You("are no longer invisible."); 107. 			break; 108. 		case WOUNDED_LEGS: 109. 			heal_legs; 110. 			break; 111. 		case HALLUC: 112. 			Hallucination = 1; 113. 			make_hallucinated(0L, TRUE); 114. 			break; 115. 		case SLEEPING: 116. 			if (unconscious || Sleep_resistance) 117. 				Sleeping += rnd(100); 118. 			else { 119. 				You("fall asleep."); 120. 				sleeptime = rnd(20); 121. 				nomul(-sleeptime); 122. 				nomovemsg = "You wake up."; 123. 				Sleeping = sleeptime + rnd(100); 124. 			}  125.  			break; 126. 		case STRANGLED: 127. 			killer = "strangulation"; 128. 			done("died"); 129. 			break; 130. 		case FUMBLING: 131. 			/* call this only when a move took place. */ 132.  			/* otherwise handle fumbling msgs locally. */ 133.  			if (!Levitation && u.umoved) { 134. 			    if (levl[u.ux][u.uy].omask) 135. 				You("trip over something."); 136. 			    else 137. 				switch (rn2(4)) { 138. 				    case 1: 139. 					if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */ 140. 					    if (Hallucination) pline("A rock bites your foot."); 141. 					    else You("trip over a rock."); 142. 					    break; 143. 					}  144.  				    case 2: 145. 					if (Hallucination) You("slip on a banana peel."); 146. 					else You("slip and nearly fall."); 147. 					break; 148. 				    case 3: 149. 					You("flounder."); 150. 					break; 151. 				    default: 152. 					You("stumble."); 153. 				}  154.  			    nomul(-2); 155. 			    nomovemsg = ""; 156. 			}  157.  			Fumbling = rnd(20); 158. 			break; 159. 		}  160.  	}  161.  }  162.   163.  static const char slithy[] = { S_SNAKE, S_NAGA, S_WORM, 0 }; 164.  165.  static void 166. hatch_it(otmp)		/* hatch the egg "otmp" if possible */ 167. register struct obj *otmp; 168. {  169.  	register struct monst *mtmp; 170. #ifdef POLYSELF 171. 	int yours = otmp->spe; 172. #endif 173.  174.  	if(moves-otmp->age > 200)  /* very old egg - it's dead */ 175. 	    otmp->corpsenm = -1; 176. #ifdef LINT	/* long conv. ok */ 177. 	else if(rnd(150) > 150) { 178. #else 179. 	else if(rnd((int)(moves-otmp->age)) > 150) { 180. #endif 181. 	    mtmp = makemon(&mons[big_to_little(otmp->corpsenm)], u.ux, u.uy); 182. 	    useup(otmp); 183. 	    if(mtmp) { 184.  185.  		if(Blind) 186. 		    You("feel something %s from your pack!",  187.  			  (index(slithy, mtmp->data->mlet)) ?  188.  			  "slither" : "drop"); 189. 		else 190. 		    pline("A%s %s just %s out of your pack!",  191.  			  (index(vowels, *(mtmp->data->mname))) ? "n" : "",  192.  			  mtmp->data->mname,  193.  			  (index(slithy, mtmp->data->mlet)) ?  194.  			  "slithered" : "dropped"); 195.  196.  #ifdef POLYSELF 197. 		if (yours) { 198. 		    pline("Its cries sound like \"%s.\"",  199.  			flags.female ? "mommy" : "daddy"); 200. 		    (void) tamedog(mtmp, (struct obj *)0); 201. 		    return; 202. 		}  203.  #endif 204. 		if(mtmp->data->mlet == S_DRAGON) { 205. 		    pline("\"Gleep!\"");		/* Mything eggs :-) */  206.  		    (void) tamedog(mtmp, (struct obj *)0);  207.  		}  208.  	    }  209.  	}  210.  }  211.   212.  void  213.  hatch_eggs	    /* hatch any eggs that have been too long in pack */  214.  {  215.  	register struct obj *otmp,/* *ctmp, /* use of ctmp commented out below*/  216.  		*otmp2;  217.   218.  	for(otmp = invent; otmp; otmp = otmp2) {  219.   220.  	    otmp2 = otmp->nobj;	    /* otmp may hatch */  221.  	    if(otmp->otyp == EGG && otmp->corpsenm >= 0) hatch_it(otmp);  222.  	}  223.   224.  /*	Not yet - there's a slight problem with "useup" on contained objs.  225.  	for(otmp = fcobj; otmp; otmp = otmp2) {  226.   227.  	    otmp2 = otmp->nobj;  228.  	    for(ctmp = invent; ctmp; ctmp = ctmp->nobj)  229.  		if(otmp->cobj == ctmp)  230.  		    if(ctmp->otyp != ICE_BOX)  231.  			if(otmp->otyp == EGG && otmp->corpsenm >= 0) 232. 			    hatch_it(otmp); 233. 	}  234.  */  235.  }