Wikia

Wikihack

Source:Mapglyph.c

2,032pages on
this wiki
Talk0

Below is the full text to src/mapglyph.c from NetHack 3.4.3. To link to a particular line, write [[mapglyph.c#line123]], for example.

Top of file Edit

1.    /*	SCCS Id: @(#)mapglyph.c	3.4	2003/01/08	*/
2.    /* Copyright (c) David Cohrs, 1991				  */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
5.    #include "hack.h"
6.    #if defined(TTY_GRAPHICS)
7.    #include "wintty.h"	/* for prototype of has_color() only */
8.    #endif
9.    #include "color.h"
10.   #define HI_DOMESTIC CLR_WHITE	/* monst.c */
11.   
12.   int explcolors[] = {
13.   	CLR_BLACK,	/* dark    */
14.   	CLR_GREEN,	/* noxious */
15.   	CLR_BROWN,	/* muddy   */
16.   	CLR_BLUE,	/* wet     */
17.   	CLR_MAGENTA,	/* magical */
18.   	CLR_ORANGE,	/* fiery   */
19.   	CLR_WHITE,	/* frosty  */
20.   };
21.   
22.   #if !defined(TTY_GRAPHICS)
23.   #define has_color(n)  TRUE
24.   #endif
25.   
26.   #ifdef TEXTCOLOR
27.   #define zap_color(n)  color = iflags.use_color ? zapcolors[n] : NO_COLOR
28.   #define cmap_color(n) color = iflags.use_color ? defsyms[n].color : NO_COLOR
29.   #define obj_color(n)  color = iflags.use_color ? objects[n].oc_color : NO_COLOR
30.   #define mon_color(n)  color = iflags.use_color ? mons[n].mcolor : NO_COLOR
31.   #define invis_color(n) color = NO_COLOR
32.   #define pet_color(n)  color = iflags.use_color ? mons[n].mcolor : NO_COLOR
33.   #define warn_color(n) color = iflags.use_color ? def_warnsyms[n].color : NO_COLOR
34.   #define explode_color(n) color = iflags.use_color ? explcolors[n] : NO_COLOR
35.   # if defined(REINCARNATION) && defined(ASCIIGRAPH)
36.   #  define ROGUE_COLOR
37.   # endif
38.   
39.   #else	/* no text color */
40.   
41.   #define zap_color(n)
42.   #define cmap_color(n)
43.   #define obj_color(n)
44.   #define mon_color(n)
45.   #define invis_color(n)
46.   #define pet_color(c)
47.   #define warn_color(n)
48.   #define explode_color(n)
49.   #endif
50.   
51.   #ifdef ROGUE_COLOR
52.   # if defined(USE_TILES) && defined(MSDOS)
53.   #define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && !iflags.grmode && \
54.   	Is_rogue_level(&u.uz))
55.   # else
56.   #define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && Is_rogue_level(&u.uz))
57.   # endif
58.   #endif
59.   

mapglyph Edit

60.   /*ARGSUSED*/
61.   void
62.   mapglyph(glyph, ochar, ocolor, ospecial, x, y)
63.   int glyph, *ocolor, x, y;
64.   int *ochar;
65.   unsigned *ospecial;
66.   {
67.   	register int offset;
68.   #if defined(TEXTCOLOR) || defined(ROGUE_COLOR)
69.   	int color = NO_COLOR;
70.   #endif
71.   	uchar ch;
72.   	unsigned special = 0;
73.   
74.       /*
75.        *  Map the glyph back to a character and color.
76.        *
77.        *  Warning:  For speed, this makes an assumption on the order of
78.        *		  offsets.  The order is set in display.h.
79.        */
80.       if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) {	/* a warning flash */
81.       	ch = warnsyms[offset];
82.   # ifdef ROGUE_COLOR
83.   	if (HAS_ROGUE_IBM_GRAPHICS)
84.   	    color = NO_COLOR;
85.   	else
86.   # endif
87.   	    warn_color(offset);
88.       } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) {	/* swallow */
89.   	/* see swallow_to_glyph() in display.c */
90.   	ch = (uchar) showsyms[S_sw_tl + (offset & 0x7)];
91.   #ifdef ROGUE_COLOR
92.   	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color)
93.   	    color = NO_COLOR;
94.   	else
95.   #endif
96.   	    mon_color(offset >> 3);
97.       } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) {	/* zap beam */
98.   	/* see zapdir_to_glyph() in display.c */
99.   	ch = showsyms[S_vbeam + (offset & 0x3)];
100.  #ifdef ROGUE_COLOR
101.  	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color)
102.  	    color = NO_COLOR;
103.  	else
104.  #endif
105.  	    zap_color((offset >> 2));
106.      } else if ((offset = (glyph - GLYPH_EXPLODE_OFF)) >= 0) {	/* explosion */
107.  	ch = showsyms[(offset % MAXEXPCHARS) + S_explode1];
108.  	explode_color(offset / MAXEXPCHARS);
109.      } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) {	/* cmap */
110.  	ch = showsyms[offset];
111.  #ifdef ROGUE_COLOR
112.  	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) {
113.  	    if (offset >= S_vwall && offset <= S_hcdoor)
114.  		color = CLR_BROWN;
115.  	    else if (offset >= S_arrow_trap && offset <= S_polymorph_trap)
116.  		color = CLR_MAGENTA;
117.  	    else if (offset == S_corr || offset == S_litcorr)
118.  		color = CLR_GRAY;
119.  	    else if (offset >= S_room && offset <= S_water)
120.  		color = CLR_GREEN;
121.  	    else
122.  		color = NO_COLOR;
123.  	} else
124.  #endif
125.  #ifdef TEXTCOLOR
126.  	    /* provide a visible difference if normal and lit corridor
127.  	     * use the same symbol */
128.  	    if (iflags.use_color &&
129.  		offset == S_litcorr && ch == showsyms[S_corr])
130.  		color = CLR_WHITE;
131.  	    else
132.  #endif
133.  	    cmap_color(offset);
134.      } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) {	/* object */
135.  	if (offset == BOULDER && iflags.bouldersym) ch = iflags.bouldersym;
136.  	else ch = oc_syms[(int)objects[offset].oc_class];
137.  #ifdef ROGUE_COLOR
138.  	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) {
139.  	    switch(objects[offset].oc_class) {
140.  		case COIN_CLASS: color = CLR_YELLOW; break;
141.  		case FOOD_CLASS: color = CLR_RED; break;
142.  		default: color = CLR_BRIGHT_BLUE; break;
143.  	    }
144.  	} else
145.  #endif
146.  	    obj_color(offset);
147.      } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) {	/* mon ridden */
148.  	ch = monsyms[(int)mons[offset].mlet];
149.  #ifdef ROGUE_COLOR
150.  	if (HAS_ROGUE_IBM_GRAPHICS)
151.  	    /* This currently implies that the hero is here -- monsters */
152.  	    /* don't ride (yet...).  Should we set it to yellow like in */
153.  	    /* the monster case below?  There is no equivalent in rogue. */
154.  	    color = NO_COLOR;	/* no need to check iflags.use_color */
155.  	else
156.  #endif
157.  	    mon_color(offset);
158.  	    special |= MG_RIDDEN;
159.      } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) {	/* a corpse */
160.  	ch = oc_syms[(int)objects[CORPSE].oc_class];
161.  #ifdef ROGUE_COLOR
162.  	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color)
163.  	    color = CLR_RED;
164.  	else
165.  #endif
166.  	    mon_color(offset);
167.  	    special |= MG_CORPSE;
168.      } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) {	/* mon detect */
169.  	ch = monsyms[(int)mons[offset].mlet];
170.  #ifdef ROGUE_COLOR
171.  	if (HAS_ROGUE_IBM_GRAPHICS)
172.  	    color = NO_COLOR;	/* no need to check iflags.use_color */
173.  	else
174.  #endif
175.  	    mon_color(offset);
176.  	/* Disabled for now; anyone want to get reverse video to work? */
177.  	/* is_reverse = TRUE; */
178.  	    special |= MG_DETECT;
179.      } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) {	/* invisible */
180.  	ch = DEF_INVISIBLE;
181.  #ifdef ROGUE_COLOR
182.  	if (HAS_ROGUE_IBM_GRAPHICS)
183.  	    color = NO_COLOR;	/* no need to check iflags.use_color */
184.  	else
185.  #endif
186.  	    invis_color(offset);
187.  	    special |= MG_INVIS;
188.      } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) {	/* a pet */
189.  	ch = monsyms[(int)mons[offset].mlet];
190.  #ifdef ROGUE_COLOR
191.  	if (HAS_ROGUE_IBM_GRAPHICS)
192.  	    color = NO_COLOR;	/* no need to check iflags.use_color */
193.  	else
194.  #endif
195.  	    pet_color(offset);
196.  	    special |= MG_PET;
197.      } else {							/* a monster */
198.  	ch = monsyms[(int)mons[glyph].mlet];
199.  #ifdef ROGUE_COLOR
200.  	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) {
201.  	    if (x == u.ux && y == u.uy)
202.  		/* actually player should be yellow-on-gray if in a corridor */
203.  		color = CLR_YELLOW;
204.  	    else
205.  		color = NO_COLOR;
206.  	} else
207.  #endif
208.  	{
209.  	    mon_color(glyph);
210.  	    /* special case the hero for `showrace' option */
211.  #ifdef TEXTCOLOR
212.  	    if (iflags.use_color && x == u.ux && y == u.uy &&
213.  		    iflags.showrace && !Upolyd)
214.  		color = HI_DOMESTIC;
215.  #endif
216.  	}
217.      }
218.  
219.  #ifdef TEXTCOLOR
220.      /* Turn off color if no color defined, or rogue level w/o PC graphics. */
221.  # ifdef REINCARNATION
222.  #  ifdef ASCIIGRAPH
223.      if (!has_color(color) || (Is_rogue_level(&u.uz) && !HAS_ROGUE_IBM_GRAPHICS))
224.  #  else
225.      if (!has_color(color) || Is_rogue_level(&u.uz))
226.  #  endif
227.  # else
228.      if (!has_color(color))
229.  # endif
230.  	color = NO_COLOR;
231.  #endif
232.  
233.      *ochar = (int)ch;
234.      *ospecial = special;
235.  #ifdef TEXTCOLOR
236.      *ocolor = color;
237.  #endif
238.      return;
239.  }
240.  
241.  /*mapglyph.c*/

Around Wikia's network

Random Wiki