Source:NetHack 3.2.0/allmain.c

Below is the full text to allmain.c from the source code of NetHack 3.2.0. To link to a particular line, write [[NetHack 3.2.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.2	96/03/28	*/ 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 POSITIONBAR 14.  STATIC_DCL void NDECL(do_postionbar); 15.  #endif 16.   17.   #ifdef OVL0 18.   19.   void 20.  moveloop 21.  {  22.   #ifdef MICRO 23.  	char ch; 24.  	int abort_lev; 25.  #endif 26.  	int moverate = 0; 27.  	boolean didmove = 0; 28.   29.   	flags.moonphase = phase_of_the_moon; 30.  	if(flags.moonphase == FULL_MOON) { 31.  		You("are lucky!  Full moon tonight."); 32.  		change_luck(1); 33.  	} else if(flags.moonphase == NEW_MOON) { 34.  		pline("Be careful!  New moon tonight."); 35.  	}  36.   	flags.friday13 = friday_13th; 37.  	if (flags.friday13) { 38.  		pline("Watch out!  Bad things can happen on Friday the 13th."); 39.  		change_luck(-1); 40.  	}  41.    42.   	initrack; 43.   44.    45.   	/* Note:  these initializers don't do anything except guarantee that 46.  		we're linked properly. 47.  	*/  48.   	decl_init; 49.  	monst_init; 50.  	monstr_init;	/* monster strengths */ 51.  	objects_init; 52.   53.   #ifdef WIZARD 54.  	if (wizard) add_debug_extended_commands; 55.  #endif 56.   57.   	(void) encumber_msg; /* in case they auto-picked up something */ 58.   59.   	u.uz0.dlevel = u.uz.dlevel; 60.   61.   	for { 62.  #ifdef CLIPPING 63.  		cliparound(u.ux, u.uy); 64.  #endif 65.  #if defined(MAC68K) && defined(MAC_MPW32) && !defined(MODEL_FAR) 66.  		UnloadAllSegments;  /* Marks non-resident segments as purgeable */ 67.  #endif 68.  		get_nh_event; 69.  #ifdef POSITIONBAR 70.  		do_positionbar; 71.  #endif 72.   73.   		didmove = flags.move; 74.  		if(flags.move) {	/* actual time passed */ 75.  		    int oldmtimedone; 76.  		    int wtcap; 77.   78.   		    if (u.utotype) deferred_goto; 79.  		    wtcap = encumber_msg; 80.  		    oldmtimedone = u.mtimedone; 81.  		    dosounds; 82.   83.   		    if(moverate <= 0) { 84.  			/* calculate how much time passed. */ 85.   			int moveamt = 0; 86.  			if(Fast & ~INTRINSIC) moveamt = 6; 87.  			else if(Fast) moveamt = 8; 88.  			else moveamt = 12; 89.   90.   			switch(wtcap) { 91.  			case UNENCUMBERED: break; 92.  			case SLT_ENCUMBER: moveamt = (moveamt * 4) / 3; break; 93.  			case MOD_ENCUMBER: moveamt *= 2; break; 94.  			case HVY_ENCUMBER: moveamt *= 4; break; 95.  			default: moveamt *= 12; break; 96.  			}  97.   			moverate += moveamt; 98.  			settrack; 99.  		    }  100.   101.  		    if(moverate > 0) { 102. 			flags.mon_moving = TRUE; 103. 			movemon; 104. 			flags.mon_moving = FALSE; 105. 			/* a monster may have levteleported player -dlc */ 106. 			if (u.utotype) deferred_goto; 107. 			if(!rn2(u.uevent.udemigod ? 25 : 108.  				(depth(&u.uz) >  109.  				 depth(&stronghold_level)) 110. 				? 50 : 70))  111.  			    (void) makemon((struct permonst *)0, 0, 0); 112. 			++monstermoves; 113. 			moverate -= 12; 114. 		    }  115.  		    if(Glib) glibr; 116. 		    nh_timeout; 117. 		    ++moves; 118. 		    if (u.ublesscnt)  u.ublesscnt--; 119. 		    if(flags.time && !flags.run) 120. 			flags.botl = 1; 121.  122.  		    /* One possible result of prayer is healing. Whether or 123. * not you get healed depends on your current hit points. 124. 		     * If you are allowed to regenerate during the prayer, the 125. 		     * end-of-prayer calculation messes up on this. 126. 		     * Another possible result is rehumanization, which requires 127. 		     * that encumbrance and movement rate be recalculated. 128. 		     */  129.  		    if (u.uinvulnerable) { 130. 			/* for the moment at least, you're in tiptop shape */ 131. 			wtcap = UNENCUMBERED; 132. 			moverate = 0; 133. 		    } else if (u.mtimedone && u.mh < u.mhmax) { 134. 			if (u.mh < 1) { 135. 			    rehumanize; 136. 			    moverate = 0; 137. 			} else if (Regeneration ||  138.  				 (wtcap < MOD_ENCUMBER && !(moves%20))) { 139. 			    flags.botl = 1; 140. 			    u.mh++; 141. 			}  142.  		    } else if (u.uhp < u.uhpmax) { 143. 			if(u.ulevel > 9) { 144. 			    int heal; 145.  146.  			    if(HRegeneration ||  147.  			       (!(moves%3) && 148. 				(wtcap < MOD_ENCUMBER || !flags.mv))) { 149. 				flags.botl = 1; 150. 				if (ACURR(A_CON) <= 12) heal = 1; 151. 				else heal = rnd((int) ACURR(A_CON)-12); 152. 				if (heal > u.ulevel-9) heal = u.ulevel-9; 153. 				u.uhp += heal; 154. 				if(u.uhp > u.uhpmax) 155. 				    u.uhp = u.uhpmax; 156. 			    }  157.  			} else if(HRegeneration ||  158.  				  ((wtcap < MOD_ENCUMBER || !flags.mv) && 159. 				   (!(moves%((MAXULEV+12)/(u.ulevel+2)+1))))) { 160. 			    flags.botl = 1; 161. 			    u.uhp++; 162. 			}  163.  		    }  164.   165.  		    if (wtcap > MOD_ENCUMBER && flags.mv) { 166. 			if(!(wtcap < EXT_ENCUMBER ? moves%30 : moves%10)) { 167. 			    if(u.uhp > 1) { 168. 				u.uhp--; 169. 			    } else { 170. 				You("pass out from exertion!"); 171. 				exercise(A_CON, FALSE); 172. 				fall_asleep(-10, FALSE); 173. 			    }  174.  			}  175.  		    }  176.   177.  		    if ((u.uen < u.uenmax) &&  178.  			((wtcap < MOD_ENCUMBER &&  179.  			  (!(moves%((MAXULEV + 8 - u.ulevel) * 180. 				    (Role_is('W') ? 3 : 4) / 6)))) 181. 			 || Energy_regeneration)) { 182. 			u.uen += 183. 			    rn1((int)(ACURR(A_WIS) + ACURR(A_INT)) / 10 + 1,1); 184. 			if (u.uen > u.uenmax)  u.uen = u.uenmax; 185. 			flags.botl = 1; 186. 		    }  187.   188.  		    if(!u.uinvulnerable) { 189. 			if(Teleportation && !rn2(85)) { 190. #ifdef REDO 191. 			    xchar old_ux = u.ux, old_uy = u.uy; 192. #endif 193. 			    tele; 194. #ifdef REDO 195. 			    if (u.ux != old_ux || u.uy != old_uy) { 196. 				/* clear doagain keystrokes */ 197. 				pushch(0); 198. 				savech(0); 199. 			    }  200.  #endif 201. 			}  202.  			if(Polymorph && !rn2(100)) { 203. 			    if (multi >= 0) { 204. 				if (occupation) 205. 				    stop_occupation; 206. 				else 207. 				    nomul(0); 208. 			    }  209.  			    polyself; 210. 			    moverate = 0; 211. 			} else if (u.ulycn >= LOW_PM &&  212.  				   !rn2(80 - (20 * night))) { 213. 			    if (multi >= 0) { 214. 				if (occupation) 215. 				    stop_occupation; 216. 				else 217. 				    nomul(0); 218. 			    }  219.  			    you_were; 220. 			    moverate = 0; 221. 			}  222.  		    }  223.   224.  		    if(Searching && multi >= 0) (void) dosearch0(1); 225. 		    do_storms; 226. 		    gethungry; 227. 		    exerchk; 228. 		    invault; 229. 		    if (u.uhave.amulet) amulet; 230. 		    if (!rn2(40+(int)(ACURR(A_DEX)*3))) 231. 			u_wipe_engr(rnd(3)); 232. 		    if (u.uevent.udemigod && !u.uinvulnerable) { 233. 			if (u.udg_cnt) u.udg_cnt--; 234. 			if (!u.udg_cnt) { 235. 			    intervene; 236. 			    u.udg_cnt = rn1(200, 50); 237. 			}  238.  		    }  239.  		    restore_attrib; 240. 		    /* underwater and waterlevel vision are done here */ 241. 		    if (Is_waterlevel(&u.uz)) 242. 			movebubbles; 243. 		    else if (Underwater) under_water(0); 244. 		    /* vision while buried done here */ 245. 		    else if (u.uburied) under_ground(0); 246.  247.  		    if ((oldmtimedone && !u.mtimedone) ||  248.  			(!oldmtimedone && u.mtimedone)) moverate = 0; 249. 		}  250.  		if(multi < 0) { 251. 			if (++multi == 0)	/* finished yet? */ 252.  				unmul((char *)0); 253. 		}  254.   255.  		find_ac; 256. 		if(!flags.mv || Blind) { 257. 		    /* redo monsters if hallu or wearing a helm of telepathy */ 258. 		    if (Hallucination ||  259.  			(HTelepat & (WORN_HELMET|WORN_AMUL|W_ART))) 260. 			see_monsters; 261.  262.  		    /* redo objects if hallucinating */ 263. 		    if (Hallucination) see_objects; 264.  265.  		    /* update swallowed display */ 266. 		    if (Hallucination && u.uswallow) swallowed(0); 267.  268.  		    if (vision_full_recalc) vision_recalc(0);	/* vision! */ 269.  		}  270.  		if(flags.botl || flags.botlx) bot; 271.  272.  		flags.move = 1; 273.  274.  		if(multi >= 0 && occupation) { 275. #ifdef MICRO 276. 			abort_lev = 0; 277. 			if (kbhit) { 278. 				if ((ch = Getchar) == ABORT) 279. 					abort_lev++; 280. # ifdef REDO 281. 				else 282. 					pushch(ch); 283. # endif /* REDO */ 284. 			}  285.  			if (!abort_lev && (*occupation) == 0) 286. #else 287. 			if ((*occupation) == 0) 288. #endif 289. 				occupation = 0; 290. 			if(  291.  #ifdef MICRO  292.  			   abort_lev ||  293.  #endif  294.  			   monster_nearby) { 295. 				stop_occupation; 296. 				reset_eat; 297. 			}  298.  #ifdef MICRO 299. 			if (!(++occtime % 7)) 300. 				display_nhwindow(WIN_MAP, FALSE); 301. #endif 302. 			continue; 303. 		}  304.   305.  		if ((u.uhave.amulet || Clairvoyant) &&  306.  		    !(In_endgame(&u.uz) || (HClairvoyant & I_BLOCKED)) &&  307.  		    !(moves % 15) && !rn2(2)) 308. 			do_vicinity_map; 309.  310.  		if(u.utrap && u.utraptype == TT_LAVA) { 311. 		    if(!is_lava(u.ux,u.uy)) 312. 			u.utrap = 0; 313. 		    else { 314. 			u.utrap -= 1<<8; 315. 			if(u.utrap < 1<<8) { 316. 			    killer_format = KILLED_BY; 317. 			    killer = "molten lava"; 318. 			    You("sink below the surface and die."); 319. 			    done(DISSOLVED); 320. 			} else if(didmove && !u.umoved) { 321. 			    Norep("You sink deeper into the lava."); 322. 			    u.utrap += rnd(4); 323. 			}  324.  		    }  325.  		}  326.   327.  #ifdef WIZARD 328. 		if (flags.sanity_check) 329. 		    sanity_check; 330. #endif 331.  332.  		u.umoved = FALSE; 333. 		if(!didmove || moverate <= 0) { 334. 		    if(multi > 0) { 335. 			lookaround; 336. 			if(!multi)	/* lookaround may clear multi */ 337. 				flags.move = 0; 338. 			else if(flags.mv) { 339. 				if(multi < COLNO && !--multi) 340. 					flags.mv = flags.run = 0; 341. 				domove; 342. 			} else { 343. 				--multi; 344. 				rhack(save_cm); 345. 			}  346.  		    } else if(multi == 0) { 347. #ifdef MAIL 348. 			ckmailstatus; 349. #endif 350. 			rhack((char *)0); 351. 		    }  352.  		    /* !flags.move here: multiple movement command stopped */ 353. 		    if (flags.time && (!flags.move || !flags.mv)) flags.botl=1; 354. 		}  355.  		if (vision_full_recalc) vision_recalc(0);	/* vision! */ 356.  		if(multi && multi%7 == 0) 357. 			display_nhwindow(WIN_MAP, FALSE); 358. 	}  359.  }  360.   361.  #endif /* OVL0 */ 362. #ifdef OVL1 363.  364.  void 365. stop_occupation 366. {  367.  	if(occupation) { 368. 		You("stop %s.", occtxt); 369. 		occupation = 0; 370. /* fainting stops your occupation, there's no reason to sync. 371. 		sync_hunger; 372. */  373.  #ifdef REDO 374. 		nomul(0); 375. 		pushch(0); 376. #endif 377. 	}  378.  }  379.   380.  #endif /* OVL1 */ 381. #ifdef OVLB 382.  383.  void 384. display_gamewindows 385. {  386.      WIN_MESSAGE = create_nhwindow(NHW_MESSAGE); 387.     WIN_STATUS = create_nhwindow(NHW_STATUS); 388.     WIN_MAP = create_nhwindow(NHW_MAP); 389.     WIN_INVEN = create_nhwindow(NHW_MENU); 390.  391.  #ifdef MAC 392.     /*  393.       * This _is_ the right place for this - maybe we will 394.      * have to split display_gamewindows into create_gamewindows 395.      * and show_gamewindows to get rid of this ifdef...  396. */ 397.  	if ( ! strcmp ( windowprocs. name, "mac" ) ) { 398. 	    SanePositions  ; 399. 	}  400.  #endif 401.  402.      /*  403.       * The mac port is not DEPENDENT on the order of these 404.      * displays, but it looks a lot better this way...  405. */ 406.      display_nhwindow(WIN_STATUS, FALSE); 407.     display_nhwindow(WIN_MESSAGE, FALSE); 408.     clear_glyph_buffer; 409.     display_nhwindow(WIN_MAP, FALSE); 410. }  411.   412.  void 413. newgame 414. {  415.  	int i;  416. 417. #ifdef MFLOPPY 418. 	gameDiskPrompt; 419. #endif 420.  421.  	fobj = invent = level.buriedobjlist = migrating_objs = (struct obj *)0; 422. 	fmon = migrating_mons = (struct monst *)0; 423. 	ftrap = 0; 424. 	flags.ident = 1; 425.  426.  	if(wiz1_level.dlevel == 0) init_dungeons; 427.  428.  	for (i = 0; i < NUMMONS; i++) 429. 		mvitals[i].mvflags = mons[i].geno & G_NOCORPSE; 430.  431.  	init_objects;		/* must be before u_init */ 432. 	u_init; 433. 	init_artifacts;	/* must be after u_init */ 434.  435.  #ifndef NO_SIGNAL 436. 	(void) signal(SIGINT, (SIG_RET_TYPE) done1); 437. #endif 438. #ifdef NEWS 439. 	if(flags.news) display_file(NEWS, FALSE); 440. #endif 441. 	load_qtlist;	/* load up the quest text info */ 442. 	quest_init; 443.  444.  	mklev; 445. 	u_on_upstairs; 446. #ifdef CLIPPING 447. 	/* pline (hence You) will call flush_screen if u.ux is set, 448. 	 * which will be confused if clipping is not set up. 449. 	 * this is the equivalent of the restgamestate call for new games. 450. 	 */  451.  	cliparound(u.ux, u.uy); 452. #endif 453. 	check_special_room(FALSE); 454. 	vision_reset;		/* set up internals for level (after mklev) */ 455.  456.  	flags.botlx = 1; 457.  458.  	/* Move the monster from under you or else 459. 	 * makedog will fail when it calls makemon. 460. 	 *			- ucsfcgl!kneller 461. 	 */  462.  	if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy)); 463. 	(void) makedog; 464. 	docrt; 465.  466.  	if(flags.legacy && moves == 1) { 467. 		flush_screen(1); 468. 		com_pager(1); 469. 	}  470.   471.  #ifdef INSURANCE 472. 	save_currentstate; 473. #endif 474. 	program_state.something_worth_saving++;	/* useful data now exists */ 475. 	return; 476. }  477.   478.  #ifdef POSITIONBAR 479. do_positionbar 480. {  481.  	static char pbar[COLNO]; 482. 	char *p; 483. 	  484.  	p = pbar; 485. 	/* up stairway */ 486. 	if (upstair.sx &&  487.  	   (glyph_to_cmap(level.locations[upstair.sx][upstair.sy].glyph) == 488. 	    S_upstair || 489.  	    glyph_to_cmap(level.locations[upstair.sx][upstair.sy].glyph) == 490. 	    S_upladder)) { 491. 		*p++ = '<'; 492. 		*p++ = upstair.sx; 493. 	}  494.  	if (sstairs.sx &&  495.  	   (glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == 496. 	    S_upstair || 497.  	    glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == 498. 	    S_upladder)) { 499. 		*p++ = '<'; 500. 		*p++ = sstairs.sx; 501. 	}  502.   503.  	/* down stairway */ 504. 	if (dnstair.sx &&  505.  	   (glyph_to_cmap(level.locations[dnstair.sx][dnstair.sy].glyph) == 506. 	    S_dnstair || 507.  	    glyph_to_cmap(level.locations[dnstair.sx][dnstair.sy].glyph) == 508. 	    S_dnladder)) { 509. 		*p++ = '>'; 510. 		*p++ = dnstair.sx; 511. 	}  512.  	if (sstairs.sx &&  513.  	   (glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == 514. 	    S_dnstair || 515.  	    glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == 516. 	    S_dnladder)) { 517. 		*p++ = '>'; 518. 		*p++ = sstairs.sx; 519. 	}  520.   521.  	/* hero location */ 522. 	if (u.ux) { 523. 		*p++ = '@'; 524. 		*p++ = u.ux; 525. 	}  526.  	/* fence post */ 527. 	*p = 0; 528.  529.  	update_positionbar(pbar); 530. }  531.  #endif 532.  533.  #endif /* OVLB */ 534.  535.  /*allmain.c*/