Wikihack
Advertisement

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.
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
Advertisement