OSDN Git Service

update year to 2023
[jnethack/source.git] / src / drawing.c
index 916cea3..0b33fc4 100644 (file)
@@ -1,10 +1,10 @@
-/* NetHack 3.6 drawing.c       $NHDT-Date: 1447124657 2015/11/10 03:04:17 $  $NHDT-Branch: master $:$NHDT-Revision: 1.49 $ */
+/* 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-2016            */
+/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2023            */
 /* JNetHack may be freely redistributed.  See license for details. */
 
 #include "hack.h"
@@ -27,12 +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 */
-const char invisexplain[] = "remembered, unseen, creature";
-
+#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().
@@ -40,88 +47,319 @@ const char invisexplain[] = "remembered, unseen, creature";
  */
 const struct class_sym def_oc_syms[MAXOCLASSES] = {
     { '\0', "", "" }, /* placeholder for the "random class" */
+/*JP
     { ILLOBJ_SYM, "illegal objects", "strange object" },
+*/
+    { ILLOBJ_SYM, "\8aï\96­\82È\95¨\91Ì", "\8aï\96­\82È\95¨\91Ì" },
+/*JP
     { WEAPON_SYM, "weapons", "weapon" },
+*/
+    { WEAPON_SYM, "\95\90\8aí", "\95\90\8aí" },
+/*JP
     { ARMOR_SYM, "armor", "suit or piece of armor" },
+*/
+    { ARMOR_SYM, "\8aZ", "\95\9e\82Ü\82½\82Í\8aZ\82Ì\82½\82®\82¢" },
+/*JP
     { RING_SYM, "rings", "ring" },
+*/
+    { RING_SYM, "\8ew\97Ö", "\8ew\97Ö" },
+/*JP
     { AMULET_SYM, "amulets", "amulet" },
+*/
+    { AMULET_SYM, "\96\82\8f\9c\82¯", "\96\82\8f\9c\82¯" },
+/*JP
     { TOOL_SYM, "tools", "useful item (pick-axe, key, lamp...)" },
+*/
+    { TOOL_SYM, "\93¹\8bï", "\95Ö\97\98\82È\93¹\8bï(\82Â\82é\82Í\82µ\81C\8c®\81C\83\89\83\93\83v\81D\81D\81D)" },
+/*JP
     { FOOD_SYM, "food", "piece of food" },
+*/
+    { FOOD_SYM, "\90H\97¿", "\90H\97¿" },
+/*JP
     { POTION_SYM, "potions", "potion" },
+*/
+    { POTION_SYM, "\96ò", "\96ò" },
+/*JP
     { SCROLL_SYM, "scrolls", "scroll" },
+*/
+    { SCROLL_SYM, "\8aª\95¨", "\8aª\95¨" },
+/*JP
     { SPBOOK_SYM, "spellbooks", "spellbook" },
+*/
+    { SPBOOK_SYM, "\96\82\96@\8f\91", "\96\82\96@\8f\91" },
+/*JP
     { WAND_SYM, "wands", "wand" },
+*/
+    { WAND_SYM, "\8fñ", "\8fñ" },
+/*JP
     { GOLD_SYM, "coins", "pile of coins" },
+*/
+    { GOLD_SYM, "\8bà\89Ý", "\8bà\89Ý\82Ì\8eR" },
+/*JP
     { GEM_SYM, "rocks", "gem or rock" },
+*/
+    { GEM_SYM, "\90Î", "\95ó\90Î\82Ü\82½\82Í\90Î" },
+/*JP
     { ROCK_SYM, "large stones", "boulder or statue" },
+*/
+    { ROCK_SYM, "\8b\90\90Î", "\8aâ\82Ü\82½\82Í\91\9c" },
+/*JP
     { BALL_SYM, "iron balls", "iron ball" },
+*/
+    { BALL_SYM, "\93S\8b\85", "\93S\8b\85" },
+/*JP
     { CHAIN_SYM, "chains", "iron chain" },
+*/
+    { CHAIN_SYM, "\8d½", "\93S\82Ì\8d½" },
+/*JP
     { VENOM_SYM, "venoms", "splash of venom" }
+*/
+    { VENOM_SYM, "\93Å", "\93Å\89t" }
 };
 
 /* Default monster class symbols.  See monsym.h. */
 const struct class_sym def_monsyms[MAXMCLASSES] = {
     { '\0', "", "" },
+/*JP
     { DEF_ANT, "", "ant or other insect" },
+*/
+    { DEF_ANT, "", "\8ba\82Ü\82½\82Í\91¼\82Ì\8d©\92\8e" },
+/*JP
     { DEF_BLOB, "", "blob" },
+*/
+    { DEF_BLOB, "", "\83u\83\8d\83b\83u" },
+/*JP
     { DEF_COCKATRICE, "", "cockatrice" },
+*/
+    { DEF_COCKATRICE, "", "\83R\83J\83g\83\8a\83X" },
+/*JP
     { DEF_DOG, "", "dog or other canine" },
+*/
+    { DEF_DOG, "", "\8c¢\82Ü\82½\82Í\83C\83k\89È\82Ì\93®\95¨" },
+/*JP
     { DEF_EYE, "", "eye or sphere" },
+*/
+    { DEF_EYE, "", "\96Ú\82Ü\82½\82Í\8b\85\91Ì" },
+/*JP
     { DEF_FELINE, "", "cat or other feline" },
+*/
+    { DEF_FELINE, "", "\94L\82Ü\82½\82Í\83l\83R\89È\82Ì\93®\95¨" },
+/*JP
     { DEF_GREMLIN, "", "gremlin" },
+*/
+    { DEF_GREMLIN, "", "\83O\83\8c\83\80\83\8a\83\93" },
+/*JP
     { DEF_HUMANOID, "", "humanoid" },
+*/
+    { DEF_HUMANOID, "", "\83q\83\85\81[\83}\83m\83C\83h" },
+/*JP
     { DEF_IMP, "", "imp or minor demon" },
+*/
+    { DEF_IMP, "", "\83C\83\93\83v\82Ü\82½\82Í\89º\8b\89\88«\96\82" },
+/*JP
     { DEF_JELLY, "", "jelly" },
+*/
+    { DEF_JELLY, "", "\83[\83\8a\81[" },
+/*JP
     { DEF_KOBOLD, "", "kobold" },
+*/
+    { DEF_KOBOLD, "", "\83R\83{\83\8b\83g" },
+/*JP
     { DEF_LEPRECHAUN, "", "leprechaun" },
+*/
+    { DEF_LEPRECHAUN, "", "\83\8c\83v\83\89\83R\81[\83\93" },
+/*JP
     { DEF_MIMIC, "", "mimic" },
+*/
+    { DEF_MIMIC, "", "\83~\83~\83b\83N" },
+/*JP
     { DEF_NYMPH, "", "nymph" },
+*/
+    { DEF_NYMPH, "", "\83j\83\93\83t" },
+/*JP
     { DEF_ORC, "", "orc" },
+*/
+    { DEF_ORC, "", "\83I\81[\83N" },
+/*JP
     { DEF_PIERCER, "", "piercer" },
+*/
+    { DEF_PIERCER, "", "\8c\8a\8bò\82¢" },
+/*JP
     { DEF_QUADRUPED, "", "quadruped" },
+*/
+    { DEF_QUADRUPED, "", "\8el\91«\93®\95¨" },
+/*JP
     { DEF_RODENT, "", "rodent" },
+*/
+    { DEF_RODENT, "", "ê\96\8e\95\93®\95¨" },
+/*JP
     { DEF_SPIDER, "", "arachnid or centipede" },
+*/
+    { DEF_SPIDER, "", "\83N\83\82\8c`\97Þ\93®\95¨\82Ü\82½\82Í\83\80\83J\83f" },
+/*JP
     { DEF_TRAPPER, "", "trapper or lurker above" },
+*/
+    { DEF_TRAPPER, "", "\83g\83\89\83b\83p\81[\82Ü\82½\82Í\83\89\81[\83J\81[" },
+/*JP
     { DEF_UNICORN, "", "unicorn or horse" },
+*/
+    { DEF_UNICORN, "", "\83\86\83j\83R\81[\83\93\82Ü\82½\82Í\94n" },
+/*JP
     { DEF_VORTEX, "", "vortex" },
+*/
+    { DEF_VORTEX, "", "\89Q" },
+/*JP
     { DEF_WORM, "", "worm" },
+*/
+    { DEF_WORM, "", "\83\8f\81[\83\80" },
+/*JP
     { DEF_XAN, "", "xan or other mythical/fantastic insect" },
+*/
+    { DEF_XAN, "", "\83U\83\93\82Ü\82½\82Í\90_\98b\82â\83t\83@\83\93\83^\83W\81[\82Ì\8d©\92\8e" },
+/*JP
     { DEF_LIGHT, "", "light" },
+*/
+    { DEF_LIGHT, "", "\8cõ" },
+/*JP
     { DEF_ZRUTY, "", "zruty" },
+*/
+    { DEF_ZRUTY, "", "\83Y\83\8b\83e\83B" },
+/*JP
     { DEF_ANGEL, "", "angelic being" },
+*/
+    { DEF_ANGEL, "", "\93V\8eg" },
+/*JP
     { DEF_BAT, "", "bat or bird" },
+*/
+    { DEF_BAT, "", "\82±\82¤\82à\82è\82Ü\82½\82Í\92¹" },
+/*JP
     { DEF_CENTAUR, "", "centaur" },
+*/
+    { DEF_CENTAUR, "", "\83P\83\93\83^\83E\83\8d\83X" },
+/*JP
     { DEF_DRAGON, "", "dragon" },
+*/
+    { DEF_DRAGON, "", "\83h\83\89\83S\83\93" },
+/*JP
     { DEF_ELEMENTAL, "", "elemental" },
+*/
+    { DEF_ELEMENTAL, "", "\90¸\97ì" },
+/*JP
     { DEF_FUNGUS, "", "fungus or mold" },
+*/
+    { DEF_FUNGUS, "", "\83L\83m\83R\82Ü\82½\82Í\83\82\81[\83\8b\83h" },
+/*JP
     { DEF_GNOME, "", "gnome" },
+*/
+    { DEF_GNOME, "", "\83m\81[\83\80" },
+/*JP
     { DEF_GIANT, "", "giant humanoid" },
+*/
+    { DEF_GIANT, "", "\8b\90\90l" },
+/*JP
     { '\0', "", "invisible monster" },
+*/
+    { '\0', "", "\93§\96¾\82È\89ö\95¨" },
+/*JP
     { DEF_JABBERWOCK, "", "jabberwock" },
+*/
+    { DEF_JABBERWOCK, "", "\83W\83\83\83o\83E\83H\83b\83N" },
+/*JP
     { DEF_KOP, "", "Keystone Kop" },
+*/
+    { DEF_KOP, "", "\8cx\94õ\88õ" },
+/*JP
     { DEF_LICH, "", "lich" },
+*/
+    { DEF_LICH, "", "\83\8a\83b\83`" },
+/*JP
     { DEF_MUMMY, "", "mummy" },
+*/
+    { DEF_MUMMY, "", "\83~\83C\83\89" },
+/*JP
     { DEF_NAGA, "", "naga" },
+*/
+    { DEF_NAGA, "", "\83i\81[\83K" },
+/*JP
     { DEF_OGRE, "", "ogre" },
+*/
+    { DEF_OGRE, "", "\83I\81[\83K" },
+/*JP
     { DEF_PUDDING, "", "pudding or ooze" },
+*/
+    { DEF_PUDDING, "", "\83v\83\8a\83\93\82Ü\82½\82Í\83E\81[\83Y" },
+/*JP
     { DEF_QUANTMECH, "", "quantum mechanic" },
+*/
+    { DEF_QUANTMECH, "", "\97Ê\8eq\8fê" },
+/*JP
     { DEF_RUSTMONST, "", "rust monster or disenchanter" },
+*/
+    { DEF_RUSTMONST, "", "\8eK\82Ì\89ö\95¨\82Ü\82½\82Í\8bz\96\82\82Ì\89ö\95¨" },
+/*JP
     { DEF_SNAKE, "", "snake" },
+*/
+    { DEF_SNAKE, "", "\83w\83r" },
+/*JP
     { DEF_TROLL, "", "troll" },
+*/
+    { DEF_TROLL, "", "\83g\83\8d\83\8b" },
+/*JP
     { DEF_UMBER, "", "umber hulk" },
+*/
+    { DEF_UMBER, "", "\83A\83\93\83o\81[\83n\83\8b\83N" },
+/*JP
     { DEF_VAMPIRE, "", "vampire" },
+*/
+    { DEF_VAMPIRE, "", "\8bz\8c\8c\8bS" },
+/*JP
     { DEF_WRAITH, "", "wraith" },
+*/
+    { DEF_WRAITH, "", "\83\8c\83C\83X" },
+/*JP
     { DEF_XORN, "", "xorn" },
+*/
+    { DEF_XORN, "", "\83]\81[\83\93" },
+/*JP
     { DEF_YETI, "", "apelike creature" },
+*/
+    { DEF_YETI, "", "\89\8e\82Ì\82æ\82¤\82È\90\95¨" },
+/*JP
     { DEF_ZOMBIE, "", "zombie" },
+*/
+    { DEF_ZOMBIE, "", "\83]\83\93\83r" },
+/*JP
     { DEF_HUMAN, "", "human or elf" },
+*/
+    { DEF_HUMAN, "", "\90l\8aÔ\82Ü\82½\82Í\83G\83\8b\83t" },
+/*JP
     { DEF_GHOST, "", "ghost" },
+*/
+    { DEF_GHOST, "", "\88«\96\82" },
+/*JP
     { DEF_GOLEM, "", "golem" },
+*/
+    { DEF_GOLEM, "", "\83S\81[\83\8c\83\80" },
+/*JP
     { DEF_DEMON, "", "major demon" },
+*/
+    { DEF_DEMON, "", "\88«\96\82" },
+/*JP
     { DEF_EEL, "", "sea monster" },
+*/
+    { DEF_EEL, "", "\8aC\82Ì\89ö\95¨" },
+/*JP
     { DEF_LIZARD, "", "lizard" },
+*/
+    { DEF_LIZARD, "", "\83g\83J\83Q" },
+/*JP
     { DEF_WORM_TAIL, "", "long worm tail" },
+*/
+    { DEF_WORM_TAIL, "", "\83\8d\83\93\83O\83\8f\81[\83\80\82Ì\90K\94ö" },
+/*JP
     { DEF_MIMIC_DEF, "", "mimic" },
+*/
+    { DEF_MIMIC_DEF, "", "\83~\83~\83b\83N" },
 };
 
 const struct symdef def_warnsyms[WARNCOUNT] = {
@@ -161,6 +399,7 @@ const struct symdef def_warnsyms[WARNCOUNT] = {
  *  Default screen symbols with explanations and colors.
  */
 const struct symdef defsyms[MAXPCHARS] = {
+#if 0 /*JP:T*/
 /* 0*/ { ' ', "dark part of a room", C(NO_COLOR) },  /* stone */
        { '|', "wall", C(CLR_GRAY) },                 /* vwall */
        { '-', "wall", C(CLR_GRAY) },                 /* hwall */
@@ -171,6 +410,19 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '-', "wall", C(CLR_GRAY) },                 /* crwall */
        { '-', "wall", C(CLR_GRAY) },                 /* tuwall */
        { '-', "wall", C(CLR_GRAY) },                 /* tdwall */
+#else
+/* 0*/ { ' ', "\95\94\89®\82Ì\88Ã\82¢\95\94\95ª", C(NO_COLOR) },       /* stone */
+       { '|', "\95Ç", C(CLR_GRAY) },                   /* vwall */
+       { '-', "\95Ç", C(CLR_GRAY) },                   /* hwall */
+       { '-', "\95Ç", C(CLR_GRAY) },                   /* tlcorn */
+       { '-', "\95Ç", C(CLR_GRAY) },                   /* trcorn */
+       { '-', "\95Ç", C(CLR_GRAY) },                   /* blcorn */
+       { '-', "\95Ç", C(CLR_GRAY) },                   /* brcorn */
+       { '-', "\95Ç", C(CLR_GRAY) },                   /* crwall */
+       { '-', "\95Ç", C(CLR_GRAY) },                   /* tuwall */
+       { '-', "\95Ç", C(CLR_GRAY) },                   /* tdwall */
+#endif
+#if 0 /*JP:T*/
 /*10*/ { '|', "wall", C(CLR_GRAY) },                 /* tlwall */
        { '|', "wall", C(CLR_GRAY) },                 /* trwall */
        { '.', "doorway", C(CLR_GRAY) },              /* ndoor */
@@ -181,6 +433,19 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '#', "iron bars", C(HI_METAL) },            /* bars */
        { '#', "tree", C(CLR_GREEN) },                /* tree */
        { '.', "floor of a room", C(CLR_GRAY) },      /* room */
+#else
+/*10*/ { '|', "\95Ç", C(CLR_GRAY) },                   /* tlwall */
+       { '|', "\95Ç", C(CLR_GRAY) },                   /* trwall */
+       { '.', "\8fo\93ü\8cû", C(CLR_GRAY) },               /* ndoor */
+       { '-', "\8aJ\82¢\82½\94à", C(CLR_BROWN) },            /* vodoor */
+       { '|', "\8aJ\82¢\82½\94à", C(CLR_BROWN) },            /* hodoor */
+       { '+', "\95Â\82\82½\94à", C(CLR_BROWN) },            /* vcdoor */
+       { '+', "\95Â\82\82½\94à", C(CLR_BROWN) },            /* hcdoor */
+       { '#', "\93S\96_", C(HI_METAL) },                 /* bars */
+       { '#', "\96Ø", C(CLR_GREEN) },                  /* tree */
+       { '.', "\95\94\89®\82Ì\8f°", C(CLR_GRAY) },             /* room */
+#endif
+#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) */
@@ -189,10 +454,23 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '<', "ladder up", C(CLR_BROWN) },           /* upladder */
        { '>', "ladder down", C(CLR_BROWN) },         /* dnladder */
        { '_', "altar", C(CLR_GRAY) },                /* altar */
