Source:SLASH'EM 0.0.7E7F2/allmain.c

Below is the full text to allmain.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/allmain.c#line123 ]], for example.

The latest source code for vanilla NetHack is at Source code.

1.   /*	SCCS Id: @(#)allmain.c	3.4	2003/04/02	*/ 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.    #ifndef NO_SIGNAL 9.   #include   10. #endif 11.  #ifdef SHORT_FILENAMES 12.  #include "patchlev.h"  13. #else 14.  #include "patchlevel.h"  15. #endif 16.   17.   #ifdef POSITIONBAR 18.  STATIC_DCL void NDECL(do_positionbar); 19.  #endif 20.   21.   #define decrnknow(spell)	spl_book[spell].sp_know-- 22.  #define spellid(spell)		spl_book[spell].sp_id 23.  #define spellknow(spell)	spl_book[spell].sp_know 24.   25.   #ifdef OVL0 26.   27.   void 28.  moveloop 29.  {  30.   #if defined(MICRO) || defined(WIN32) 31.      char ch; 32.      int abort_lev; 33.  #endif 34.      int moveamt = 0, wtcap = 0, change = 0; 35.      boolean didmove = FALSE, monscanmove = FALSE; 36.   37.       flags.moonphase = phase_of_the_moon; 38.      if(flags.moonphase == FULL_MOON) { 39.  	You("are lucky!  Full moon tonight."); 40.  	change_luck(1); 41.      } else if(flags.moonphase == NEW_MOON) { 42.  	pline("Be careful!  New moon tonight."); 43.      }  44.       flags.friday13 = friday_13th; 45.      if (flags.friday13) { 46.  	pline("Watch out!  Bad things can happen on Friday the 13th."); 47.  	change_luck(-1); 48.      }  49.       /* KMH -- February 2 */ 50.      flags.groundhogday = groundhog_day; 51.      if (flags.groundhogday) 52.  	pline("Happy Groundhog Day!"); 53.   54.       initrack; 55.   56.    57.       /* Note:  these initializers don't do anything except guarantee that 58.  	    we're linked properly. 59.      */  60.       decl_init; 61.      monst_init; 62.      monstr_init;	/* monster strengths */ 63.      objects_init; 64.   65.   #ifdef WIZARD 66.      if (wizard) add_debug_extended_commands; 67.  #endif 68.   69.       (void) encumber_msg; /* in case they auto-picked up something */ 70.      if (defer_see_monsters) { 71.  	defer_see_monsters = FALSE; 72.  	see_monsters; 73.      }  74.    75.       u.uz0.dlevel = u.uz.dlevel; 76.      youmonst.movement = NORMAL_SPEED;	/* give the hero some movement points */ 77.   78.       for { 79.  	get_nh_event; 80.  #ifdef POSITIONBAR 81.  	do_positionbar; 82.  #endif 83.   84.   	didmove = flags.move; 85.  	if(didmove) { 86.  	    /* actual time passed */ 87.  	    youmonst.movement -= NORMAL_SPEED; 88.   89.   	    do { /* hero can't move this turn loop */ 90.  		wtcap = encumber_msg; 91.   92.   		flags.mon_moving = TRUE; 93.  		do { 94.  		    monscanmove = movemon; 95.  		    if (youmonst.movement > NORMAL_SPEED) 96.  			break;	/* it's now your turn */ 97.  		} while (monscanmove); 98.  		flags.mon_moving = FALSE; 99.   100.  		if (!monscanmove && youmonst.movement < NORMAL_SPEED) { 101. 		    /* both you and the monsters are out of steam this round */ 102. 		    /* set up for a new turn */ 103. 		    struct monst *mtmp; 104. 		    mcalcdistress;	/* adjust monsters' trap, blind, etc */ 105.  106.  		    /* reallocate movement rations to monsters */ 107. 		    for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) 108. 			mtmp->movement += mcalcmove(mtmp); 109.  110.  		    if(!rn2(u.uevent.udemigod ? 25 : 111.  			    (depth(&u.uz) > depth(&stronghold_level)) ? 50 : 70)) 112.  			(void) makemon((struct permonst *)0, 0, 0, NO_MM_FLAGS); 113.  114.  		    /* calculate how much time passed. */ 115.  #ifdef STEED 116. 		    if (u.usteed && u.umoved) { 117. 			/* your speed doesn't augment steed's speed */ 118. 			moveamt = mcalcmove(u.usteed); 119. 		    } else 120. #endif 121. 		    {  122.  			moveamt = youmonst.data->mmove; 123.  124.  			if (Very_fast) {	/* speed boots or potion */ 125. 			    /* average movement is 1.67 times normal */ 126. 			    moveamt += NORMAL_SPEED / 2; 127. 			    if (rn2(3) == 0) moveamt += NORMAL_SPEED / 2; 128. 			} else if (Fast) { 129. 			    /* average movement is 1.33 times normal */ 130. 			    if (rn2(3) != 0) moveamt += NORMAL_SPEED / 2; 131. 			}  132.  			if (tech_inuse(T_BLINK)) { /* TECH: Blinking! */ 133.  			    /* Case    Average  Variance 134. 			     * -  135.  			     * Normal    12         0 136. 			     * Fast      16        12 137. 			     * V fast    20        12 138. 			     * Blinking  24        12 139. 			     * F & B     28        18 140. 			     * V F & B   30        18 141. 			     */  142.  			    moveamt += NORMAL_SPEED * 2 / 3; 143. 			    if (rn2(3) == 0) moveamt += NORMAL_SPEED / 2; 144. 			}  145.  		    }  146.   147.  		    switch (wtcap) { 148. 			case UNENCUMBERED: break; 149. 			case SLT_ENCUMBER: moveamt -= (moveamt / 4); break; 150. 			case MOD_ENCUMBER: moveamt -= (moveamt / 2); break; 151. 			case HVY_ENCUMBER: moveamt -= ((moveamt * 3) / 4); break; 152. 			case EXT_ENCUMBER: moveamt -= ((moveamt * 7) / 8); break; 153. 			default: break; 154. 		    }  155.   156.  		    youmonst.movement += moveamt; 157. 		    if (youmonst.movement < 0) youmonst.movement = 0; 158. 		    settrack; 159.  160.  		    monstermoves++; 161. 		    moves++; 162.  163.  		    /********************************/  164.  		    /* once-per-turn things go here */ 165. 		    /********************************/  166.   167.  		    if (flags.bypasses) clear_bypasses; 168. 		    if(Glib) glibr; 169. 		    nh_timeout; 170. 		    run_regions; 171.  172.  #ifdef DUNGEON_GROWTH 173. 		    dgn_growths(TRUE, TRUE); 174. #endif 175.  176.  		    if (u.ublesscnt)  u.ublesscnt--; 177. 		     178.  		    if(flags.time && !flags.run) 179. 			flags.botl = 1; 180.  181.  		    /* One possible result of prayer is healing. Whether or 182. * not you get healed depends on your current hit points. 183. 		     * If you are allowed to regenerate during the prayer, the 184. 		     * end-of-prayer calculation messes up on this. 185. 		     * Another possible result is rehumanization, which requires 186. 		     * that encumbrance and movement rate be recalculated. 187. 		     */  188.  		    if (u.uinvulnerable) { 189. 			/* for the moment at least, you're in tiptop shape */ 190. 			wtcap = UNENCUMBERED; 191. 		    } else if (Upolyd && youmonst.data->mlet == S_EEL && !is_pool(u.ux,u.uy) && !Is_waterlevel(&u.uz)) { 192. 			if (u.mh > 1) { 193. 			    u.mh--; 194. 			    flags.botl = 1; 195. 			} else if (u.mh < 1) 196. 			    rehumanize; 197. 		    } else if (Upolyd && u.mh < u.mhmax) { 198. 			if (u.mh < 1) 199. 			    rehumanize; 200. 			else if (Regeneration ||  201.  				    (wtcap < MOD_ENCUMBER && !(moves%20))) { 202. 			    flags.botl = 1; 203. 			    u.mh++; 204. 			}  205.  		    } else if (u.uhp < u.uhpmax &&  206.  			 (wtcap < MOD_ENCUMBER || !u.umoved || Regeneration)) { 207. /*  208.   * KMH, balance patch -- New regeneration code 209.  * Healthstones have been added, which alter your effective 210.  * experience level and constitution (-2 cursed, +1 uncursed,  211.   * +2 blessed) for the basis of regeneration calculations. 212.  */  213.   214.   			int efflev = u.ulevel + u.uhealbonus; 215.  			int effcon = ACURR(A_CON) + u.uhealbonus; 216. 			int heal = 1; 217.  218.   219.  			if (efflev > 9 && !(moves % 3)) { 220. 			    if (effcon <= 12) { 221. 				heal = 1; 222. 			    } else { 223. 				heal = rnd(effcon); 224.   				if (heal > efflev-9) heal = efflev-9; 225. 			    }  226.  			    flags.botl = 1; 227. 			    u.uhp += heal; 228. 			    if(u.uhp > u.uhpmax) 229. 				u.uhp = u.uhpmax; 230. 			} else if (Regeneration ||  231.  			     (efflev <= 9 && 232. 			      !(moves % ((MAXULEV+12) / (u.ulevel+2) + 1)))) { 233. 			    flags.botl = 1; 234. 			    u.uhp++; 235. 			}  236.  		    }  237.   238.  		    if (!u.uinvulnerable && u.uen > 0 && u.uhp < u.uhpmax &&  239.  			    tech_inuse(T_CHI_HEALING)) { 240. 			u.uen--; 241. 			u.uhp++; 242. 			flags.botl = 1; 243. 		    }  244.   245.  		    /* moving around while encumbered is hard work */ 246. 		    if (wtcap > MOD_ENCUMBER && u.umoved) { 247. 			if(!(wtcap < EXT_ENCUMBER ? moves%30 : moves%10)) { 248. 			    if (Upolyd && u.mh > 1) { 249. 				u.mh--; 250. 			    } else if (!Upolyd && u.uhp > 1) { 251. 				u.uhp--; 252. 			    } else { 253. 				You("pass out from exertion!"); 254. 				exercise(A_CON, FALSE); 255. 				fall_asleep(-10, FALSE); 256. 			    }  257.  			}  258.  		    }  259.   260.  		     261.  		    /* KMH -- OK to regenerate if you don't move */ 262. 		    if ((u.uen < u.uenmax) && (Energy_regeneration || 263. 				((wtcap < MOD_ENCUMBER || !flags.mv) &&  264.  				(!(moves%((MAXULEV + 15 - u.ulevel) * 265. 				(Role_if(PM_WIZARD) ? 3 : 4) / 6)))))) { 266. 			u.uen += rn1((int)(ACURR(A_WIS) + ACURR(A_INT)) / 15 + 1,1); 267. #ifdef WIZ_PATCH_DEBUG 268.                 pline("mana was = %d now = %d",temp,u.uen); 269. #endif 270.  271.  			if (u.uen > u.uenmax)  u.uen = u.uenmax; 272. 			flags.botl = 1; 273. 		    }  274.   275.  		    if(!u.uinvulnerable) { 276. 			if(Teleportation && !rn2(85)) { 277. 			    xchar old_ux = u.ux, old_uy = u.uy; 278. 			    tele; 279. 			    if (u.ux != old_ux || u.uy != old_uy) { 280. 				if (!next_to_u) { 281. 				    check_leash(old_ux, old_uy); 282. 				}  283.  #ifdef REDO 284. 				/* clear doagain keystrokes */ 285. 				pushch(0); 286. 				savech(0); 287. #endif 288. 			    }  289.  			}  290.  			/* delayed change may not be valid anymore */ 291. 			if ((change == 1 && !Polymorph) ||  292.  			    (change == 2 && u.ulycn == NON_PM)) 293. 			    change = 0; 294. 			if(Polymorph && !rn2(100)) 295. 			    change = 1; 296. 			else if (u.ulycn >= LOW_PM && !Upolyd &&  297.  				 !rn2(80 - (20 * night))) 298. 			    change = 2; 299. 			if (change && !Unchanging) { 300. 			    if (multi >= 0) { 301. 				if (occupation) 302. 				    stop_occupation; 303. 				else 304. 				    nomul(0); 305. 				if (change == 1) polyself(FALSE); 306. 				else you_were; 307. 				change = 0; 308. 			    }  309.  			}  310.  		}	/* !u.uinvulnerable */ 311.  312.  		    if(Searching && multi >= 0) (void) dosearch0(1); 313. 		    dosounds; 314. 		    do_storms; 315. 		    gethungry; 316. 		    age_spells; 317. 		    exerchk; 318. 		    invault; 319. 		    if (u.uhave.amulet) amulet; 320. 		if (!rn2(40+(int)(ACURR(A_DEX)*3))) u_wipe_engr(rnd(3)); 321. 		    if (u.uevent.udemigod && !u.uinvulnerable) { 322. 			if (u.udg_cnt) u.udg_cnt--; 323. 			if (!u.udg_cnt) { 324. 			    intervene; 325. 			    u.udg_cnt = rn1(200, 50); 326. 			}  327.  		    }  328.  		    restore_attrib; 329.  330.  		    /* underwater and waterlevel vision are done here */ 331. 		    if (Is_waterlevel(&u.uz)) 332. 			movebubbles; 333. 		    else if (Underwater) 334. 			under_water(0); 335. 		    /* vision while buried done here */ 336. 		    else if (u.uburied) under_ground(0); 337.  338.  		    /* when immobile, count is in turns */ 339. 		    if(multi < 0) { 340. 			if (++multi == 0) {	/* finished yet? */ 341.  			    unmul((char *)0); 342. 			    /* if unmul caused a level change, take it now */ 343. 			    if (u.utotype) deferred_goto; 344. 			}  345.  		    }  346.  		}  347.  	    } while (youmonst.movement<NORMAL_SPEED); /* hero can't move loop */ 348.  349.  	    /******************************************/  350.  	    /* once-per-hero-took-time things go here */ 351. 	    /******************************************/  352.   353.   354.  	} /* actual time passed */ 355.  356.  	/****************************************/  357.  	/* once-per-player-input things go here */ 358. 	/****************************************/  359.   360.  	find_ac; 361. 	if(!flags.mv || Blind) { 362. 	    /* redo monsters if hallu or wearing a helm of telepathy */ 363. 	    if (Hallucination) {	/* update screen randomly */ 364. 		see_monsters; 365. 		see_objects; 366. 		see_traps; 367. 		if (u.uswallow) swallowed(0); 368. 	    } else if (Unblind_telepat) { 369. 		see_monsters; 370. 	    } else if (Warning || Warn_of_mon) 371. 	     	see_monsters; 372.  373.  	    if (vision_full_recalc) vision_recalc(0);	/* vision! */ 374.  	}  375.  	if(flags.botl || flags.botlx) bot; 376.  377.  	flags.move = 1; 378.  379.  	if(multi >= 0 && occupation) { 380. #if defined(MICRO) || defined(WIN32) 381. 	    abort_lev = 0; 382. 	    if (kbhit) { 383. 		if ((ch = Getchar) == ABORT) 384. 		    abort_lev++; 385. # ifdef REDO 386. 		else 387. 		    pushch(ch); 388. # endif /* REDO */ 389. 	    }  390.  	    if (!abort_lev && (*occupation) == 0) 391. #else 392. 	    if ((*occupation) == 0) 393. #endif 394. 		occupation = 0; 395. 	    if(  396.  #if defined(MICRO) || defined(WIN32)  397.  		   abort_lev ||  398.  #endif  399.  		   monster_nearby) { 400. 		stop_occupation; 401. 		reset_eat; 402. 	    }  403.  #if defined(MICRO) || defined(WIN32) 404. 	    if (!(++occtime % 7)) 405. 		display_nhwindow(WIN_MAP, FALSE); 406. #endif 407. 	    continue; 408. 	}  409.   410.  	if ((u.uhave.amulet || Clairvoyant) &&  411.  	    !In_endgame(&u.uz) && !BClairvoyant &&  412.  	    !(moves % 15) && !rn2(2)) 413. 		do_vicinity_map; 414.  415.  	if(u.utrap && u.utraptype == TT_LAVA) { 416. 	    if(!is_lava(u.ux,u.uy)) 417. 		u.utrap = 0; 418. 	    else if (!u.uinvulnerable) { 419. 		u.utrap -= 1<<8; 420. 		if(u.utrap < 1<<8) { 421. 		    killer_format = KILLED_BY; 422. 		    killer = "molten lava"; 423. 		    You("sink below the surface and die."); 424. 		    done(DISSOLVED); 425. 		} else if(didmove && !u.umoved) { 426. 		    Norep("You sink deeper into the lava."); 427. 		    u.utrap += rnd(4); 428. 		}  429.  	    }  430.  	}  431.   432.  #ifdef WIZARD 433. 	if (iflags.sanity_check) 434. 	    sanity_check; 435. #elif defined(OBJ_SANITY) 436. 	if (iflags.sanity_check) 437. 	    obj_sanity_check; 438. #endif 439.  440.  #ifdef CLIPPING 441. 	/* just before rhack */ 442. 	cliparound(u.ux, u.uy); 443. #endif 444.  445.  	u.umoved = FALSE; 446.  447.  	if (multi > 0) { 448. 	    lookaround; 449. 	    if (!multi) { 450. 		/* lookaround may clear multi */ 451. 		flags.move = 0; 452. 		if (flags.time) flags.botl = 1; 453. 		continue; 454. 	    }  455.  	    if (flags.mv) { 456. 		if(multi < COLNO && !--multi) 457. 		    flags.travel = iflags.travel1 = flags.mv = flags.run = 0; 458. 		domove; 459. 	    } else { 460. 		--multi; 461. 		rhack(save_cm); 462. 	    }  463.  	} else if (multi == 0) { 464. #ifdef MAIL 465. 	    ckmailstatus; 466. #endif 467. 	    rhack((char *)0); 468. 	}  469.  	if (u.utotype)		/* change dungeon level */ 470. 	    deferred_goto;	/* after rhack */ 471. 	/* !flags.move here: multiple movement command stopped */ 472. 	else if (flags.time && (!flags.move || !flags.mv)) 473. 	    flags.botl = 1; 474.  475.  	if (vision_full_recalc) vision_recalc(0);	/* vision! */ 476.  	/* when running in non-tport mode, this gets done through domove */ 477. 	if ((!flags.run || iflags.runmode == RUN_TPORT) &&  478.  		(multi && (!flags.travel ? !(multi % 7) : !(moves % 7L)))) { 479. 	    if (flags.time && flags.run) flags.botl = 1; 480. 	    display_nhwindow(WIN_MAP, FALSE); 481. 	}  482.      }  483.  }  484.   485.   486.  #endif /* OVL0 */ 487. #ifdef OVL1 488.  489.  void 490. stop_occupation 491. {  492.  	if(occupation) { 493. 		if (!maybe_finished_meal(TRUE)) 494. 		    You("stop %s.", occtxt); 495. 		occupation = 0; 496. 		flags.botl = 1; /* in case u.uhs changed */ 497. /* fainting stops your occupation, there's no reason to sync. 498. 		sync_hunger; 499. */  500.  #ifdef REDO 501. 		nomul(0); 502. 		pushch(0); 503. #endif 504. 	}  505.  }  506.   507.  #endif /* OVL1 */ 508. #ifdef OVLB 509.  510.  void 511. display_gamewindows 512. {  513.      WIN_MESSAGE = create_nhwindow(NHW_MESSAGE); 514.     WIN_STATUS = create_nhwindow(NHW_STATUS); 515.     WIN_MAP = create_nhwindow(NHW_MAP); 516.     WIN_INVEN = create_nhwindow(NHW_MENU); 517.  518.  #ifdef MAC 519.     /*  520.       * This _is_ the right place for this - maybe we will 521.      * have to split display_gamewindows into create_gamewindows 522.      * and show_gamewindows to get rid of this ifdef...  523. */ 524.  	if ( ! strcmp ( windowprocs. name, "mac" ) ) { 525. 	    SanePositions  ; 526. 	}  527.  #endif 528.  529.      /*  530.       * The mac port is not DEPENDENT on the order of these 531.      * displays, but it looks a lot better this way...  532. */ 533.      display_nhwindow(WIN_STATUS, FALSE); 534.     display_nhwindow(WIN_MESSAGE, FALSE); 535.     clear_glyph_buffer; 536.     display_nhwindow(WIN_MAP, FALSE); 537. }  538.   539.  void 540. newgame 541. {  542.  	int i;  543. 544. #ifdef MFLOPPY 545. 	gameDiskPrompt; 546. #endif 547.  548.  	flags.ident = 1; 549.  550.  	for (i = 0; i < NUMMONS; i++) 551. 		mvitals[i].mvflags = mons[i].geno & G_NOCORPSE; 552.  553.  	init_objects;		/* must be before u_init */ 554.  555.  	flags.pantheon = -1;	/* role_init will reset this */ 556. 	role_init;		/* must be before init_dungeons, u_init, 557. 				 * and init_artifacts */ 558.  559.  	init_dungeons;	/* must be before u_init to avoid rndmonst 560. 				 * creating odd monsters for any tins and eggs 561. 				 * in hero's initial inventory */ 562. 	init_artifacts;	/* before u_init in case $WIZKIT specifies 563. 				 * any artifacts */ 564. 	u_init; 565. 	init_artifacts1;	/* must be after u_init */ 566.  567.  #ifndef NO_SIGNAL 568. 	(void) signal(SIGINT, (SIG_RET_TYPE) done1); 569. #endif 570. #ifdef NEWS 571. 	if(iflags.news) display_file_area(NEWS_AREA, NEWS, FALSE); 572. #endif 573.  574.  	load_qtlist;	/* load up the quest text info */ 575. /*	quest_init;*/	/* Now part of role_init */ 576.  577.  	mklev; 578. 	u_on_upstairs; 579. 	vision_reset;		/* set up internals for level (after mklev) */ 580. 	check_special_room(FALSE); 581.  582.  	flags.botlx = 1; 583.  584.  	/* Move the monster from under you or else 585. 	 * makedog will fail when it calls makemon. 586. 	 *			- ucsfcgl!kneller 587. 	 */  588.   589.  	if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy)); 590. 	(void) makedog; 591.  592.  	docrt; 593.  594.  	if (flags.legacy) { 595. 		flush_screen(1); 596. 		com_pager(1); 597. 	}  598.  #ifdef INSURANCE 599. 	save_currentstate; 600. #endif 601. 	program_state.something_worth_saving++;	/* useful data now exists */ 602.  603.  	/* Success! */ 604.  	welcome(TRUE); 605. 	return; 606. }  607.   608.  /* show "welcome [back] to nethack" message at program startup */ 609. void 610. welcome(new_game) 611. boolean new_game;	/* false => restoring an old game */ 612. {  613.      char buf[BUFSZ]; 614.     boolean currentgend = Upolyd ? u.mfemale : flags.female; 615.  616.      /*  617.       * The "welcome back" message always describes your innate form 618.      * even when polymorphed or wearing a helm of opposite alignment. 619.      * Alignment is shown unconditionally for new games; for restores 620.      * it's only shown if it has changed from its original value. 621.      * Sex is shown for new games except when it is redundant; for 622.      * restores it's only shown if different from its original value. 623.      */  624.      *buf = '\0'; 625.     if (new_game || u.ualignbase[A_ORIGINAL] != u.ualignbase[A_CURRENT]) 626. 	Sprintf(eos(buf), " %s", align_str(u.ualignbase[A_ORIGINAL])); 627.     if (!urole.name.f &&  628.  	    (new_game ? (urole.allow & ROLE_GENDMASK) == (ROLE_MALE|ROLE_FEMALE) : 629. 	     currentgend != flags.initgend)) 630. 	Sprintf(eos(buf), " %s", genders[currentgend].adj); 631.  632.  #if 0 633.     pline(new_game ? "%s %s, welcome to NetHack!  You are a%s %s %s."  634.  		   : "%s %s, the%s %s %s, welcome back to NetHack!",  635.  	  Hello((struct monst *) 0), plname, buf, urace.adj,  636.  	  (currentgend && urole.name.f) ? urole.name.f : urole.name.m); 637. #endif 638.     if (new_game) pline("%s %s, welcome to %s!  You are a%s %s %s.",  639.  	  Hello((struct monst *) 0), plname, DEF_GAME_NAME, buf, urace.adj,  640.  	  (currentgend && urole.name.f) ? urole.name.f : urole.name.m); 641.     else pline("%s %s, the%s %s %s, welcome back to %s!",  642.  	  Hello((struct monst *) 0), plname, buf, urace.adj,  643.  	  (currentgend && urole.name.f) ? urole.name.f : urole.name.m,  644.  	  DEF_GAME_NAME); 645. }  646.   647.  #ifdef POSITIONBAR 648. STATIC_DCL void 649. do_positionbar 650. {  651.  	static char pbar[COLNO]; 652. 	char *p; 653. 	  654.  	p = pbar; 655. 	/* up stairway */ 656. 	if (upstair.sx &&  657.  #ifdef DISPLAY_LAYERS  658.  	   (level.locations[upstair.sx][upstair.sy].mem_bg == S_upstair || 659. 	    level.locations[upstair.sx][upstair.sy].mem_bg == S_upladder)) { 660. #else 661. 	   (glyph_to_cmap(level.locations[upstair.sx][upstair.sy].glyph) ==  662.  	    S_upstair ||  663.   	    glyph_to_cmap(level.locations[upstair.sx][upstair.sy].glyph) ==  664.  	    S_upladder)) {  665.  #endif  666.  		*p++ = '<';  667.  		*p++ = upstair.sx;  668.  	}  669.  	if (sstairs.sx && 670. #ifdef DISPLAY_LAYERS 671. 	   (level.locations[sstairs.sx][sstairs.sy].mem_bg == S_upstair ||  672.  	    level.locations[sstairs.sx][sstairs.sy].mem_bg == S_upladder)) {  673.  #else  674.  	   (glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == 675. 	    S_upstair || 676.  	    glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == 677. 	    S_upladder)) { 678. #endif 679. 		*p++ = '<'; 680. 		*p++ = sstairs.sx; 681. 	}  682.   683.  	/* down stairway */ 684. 	if (dnstair.sx &&  685.  #ifdef DISPLAY_LAYERS  686.  	   (level.locations[dnstair.sx][dnstair.sy].mem_bg == S_dnstair || 687. 	    level.locations[dnstair.sx][dnstair.sy].mem_bg == S_dnladder)) { 688. #else 689. 	   (glyph_to_cmap(level.locations[dnstair.sx][dnstair.sy].glyph) ==  690.  	    S_dnstair ||  691.   	    glyph_to_cmap(level.locations[dnstair.sx][dnstair.sy].glyph) ==  692.  	    S_dnladder)) {  693.  #endif  694.  		*p++ = '>';  695.  		*p++ = dnstair.sx;  696.  	}  697.  	if (sstairs.sx && 698. #ifdef DISPLAY_LAYERS 699. 	   (level.locations[sstairs.sx][sstairs.sy].mem_bg == S_dnstair ||  700.  	    level.locations[sstairs.sx][sstairs.sy].mem_bg == S_dnladder)) {  701.  #else  702.  	   (glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == 703. 	    S_dnstair || 704.  	    glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == 705. 	    S_dnladder)) { 706. #endif 707. 		*p++ = '>'; 708. 		*p++ = sstairs.sx; 709. 	}  710.   711.  	/* hero location */ 712. 	if (u.ux) { 713. 		*p++ = '@'; 714. 		*p++ = u.ux; 715. 	}  716.  	/* fence post */ 717. 	*p = 0; 718.  719.  	update_positionbar(pbar); 720. }  721.  #endif 722.  723.  #endif /* OVLB */ 724.  725.  /*allmain.c*/