Source:NetHack 3.0.0/prisym.c
Jump to navigation
Jump to search
Below is the full text to prisym.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/prisym.c#line123]], for example.
Warning! This is the source code from an old release. For the latest release, 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: @(#)prisym.c 3.0 88/11/09 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. #ifdef WORM 8. #include "wseg.h" 9. #include "lev.h" 10. 11. static void pwseg P((struct wseg *)); 12. #endif 13. 14. void 15. atl(x,y,ch) 16. register int x, y; 17. char ch; 18. { 19. register struct rm *crm = &levl[x][y]; 20. 21. if(x<0 || x>COLNO-1 || y<0 || y>ROWNO-1){ 22. impossible("atl(%d,%d,%c)",x,y,ch); 23. return; 24. } 25. if(crm->seen && crm->scrsym == ch) return; 26. /* crm->scrsym = (uchar) ch; */ 27. /* wrong if characters are signed but uchar is larger than char, 28. * and ch, when passed, was greater than 127. 29. * We probably should _really_ go around changing atl to take a 30. * uchar for its third argument... 31. */ 32. crm->scrsym = (uchar)((unsigned char) ch); 33. crm->new = 1; 34. on_scr(x,y); 35. } 36. 37. void 38. on_scr(x,y) 39. register int x, y; 40. { 41. if(x < scrlx) scrlx = x; 42. if(x > scrhx) scrhx = x; 43. if(y < scrly) scrly = y; 44. if(y > scrhy) scrhy = y; 45. } 46. 47. /* call: (x,y) - display 48. (-1,0) - close (leave last symbol) 49. (-1,-1)- close (undo last symbol) 50. (-1,let)-open: initialize symbol 51. (-2,let)-change let 52. (-3,let)-set color 53. */ 54. 55. void 56. tmp_at(x, y) 57. int x, y; 58. { 59. #ifdef LINT /* static schar prevx, prevy; static char let; */ 60. schar prevx=0, prevy=0; 61. uchar let; 62. uchar col; 63. #else 64. static schar prevx, prevy; 65. static uchar let; 66. static uchar col; 67. #endif 68. 69. switch ((int)x) { 70. case -2: /* change let call */ 71. let = y; 72. return; 73. case -1: /* open or close call */ 74. if ((int)y >= 0) { 75. let = y; 76. prevx = -1; 77. col = AT_ZAP; 78. return; 79. } 80. break; 81. case -3: /* set color call */ 82. col = y; 83. return; 84. } 85. if(prevx >= 0 && cansee(prevx,prevy)) { 86. delay_output(); 87. prl(prevx, prevy); /* in case there was a monster */ 88. at(prevx, prevy, levl[prevx][prevy].scrsym, AT_APP); 89. } 90. if(x >= 0){ /* normal call */ 91. if(cansee(x,y)) at(x,y,let,col); 92. prevx = x; 93. prevy = y; 94. } else { /* close call */ 95. let = 0; 96. prevx = -1; 97. } 98. } 99. 100. /* like the previous, but the symbols are first erased on completion */ 101. void 102. Tmp_at2(x, y) 103. int x, y; 104. { 105. #ifdef LINT /* static char let; static xchar cnt; static coord tc[COLNO]; */ 106. uchar let; 107. xchar cnt; 108. coord tc[COLNO]; /* but watch reflecting beams! */ 109. # ifdef MSDOSCOLOR 110. uchar col; 111. # endif 112. #else 113. static uchar let; 114. static xchar cnt; 115. static coord tc[COLNO]; /* but watch reflecting beams! */ 116. # ifdef MSDOSCOLOR 117. static uchar col; 118. # endif 119. #endif 120. register int xx,yy; 121. switch((int)x) { 122. case -1: 123. if(y > 0) { /* open call */ 124. let = y; 125. cnt = 0; 126. #ifdef MSDOSCOLOR 127. col = AT_ZAP; 128. #endif 129. return; 130. } 131. /* close call (do not distinguish y==0 and y==-1) */ 132. while(cnt--) { 133. xx = tc[cnt].x; 134. yy = tc[cnt].y; 135. prl(xx, yy); 136. at(xx, yy, levl[xx][yy].scrsym, AT_APP); 137. } 138. cnt = let = 0; /* superfluous */ 139. return; 140. case -2: /* change let call */ 141. let = y; 142. return; 143. #ifdef MSDOSCOLOR 144. case -3: /* set color call */ 145. col = y; 146. return; 147. #endif 148. } 149. /* normal call */ 150. if(cansee(x,y)) { 151. if(cnt) delay_output(); 152. #ifdef MSDOSCOLOR 153. at(x,y,let,col); 154. #else 155. at(x,y,let,AT_ZAP); 156. #endif 157. tc[cnt].x = x; 158. tc[cnt].y = y; 159. if(++cnt >= COLNO) panic("Tmp_at2 overflow?"); 160. levl[x][y].new = 0; /* prevent pline-nscr erasing --- */ 161. } 162. } 163. 164. void 165. curs_on_u() 166. { 167. curs(u.ux, u.uy+2); 168. } 169. 170. void 171. pru() 172. { 173. if(u.udispl && (Invisible || u.udisx != u.ux || u.udisy != u.uy)) 174. /* if(! levl[u.udisx][u.udisy].new) */ 175. if(!vism_at(u.udisx, u.udisy)) 176. newsym(u.udisx, u.udisy); 177. if(Invisible 178. #ifdef POLYSELF 179. || u.uundetected 180. #endif 181. ) { 182. u.udispl = 0; 183. prl(u.ux,u.uy); 184. } else 185. if(!u.udispl || u.udisx != u.ux || u.udisy != u.uy) { 186. atl(u.ux, u.uy, (char) u.usym); 187. u.udispl = 1; 188. u.udisx = u.ux; 189. u.udisy = u.uy; 190. } 191. levl[u.ux][u.uy].seen = 1; 192. } 193. 194. /* print a position that is visible for @ */ 195. void 196. prl(x,y) 197. { 198. register struct rm *room; 199. register struct monst *mtmp = (struct monst *)0; 200. register struct obj *otmp; 201. register struct trap *ttmp; 202. 203. if(x == u.ux && y == u.uy && !Invisible 204. #ifdef POLYSELF 205. && !u.uundetected 206. #endif 207. ) { 208. pru(); 209. return; 210. } 211. if(!isok(x,y)) return; 212. room = &levl[x][y]; 213. if((!room->typ) || 214. (IS_ROCK(room->typ) && levl[u.ux][u.uy].typ == CORR && 215. !levl[u.ux][u.uy].lit)) 216. /* the only lit corridor squares should be the entrances to 217. * outside castle areas */ 218. return; 219. if(room->mmask) mtmp = m_at(x,y); 220. if(mtmp && !mtmp->mhide && 221. (!mtmp->minvis || See_invisible)) { 222. #ifdef WORM 223. if(m_atseg) 224. pwseg(m_atseg); 225. else 226. #endif 227. pmon(mtmp); 228. } 229. else if(room->omask && !is_pool(x,y)) { 230. otmp = o_at(x,y); 231. atl(x,y,Hallucination ? rndobjsym() : otmp->olet); 232. } 233. else if(room->gmask && !is_pool(x,y)) 234. atl(x,y,Hallucination ? rndobjsym() : GOLD_SYM); 235. else if((!mtmp || mtmp->data == &mons[PM_GIANT_SPIDER]) && 236. (ttmp = t_at(x,y)) && ttmp->ttyp == WEB) 237. atl(x,y,(char)WEB_SYM); 238. else if(mtmp && (!mtmp->minvis || See_invisible)) { 239. /* must be a hiding monster, but not hiding right now */ 240. /* assume for the moment that long worms do not hide */ 241. pmon(mtmp); 242. } 243. else if(!room->seen || room->scrsym == STONE_SYM) { 244. room->new = room->seen = 1; 245. newsym(x,y); 246. on_scr(x,y); 247. } 248. room->seen = 1; 249. } 250. 251. uchar 252. news0(x,y) 253. register xchar x,y; 254. { 255. register struct obj *otmp; 256. register struct trap *ttmp; 257. struct rm *room; 258. register uchar tmp; /* don't compare char with uchar -- OIS */ 259. register int croom; 260. 261. room = &levl[x][y]; 262. /* note: a zero scrsym means to ignore the presence of objects */ 263. if(!room->seen) tmp = STONE_SYM; 264. else if(room->typ == POOL || room->typ == MOAT) tmp = POOL_SYM; 265. else if(room->omask && !Blind && room->scrsym) { 266. otmp = o_at(x,y); 267. tmp = Hallucination ? rndobjsym() : otmp->olet; 268. } 269. else if(room->gmask && !Blind && room->scrsym) 270. tmp = Hallucination ? rndobjsym() : GOLD_SYM; 271. else if(x == xupstair && y == yupstair) tmp = UP_SYM; 272. else if(x == xdnstair && y == ydnstair) tmp = DN_SYM; 273. #ifdef STRONGHOLD 274. else if(x == xupladder && y == yupladder) tmp = UPLADDER_SYM; 275. else if(x == xdnladder && y == ydnladder) tmp = DNLADDER_SYM; 276. #endif 277. else if((ttmp = t_at(x,y)) && ttmp->ttyp == WEB) tmp = WEB_SYM; 278. else if(ttmp && ttmp->tseen) tmp = TRAP_SYM; 279. else switch(room->typ) { 280. case SCORR: 281. tmp = STONE_SYM; 282. break; 283. case SDOOR: 284. croom = inroom(x,y); 285. if(croom == -1) { 286. #ifdef STRONGHOLD 287. if(IS_WALL(levl[x-1][y].typ)) tmp = HWALL_SYM; 288. else tmp = VWALL_SYM; 289. break; 290. #else 291. impossible("door %d %d not in room",x,y); 292. #endif 293. } 294. if(rooms[croom].lx-1 == x || rooms[croom].hx+1 == x) 295. tmp = VWALL_SYM; 296. else /* SDOORs aren't created on corners */ 297. tmp = HWALL_SYM; 298. break; 299. case HWALL: 300. #ifdef STRONGHOLD 301. if (is_maze_lev && is_drawbridge_wall(x,y) >= 0) tmp = DB_HWALL_SYM; 302. else 303. #endif 304. tmp = HWALL_SYM; 305. break; 306. case VWALL: 307. #ifdef STRONGHOLD 308. if (is_maze_lev && is_drawbridge_wall(x,y) >= 0) tmp = DB_VWALL_SYM; 309. else 310. #endif 311. tmp = VWALL_SYM; 312. break; 313. case TLCORNER: 314. tmp = TLCORN_SYM; 315. break; 316. case TRCORNER: 317. tmp = TRCORN_SYM; 318. break; 319. case BLCORNER: 320. tmp = BLCORN_SYM; 321. break; 322. case BRCORNER: 323. tmp = BRCORN_SYM; 324. break; 325. case DOOR: 326. tmp = DOOR_SYM; 327. break; 328. case CORR: 329. tmp = CORR_SYM; 330. break; 331. #ifdef STRONGHOLD 332. case DRAWBRIDGE_UP: 333. if((room->drawbridgemask & DB_UNDER) == DB_MOAT) tmp = POOL_SYM; 334. else tmp = ROOM_SYM; 335. break; 336. case DRAWBRIDGE_DOWN: 337. #endif /* STRONGHOLD /**/ 338. case ROOM: 339. if(room->lit || cansee(x,y) || Blind) tmp = ROOM_SYM; 340. else tmp = STONE_SYM; 341. break; 342. #ifdef POLYSELF 343. case STONE: 344. tmp = STONE_SYM; 345. break; 346. #endif 347. #ifdef FOUNTAINS 348. case FOUNTAIN: 349. tmp = FOUNTAIN_SYM; 350. break; 351. #endif 352. #ifdef THRONES 353. case THRONE: 354. tmp = THRONE_SYM; 355. break; 356. #endif 357. #ifdef SINKS 358. case SINK: 359. tmp = SINK_SYM; 360. break; 361. #endif 362. #ifdef ALTARS 363. case ALTAR: 364. tmp = ALTAR_SYM; 365. break; 366. #endif 367. case CROSSWALL: 368. tmp = CRWALL_SYM; 369. break; 370. case TUWALL: 371. tmp = TUWALL_SYM; 372. break; 373. case TDWALL: 374. tmp = TDWALL_SYM; 375. break; 376. case TLWALL: 377. tmp = TLWALL_SYM; 378. break; 379. case TRWALL: 380. tmp = TRWALL_SYM; 381. break; 382. /* 383. case POOL: 384. tmp = POOL_SYM; 385. break; 386. */ 387. default: 388. tmp = ERRCHAR; 389. } 390. return(tmp); 391. } 392. 393. void 394. newsym(x,y) 395. register int x, y; 396. { 397. atl(x,y,(char)news0(x,y)); 398. } 399. 400. /* used with wand of digging (or pick-axe): fill scrsym and force display */ 401. /* also when a POOL evaporates */ 402. void 403. mnewsym(x, y) 404. register int x, y; 405. { 406. register struct rm *room; 407. uchar newscrsym; /* OIS */ 408. 409. if(!vism_at(x,y)) { 410. room = &levl[x][y]; 411. newscrsym = news0(x,y); 412. if(room->scrsym != newscrsym) { 413. room->scrsym = newscrsym; 414. room->seen = 0; 415. } 416. } 417. } 418. 419. void 420. nosee(x,y) 421. register int x, y; 422. { 423. register struct rm *room; 424. 425. if(!isok(x,y)) return; 426. room = &levl[x][y]; 427. if(room->scrsym == ROOM_SYM && !room->lit && !Blind) { 428. room->scrsym = STONE_SYM; /* was ' ' -- OIS */ 429. room->new = 1; 430. on_scr(x,y); 431. } 432. } 433. 434. void 435. prl1(x,y) 436. register int x, y; 437. { 438. if(u.dx) { 439. if(u.dy) { 440. prl(x-(2*u.dx),y); 441. prl(x-u.dx,y); 442. prl(x,y); 443. prl(x,y-u.dy); 444. prl(x,y-(2*u.dy)); 445. } else { 446. prl(x,y-1); 447. prl(x,y); 448. prl(x,y+1); 449. } 450. } else { 451. prl(x-1,y); 452. prl(x,y); 453. prl(x+1,y); 454. } 455. } 456. 457. void 458. nose1(x,y) 459. register int x, y; 460. { 461. if(u.dx) { 462. if(u.dy) { 463. nosee(x,u.uy); 464. nosee(x,u.uy-u.dy); 465. nosee(x,y); 466. nosee(u.ux-u.dx,y); 467. nosee(u.ux,y); 468. } else { 469. nosee(x,y-1); 470. nosee(x,y); 471. nosee(x,y+1); 472. } 473. } else { 474. nosee(x-1,y); 475. nosee(x,y); 476. nosee(x+1,y); 477. } 478. } 479. 480. int 481. vism_at(x,y) 482. register int x, y; 483. { 484. if(x == u.ux && y == u.uy && !Invisible) return(1); 485. 486. if(levl[x][y].mmask) 487. if (Blind && Telepat || canseemon(m_at(x,y))) 488. return(1); 489. else return ((HTelepat & WORN_HELMET) && 490. (dist(x, y) <= (BOLT_LIM * BOLT_LIM))); 491. return(0); 492. } 493. 494. #ifdef NEWSCR 495. void 496. pobj(obj) 497. register struct obj *obj; 498. { 499. register int show = (!obj->oinvis || See_invisible) && 500. cansee(obj->ox,obj->oy); 501. if(obj->odispl){ 502. if(obj->odx != obj->ox || obj->ody != obj->oy || !show) 503. if(!vism_at(obj->odx,obj->ody)){ 504. newsym(obj->odx, obj->ody); 505. obj->odispl = 0; 506. } 507. } 508. if(show && !vism_at(obj->ox,obj->oy)){ 509. atl(obj->ox,obj->oy,obj->olet); 510. obj->odispl = 1; 511. obj->odx = obj->ox; 512. obj->ody = obj->oy; 513. } 514. } 515. #endif /* NEWSCR /**/ 516. 517. void 518. unpobj(obj) 519. register struct obj *obj; 520. { 521. /* if(obj->odispl){ 522. if(!vism_at(obj->odx, obj->ody)) 523. newsym(obj->odx, obj->ody); 524. obj->odispl = 0; 525. } 526. */ 527. if(!vism_at(obj->ox,obj->oy)) 528. newsym(obj->ox,obj->oy); 529. } 530. 531. #ifdef WORM 532. static void 533. pwseg(wtmp) 534. register struct wseg *wtmp; 535. { 536. if(!wtmp->wdispl){ 537. atl(wtmp->wx, wtmp->wy, S_WORM_TAIL); 538. wtmp->wdispl = 1; 539. } 540. } 541. #endif