Source:NetHack 3.2.0/allmain.c
(Redirected from NetHack 3.2.0/allmain.c)
Jump to navigation
Jump to search
Below is the full text to allmain.c from the source code of NetHack 3.2.0.
Warning! This is the source code from an old release. For newer releases, see Source code
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.
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 <signal.h> 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*/