-       { '|', "grave", C(CLR_GRAY) },                /* grave */
+       { '|', "grave", C(CLR_WHITE) },               /* grave */
        { '\\', "opulent throne", C(HI_GOLD) },       /* throne */
+#else
+/*20*/ { '.', "\95\94\89®\82Ì\88Ã\82¢\95\94\95ª", C(CLR_BLACK) },      /* dark room */
+       { '#', "\92Ê\98H", C(CLR_GRAY) },                 /* dark corr */
+       { '#', "\96¾\82é\82¢\92Ê\98H", C(CLR_GRAY) },     /* lit corr (see mapglyph.c) */
+       { '<', "\8fã\82è\8aK\92i", C(CLR_GRAY) },             /* upstair */
+       { '>', "\89º\82è\8aK\92i", C(CLR_GRAY) },             /* dnstair */
+       { '<', "\8fã\82è\82Í\82µ\82²", C(CLR_BROWN) },          /* upladder */
+       { '>', "\89º\82è\82Í\82µ\82²", C(CLR_BROWN) },          /* dnladder */
+       { '_', "\8dÕ\92d", C(CLR_GRAY) },                 /* altar */
+       { '|', "\95æ", C(CLR_WHITE) },                  /* grave */
+       { '\\', "\89Ø\82â\82©\82È\8bÊ\8dÀ", C(HI_GOLD) },         /* throne */
+#endif
+#if 0 /*JP:T*/
 /*30*/ { '#', "sink", C(CLR_GRAY) },                 /* sink */
