Source:NetHack 3.1.0/allmain.c

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

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

1.   /*	SCCS Id: @(#)allmain.c	3.1	92/11/13	*/ 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* NetHack may be freely redistributed. See license for details. */ 4.     5.    /* various code that was replicated in *main.c */ 6.    7.    #include "hack.h"  8. 9.   #ifndef NO_SIGNAL 10.  #include   11. #endif 12.   13.   #ifdef OVL0 14.   15.   void 16.  moveloop 17.  {  18.   #ifdef MICRO 19.  	char ch; 20.  	int abort_lev; 21.  #endif 22.  	int moverate = 0; 23.  	boolean didmove = 0; 24.   25.   	/* Note:  these initializers don't do anything except guarantee that 26.  		we're linked properly. 27.  	*/  28.   	decl_init; 29.  	monst_init; 30.  	monstr_init;	/* monster strengths */ 31.  	objects_init; 32.   33.   #ifdef MULDGN 34.  	quest_init;	/* set up dynamic quest data */ 35.  #endif 36.   37.   	(void) encumber_msg; /* in case they auto-picked up something */ 38.   39.   	for { 40.  #ifdef CLIPPING 41.  		cliparound(u.ux, u.uy); 42.  #endif 43.  #if defined(MAC_MPW32) && !defined(MODEL_FAR) 44.  		UnloadAllSegments;  /* Marks non-resident segments as purgeable */ 45.  #endif 46.  		get_nh_event; 47.   48.   		didmove = flags.move; 49.  		if(flags.move) {	/* actual time passed */ 50.  		    int wtcap; 51.   52.   		    if (u.utotype) deferred_goto; 53.  		    wtcap = encumber_msg; 54.   55.   #ifdef SOUNDS 56.  		    dosounds; 57.  #endif 58.   59.   		    if(moverate <= 0) { 60.  			/* calculate how much time passed. */ 61.   			int moveamt = 0; 62.  			if(Fast & ~INTRINSIC) moveamt = 6; 63.  			else if(Fast) moveamt = 8; 64.  			else moveamt = 12; 65.   66.   			switch(wtcap) { 67.  			case UNENCUMBERED: break; 68.  			case SLT_ENCUMBER: moveamt = (moveamt * 4) / 3; break; 69.  			case MOD_ENCUMBER: moveamt *= 2; break; 70.  			case HVY_ENCUMBER: moveamt *= 4; break; 71.  			default: moveamt *= 12; break; 72.  			}  73.   			moverate += moveamt; 74.  			settrack; 75.  		    }  76.    77.   		    if(moverate > 0) { 78.  			movemon; 79.  			/* a monster may have levteleported player -dlc */ 80.  			if (u.utotype) deferred_goto; 81.  			if(!rn2(u.uevent.udemigod ? 25 : 82.   				(depth(&u.uz) >  83.   				 depth(&stronghold_level)) 84.  				? 50 : 70))  85.   			    (void) makemon((struct permonst *)0, 0, 0); 86.  			++monstermoves; 87.  			remove_cadavers(&fobj); 88.  			remove_cadavers(&invent); 89.  			moverate -= 12; 90.  		    }  91.   		    if(Glib) glibr; 92.  		    nh_timeout; 93.  		    ++moves; 94.  		    if (u.ublesscnt)  u.ublesscnt--; 95.  		    if(flags.time) flags.botl = 1; 96.  #ifdef POLYSELF 97.  		    if (u.mtimedone && u.mh < u.mhmax) { 98.  			if (u.mh < 1) { 99.  			    rehumanize; 100. 			    moverate = 0; 101. 			} else if (Regeneration ||  102.  				 (wtcap < MOD_ENCUMBER && !(moves%20))) { 103. 			    flags.botl = 1; 104. 			    u.mh++; 105. 			}  106.  		    } else 107. #endif 108. 		    if(u.uhp < u.uhpmax) { 109. 			if(u.ulevel > 9) { 110. 			    int heal; 111.  112.  			    if(HRegeneration ||  113.  			       (!(moves%3) && 114. 				(wtcap < MOD_ENCUMBER || !flags.mv))) { 115. 				flags.botl = 1; 116. 				if (ACURR(A_CON) <= 12) heal = 1; 117. 				else heal = rnd((int) ACURR(A_CON)-12); 118. 				if (heal > u.ulevel-9) heal = u.ulevel-9; 119. 				u.uhp += heal; 120. 				if(u.uhp > u.uhpmax) 121. 				    u.uhp = u.uhpmax; 122. 			    }  123.  			} else if(HRegeneration ||  124.  				  ((wtcap < MOD_ENCUMBER || !flags.mv) && 125. 				   (!(moves%((MAXULEV+12)/(u.ulevel+2)+1))))) { 126. 			    flags.botl = 1; 127. 			    u.uhp++; 128. 			}  129.  		    }  130.   131.  		    if (wtcap > MOD_ENCUMBER && flags.mv) { 132. 			if(!(wtcap < EXT_ENCUMBER ? moves%30 : moves%10)) { 133. 			    if(u.uhp > 1) { 134. 				u.uhp--; 135. 			    } else { 136. 				pline("You pass out from exertion!"); 137. 				exercise(A_CON, FALSE); 138. 				nomul(-10); 139. 				u.usleep = 1; 140. 			    }  141.  			}  142.  		    }  143.   144.  		    if ((u.uen < u.uenmax) &&  145.  			((wtcap < MOD_ENCUMBER &&  146.  			  (!(moves%((MAXULEV + 1 - u.ulevel) * 147. 				    (pl_character[0] == 'W' ? 3 : 4) / 2)))) 148. 			 || Energy_regeneration)) { 149. 			u.uen += 150. 			    rn1((int)(ACURR(A_WIS) + ACURR(A_INT)) / 10 + 1,1); 151. 			if (u.uen > u.uenmax)  u.uen = u.uenmax; 152. 			flags.botl = 1; 153. 		    }  154.   155.  		    if(!u.uinvulnerable) { 156. 			if(Teleportation && !rn2(85)) tele; 157. #ifdef POLYSELF 158. 			if(Polymorph && !rn2(100)) { 159. 			    if (multi >= 0) { 160. 				if (occupation) 161. 				    stop_occupation; 162. 				else 163. 				    nomul(0); 164. 			    }  165.  			    polyself; 166. 			    moverate = 0; 167. 			} else if (u.ulycn >= 0 && !rn2(80 - (20 * night))) { 168. 			    if (multi >= 0) { 169. 				if (occupation) 170. 				    stop_occupation; 171. 				else 172. 				    nomul(0); 173. 			    }  174.  			    you_were; 175. 			    moverate = 0; 176. 			}  177.  #endif 178. 		    }  179.   180.  		    if(Searching && multi >= 0) (void) dosearch0(1); 181. 		    do_storms; 182. 		    hatch_eggs; 183. 		    burn_lamps; 184. 		    gethungry; 185. 		    exerchk; 186. 		    invault; 187. 		    amulet; 188. 		    if (!rn2(40+(int)(ACURR(A_DEX)*3))) 189. 			u_wipe_engr(rnd(3)); 190. 		    if (u.uevent.udemigod && !u.uinvulnerable) { 191. 			if (u.udg_cnt) u.udg_cnt--; 192. 			if (!u.udg_cnt) { 193. 			    intervene; 194. 			    u.udg_cnt = rn1(200, 50); 195. 			}  196.  		    }  197.  		    restore_attrib; 198. 		    /* underwater and waterlevel vision are done here */ 199. 		    if (Is_waterlevel(&u.uz)) 200. 			movebubbles; 201. 		    else if (Underwater) 202. 			under_water(0); 203.  204.  		}  205.  		if(multi < 0) { 206. 			if(!++multi){ 207. 				pline(nomovemsg ? nomovemsg :  208.  					(const char *)"You can move again."); 209. 				nomovemsg = 0; 210. 				u.usleep = 0; 211. 				if(afternmv) (*afternmv); 212. 				afternmv = 0; 213. 			}  214.  		}  215.   216.  		find_ac; 217. 		if(!flags.mv || Blind) { 218. 		    /* redo monsters if hallu or wearing a helm of telepathy */ 219. 		    if (Hallucination ||  220.  			(HTelepat & (WORN_HELMET|WORN_AMUL|W_ART))) 221. 			see_monsters; 222.  223.  		    /* redo objects if hallucinating */ 224. 		    if (Hallucination) see_objects; 225.  226.  		    /* update swallowed display */ 227. 		    if (Hallucination && u.uswallow) swallowed(0); 228.  229.  		    if (vision_full_recalc) vision_recalc(0);	/* vision! */ 230.  		}  231.  		if(flags.botl || flags.botlx) bot; 232.  233.  		flags.move = 1; 234.  235.  		if(multi >= 0 && occupation) { 236. #ifdef MICRO 237. 			abort_lev = 0; 238. 			if (kbhit) { 239. 				if ((ch = Getchar) == ABORT) 240. 					abort_lev++; 241. # ifdef REDO 242. 				else 243. 					pushch(ch); 244. # endif /* REDO */ 245. 			}  246.  			if (!abort_lev && (*occupation) == 0) 247. #else 248. 			if ((*occupation) == 0) 249. #endif 250. 				occupation = 0; 251. 			if(  252.  #ifdef MICRO  253.  			   abort_lev ||  254.  #endif  255.  			   monster_nearby) { 256. 				stop_occupation; 257. 				reset_eat; 258. 			}  259.  #ifdef MICRO 260. 			if (!(++occtime % 7)) 261. 				display_nhwindow(WIN_MAP, FALSE); 262. #endif 263. 			continue; 264. 		}  265.   266.  		if((u.uhave.amulet || Clairvoyant) && !In_endgame(&u.uz) &&  267.  						!(moves%15) && !rn2(2)) 268. 			do_vicinity_map; 269.  270.  		if(u.utrap && u.utraptype == TT_LAVA) { 271. 		    if(!is_lava(u.ux,u.uy)) 272. 			u.utrap = 0; 273. 		    else { 274. 			u.utrap -= 1<<8; 275. 			if(u.utrap < 1<<8) { 276. 			    killer_format = KILLED_BY; 277. 			    killer = "molten lava"; 278. 			    You("sink below the surface and suffocate."); 279. 			    done(DROWNING); /*whatever*/ 280. 			} else if(didmove && !u.umoved) { 281. 			    Norep("You sink deeper into the lava."); 282. 			    u.utrap += rnd(4); 283. 			}  284.  		    }  285.  		}  286.   287.  		u.umoved = FALSE; 288. 		if(!didmove || moverate <= 0) { 289. 		    if(multi > 0) { 290. 			lookaround; 291. 			if(!multi) {	/* lookaround may clear multi */ 292. 				flags.move = 0; 293. 				continue; 294. 			}  295.  			if(flags.mv) { 296. 				if(multi < COLNO && !--multi) 297. 					flags.mv = flags.run = 0; 298. 				domove; 299. 			} else { 300. 				--multi; 301. 				rhack(save_cm); 302. 			}  303.  		    } else if(multi == 0) { 304. #ifdef MAIL 305. 			ckmailstatus; 306. #endif 307. 			rhack(NULL); 308. 		    }  309.  		}  310.  		if (vision_full_recalc) vision_recalc(0);	/* vision! */ 311.  		if(multi && multi%7 == 0) 312. 			display_nhwindow(WIN_MAP, FALSE); 313. 	}  314.  }  315.   316.  #endif /* OVL0 */ 317. #ifdef OVL1 318.  319.  void 320. stop_occupation 321. {  322.  	if(occupation) { 323. 		You("stop %s.", occtxt); 324. 		occupation = 0; 325. /* fainting stops your occupation, there's no reason to sync. 326. 		sync_hunger; 327. */  328.  #ifdef REDO 329. 		nomul(0); 330. 		pushch(0); 331. #endif 332. 	}  333.  }  334.   335.  #endif /* OVL1 */ 336. #ifdef OVLB 337.  338.  void 339. display_gamewindows 340. {  341.      WIN_MESSAGE = create_nhwindow(NHW_MESSAGE); 342.     WIN_STATUS = create_nhwindow(NHW_STATUS); 343.     WIN_MAP = create_nhwindow(NHW_MAP); 344.     WIN_INVEN = create_nhwindow(NHW_MENU); 345.  346.  #ifdef MAC 347.     /*  348.       * This _is_ the right place for this - maybe we will 349.      * have to split display_gamewindows into create_gamewindows 350.      * and show_gamewindows to get rid of this ifdef...  351. */ 352.      SanePositions  ; 353. #endif 354.  355.      /*  356.       * The mac port is not DEPENDENT on the order of these 357.      * displays, but it looks a lot better this way...  358. */ 359.      display_nhwindow(WIN_STATUS, FALSE); 360.     display_nhwindow(WIN_MESSAGE, FALSE); 361.     display_nhwindow(WIN_MAP, FALSE); 362. }  363.   364.  void 365. newgame 366. {  367.  #ifdef MFLOPPY 368. 	gameDiskPrompt; 369. #endif 370.  371.  	fobj = invent = migrating_objs = (struct obj *)0; 372. 	fmon = migrating_mons = (struct monst *)0; 373. 	ftrap = 0; 374. 	flags.ident = 1; 375.  376.  	if(wiz1_level.dlevel == 0) init_dungeons; 377. 	init_objects; 378. 	u_init; 379.  380.  #ifndef NO_SIGNAL 381. 	(void) signal(SIGINT, (SIG_RET_TYPE) done1); 382. #endif 383. #ifdef NEWS 384. 	if(flags.news) display_file(NEWS, FALSE); 385. #endif 386. #ifdef MULDGN 387. 	load_qtlist;	/* load up the quest text info */ 388. 	if(flags.legacy && moves == 1) com_pager(1); 389. #endif 390. 	mklev; 391. 	u_on_upstairs; 392. 	check_special_room(FALSE); 393. 	vision_reset;		/* set up internals for level (after mklev) */ 394.  395.  	flags.botlx = 1; 396.  397.  	/* Move the monster from under you or else 398. 	 * makedog will fail when it calls makemon. 399. 	 * 			- ucsfcgl!kneller 400. 	 */  401.  	if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy)); 402.  403.  #ifdef CLIPPING 404. 	cliparound(u.ux, u.uy); 405. #endif 406. 	(void) makedog; 407. 	docrt; 408.  409.  #ifdef INSURANCE 410. 	save_currentstate; 411. #endif 412. 	return; 413. }  414.   415.  #endif /* OVLB */ 416.  417.  /*allmain.c*/