Source:NetHack 3.0.0/prisym.c

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

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