-       { '{', "fountain", C(CLR_BLUE) },             /* fountain */
+       { '{', "fountain", C(CLR_BRIGHT_BLUE) },      /* fountain */
        { '}', "water", C(CLR_BLUE) },                /* pool */
        { '.', "ice", C(CLR_CYAN) },                  /* ice */
        { '}', "molten lava", C(CLR_RED) },           /* lava */
@@ -201,6 +479,19 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '#', "raised drawbridge", C(CLR_BROWN) },   /* vcdbridge */
        { '#', "raised drawbridge", C(CLR_BROWN) },   /* hcdbridge */
        { ' ', "air", C(CLR_CYAN) },                  /* open air */
+#else
+/*30*/ { '#', "\97¬\82µ\91ä", C(CLR_GRAY) },               /* sink */
+       { '{', "\90ò", C(CLR_BRIGHT_BLUE) },            /* fountain */
+       { '}', "\90\85\82Ì\82½\82Ü\82Á\82½\8fê\8f\8a", C(CLR_BLUE) },     /* pool */
+       { '.', "\95X", C(CLR_CYAN) },                   /* ice */
+       { '}', "\97n\8aâ", C(CLR_RED) },                  /* lava */
+       { '.', "\8d~\82è\82Ä\82¢\82é\92µ\82Ë\8b´", C(CLR_BROWN) },    /* vodbridge */
+       { '.', "\8d~\82è\82Ä\82¢\82é\92µ\82Ë\8b´", C(CLR_BROWN) },    /* hodbridge */
+       { '#', "\8fã\82Á\82Ä\82¢\82é\92µ\82Ë\8b´", C(CLR_BROWN) },    /* vcdbridge */
+       { '#', "\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:T*/
 /*40*/ { '#', "cloud", C(CLR_GRAY) },                /* [part of] a cloud */
        { '}', "water", C(CLR_BLUE) },                /* under water */
        { '^', "arrow trap", C(HI_METAL) },           /* trap */
@@ -211,6 +502,19 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '^', "land mine", C(CLR_RED) },             /* trap */
        { '^', "rolling boulder trap", C(CLR_GRAY) }, /* trap */
        { '^', "sleeping gas trap", C(HI_ZAP) },      /* trap */
