-/* NetHack 3.6 drawing.c $NHDT-Date: 1463706747 2016/05/20 01:12:27 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.51 $ */
+/* NetHack 3.6 drawing.c $NHDT-Date: 1573943500 2019/11/16 22:31:40 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.64 $ */
/* Copyright (c) NetHack Development Team 1992. */
/* NetHack may be freely redistributed. See license for details. */
/* JNetHack Copyright */
/* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
-/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2018 */
+/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2023 */
/* JNetHack may be freely redistributed. See license for details. */
#include "hack.h"
int currentgraphics = 0;
nhsym showsyms[SYM_MAX] = DUMMY; /* symbols to be displayed */
-nhsym l_syms[SYM_MAX] = DUMMY; /* loaded symbols */
-nhsym r_syms[SYM_MAX] = DUMMY; /* rogue symbols */
-
+nhsym primary_syms[SYM_MAX] = DUMMY; /* primary symbols */
+nhsym rogue_syms[SYM_MAX] = DUMMY; /* rogue symbols */
+nhsym ov_primary_syms[SYM_MAX] = DUMMY; /* overides via config SYMBOL */
+nhsym ov_rogue_syms[SYM_MAX] = DUMMY; /* overides via config ROGUESYMBOL */
nhsym warnsyms[WARNCOUNT] = DUMMY; /* the current warning display symbols */
-/*JP
-const char invisexplain[] = "remembered, unseen, creature";
-*/
-const char invisexplain[] = "\8ao\82¦\82Ä\82¢\82é\82ª\8c©\82¦\82Ä\82¢\82È\82¢\89ö\95¨";
-
+#if 0 /*JP:T*/
+const char invisexplain[] = "remembered, unseen, creature",
+ altinvisexplain[] = "unseen creature"; /* for clairvoyance */
+#else
+const char invisexplain[] = "\8ao\82¦\82Ä\82¢\82é\82ª\8c©\82¦\82Ä\82¢\82È\82¢\89ö\95¨",
+ altinvisexplain[] = "\8c©\82¦\82Ä\82¢\82È\82¢\89ö\95¨"; /* for clairvoyance */
+#endif
+
/* Default object class symbols. See objclass.h.
* {symbol, name, explain}
* name: used in object_detect().
* Default screen symbols with explanations and colors.
*/
const struct symdef defsyms[MAXPCHARS] = {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
/* 0*/ { ' ', "dark part of a room", C(NO_COLOR) }, /* stone */
{ '|', "wall", C(CLR_GRAY) }, /* vwall */
{ '-', "wall", C(CLR_GRAY) }, /* hwall */
{ '-', "\95Ç", C(CLR_GRAY) }, /* tuwall */
{ '-', "\95Ç", C(CLR_GRAY) }, /* tdwall */
#endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
/*10*/ { '|', "wall", C(CLR_GRAY) }, /* tlwall */
{ '|', "wall", C(CLR_GRAY) }, /* trwall */
{ '.', "doorway", C(CLR_GRAY) }, /* ndoor */
{ '#', "\96Ø", C(CLR_GREEN) }, /* tree */
{ '.', "\95\94\89®\82Ì\8f°", C(CLR_GRAY) }, /* room */
#endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
/*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 mapglyph.c) */
{ '|', "\95æ", C(CLR_WHITE) }, /* grave */
{ '\\', "\89Ø\82â\82©\82È\8bÊ\8dÀ", C(HI_GOLD) }, /* throne */
#endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
/*30*/ { '#', "sink", C(CLR_GRAY) }, /* sink */
{ '{', "fountain", C(CLR_BRIGHT_BLUE) }, /* fountain */
{ '}', "water", C(CLR_BLUE) }, /* pool */
{ '#', "\8fã\82Á\82Ä\82¢\82é\92µ\82Ë\8b´", C(CLR_BROWN) }, /* hcdbridge */
{ ' ', "\8bó\8bC\82Ì\82½\82Ü\82Á\82½\8fê\8f\8a", C(CLR_CYAN) }, /* open air */
#endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
/*40*/ { '#', "cloud", C(CLR_GRAY) }, /* [part of] a cloud */
{ '}', "water", C(CLR_BLUE) }, /* under water */
{ '^', "arrow trap", C(HI_METAL) }, /* trap */
{ '^', "\8b\90\8aâ\82Ìã©", C(CLR_GRAY) }, /* trap */
{ '^', "\90\87\96°\83K\83X\82Ìã©", C(HI_ZAP) }, /* trap */
#endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
/*50*/ { '^', "rust trap", C(CLR_BLUE) }, /* trap */
{ '^', "fire trap", C(CLR_ORANGE) }, /* trap */
{ '^', "pit", C(CLR_BLACK) }, /* trap */
{ '^', "\96\82\96@\82Ì\93ü\8cû", C(CLR_BRIGHT_MAGENTA) }, /* trap */
{ '"', "\82\82à\82Ì\91\83", C(CLR_GRAY) }, /* web */
#endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
/*60*/ { '^', "statue trap", C(CLR_GRAY) }, /* trap */
{ '^', "magic trap", C(HI_ZAP) }, /* trap */
{ '^', "anti-magic field", C(HI_ZAP) }, /* trap */
{ '#', "", C(HI_ZAP) },
{ '@', "", C(HI_ZAP) },
{ '*', "", C(HI_ZAP) },
-#if 0 /*JP*/
+#if 0 /*JP:T*/
{ '#', "poison cloud", C(CLR_BRIGHT_GREEN) }, /* part of a cloud */
{ '?', "valid position", C(CLR_BRIGHT_GREEN) }, /* target position */
#else
#undef C
-#ifdef TERMLIB
+#if defined(TERMLIB) || defined(CURSES_GRAPHICS)
void NDECL((*decgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
-#endif /* TERMLIB */
+#endif /* TERMLIB || CURSES */
#ifdef PC9800
void NDECL((*ibmgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
void NDECL((*ascgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
#endif
+#ifdef CURSES_GRAPHICS
+void NDECL((*cursesgraphics_mode_callback)) = 0;
+#endif
+
/*
* Convert the given character to an object class. If the character is not
* recognized, then MAXOCLASSES is returned. Used in detect.c, invent.c,
* init_symbols()
* Sets the current display symbols, the
* loadable symbols to the default NetHack
- * symbols, including the r_syms rogue level
+ * symbols, including the rogue_syms rogue level
* symbols. This would typically be done
* immediately after execution begins. Any
* previously loaded external symbol sets are
*
* If (arg != 0), which is the normal expected
* usage, then showsyms are taken from the
- * adjustable display symbols found in l_syms.
- * l_syms may have been loaded from an external
+ * adjustable display symbols found in primary_syms.
+ * primary_syms may have been loaded from an external
* symbol file by config file options or interactively
* in the Options menu.
*
* out of other {rogue} level display modes.
*
* If arg is ROGUESET, this places the rogue level
- * symbols from r_syms into showsyms.
+ * symbols from rogue_syms into showsyms.
*
* If arg is PRIMARY, this places the symbols
* from l_monsyms into showsyms.
*
- * update_l_symset()
- * Update a member of the loadable (l_*) symbol set.
+ * update_primary_symset()
+ * Update a member of the primary(primary_*) symbol set.
+ *
+ * update_rogue_symset()
+ * Update a member of the rogue (rogue_*) symbol set.
*
- * update_r_symset()
- * Update a member of the rogue (r_*) symbol set.
+ * update_ov_primary_symset()
+ * Update a member of the overrides for primary symbol set.
+ *
+ * update_ov_rogue_symset()
+ * Update a member of the overrides for rogue symbol set.
*
*/
void
init_symbols()
{
- init_l_symbols();
+ init_ov_primary_symbols();
+ init_ov_rogue_symbols();
+ init_primary_symbols();
init_showsyms();
- init_r_symbols();
-}
-
-void
-update_bouldersym()
-{
- showsyms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
- l_syms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
- r_syms[SYM_BOULDER + SYM_OFF_X] = iflags.bouldersym;
+ init_rogue_symbols();
}
void
showsyms[i + SYM_OFF_M] = def_monsyms[i].sym;
for (i = 0; i < WARNCOUNT; i++)
showsyms[i + SYM_OFF_W] = def_warnsyms[i].sym;
- for (i = 0; i < MAXOTHER; i++) {
- if (i == SYM_BOULDER)
- showsyms[i + SYM_OFF_X] = iflags.bouldersym
- ? iflags.bouldersym
- : def_oc_syms[ROCK_CLASS].sym;
- else if (i == SYM_INVISIBLE)
- showsyms[i + SYM_OFF_X] = DEF_INVISIBLE;
+ for (i = 0; i < MAXOTHER; i++)
+ showsyms[i + SYM_OFF_X] = get_othersym(i, PRIMARY);
+}
+
+/* initialize defaults for the overrides to the rogue symset */
+void
+init_ov_rogue_symbols()
+{
+ register int i;
+
+ for (i = 0; i < SYM_MAX; i++)
+ ov_rogue_syms[i] = (nhsym) 0;
+}
+/* initialize defaults for the overrides to the primary symset */
+void
+init_ov_primary_symbols()
+{
+ register int i;
+
+ for (i = 0; i < SYM_MAX; i++)
+ ov_primary_syms[i] = (nhsym) 0;
+}
+
+nhsym
+get_othersym(idx, which_set)
+int idx, which_set;
+{
+ nhsym sym = (nhsym) 0;
+ int oidx = idx + SYM_OFF_X;
+
+ if (which_set == ROGUESET)
+ sym = ov_rogue_syms[oidx] ? ov_rogue_syms[oidx]
+ : rogue_syms[oidx];
+ else
+ sym = ov_primary_syms[oidx] ? ov_primary_syms[oidx]
+ : primary_syms[oidx];
+ if (!sym) {
+ switch(idx) {
+ case SYM_BOULDER:
+ sym = def_oc_syms[ROCK_CLASS].sym;
+ break;
+ case SYM_INVISIBLE:
+ sym = DEF_INVISIBLE;
+ break;
+ }
}
+ return sym;
}
-/* initialize defaults for the loadable symset */
+/* initialize defaults for the primary symset */
void
-init_l_symbols()
+init_primary_symbols()
{
register int i;
for (i = 0; i < MAXPCHARS; i++)
- l_syms[i + SYM_OFF_P] = defsyms[i].sym;
+ primary_syms[i + SYM_OFF_P] = defsyms[i].sym;
for (i = 0; i < MAXOCLASSES; i++)
- l_syms[i + SYM_OFF_O] = def_oc_syms[i].sym;
+ primary_syms[i + SYM_OFF_O] = def_oc_syms[i].sym;
for (i = 0; i < MAXMCLASSES; i++)
- l_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
+ primary_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
for (i = 0; i < WARNCOUNT; i++)
- l_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
- for (i = 0; i < MAXOTHER; i++) {
- if (i == SYM_BOULDER)
- l_syms[i + SYM_OFF_X] = iflags.bouldersym
- ? iflags.bouldersym
- : def_oc_syms[ROCK_CLASS].sym;
- else if (i == SYM_INVISIBLE)
- l_syms[i + SYM_OFF_X] = DEF_INVISIBLE;
- }
+ primary_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
+ for (i = 0; i < MAXOTHER; i++)
+ primary_syms[i + SYM_OFF_X] = get_othersym(i, PRIMARY);
clear_symsetentry(PRIMARY, FALSE);
}
+/* initialize defaults for the rogue symset */
void
-init_r_symbols()
+init_rogue_symbols()
{
register int i;
later by the roguesymbols option */
for (i = 0; i < MAXPCHARS; i++)
- r_syms[i + SYM_OFF_P] = defsyms[i].sym;
- r_syms[S_vodoor] = r_syms[S_hodoor] = r_syms[S_ndoor] = '+';
- r_syms[S_upstair] = r_syms[S_dnstair] = '%';
+ rogue_syms[i + SYM_OFF_P] = defsyms[i].sym;
+ rogue_syms[S_vodoor] = rogue_syms[S_hodoor] = rogue_syms[S_ndoor] = '+';
+ rogue_syms[S_upstair] = rogue_syms[S_dnstair] = '%';
for (i = 0; i < MAXOCLASSES; i++)
- r_syms[i + SYM_OFF_O] = def_r_oc_syms[i];
+ rogue_syms[i + SYM_OFF_O] = def_r_oc_syms[i];
for (i = 0; i < MAXMCLASSES; i++)
- r_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
+ rogue_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
for (i = 0; i < WARNCOUNT; i++)
- r_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
- for (i = 0; i < MAXOTHER; i++) {
- if (i == SYM_BOULDER)
- r_syms[i + SYM_OFF_X] = iflags.bouldersym
- ? iflags.bouldersym
- : def_oc_syms[ROCK_CLASS].sym;
- else if (i == SYM_INVISIBLE)
- r_syms[i + SYM_OFF_X] = DEF_INVISIBLE;
- }
+ rogue_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
+ for (i = 0; i < MAXOTHER; i++)
+ rogue_syms[i + SYM_OFF_X] = get_othersym(i, ROGUESET);
clear_symsetentry(ROGUESET, FALSE);
/* default on Rogue level is no color
/* Adjust graphics display characters on Rogue levels */
for (i = 0; i < SYM_MAX; i++)
- showsyms[i] = r_syms[i];
+ showsyms[i] = ov_rogue_syms[i] ? ov_rogue_syms[i]
+ : rogue_syms[i];
#if defined(MSDOS) && defined(USE_TILES)
if (iflags.grmode)
case PRIMARY:
default:
for (i = 0; i < SYM_MAX; i++)
- showsyms[i] = l_syms[i];
+ showsyms[i] = ov_primary_syms[i] ? ov_primary_syms[i]
+ : primary_syms[i];
#if defined(MSDOS) && defined(USE_TILES)
if (iflags.grmode)
if (nondefault) {
for (i = 0; i < SYM_MAX; i++)
- showsyms[i] = l_syms[i];
+ showsyms[i] = ov_primary_syms[i] ? ov_primary_syms[i]
+ : primary_syms[i];
#ifdef PC9800
if (SYMHANDLING(H_IBM) && ibmgraphics_mode_callback)
(*ibmgraphics_mode_callback)();
- else if (!symset[currentgraphics].name && ascgraphics_mode_callback)
+ else if (SYMHANDLING(H_UNK) && ascgraphics_mode_callback)
(*ascgraphics_mode_callback)();
#endif
-#ifdef TERMLIB
+#if defined(TERMLIB) || defined(CURSES_GRAPHICS)
+ /* curses doesn't assign any routine to dec..._callback but
+ probably does the expected initialization under the hood
+ for terminals capable of rendering DECgraphics */
if (SYMHANDLING(H_DEC) && decgraphics_mode_callback)
(*decgraphics_mode_callback)();
+# ifdef CURSES_GRAPHICS
+ /* there aren't any symbol sets with CURS handling, and the
+ curses interface never assigns a routine to curses..._callback */
+ if (SYMHANDLING(H_CURS) && cursesgraphics_mode_callback)
+ (*cursesgraphics_mode_callback)();
+# endif
#endif
- } else
- init_symbols();
+ } else {
+ init_primary_symbols();
+ init_showsyms();
+ }
+}
+
+void
+update_ov_primary_symset(symp, val)
+struct symparse *symp;
+int val;
+{
+ ov_primary_syms[symp->idx] = val;
+}
+
+void
+update_ov_rogue_symset(symp, val)
+struct symparse *symp;
+int val;
+{
+ ov_rogue_syms[symp->idx] = val;
}
void
-update_l_symset(symp, val)
+update_primary_symset(symp, val)
struct symparse *symp;
int val;
{
- l_syms[symp->idx] = val;
+ primary_syms[symp->idx] = val;
}
void
-update_r_symset(symp, val)
+update_rogue_symset(symp, val)
struct symparse *symp;
int val;
{
- r_syms[symp->idx] = val;
+ rogue_syms[symp->idx] = val;
}
void
* to this array at the matching offset.
*/
const char *known_handling[] = {
- "UNKNOWN", /* H_UNK */
- "IBM", /* H_IBM */
- "DEC", /* H_DEC */
+ "UNKNOWN", /* H_UNK */
+ "IBM", /* H_IBM */
+ "DEC", /* H_DEC */
+ "CURS", /* H_CURS */
+ "MAC", /* H_MAC -- pre-OSX MACgraphics */
(const char *) 0,
};
{ SYM_MON, S_MIMIC_DEF + SYM_OFF_M, "S_mimic_def" },
{ SYM_OTH, SYM_BOULDER + SYM_OFF_X, "S_boulder" },
{ SYM_OTH, SYM_INVISIBLE + SYM_OFF_X, "S_invisible" },
+ { SYM_OTH, SYM_PET_OVERRIDE + SYM_OFF_X, "S_pet_override" },
+ { SYM_OTH, SYM_HERO_OVERRIDE + SYM_OFF_X, "S_hero_override" },
{ 0, 0, (const char *) 0 } /* fence post */
};