From a7a50902bdddc6c60f876cf3f06238c384aaf206 Mon Sep 17 00:00:00 2001 From: jwalz Date: Sat, 5 Jan 2002 21:05:49 +0000 Subject: [PATCH] *** empty log message *** --- src/mapglyph.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 src/mapglyph.c diff --git a/src/mapglyph.c b/src/mapglyph.c new file mode 100644 index 000000000..91ad008c1 --- /dev/null +++ b/src/mapglyph.c @@ -0,0 +1,226 @@ +/* SCCS Id: @(#)mapglyph.c 3.3 2000/08/18 */ +/* Copyright (c) David Cohrs, 1991 */ +/* NetHack may be freely redistributed. See license for details. */ + +#include "hack.h" +#if defined(TTY_GRAPHICS) +#include "wintty.h" /* for prototype of has_color() only */ +#endif + +int explcolors[] = { + CLR_BLACK, /* dark */ + CLR_GREEN, /* noxious */ + CLR_BROWN, /* muddy */ + CLR_BLUE, /* wet */ + CLR_MAGENTA, /* magical */ + CLR_ORANGE, /* fiery */ + CLR_WHITE, /* frosty */ +}; + +#ifdef TEXTCOLOR +#define zap_color(n) color = iflags.use_color ? zapcolors[n] : NO_COLOR +#define cmap_color(n) color = iflags.use_color ? defsyms[n].color : NO_COLOR +#define obj_color(n) color = iflags.use_color ? objects[n].oc_color : NO_COLOR +#define mon_color(n) color = iflags.use_color ? mons[n].mcolor : NO_COLOR +#define invis_color(n) color = NO_COLOR +#define pet_color(n) color = iflags.use_color ? mons[n].mcolor : NO_COLOR +#define warn_color(n) color = iflags.use_color ? def_warnsyms[n].color : NO_COLOR +#define explode_color(n) color = iflags.use_color ? explcolors[n] : NO_COLOR +# if defined(REINCARNATION) && defined(ASCIIGRAPH) +# define ROGUE_COLOR +# endif + +#else /* no text color */ + +#define zap_color(n) +#define cmap_color(n) +#define obj_color(n) +#define mon_color(n) +#define invis_color(n) +#define pet_color(c) +#define warn_color(n) +#define explode_color(n) +#endif + +#ifdef ROGUE_COLOR +# if defined(USE_TILES) && defined(MSDOS) +#define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && !iflags.grmode && \ + Is_rogue_level(&u.uz)) +# else +#define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && Is_rogue_level(&u.uz)) +# endif +#endif + +void +mapglyph(glyph, ochar, ocolor, ospecial, x, y) +int glyph, *ocolor, x, y; +int *ochar; +unsigned *ospecial; +{ + register int offset; + int color = NO_COLOR; + uchar ch; + unsigned special = 0; + + /* + * Map the glyph back to a character and color. + * + * Warning: For speed, this makes an assumption on the order of + * offsets. The order is set in display.h. + */ + if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ + ch = warnsyms[offset]; +# ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + color = NO_COLOR; + else +# endif + warn_color(offset); + } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ + /* see swallow_to_glyph() in display.c */ + ch = (uchar) showsyms[S_sw_tl + (offset & 0x7)]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) + color = NO_COLOR; + else +#endif + mon_color(offset >> 3); + } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ + /* see zapdir_to_glyph() in display.c */ + ch = showsyms[S_vbeam + (offset & 0x3)]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) + color = NO_COLOR; + else +#endif + zap_color((offset >> 2)); + } else if ((offset = (glyph - GLYPH_EXPLODE_OFF)) >= 0) { /* explosion */ + ch = showsyms[(offset % MAXEXPCHARS) + S_explode1]; + explode_color(offset / MAXEXPCHARS); + } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ + ch = showsyms[offset]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { + if (offset >= S_vwall && offset <= S_hcdoor) + color = CLR_BROWN; + else if (offset >= S_arrow_trap && offset <= S_polymorph_trap) + color = CLR_MAGENTA; + else if (offset == S_corr || offset == S_litcorr) + color = CLR_GRAY; + else if (offset >= S_room && offset <= S_water) + color = CLR_GREEN; + else + color = NO_COLOR; + } else +#endif + cmap_color(offset); + } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ + if (offset == BOULDER && iflags.bouldersym) ch = iflags.bouldersym; + else ch = oc_syms[(int)objects[offset].oc_class]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { + switch(objects[offset].oc_class) { + case GOLD_CLASS: color = CLR_YELLOW; break; + case FOOD_CLASS: color = CLR_RED; break; + default: color = CLR_BRIGHT_BLUE; break; + } + } else +#endif + obj_color(offset); + } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) { /* mon ridden */ + ch = monsyms[(int)mons[offset].mlet]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + /* This currently implies that the hero is here -- monsters */ + /* don't ride (yet...). Should we set it to yellow like in */ + /* the monster case below? There is no equivalent in rogue. */ + color = NO_COLOR; /* no need to check iflags.use_color */ + else +#endif + mon_color(offset); + special |= MG_RIDDEN; + } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ + ch = oc_syms[(int)objects[CORPSE].oc_class]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) + color = CLR_RED; + else +#endif + mon_color(offset); + special |= MG_CORPSE; + } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { /* mon detect */ + ch = monsyms[(int)mons[offset].mlet]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + color = NO_COLOR; /* no need to check iflags.use_color */ + else +#endif + mon_color(offset); + /* Disabled for now; anyone want to get reverse video to work? */ + /* is_reverse = TRUE; */ + special |= MG_DETECT; + } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ + ch = DEF_INVISIBLE; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + color = NO_COLOR; /* no need to check iflags.use_color */ + else +#endif + invis_color(offset); + special |= MG_INVIS; + } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ + ch = monsyms[(int)mons[offset].mlet]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + color = NO_COLOR; /* no need to check iflags.use_color */ + else +#endif + pet_color(offset); + special |= MG_PET; + } else { /* a monster */ + ch = monsyms[(int)mons[glyph].mlet]; +#ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { + if (x == u.ux && y == u.uy) + /* actually player should be yellow-on-gray if in a corridor */ + color = CLR_YELLOW; + else + color = NO_COLOR; + } else +#endif + mon_color(glyph); + } + +#ifdef TEXTCOLOR + /* Turn off color if no color defined, or rogue level w/o PC graphics. */ +# ifdef REINCARNATION +# ifdef ASCIIGRAPH + if (!has_color(color) || (Is_rogue_level(&u.uz) && !HAS_ROGUE_IBM_GRAPHICS)) +# else + if (!has_color(color) || Is_rogue_level(&u.uz)) +# endif +# else + if (!has_color(color)) +# endif + color = NO_COLOR; +#endif + if (ochar) + *ochar = (int)ch; + else + impossible("glyphmap(): Invalid output character buffer."); + + if (ospecial) + *ospecial = special; + else + impossible("glyphmap(): Invalid special feature return buffer."); + +#ifdef TEXTCOLOR + if (ocolor) + *ocolor = color; + else + impossible("glyphmap(): Invalid color buffer."); +#endif + return; +} + +/*mapglyph.c*/