+#else
+/*40*/ { '#', "\89_", C(CLR_GRAY) },                   /* [part of] a cloud */
+       { '}', "\90\85", C(CLR_BLUE) },                   /* under water */
+       { '^', "\96î\82Ìã©", C(HI_METAL) },               /* trap */
+       { '^', "\93\8a\82°\96î\82Ìã©", C(HI_METAL) },           /* trap */
+       { '^', "\97\8e\90Î\82Ìã©", C(CLR_GRAY) },             /* trap */
+       { '^', "\82«\82µ\82Þ\94Â", C(CLR_BROWN) },            /* trap */
+       { '^', "\8cF\82Ìã©", C(HI_METAL) },               /* trap */
+       { '^', "\92n\97\8b", C(CLR_RED) },                  /* trap */
+       { '^', "\8b\90\8aâ\82Ìã©", C(CLR_GRAY) },             /* trap */
+       { '^', "\90\87\96°\83K\83X\82Ìã©", C(HI_ZAP) },           /* trap */
+#endif
+#if 0 /*JP:T*/
 /*50*/ { '^', "rust trap", C(CLR_BLUE) },            /* trap */
        { '^', "fire trap", C(CLR_ORANGE) },          /* trap */
        { '^', "pit", C(CLR_BLACK) },                 /* trap */
