Source:SLASH'EM 0.0.7E7F2/mapglyph.c

From NetHackWiki
Revision as of 19:13, 7 March 2008 by Kernigh bot (talk | contribs) (SLASH'EM 0.0.7E7F2/mapglyph.c moved to Source:SLASH'EM 0.0.7E7F2/mapglyph.c: Robot: moved page)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Below is the full text to mapglyph.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/mapglyph.c#line123]], for example.

The latest source code for vanilla NetHack is at 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: @(#)mapglyph.c	3.4	2003/01/08	*/
2.    /* Copyright (c) David Cohrs, 1991				  */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
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.   
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*/