OSDN Git Service

update year to 2020
[jnethack/source.git] / src / drawing.c
index a91364d..b5ea183 100644 (file)
@@ -1,10 +1,10 @@
-/* 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-2020            */
 /* JNetHack may be freely redistributed.  See license for details. */
 
 #include "hack.h"
@@ -27,15 +27,19 @@ struct symsetentry symset[NUM_GRAPHICS];
 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().
@@ -395,7 +399,7 @@ const struct symdef def_warnsyms[WARNCOUNT] = {
  *  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 */
@@ -418,7 +422,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '-', "\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 */
@@ -441,7 +445,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '#', "\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) */
@@ -464,7 +468,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '|', "\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 */
@@ -487,7 +491,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '#', "\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 */
@@ -510,7 +514,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '^', "\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 */
@@ -530,10 +534,10 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '^', "\97\8e\82µ\94à", C(CLR_BROWN) },              /* trap */
        { '^', "\8fu\8aÔ\88Ú\93®\82Ìã©", C(CLR_MAGENTA) },      /* trap */
        { '^', "\95Ê\82Ì\8aK\82Ö\82Ì\8fu\8aÔ\88Ú\93®\82Ìã©", C(CLR_MAGENTA) }, /* trap */
-       { '^', "\96\82\96@\82Ìã©", C(CLR_BRIGHT_MAGENTA) },   /* 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 */
@@ -554,10 +558,10 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '^', "\95Ï\89»\82Ìã©", C(CLR_BRIGHT_GREEN) },       /* trap */
        { '~', "\90U\93®\82µ\82Ä\82¢\82é\8fê\8f\8a", C(CLR_MAGENTA) },    /* "trap" */
        /* zap colors are changed by mapglyph() to match type of beam */
-       { '|', "\95Ç", C(CLR_GRAY) },              /* vbeam */
-       { '-', "\95Ç", C(CLR_GRAY) },              /* hbeam */
-       { '\\', "\95Ç", C(CLR_GRAY) },             /* lslant */
-       { '/', "\95Ç", C(CLR_GRAY) },              /* rslant */
+       { '|', "", 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 */
@@ -567,7 +571,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '#', "", 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
@@ -610,15 +614,19 @@ static const uchar def_r_oc_syms[MAXOCLASSES] = {
 
 #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,
@@ -657,7 +665,7 @@ char ch;
  * 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
@@ -673,8 +681,8 @@ char ch;
  *
  *                     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.
  *
@@ -684,33 +692,33 @@ char ch;
  *                     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
@@ -726,44 +734,78 @@ init_showsyms()
         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;
 
@@ -771,24 +813,18 @@ init_r_symbols()
        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
@@ -808,7 +844,8 @@ int whichset;
         /* 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)
@@ -820,7 +857,8 @@ int whichset;
     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)
@@ -839,35 +877,63 @@ int nondefault;
 
     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
@@ -899,9 +965,11 @@ boolean name_too;
  * 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,
 };
 
@@ -1106,6 +1174,8 @@ struct symparse loadsyms[] = {
     { 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 */
 };