@@ -221,25 +525,60 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '^', "level teleporter", C(CLR_MAGENTA) },    /* trap */
        { '^', "magic portal", C(CLR_BRIGHT_MAGENTA) }, /* trap */
        { '"', "web", C(CLR_GRAY) },                    /* web */
+#else
+/*50*/ { '^', "\95\85\90H\82Ìã©", C(CLR_BLUE) },             /* trap */
+       { '^', "\89Î\82Ìã©", C(CLR_ORANGE) },             /* trap */
+       { '^', "\97\8e\82µ\8c\8a", C(CLR_BLACK) },              /* trap */
+       { '^', "\83g\83Q\82¾\82ç\82¯\82Ì\97\8e\82µ\8c\8a", C(CLR_BLACK) },  /* trap */
+       { '^', "\8c\8a", C(CLR_BROWN) },                  /* trap */
+       { '^', "\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Ì\93ü\8cû", C(CLR_BRIGHT_MAGENTA) }, /* trap */
+       { '"', "\82­\82à\82Ì\91\83", C(CLR_GRAY) },             /* web */
+#endif
+#if 0 /*JP:T*/
 /*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_YELLOW) },     /* trap */
-       { '|', "wall", C(CLR_GRAY) },            /* vbeam */
-       { '-', "wall", C(CLR_GRAY) },            /* hbeam */
-       { '\\', "wall", C(CLR_GRAY) },           /* lslant */
-       { '/', "wall", C(CLR_GRAY) },            /* rslant */
+       { '~', "vibrating square", C(CLR_MAGENTA) },    /* "trap" */
+       /* zap colors are changed by mapglyph() 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 */
+#else
+/*60*/ { '^', "\92¤\91\9c\82Ìã©", C(CLR_GRAY) },               /* trap */
+       { '^', "\96\82\96@\82Ìã©", C(HI_ZAP) },                 /* trap */
+       { '^', "\94½\96\82\96@\8bó\8aÔ\82Ìã©", C(HI_ZAP) },           /* trap */
+       { '^', "\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 */
+       { '|', "", 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 */
+#endif
 /*70*/ { '(', "", C(HI_WOOD) },                 /* boomerang open right */
        { '0', "", C(HI_ZAP) },                  /* 4 magic shield symbols */
        { '#', "", C(HI_ZAP) },
        { '@', "", C(HI_ZAP) },
        { '*', "", C(HI_ZAP) },
+#if 0 /*JP:T*/
        { '#', "poison cloud", C(CLR_BRIGHT_GREEN) },   /* part of a cloud */
        { '?', "valid position", C(CLR_BRIGHT_GREEN) }, /*  target position */
+#else
+       { '#', "\93Å\89_", C(CLR_BRIGHT_GREEN) },           /* part of a cloud */
+       { '?', "\97L\8cø\82È\88Ê\92u", C(CLR_BRIGHT_GREEN) },     /*  target position */
+#endif
+       /* swallow colors are changed by mapglyph() to match engulfing monst */
        { '/', "", C(CLR_GREEN) },         /* swallow top left      */
        { '-', "", C(CLR_GREEN) },         /* swallow top center    */
        { '\\', "", C(CLR_GREEN) },        /* swallow top right     */
@@ -248,6 +587,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '\\', "", C(CLR_GREEN) },        /* swallow bottom left   */
        { '-', "", C(CLR_GREEN) },         /* swallow bottom center */
        { '/', "", C(CLR_GREEN) },         /* swallow bottom right  */
+       /* explosion colors are changed by mapglyph() to match type of expl. */
        { '/', "", C(CLR_ORANGE) },        /* explosion top left     */
        { '-', "", C(CLR_ORANGE) },        /* explosion top center   */
        { '\\', "", C(CLR_ORANGE) },       /* explosion top right    */
@@ -274,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,
@@ -321,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
@@ -337,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.
  *
@@ -348,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
@@ -390,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;
 
@@ -435,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
@@ -472,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)
@@ -484,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)
@@ -503,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
@@ -563,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,
 };
 
