Source:NetHack 3.1.0/timeout.c

Below is the full text to timeout.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.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.1	92/11/01	*/ 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.   STATIC_DCL void NDECL(stoned_dialogue); 8.   STATIC_DCL void NDECL(vomiting_dialogue); 9.   STATIC_DCL void NDECL(choke_dialogue); 10.  STATIC_DCL void FDECL(hatch_it, (struct obj *)); 11.   12.   static void FDECL(age_candle, (struct obj *)); 13.   14.   #ifdef OVLB 15.   16.   /* He is being petrified - dialogue by inmet!tower */ 17.  static const char NEARDATA *stoned_texts[] = { 18.  	"You are slowing down.",		/* 5 */ 19.  	"Your limbs are stiffening.",		/* 4 */ 20.  	"Your limbs have turned to stone.",	/* 3 */ 21.  	"You have turned to stone.",		/* 2 */ 22.  	"You are a statue." /* 1 */ 23.   };  24.    25.   STATIC_OVL void 26.  stoned_dialogue { 27.  	register long i = (Stoned & TIMEOUT); 28.   29.   	if(i > 0 && i <= SIZE(stoned_texts)) 30.  		pline(stoned_texts[SIZE(stoned_texts) - i]); 31.  	if(i == 5) 32.  		Fast &= ~(TIMEOUT|INTRINSIC); 33.  	if(i == 3) 34.  		nomul(-3); 35.  	exercise(A_DEX, FALSE); 36.  }  37.    38.   /* He is getting sicker and sicker prior to vomiting */ 39.  static const char NEARDATA *vomiting_texts[] = { 40.  	"You are feeling mildly nauseous.",	/* 14 */ 41.  	"You feel slightly confused.",		/* 11 */ 42.  	"You can't seem to think straight.",	/* 8 */ 43.  	"You feel incredibly sick.",		/* 5 */ 44.  	"You suddenly vomit!" /* 2 */ 45.   };  46.    47.   STATIC_OVL void 48.  vomiting_dialogue { 49.  	register long i = (Vomiting & TIMEOUT) / 3L; 50.   51.   	if ((((Vomiting & TIMEOUT) % 3L) == 2) && (i >= 0)  52.   	    && (i < SIZE(vomiting_texts))) 53.  		pline(vomiting_texts[SIZE(vomiting_texts) - i - 1]); 54.   55.   	switch ((int) i) { 56.  	case 0: 57.  		vomit; 58.  		morehungry(20); 59.  		break; 60.  	case 2: 61.  		make_stunned(HStun + d(2,4), FALSE); 62.  		/* fall through */ 63.  	case 3: 64.  		make_confused(HConfusion + d(2,4), FALSE); 65.  		break; 66.  	}  67.   	exercise(A_CON, FALSE); 68.  }  69.    70.   static const char NEARDATA *choke_texts[] = { 71.  	"You find it hard to breathe.", 72.  	"You're gasping for air.", 73.  	"You can no longer breathe.", 74.  	"You're turning %s.", 75.  	"You suffocate." 76.  };  77.    78.   STATIC_OVL void 79.  choke_dialogue 80.  {  81.   	register long i = (Strangled & TIMEOUT); 82.   83.   	if(i > 0 && i <= SIZE(choke_texts)) 84.  		pline(choke_texts[SIZE(choke_texts) - i], Hallucination ?  85.   			hcolor : blue); 86.  	exercise(A_STR, FALSE); 87.  }  88.    89.   #endif /* OVLB */ 90.  #ifdef OVL0 91.   92.   void 93.  nh_timeout 94.  {  95.   	register struct prop *upp; 96.  	int sleeptime; 97.   98.   	if(u.uluck && moves % (u.uhave.amulet || u.ugangr ? 300 : 600) == 0) { 99.   	/* Cursed luckstones stop bad luck from timing out; blessed luckstones 100. 	 * stop good luck from timing out; normal luckstones stop both; 101. 	 * neither is stopped if you don't have a luckstone. 102. 	 * Luck is based at 0 usually, +1 if a full moon and -1 on Friday 13th 103. 	 */  104.  	    register int time_luck = stone_luck(FALSE); 105. 	    boolean nostone = !carrying(LUCKSTONE) && !stone_luck(TRUE); 106. 	    int baseluck = (flags.moonphase == FULL_MOON) ? 1 : 0; 107.   108.  	    baseluck -= (flags.friday13 ? 1 : 0); 109.  110.  	    if(u.uluck > baseluck && (nostone || time_luck < 0)) 111. 		u.uluck--; 112. 	    else if(u.uluck < baseluck && (nostone || time_luck > 0)) 113. 		u.uluck++; 114. 	}  115.  	if(u.uinvulnerable) return; /* things past this point could kill you */ 116. 	if(Stoned) stoned_dialogue; 117. 	if(Vomiting) vomiting_dialogue; 118. 	if(Strangled) choke_dialogue; 119. #ifdef POLYSELF 120. 	if(u.mtimedone) if(!--u.mtimedone) rehumanize; 121. #endif 122. 	if(u.ucreamed) u.ucreamed--; 123.  124.  	for(upp = u.uprops; upp < u.uprops+SIZE(u.uprops); upp++) 125. 	    if((upp->p_flgs & TIMEOUT) && !(--upp->p_flgs & TIMEOUT)) { 126. 		if(upp->p_tofn) (*upp->p_tofn); 127. 		else switch(upp - u.uprops){ 128. 		case STONED: 129. 			if (!killer) { 130. 				killer_format = KILLED_BY_AN; 131. 				killer = "cockatrice"; 132. 			} done(STONING); 133. 			break; 134. 		case VOMITING: 135. 			make_vomiting(0L, TRUE); 136. 			break; 137. 		case SICK: 138. 			You("die from your illness."); 139. 			killer_format = KILLED_BY_AN; 140. 			killer = u.usick_cause; 141. 			done(POISONING); 142. 			break; 143. 		case FAST: 144. 			if (Fast & ~INTRINSIC) /* boot speed */ 145. 				;  146.  			else 147. 				You("feel yourself slowing down%s.",  148.  							Fast ? " a bit" : ""); 149. 			break; 150. 		case CONFUSION: 151. 			HConfusion = 1; /* So make_confused works properly */ 152. 			make_confused(0L, TRUE); 153. 			stop_occupation; 154. 			break; 155. 		case STUNNED: 156. 			HStun = 1; 157. 			make_stunned(0L, TRUE); 158. 			stop_occupation; 159. 			break; 160. 		case BLINDED: 161. 			Blinded = 1; 162. 			make_blinded(0L, TRUE); 163. 			stop_occupation; 164. 			break; 165. 		case INVIS: 166. 			newsym(u.ux,u.uy); 167. 			if (!Invis && !See_invisible && !Blind) 168. 				You("are no longer invisible."); 169. 			stop_occupation; 170. 			break; 171. 		case SEE_INVIS: 172. 			set_mimic_blocking; /* do special mimic handling */ 173. 			see_monsters;		/* make invis mons appear */ 174. 			newsym(u.ux,u.uy);	/* make self appear */ 175. 			stop_occupation; 176. 			break; 177. 		case WOUNDED_LEGS: 178. 			heal_legs; 179. 			stop_occupation; 180. 			break; 181. 		case HALLUC: 182. 			HHallucination = 1; 183. 			make_hallucinated(0L, TRUE, 0L); 184. 			stop_occupation; 185. 			break; 186. 		case SLEEPING: 187. 			if (unconscious || Sleep_resistance) 188. 				Sleeping += rnd(100); 189. 			else { 190. 				You("fall asleep."); 191. 				sleeptime = rnd(20); 192. 				nomul(-sleeptime); 193. 				u.usleep = 1; 194. 				nomovemsg = "You wake up."; 195. 				Sleeping = sleeptime + rnd(100); 196. 			}  197.  			break; 198. 		case STRANGLED: 199. 			killer_format = KILLED_BY; 200. 			killer = "strangulation"; 201. 			done(DIED); 202. 			break; 203. 		case FUMBLING: 204. 			/* call this only when a move took place. */ 205.  			/* otherwise handle fumbling msgs locally. */ 206.  			if (!Levitation && u.umoved) { 207. 			    if (OBJ_AT(u.ux, u.uy)) 208. 				You("trip over something."); 209. 			    else if (rn2(3) && is_ice(u.ux, u.uy)) 210. 				You("%s on the ice.",  211.  				    rn2(2) ? "slip" : "slide"); 212. 			    else 213. 				switch (rn2(4)) { 214. 				    case 1: 215. 					if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */ 216. 					    if (Hallucination) pline("A rock bites your foot."); 217. 					    else You("trip over a rock."); 218. 					    break; 219. 					}  220.  				    case 2: 221. 					if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */ 222. 					    if (Hallucination) You("slip on a banana peel."); 223. 					    else You("slip and nearly fall."); 224. 					    break; 225. 					}  226.  				    case 3: 227. 					You("flounder."); 228. 					break; 229. 				    default: 230. 					You("stumble."); 231. 				}  232.  			    nomul(-2); 233. 			    nomovemsg = ""; 234. 			    /* Fumbling can be noisy */ 235. 			    if ((inv_weight > -500)) { 236. 			    	You("make a lot of noise!"); 237. 			    	wake_nearby; 238. 			    }  239.  			}  240.  			Fumbling += rnd(20); 241. 			break; 242. 		}  243.  	}  244.  }  245.   246.  #endif /* OVL0 */ 247. #ifdef OVLB 248.  249.  STATIC_OVL void 250. hatch_it(otmp)		/* hatch the egg "otmp" if possible */ 251. register struct obj *otmp; 252. {  253.  	register struct monst *mtmp; 254. #ifdef POLYSELF 255. 	int yours = otmp->spe; 256. #endif 257.  258.  	if(monstermoves-otmp->age > 200)  /* very old egg - it's dead */ 259. 	    otmp->corpsenm = -1; 260. #ifdef LINT	/* long conv. ok */ 261. 	else if(rnd(150) > 150) { 262. #else 263. 	else if(rnd((int)(monstermoves-otmp->age)) > 150) { 264. #endif 265. 	    mtmp = makemon(&mons[big_to_little(otmp->corpsenm)], u.ux, u.uy); 266. 	    useup(otmp); 267. 	    if(mtmp) { 268.  269.  		if(Blind) 270. 		    You("feel something %s from your pack!",  271.  			locomotion(mtmp->data, "drop")); 272. 		else 273. 		    You("see %s %s out of your pack!",  274.  			an(mtmp->data->mname),  275.  			locomotion(mtmp->data, "drop")); 276.  277.  #ifdef POLYSELF 278. 		if (yours) { 279. 		    struct monst *mtmp2; 280.  281.  		    pline("Its cries sound like \"%s.\"",  282.  			flags.female ? "mommy" : "daddy"); 283. 		    if (mtmp2 = tamedog(mtmp, (struct obj *)0)) 284. 			mtmp = mtmp2; 285. 		    mtmp->mtame = 20; 286. 		    while(otmp = (mtmp->minvent)) { 287. 			mtmp->minvent = otmp->nobj; 288. 			dealloc_obj(otmp); 289. 		    }  290.  		    return; 291. 		}  292.  #endif 293. 		if(mtmp->data->mlet == S_DRAGON) { 294. 		    struct monst *mtmp2; 295.  296.  		    verbalize("Gleep!");		/* Mything eggs :-) */  297.  		    if (mtmp2 = tamedog(mtmp, (struct obj *)0))  298.  			mtmp = mtmp2;  299.  		    while(otmp = (mtmp->minvent)) {  300.  			mtmp->minvent = otmp->nobj;  301.  			dealloc_obj(otmp);  302.  		    }  303.  		}  304.  	    }  305.  	}  306.  }  307.   308.  #endif /* OVLB */  309.  #ifdef OVL1  310.   311.  void  312.  hatch_eggs	    /* hatch any eggs that have been too long in pack */  313.  {  314.  	register struct obj *otmp, *otmp2;  315.   316.  	for(otmp = invent; otmp; otmp = otmp2) {  317.  	    otmp2 = otmp->nobj;	    /* otmp may hatch */  318.  	    if(otmp->otyp == EGG && otmp->corpsenm >= 0) hatch_it(otmp);  319.  	    /* else if (Is_container(otmp) && otmp->cobj) ...		*/  320.  	    /*								*/  321.  	    /* Check for container here and hatch with the container.	*/  322.  	    /* One of these days... */ 323.  	    /* Maybe call hatch_eggs with invent as a parameter so	*/ 324. 	    /* that we can call it recursively. */ 325.  	}  326.  }  327.   328.  /* Burn up lit lamps. Only applies to non-magic lamps; magic lamps stay 329.  * lit as long as there's a genie inside. We use obj->age to see how long 330.  * there is left for the lamp to burn, but this differs from the use of  331. * age for corpses and eggs: for the latter items it's when the object was 332.  * created, but for lamps it's the number of moves remaining. 333.  */  334.  void 335. burn_lamps 336. {  337.  	register struct obj *obj; 338.  339.  	/* Note: magic lamps never go out as long as the genie's inside */ 340. 	for(obj=invent; obj; obj=obj->nobj) { 341. 	    if ((obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN)  342.  							&& obj->lamplit) { 343. 		obj->age--; 344. 		switch((int)obj->age) { 345. 		    case 150: 346. 		    case 100: 347. 			if (obj->otyp == BRASS_LANTERN) goto advmsg; 348. 			if (!Blind) 349. 			    Your("%s flickers.", xname(obj)); 350. 			break; 351. 		    case 50: 352. 			if (obj->otyp == BRASS_LANTERN) goto advmsg; 353. 			if (!Blind) 354. 			    Your("%s flickers considerably.", xname(obj)); 355. 			break; 356. 		    case 25: 357. 	advmsg:		if (!Blind) { 358. 			    if (obj->otyp == BRASS_LANTERN) { 359. 				Your("lamp is getting dim."); 360. 				if (Hallucination) 361. 				    pline("Batteries have not been invented yet."); 362. 			    } else 363. 				Your("%s seems about to go out.", xname(obj)); 364. 			}  365.  			break; 366. 		    case 0: /* even if blind you'll know */ 367. 			if (obj->otyp == BRASS_LANTERN) 368. 				Your("lamp has run out of power."); 369. 			else Your("%s goes out.", xname(obj)); 370. 			obj->lamplit = 0; 371. 			obj->spe = 0; 372. 			check_lamps; 373. 			break; 374. 		    default: break; 375. 		}  376.  	    }  377.  	    if ((obj->otyp == CANDELABRUM_OF_INVOCATION || Is_candle(obj)) &&  378.  			obj->lamplit) 379. 		age_candle(obj); 380. 	}  381.  }  382.   383.  static void 384. age_candle(otmp) 385. register struct obj *otmp; 386. {  387.  	register boolean many, 388. 	                 menorah = otmp->otyp == CANDELABRUM_OF_INVOCATION; 389.  390.  	otmp->age--; 391.  392.  	if (otmp->age == 0L) { 393. 	    otmp->lamplit = 0; 394. 	    many = menorah ? otmp->spe > 1 : otmp->quan > 1L; 395. 	    if (menorah) { 396. 		pline("%s's flame%s.",  397.  			The(xname(otmp)), (many ? "s die" : " dies")); 398. 		otmp->spe = 0; 399. 	    } else { 400. 		Your("%s %s consumed!  %s",  401.  			xname(otmp), (many ? "are" : "is"), 402.  			(Hallucination ? 403. 			    (many ? "They shriek!" : "It shrieks!") : 404. 			 Blind ? "" : 405.  			    (many ? "Their flames die." : "Its flame dies."))); 406. 		freeinv(otmp); 407. 		obfree(otmp, (struct obj *)0); 408. 	    }  409.  	    check_lamps; 410. 	} else if (Blind) { 411. 	    return; 412. 	} else if (otmp->age == 15L) { 413. 	    many = menorah ? otmp->spe > 1 : otmp->quan > 1L; 414. 	    Norep("The %scandle%s flame%s flicker%s low!",  415.  			(menorah ? "candelabrum's " : ""), 416.  			(many ? "s'" : "'s"), 417.  			(many ? "s" : ""), 418.  			(many ? "" : "s")); 419. 	} else if (otmp->age == 75L) { 420. 	    many = menorah ? otmp->spe > 1 : otmp->quan > 1L; 421. 	    Norep("The %scandle%s getting short.",  422.  			menorah ? "candelabrum's " : "",  423.  			(many ? "s are" : " is")); 424. 	}  425.  }  426.  void 427. do_storms 428. {  429.      int nstrike; 430.     register int x, y;  431. int dirx, diry; 432.     int count; 433.  434.      /* no lightning if not the air level or too often, even then */ 435.     if(!Is_airlevel(&u.uz) || rn2(8)) 436. 	return; 437.  438.      /* the number of strikes is 8-log2(nstrike) */ 439.     for(nstrike = rnd(64); nstrike <= 64; nstrike *= 2) { 440. 	count = 0; 441. 	do { 442. 	    x = rnd(COLNO-1); 443. 	    y = rn2(ROWNO); 444. 	} while (++count < 100 && levl[x][y].typ != CLOUD); 445.  446.  	if(count < 100) { 447. 	    dirx = rn2(3) - 1; 448. 	    diry = rn2(3) - 1; 449. 	    if(dirx != 0 || diry != 0) 450. 		buzz(-15, /* "monster" LIGHTNING spell */  451.  		     8, x, y, dirx, diry); 452. 	}  453.      }  454.   455.      if(levl[u.ux][u.uy].typ == CLOUD) { 456. 	/* inside a cloud during a thunder storm is deafening */ 457. 	pline("Kaboom!!!  Boom!!  Boom!!"); 458. 	if(!u.uinvulnerable) { 459. 	    stop_occupation; 460. 	    nomul(-3); 461. 	}  462.      } else 463. 	You("hear a rumbling noise."); 464. }  465.  #endif /* OVL1 */ 466.  467.  /*timeout.c*/