Source:NetHack 3.4.0/mapglyph.c

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

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /*	SCCS Id: @(#)mapglyph.c	3.4	2000/08/18	*/ 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. 11.  int explcolors[] = { 12.  	CLR_BLACK,	/* dark    */ 13.  	CLR_GREEN,	/* noxious */ 14.  	CLR_BROWN,	/* muddy   */ 15.  	CLR_BLUE,	/* wet     */ 16.  	CLR_MAGENTA,	/* magical */ 17.  	CLR_ORANGE,	/* fiery   */ 18.  	CLR_WHITE,	/* frosty  */ 19.  };  20.    21.   #if !defined(TTY_GRAPHICS) 22.  #define has_color(n)  TRUE 23.  #endif 24.   25.   #ifdef TEXTCOLOR 26.  #define zap_color(n)  color = iflags.use_color ? zapcolors[n] : NO_COLOR 27.  #define cmap_color(n) color = iflags.use_color ? defsyms[n].color : NO_COLOR 28.  #define obj_color(n)  color = iflags.use_color ? objects[n].oc_color : NO_COLOR 29.  #define mon_color(n)  color = iflags.use_color ? mons[n].mcolor : NO_COLOR 30.  #define invis_color(n) color = NO_COLOR 31.  #define pet_color(n)  color = iflags.use_color ? mons[n].mcolor : NO_COLOR 32.  #define warn_color(n) color = iflags.use_color ? def_warnsyms[n].color : NO_COLOR 33.  #define explode_color(n) color = iflags.use_color ? explcolors[n] : NO_COLOR 34.  # if defined(REINCARNATION) && defined(ASCIIGRAPH) 35.  #  define ROGUE_COLOR 36.  # endif 37.   38.   #else	/* no text color */ 39.   40.   #define zap_color(n) 41.  #define cmap_color(n) 42.  #define obj_color(n) 43.  #define mon_color(n) 44.  #define invis_color(n) 45.  #define pet_color(c) 46.  #define warn_color(n) 47.  #define explode_color(n) 48.  #endif 49.   50.   #ifdef ROGUE_COLOR 51.  # if defined(USE_TILES) && defined(MSDOS) 52.  #define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && !iflags.grmode && \  53.   	Is_rogue_level(&u.uz)) 54.  # else 55.  #define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && Is_rogue_level(&u.uz)) 56.  # endif 57.  #endif 58.   59.   /*ARGSUSED*/ 60.  void 61.  mapglyph(glyph, ochar, ocolor, ospecial, x, y)  62. int glyph, *ocolor, x, y; 63. int *ochar; 64.  unsigned *ospecial; 65.  {  66.   	register int offset; 67.  	int color = NO_COLOR; 68.  	uchar ch; 69.  	unsigned special = 0; 70.   71.       /*  72.        *  Map the glyph back to a character and color. 73.       *  74.        *  Warning:  For speed, this makes an assumption on the order of  75. *		 offsets. The order is set in display.h. 76. */ 77.       if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) {	/* a warning flash */ 78.      	ch = warnsyms[offset]; 79.  # ifdef ROGUE_COLOR 80.  	if (HAS_ROGUE_IBM_GRAPHICS) 81.  	    color = NO_COLOR; 82.  	else 83.  # endif 84.  	    warn_color(offset); 85.      } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) {	/* swallow */ 86.  	/* see swallow_to_glyph in display.c */ 87.  	ch = (uchar) showsyms[S_sw_tl + (offset & 0x7)]; 88.  #ifdef ROGUE_COLOR 89.  	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) 90.  	    color = NO_COLOR; 91.  	else 92.  #endif 93.  	    mon_color(offset >> 3); 94.      } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) {	/* zap beam */ 95.  	/* see zapdir_to_glyph in display.c */ 96.  	ch = showsyms[S_vbeam + (offset & 0x3)]; 97.  #ifdef ROGUE_COLOR 98.  	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) 99.  	    color = NO_COLOR; 100. 	else 101. #endif 102. 	    zap_color((offset >> 2)); 103.     } else if ((offset = (glyph - GLYPH_EXPLODE_OFF)) >= 0) {	/* explosion */ 104. 	ch = showsyms[(offset % MAXEXPCHARS) + S_explode1]; 105. 	explode_color(offset / MAXEXPCHARS); 106.     } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) {	/* cmap */ 107. 	ch = showsyms[offset]; 108. #ifdef ROGUE_COLOR 109. 	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { 110. 	    if (offset >= S_vwall && offset <= S_hcdoor) 111. 		color = CLR_BROWN; 112. 	    else if (offset >= S_arrow_trap && offset <= S_polymorph_trap) 113. 		color = CLR_MAGENTA; 114. 	    else if (offset == S_corr || offset == S_litcorr) 115. 		color = CLR_GRAY; 116. 	    else if (offset >= S_room && offset <= S_water) 117. 		color = CLR_GREEN; 118. 	    else 119. 		color = NO_COLOR; 120. 	} else 121. #endif 122. 	    cmap_color(offset); 123.     } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) {	/* object */ 124. 	if (offset == BOULDER && iflags.bouldersym) ch = iflags.bouldersym; 125. 	else ch = oc_syms[(int)objects[offset].oc_class]; 126. #ifdef ROGUE_COLOR 127. 	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { 128. 	    switch(objects[offset].oc_class) { 129. 		case GOLD_CLASS: color = CLR_YELLOW; break; 130. 		case FOOD_CLASS: color = CLR_RED; break; 131. 		default: color = CLR_BRIGHT_BLUE; break; 132. 	    }  133.  	} else 134. #endif 135. 	    obj_color(offset); 136.     } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) {	/* mon ridden */ 137. 	ch = monsyms[(int)mons[offset].mlet]; 138. #ifdef ROGUE_COLOR 139. 	if (HAS_ROGUE_IBM_GRAPHICS) 140. 	    /* This currently implies that the hero is here -- monsters */ 141. 	    /* don't ride (yet...). Should we set it to yellow like in */ 142. 	    /* the monster case below? There is no equivalent in rogue. */ 143.  	    color = NO_COLOR;	/* no need to check iflags.use_color */ 144. 	else 145. #endif 146. 	    mon_color(offset); 147. 	    special |= MG_RIDDEN; 148.     } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) {	/* a corpse */ 149. 	ch = oc_syms[(int)objects[CORPSE].oc_class]; 150. #ifdef ROGUE_COLOR 151. 	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) 152. 	    color = CLR_RED; 153. 	else 154. #endif 155. 	    mon_color(offset); 156. 	    special |= MG_CORPSE; 157.     } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) {	/* mon detect */ 158. 	ch = monsyms[(int)mons[offset].mlet]; 159. #ifdef ROGUE_COLOR 160. 	if (HAS_ROGUE_IBM_GRAPHICS) 161. 	    color = NO_COLOR;	/* no need to check iflags.use_color */ 162. 	else 163. #endif 164. 	    mon_color(offset); 165. 	/* Disabled for now; anyone want to get reverse video to work? */ 166.  	/* is_reverse = TRUE; */ 167. 	    special |= MG_DETECT; 168.     } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) {	/* invisible */ 169. 	ch = DEF_INVISIBLE; 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. 	    invis_color(offset); 176. 	    special |= MG_INVIS; 177.     } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) {	/* a pet */ 178. 	ch = monsyms[(int)mons[offset].mlet]; 179. #ifdef ROGUE_COLOR 180. 	if (HAS_ROGUE_IBM_GRAPHICS) 181. 	    color = NO_COLOR;	/* no need to check iflags.use_color */ 182. 	else 183. #endif 184. 	    pet_color(offset); 185. 	    special |= MG_PET; 186.     } else {							/* a monster */ 187. 	ch = monsyms[(int)mons[glyph].mlet]; 188. #ifdef ROGUE_COLOR 189. 	if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { 190. 	    if (x == u.ux && y == u.uy) 191. 		/* actually player should be yellow-on-gray if in a corridor */ 192. 		color = CLR_YELLOW; 193. 	    else 194. 		color = NO_COLOR; 195. 	} else 196. #endif 197. 	    mon_color(glyph); 198.     }  199.   200.  #ifdef TEXTCOLOR 201.     /* Turn off color if no color defined, or rogue level w/o PC graphics. */ 202.  # ifdef REINCARNATION 203. #  ifdef ASCIIGRAPH 204.     if (!has_color(color) || (Is_rogue_level(&u.uz) && !HAS_ROGUE_IBM_GRAPHICS)) 205. #  else 206.     if (!has_color(color) || Is_rogue_level(&u.uz)) 207. #  endif 208. # else 209.     if (!has_color(color)) 210. # endif 211. 	color = NO_COLOR; 212. #endif 213.     if (ochar) 214. 	*ochar = (int)ch; 215.     else 216.     	impossible("glyphmap: Invalid output character buffer."); 217.  218.      if (ospecial) 219. 	*ospecial = special; 220.     else 221.     	impossible("glyphmap: Invalid special feature return buffer."); 222.  223.  #ifdef TEXTCOLOR 224.     if (ocolor) 225. 	*ocolor = color; 226.     else 227.     	impossible("glyphmap: Invalid color  buffer."); 228. #endif 229.     return; 230. }  231.   232.  /*mapglyph.c*/