@@ -615,6 +1019,7 @@ struct symparse loadsyms[] = {
     { SYM_PCHAR, S_bars, "S_bars" },
     { SYM_PCHAR, S_tree, "S_tree" },
     { SYM_PCHAR, S_room, "S_room" },
+    { SYM_PCHAR, S_darkroom, "S_darkroom" },
     { SYM_PCHAR, S_corr, "S_corr" },
     { SYM_PCHAR, S_litcorr, "S_litcorr" },
     { SYM_PCHAR, S_upstair, "S_upstair" },
@@ -659,6 +1064,7 @@ struct symparse loadsyms[] = {
     { SYM_PCHAR, S_magic_trap, "S_magic_trap" },
     { SYM_PCHAR, S_anti_magic_trap, "S_anti_magic_trap" },
     { SYM_PCHAR, S_polymorph_trap, "S_polymorph_trap" },
+    { SYM_PCHAR, S_vibrating_square, "S_vibrating_square" },
     { SYM_PCHAR, S_vbeam, "S_vbeam" },
     { SYM_PCHAR, S_hbeam, "S_hbeam" },
     { SYM_PCHAR, S_lslant, "S_lslant" },
@@ -689,6 +1095,7 @@ struct symparse loadsyms[] = {
     { SYM_PCHAR, S_explode7, "S_explode7" },
     { SYM_PCHAR, S_explode8, "S_explode8" },
     { SYM_PCHAR, S_explode9, "S_explode9" },
+    { SYM_OC, ILLOBJ_CLASS + SYM_OFF_O, "S_strange_obj" },
     { SYM_OC, WEAPON_CLASS + SYM_OFF_O, "S_weapon" },
     { SYM_OC, ARMOR_CLASS + SYM_OFF_O, "S_armor" },
     { SYM_OC, ARMOR_CLASS + SYM_OFF_O, "S_armour" },
@@ -767,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 */
 };