*** empty log message ***
This commit is contained in:
226
src/mapglyph.c
Normal file
226
src/mapglyph.c
Normal file
@@ -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*/
|
||||
Reference in New Issue
Block a user