Files
nethack/src/drawing.c
nhmall c9673b3d9e more window port interface adjustments
further adjustments to the window port interface to pass a pointer
to a glyph_info struct which describes not just the glyph number
itself, but also the ttychar, the color, the glyphflags, and the
symset index.

This affects two existing window port calls that get passed glyphs
and does the parameter consistently for both of them using the
glyph_info struct pointer:
	print_glyph()
	add_menu().

The recently added glyphmod parameter is now unnecessary and has been
removed.
2021-01-05 10:09:37 -05:00

311 lines
13 KiB
C

/* NetHack 3.7 drawing.c $NHDT-Date: 1596498163 2020/08/03 23:42:43 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.78 $ */
/* Copyright (c) NetHack Development Team 1992. */
/* NetHack may be freely redistributed. See license for details. */
#include "config.h"
#include "color.h"
#include "rm.h"
#include "objclass.h"
#include "monsym.h"
/* Relevant header information in rm.h, objclass.h, and monsym.h. */
#ifdef C
#undef C
#endif
#ifdef TEXTCOLOR
#define C(n) n
#else
#define C(n)
#endif
/* Default object class symbols. See objclass.h.
* {symbol, name, explain}
* name: used in object_detect().
* explain: used in do_look().
*/
const struct class_sym def_oc_syms[MAXOCLASSES] = {
{ '\0', "", "" }, /* placeholder for the "random class" */
{ ILLOBJ_SYM, "illegal objects", "strange object" },
{ WEAPON_SYM, "weapons", "weapon" },
{ ARMOR_SYM, "armor", "suit or piece of armor" },
{ RING_SYM, "rings", "ring" },
{ AMULET_SYM, "amulets", "amulet" },
{ TOOL_SYM, "tools", "useful item (pick-axe, key, lamp...)" },
{ FOOD_SYM, "food", "piece of food" },
{ POTION_SYM, "potions", "potion" },
{ SCROLL_SYM, "scrolls", "scroll" },
{ SPBOOK_SYM, "spellbooks", "spellbook" },
{ WAND_SYM, "wands", "wand" },
{ GOLD_SYM, "coins", "pile of coins" },
{ GEM_SYM, "rocks", "gem or rock" },
{ ROCK_SYM, "large stones", "boulder or statue" },
{ BALL_SYM, "iron balls", "iron ball" },
{ CHAIN_SYM, "chains", "iron chain" },
{ VENOM_SYM, "venoms", "splash of venom" }
};
/* Default monster class symbols. See monsym.h. */
const struct class_sym def_monsyms[MAXMCLASSES] = {
{ '\0', "", "" },
{ DEF_ANT, "", "ant or other insect" },
{ DEF_BLOB, "", "blob" },
{ DEF_COCKATRICE, "", "cockatrice" },
{ DEF_DOG, "", "dog or other canine" },
{ DEF_EYE, "", "eye or sphere" },
{ DEF_FELINE, "", "cat or other feline" },
{ DEF_GREMLIN, "", "gremlin" },
{ DEF_HUMANOID, "", "humanoid" },
{ DEF_IMP, "", "imp or minor demon" },
{ DEF_JELLY, "", "jelly" },
{ DEF_KOBOLD, "", "kobold" },
{ DEF_LEPRECHAUN, "", "leprechaun" },
{ DEF_MIMIC, "", "mimic" },
{ DEF_NYMPH, "", "nymph" },
{ DEF_ORC, "", "orc" },
{ DEF_PIERCER, "", "piercer" },
{ DEF_QUADRUPED, "", "quadruped" },
{ DEF_RODENT, "", "rodent" },
{ DEF_SPIDER, "", "arachnid or centipede" },
{ DEF_TRAPPER, "", "trapper or lurker above" },
{ DEF_UNICORN, "", "unicorn or horse" },
{ DEF_VORTEX, "", "vortex" },
{ DEF_WORM, "", "worm" },
{ DEF_XAN, "", "xan or other mythical/fantastic insect" },
{ DEF_LIGHT, "", "light" },
{ DEF_ZRUTY, "", "zruty" },
{ DEF_ANGEL, "", "angelic being" },
{ DEF_BAT, "", "bat or bird" },
{ DEF_CENTAUR, "", "centaur" },
{ DEF_DRAGON, "", "dragon" },
{ DEF_ELEMENTAL, "", "elemental" },
{ DEF_FUNGUS, "", "fungus or mold" },
{ DEF_GNOME, "", "gnome" },
{ DEF_GIANT, "", "giant humanoid" },
{ '\0', "", "invisible monster" },
{ DEF_JABBERWOCK, "", "jabberwock" },
{ DEF_KOP, "", "Keystone Kop" },
{ DEF_LICH, "", "lich" },
{ DEF_MUMMY, "", "mummy" },
{ DEF_NAGA, "", "naga" },
{ DEF_OGRE, "", "ogre" },
{ DEF_PUDDING, "", "pudding or ooze" },
{ DEF_QUANTMECH, "", "quantum mechanic" },
{ DEF_RUSTMONST, "", "rust monster or disenchanter" },
{ DEF_SNAKE, "", "snake" },
{ DEF_TROLL, "", "troll" },
{ DEF_UMBER, "", "umber hulk" },
{ DEF_VAMPIRE, "", "vampire" },
{ DEF_WRAITH, "", "wraith" },
{ DEF_XORN, "", "xorn" },
{ DEF_YETI, "", "apelike creature" },
{ DEF_ZOMBIE, "", "zombie" },
{ DEF_HUMAN, "", "human or elf" },
{ DEF_GHOST, "", "ghost" },
{ DEF_GOLEM, "", "golem" },
{ DEF_DEMON, "", "major demon" },
{ DEF_EEL, "", "sea monster" },
{ DEF_LIZARD, "", "lizard" },
{ DEF_WORM_TAIL, "", "long worm tail" },
{ DEF_MIMIC_DEF, "", "mimic" },
};
const struct symdef def_warnsyms[WARNCOUNT] = {
/* white warning */
{ '0', "unknown creature causing you worry", C(CLR_WHITE) },
/* pink warning */
{ '1', "unknown creature causing you concern", C(CLR_RED) },
/* red warning */
{ '2', "unknown creature causing you anxiety", C(CLR_RED) },
/* ruby warning */
{ '3', "unknown creature causing you disquiet", C(CLR_RED) },
/* purple warning */
{ '4', "unknown creature causing you alarm", C(CLR_MAGENTA) },
/* black warning */
{ '5', "unknown creature causing you dread", C(CLR_BRIGHT_MAGENTA) },
};
/*
* Default screen symbols with explanations and colors.
*/
const struct symdef defsyms[MAXPCHARS] = {
/* 0*/ { ' ', "stone", C(NO_COLOR) }, /* stone */
{ '|', "wall", C(CLR_GRAY) }, /* vwall */
{ '-', "wall", C(CLR_GRAY) }, /* hwall */
{ '-', "wall", C(CLR_GRAY) }, /* tlcorn */
{ '-', "wall", C(CLR_GRAY) }, /* trcorn */
{ '-', "wall", C(CLR_GRAY) }, /* blcorn */
{ '-', "wall", C(CLR_GRAY) }, /* brcorn */
{ '-', "wall", C(CLR_GRAY) }, /* crwall */
{ '-', "wall", C(CLR_GRAY) }, /* tuwall */
{ '-', "wall", C(CLR_GRAY) }, /* tdwall */
/*10*/ { '|', "wall", C(CLR_GRAY) }, /* tlwall */
{ '|', "wall", C(CLR_GRAY) }, /* trwall */
{ '.', "doorway", C(CLR_GRAY) }, /* ndoor */
{ '-', "open door", C(CLR_BROWN) }, /* vodoor */
{ '|', "open door", C(CLR_BROWN) }, /* hodoor */
{ '+', "closed door", C(CLR_BROWN) }, /* vcdoor */
{ '+', "closed door", C(CLR_BROWN) }, /* hcdoor */
{ '#', "iron bars", C(HI_METAL) }, /* bars */
{ '#', "tree", C(CLR_GREEN) }, /* tree */
{ '.', "floor of a room", C(CLR_GRAY) }, /* room */
/*20*/ { '.', "dark part of a room", C(CLR_BLACK) }, /* dark room */
{ '#', "corridor", C(CLR_GRAY) }, /* dark corr */
{ '#', "lit corridor", C(CLR_GRAY) }, /* lit corr, see map_glyphinfo() */
{ '<', "staircase up", C(CLR_GRAY) }, /* upstair */
{ '>', "staircase down", C(CLR_GRAY) }, /* dnstair */
{ '<', "ladder up", C(CLR_BROWN) }, /* upladder */
{ '>', "ladder down", C(CLR_BROWN) }, /* dnladder */
{ '_', "altar", C(CLR_GRAY) }, /* altar */
{ '|', "grave", C(CLR_WHITE) }, /* grave */
{ '\\', "opulent throne", C(HI_GOLD) }, /* throne */
/*30*/ { '#', "sink", C(CLR_GRAY) }, /* sink */
{ '{', "fountain", C(CLR_BRIGHT_BLUE) }, /* fountain */
{ '}', "water", C(CLR_BLUE) }, /* pool */
{ '.', "ice", C(CLR_CYAN) }, /* ice */
{ '}', "molten lava", C(CLR_RED) }, /* lava */
{ '.', "lowered drawbridge", C(CLR_BROWN) }, /* vodbridge */
{ '.', "lowered drawbridge", C(CLR_BROWN) }, /* hodbridge */
{ '#', "raised drawbridge", C(CLR_BROWN) }, /* vcdbridge */
{ '#', "raised drawbridge", C(CLR_BROWN) }, /* hcdbridge */
{ ' ', "air", C(CLR_CYAN) }, /* open air */
/*40*/ { '#', "cloud", C(CLR_GRAY) }, /* [part of] a cloud */
{ '}', "water", C(CLR_BLUE) }, /* under water */
{ '^', "arrow trap", C(HI_METAL) }, /* trap */
{ '^', "dart trap", C(HI_METAL) }, /* trap */
{ '^', "falling rock trap", C(CLR_GRAY) }, /* trap */
{ '^', "squeaky board", C(CLR_BROWN) }, /* trap */
{ '^', "bear trap", C(HI_METAL) }, /* trap */
{ '^', "land mine", C(CLR_RED) }, /* trap */
{ '^', "rolling boulder trap", C(CLR_GRAY) }, /* trap */
{ '^', "sleeping gas trap", C(HI_ZAP) }, /* trap */
/*50*/ { '^', "rust trap", C(CLR_BLUE) }, /* trap */
{ '^', "fire trap", C(CLR_ORANGE) }, /* trap */
{ '^', "pit", C(CLR_BLACK) }, /* trap */
{ '^', "spiked pit", C(CLR_BLACK) }, /* trap */
{ '^', "hole", C(CLR_BROWN) }, /* trap */
{ '^', "trap door", C(CLR_BROWN) }, /* trap */
{ '^', "teleportation trap", C(CLR_MAGENTA) }, /* trap */
{ '^', "level teleporter", C(CLR_MAGENTA) }, /* trap */
{ '^', "magic portal", C(CLR_BRIGHT_MAGENTA) }, /* trap */
{ '"', "web", C(CLR_GRAY) }, /* web */
/*60*/ { '^', "statue trap", C(CLR_GRAY) }, /* trap */
{ '^', "magic trap", C(HI_ZAP) }, /* trap */
{ '^', "anti-magic field", C(HI_ZAP) }, /* trap */
{ '^', "polymorph trap", C(CLR_BRIGHT_GREEN) }, /* trap */
{ '~', "vibrating square", C(CLR_MAGENTA) }, /* "trap" */
/* zap colors are changed by map_glyphinfo() to match type of beam */
{ '|', "", C(CLR_GRAY) }, /* vbeam */
{ '-', "", C(CLR_GRAY) }, /* hbeam */
{ '\\', "", C(CLR_GRAY) }, /* lslant */
{ '/', "", C(CLR_GRAY) }, /* rslant */
{ '*', "", C(CLR_WHITE) }, /* dig beam */
{ '!', "", C(CLR_WHITE) }, /* camera flash beam */
{ ')', "", C(HI_WOOD) }, /* boomerang open left */
/*70*/ { '(', "", C(HI_WOOD) }, /* boomerang open right */
{ '0', "", C(HI_ZAP) }, /* 4 magic shield symbols */
{ '#', "", C(HI_ZAP) },
{ '@', "", C(HI_ZAP) },
{ '*', "", C(HI_ZAP) },
{ '#', "poison cloud", C(CLR_BRIGHT_GREEN) }, /* part of a cloud */
{ '?', "valid position", C(CLR_BRIGHT_GREEN) }, /* target position */
/* swallow colors are changed by map_glyphinfo() to match engulfing monst */
{ '/', "", C(CLR_GREEN) }, /* swallow top left */
{ '-', "", C(CLR_GREEN) }, /* swallow top center */
{ '\\', "", C(CLR_GREEN) }, /* swallow top right */
/*80*/ { '|', "", C(CLR_GREEN) }, /* swallow middle left */
{ '|', "", C(CLR_GREEN) }, /* swallow middle right */
{ '\\', "", C(CLR_GREEN) }, /* swallow bottom left */
{ '-', "", C(CLR_GREEN) }, /* swallow bottom center */
{ '/', "", C(CLR_GREEN) }, /* swallow bottom right */
/* explosion colors are changed by map_glyphinfo() to match type of expl. */
{ '/', "", C(CLR_ORANGE) }, /* explosion top left */
{ '-', "", C(CLR_ORANGE) }, /* explosion top center */
{ '\\', "", C(CLR_ORANGE) }, /* explosion top right */
{ '|', "", C(CLR_ORANGE) }, /* explosion middle left */
{ ' ', "", C(CLR_ORANGE) }, /* explosion middle center*/
/*90*/ { '|', "", C(CLR_ORANGE) }, /* explosion middle right */
{ '\\', "", C(CLR_ORANGE) }, /* explosion bottom left */
{ '-', "", C(CLR_ORANGE) }, /* explosion bottom center*/
{ '/', "", C(CLR_ORANGE) }, /* explosion bottom right */
};
/* default rogue level symbols */
const uchar def_r_oc_syms[MAXOCLASSES] = {
/* 0*/ '\0', ILLOBJ_SYM, WEAPON_SYM, ']', /* armor */
RING_SYM,
/* 5*/ ',', /* amulet */
TOOL_SYM, ':', /* food */
POTION_SYM, SCROLL_SYM,
/*10*/ SPBOOK_SYM, WAND_SYM,
GEM_SYM, /* gold -- yes it's the same as gems */
GEM_SYM, ROCK_SYM,
/*15*/ BALL_SYM, CHAIN_SYM, VENOM_SYM
};
#undef C
/*
* Convert the given character to an object class. If the character is not
* recognized, then MAXOCLASSES is returned. Used in detect.c, invent.c,
* objnam.c, options.c, pickup.c, sp_lev.c, lev_main.c, and tilemap.c.
*/
int
def_char_to_objclass(ch)
char ch;
{
int i;
for (i = 1; i < MAXOCLASSES; i++)
if (ch == def_oc_syms[i].sym)
break;
return i;
}
/*
* Convert a character into a monster class. This returns the _first_
* match made. If there are are no matches, return MAXMCLASSES.
* Used in detect.c, options.c, read.c, sp_lev.c, and lev_main.c
*/
int
def_char_to_monclass(ch)
char ch;
{
int i;
for (i = 1; i < MAXMCLASSES; i++)
if (ch == def_monsyms[i].sym)
break;
return i;
}
/* does 'ch' represent a furniture character? returns index into defsyms[] */
int
def_char_is_furniture(ch)
char ch;
{
/* note: these refer to defsyms[] order which is much different from
levl[][].typ order but both keep furniture in a contiguous block */
static const char first_furniture[] = "stair", /* "staircase up" */
last_furniture[] = "fountain";
int i;
boolean furniture = FALSE;
for (i = 0; i < SIZE(defsyms); ++i) {
if (!furniture) {
if (!strncmp(defsyms[i].explanation, first_furniture, 5))
furniture = TRUE;
}
if (furniture) {
if (defsyms[i].sym == (uchar) ch)
return i;
if (!strcmp(defsyms[i].explanation, last_furniture))
break; /* reached last furniture */
}
}
return -1;
}
/*drawing.c*/