OSDN Git Service

update year to 2020
[jnethack/source.git] / src / drawing.c
1 /* NetHack 3.6  drawing.c       $NHDT-Date: 1573943500 2019/11/16 22:31:40 $  $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.64 $ */
2 /* Copyright (c) NetHack Development Team 1992.                   */
3 /* NetHack may be freely redistributed.  See license for details. */
4
5 /* JNetHack Copyright */
6 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000  */
7 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2020            */
8 /* JNetHack may be freely redistributed.  See license for details. */
9
10 #include "hack.h"
11 #include "tcap.h"
12
13 /* Relevant header information in rm.h, objclass.h, and monsym.h. */
14
15 #ifdef C
16 #undef C
17 #endif
18
19 #ifdef TEXTCOLOR
20 #define C(n) n
21 #else
22 #define C(n)
23 #endif
24
25 struct symsetentry symset[NUM_GRAPHICS];
26
27 int currentgraphics = 0;
28
29 nhsym showsyms[SYM_MAX] = DUMMY; /* symbols to be displayed */
30 nhsym primary_syms[SYM_MAX] = DUMMY;   /* primary symbols          */
31 nhsym rogue_syms[SYM_MAX] = DUMMY;   /* rogue symbols           */
32 nhsym ov_primary_syms[SYM_MAX] = DUMMY;   /* overides via config SYMBOL */
33 nhsym ov_rogue_syms[SYM_MAX] = DUMMY;   /* overides via config ROGUESYMBOL */
34 nhsym warnsyms[WARNCOUNT] = DUMMY; /* the current warning display symbols */
35 #if 0 /*JP:T*/
36 const char invisexplain[] = "remembered, unseen, creature",
37            altinvisexplain[] = "unseen creature"; /* for clairvoyance */
38 #else
39 const char invisexplain[] = "\8ao\82¦\82Ä\82¢\82é\82ª\8c©\82¦\82Ä\82¢\82È\82¢\89ö\95¨",
40            altinvisexplain[] = "\8c©\82¦\82Ä\82¢\82È\82¢\89ö\95¨"; /* for clairvoyance */
41 #endif
42            
43 /* Default object class symbols.  See objclass.h.
44  * {symbol, name, explain}
45  *     name:    used in object_detect().
46  *     explain: used in do_look().
47  */
48 const struct class_sym def_oc_syms[MAXOCLASSES] = {
49     { '\0', "", "" }, /* placeholder for the "random class" */
50 /*JP
51     { ILLOBJ_SYM, "illegal objects", "strange object" },
52 */
53     { ILLOBJ_SYM, "\8aï\96­\82È\95¨\91Ì", "\8aï\96­\82È\95¨\91Ì" },
54 /*JP
55     { WEAPON_SYM, "weapons", "weapon" },
56 */
57     { WEAPON_SYM, "\95\90\8aí", "\95\90\8aí" },
58 /*JP
59     { ARMOR_SYM, "armor", "suit or piece of armor" },
60 */
61     { ARMOR_SYM, "\8aZ", "\95\9e\82Ü\82½\82Í\8aZ\82Ì\82½\82®\82¢" },
62 /*JP
63     { RING_SYM, "rings", "ring" },
64 */
65     { RING_SYM, "\8ew\97Ö", "\8ew\97Ö" },
66 /*JP
67     { AMULET_SYM, "amulets", "amulet" },
68 */
69     { AMULET_SYM, "\96\82\8f\9c\82¯", "\96\82\8f\9c\82¯" },
70 /*JP
71     { TOOL_SYM, "tools", "useful item (pick-axe, key, lamp...)" },
72 */
73     { 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)" },
74 /*JP
75     { FOOD_SYM, "food", "piece of food" },
76 */
77     { FOOD_SYM, "\90H\97¿", "\90H\97¿" },
78 /*JP
79     { POTION_SYM, "potions", "potion" },
80 */
81     { POTION_SYM, "\96ò", "\96ò" },
82 /*JP
83     { SCROLL_SYM, "scrolls", "scroll" },
84 */
85     { SCROLL_SYM, "\8aª\95¨", "\8aª\95¨" },
86 /*JP
87     { SPBOOK_SYM, "spellbooks", "spellbook" },
88 */
89     { SPBOOK_SYM, "\96\82\96@\8f\91", "\96\82\96@\8f\91" },
90 /*JP
91     { WAND_SYM, "wands", "wand" },
92 */
93     { WAND_SYM, "\8fñ", "\8fñ" },
94 /*JP
95     { GOLD_SYM, "coins", "pile of coins" },
96 */
97     { GOLD_SYM, "\8bà\89Ý", "\8bà\89Ý\82Ì\8eR" },
98 /*JP
99     { GEM_SYM, "rocks", "gem or rock" },
100 */
101     { GEM_SYM, "\90Î", "\95ó\90Î\82Ü\82½\82Í\90Î" },
102 /*JP
103     { ROCK_SYM, "large stones", "boulder or statue" },
104 */
105     { ROCK_SYM, "\8b\90\90Î", "\8aâ\82Ü\82½\82Í\91\9c" },
106 /*JP
107     { BALL_SYM, "iron balls", "iron ball" },
108 */
109     { BALL_SYM, "\93S\8b\85", "\93S\8b\85" },
110 /*JP
111     { CHAIN_SYM, "chains", "iron chain" },
112 */
113     { CHAIN_SYM, "\8d½", "\93S\82Ì\8d½" },
114 /*JP
115     { VENOM_SYM, "venoms", "splash of venom" }
116 */
117     { VENOM_SYM, "\93Å", "\93Å\89t" }
118 };
119
120 /* Default monster class symbols.  See monsym.h. */
121 const struct class_sym def_monsyms[MAXMCLASSES] = {
122     { '\0', "", "" },
123 /*JP
124     { DEF_ANT, "", "ant or other insect" },
125 */
126     { DEF_ANT, "", "\8ba\82Ü\82½\82Í\91¼\82Ì\8d©\92\8e" },
127 /*JP
128     { DEF_BLOB, "", "blob" },
129 */
130     { DEF_BLOB, "", "\83u\83\8d\83b\83u" },
131 /*JP
132     { DEF_COCKATRICE, "", "cockatrice" },
133 */
134     { DEF_COCKATRICE, "", "\83R\83J\83g\83\8a\83X" },
135 /*JP
136     { DEF_DOG, "", "dog or other canine" },
137 */
138     { DEF_DOG, "", "\8c¢\82Ü\82½\82Í\83C\83k\89È\82Ì\93®\95¨" },
139 /*JP
140     { DEF_EYE, "", "eye or sphere" },
141 */
142     { DEF_EYE, "", "\96Ú\82Ü\82½\82Í\8b\85\91Ì" },
143 /*JP
144     { DEF_FELINE, "", "cat or other feline" },
145 */
146     { DEF_FELINE, "", "\94L\82Ü\82½\82Í\83l\83R\89È\82Ì\93®\95¨" },
147 /*JP
148     { DEF_GREMLIN, "", "gremlin" },
149 */
150     { DEF_GREMLIN, "", "\83O\83\8c\83\80\83\8a\83\93" },
151 /*JP
152     { DEF_HUMANOID, "", "humanoid" },
153 */
154     { DEF_HUMANOID, "", "\83q\83\85\81[\83}\83m\83C\83h" },
155 /*JP
156     { DEF_IMP, "", "imp or minor demon" },
157 */
158     { DEF_IMP, "", "\83C\83\93\83v\82Ü\82½\82Í\89º\8b\89\88«\96\82" },
159 /*JP
160     { DEF_JELLY, "", "jelly" },
161 */
162     { DEF_JELLY, "", "\83[\83\8a\81[" },
163 /*JP
164     { DEF_KOBOLD, "", "kobold" },
165 */
166     { DEF_KOBOLD, "", "\83R\83{\83\8b\83g" },
167 /*JP
168     { DEF_LEPRECHAUN, "", "leprechaun" },
169 */
170     { DEF_LEPRECHAUN, "", "\83\8c\83v\83\89\83R\81[\83\93" },
171 /*JP
172     { DEF_MIMIC, "", "mimic" },
173 */
174     { DEF_MIMIC, "", "\83~\83~\83b\83N" },
175 /*JP
176     { DEF_NYMPH, "", "nymph" },
177 */
178     { DEF_NYMPH, "", "\83j\83\93\83t" },
179 /*JP
180     { DEF_ORC, "", "orc" },
181 */
182     { DEF_ORC, "", "\83I\81[\83N" },
183 /*JP
184     { DEF_PIERCER, "", "piercer" },
185 */
186     { DEF_PIERCER, "", "\8c\8a\8bò\82¢" },
187 /*JP
188     { DEF_QUADRUPED, "", "quadruped" },
189 */
190     { DEF_QUADRUPED, "", "\8el\91«\93®\95¨" },
191 /*JP
192     { DEF_RODENT, "", "rodent" },
193 */
194     { DEF_RODENT, "", "ê\96\8e\95\93®\95¨" },
195 /*JP
196     { DEF_SPIDER, "", "arachnid or centipede" },
197 */
198     { DEF_SPIDER, "", "\83N\83\82\8c`\97Þ\93®\95¨\82Ü\82½\82Í\83\80\83J\83f" },
199 /*JP
200     { DEF_TRAPPER, "", "trapper or lurker above" },
201 */
202     { DEF_TRAPPER, "", "\83g\83\89\83b\83p\81[\82Ü\82½\82Í\83\89\81[\83J\81[" },
203 /*JP
204     { DEF_UNICORN, "", "unicorn or horse" },
205 */
206     { DEF_UNICORN, "", "\83\86\83j\83R\81[\83\93\82Ü\82½\82Í\94n" },
207 /*JP
208     { DEF_VORTEX, "", "vortex" },
209 */
210     { DEF_VORTEX, "", "\89Q" },
211 /*JP
212     { DEF_WORM, "", "worm" },
213 */
214     { DEF_WORM, "", "\83\8f\81[\83\80" },
215 /*JP
216     { DEF_XAN, "", "xan or other mythical/fantastic insect" },
217 */
218     { DEF_XAN, "", "\83U\83\93\82Ü\82½\82Í\90_\98b\82â\83t\83@\83\93\83^\83W\81[\82Ì\8d©\92\8e" },
219 /*JP
220     { DEF_LIGHT, "", "light" },
221 */
222     { DEF_LIGHT, "", "\8cõ" },
223 /*JP
224     { DEF_ZRUTY, "", "zruty" },
225 */
226     { DEF_ZRUTY, "", "\83Y\83\8b\83e\83B" },
227 /*JP
228     { DEF_ANGEL, "", "angelic being" },
229 */
230     { DEF_ANGEL, "", "\93V\8eg" },
231 /*JP
232     { DEF_BAT, "", "bat or bird" },
233 */
234     { DEF_BAT, "", "\82±\82¤\82à\82è\82Ü\82½\82Í\92¹" },
235 /*JP
236     { DEF_CENTAUR, "", "centaur" },
237 */
238     { DEF_CENTAUR, "", "\83P\83\93\83^\83E\83\8d\83X" },
239 /*JP
240     { DEF_DRAGON, "", "dragon" },
241 */
242     { DEF_DRAGON, "", "\83h\83\89\83S\83\93" },
243 /*JP
244     { DEF_ELEMENTAL, "", "elemental" },
245 */
246     { DEF_ELEMENTAL, "", "\90¸\97ì" },
247 /*JP
248     { DEF_FUNGUS, "", "fungus or mold" },
249 */
250     { DEF_FUNGUS, "", "\83L\83m\83R\82Ü\82½\82Í\83\82\81[\83\8b\83h" },
251 /*JP
252     { DEF_GNOME, "", "gnome" },
253 */
254     { DEF_GNOME, "", "\83m\81[\83\80" },
255 /*JP
256     { DEF_GIANT, "", "giant humanoid" },
257 */
258     { DEF_GIANT, "", "\8b\90\90l" },
259 /*JP
260     { '\0', "", "invisible monster" },
261 */
262     { '\0', "", "\93§\96¾\82È\89ö\95¨" },
263 /*JP
264     { DEF_JABBERWOCK, "", "jabberwock" },
265 */
266     { DEF_JABBERWOCK, "", "\83W\83\83\83o\83E\83H\83b\83N" },
267 /*JP
268     { DEF_KOP, "", "Keystone Kop" },
269 */
270     { DEF_KOP, "", "\8cx\94õ\88õ" },
271 /*JP
272     { DEF_LICH, "", "lich" },
273 */
274     { DEF_LICH, "", "\83\8a\83b\83`" },
275 /*JP
276     { DEF_MUMMY, "", "mummy" },
277 */
278     { DEF_MUMMY, "", "\83~\83C\83\89" },
279 /*JP
280     { DEF_NAGA, "", "naga" },
281 */
282     { DEF_NAGA, "", "\83i\81[\83K" },
283 /*JP
284     { DEF_OGRE, "", "ogre" },
285 */
286     { DEF_OGRE, "", "\83I\81[\83K" },
287 /*JP
288     { DEF_PUDDING, "", "pudding or ooze" },
289 */
290     { DEF_PUDDING, "", "\83v\83\8a\83\93\82Ü\82½\82Í\83E\81[\83Y" },
291 /*JP
292     { DEF_QUANTMECH, "", "quantum mechanic" },
293 */
294     { DEF_QUANTMECH, "", "\97Ê\8eq\8fê" },
295 /*JP
296     { DEF_RUSTMONST, "", "rust monster or disenchanter" },
297 */
298     { DEF_RUSTMONST, "", "\8eK\82Ì\89ö\95¨\82Ü\82½\82Í\8bz\96\82\82Ì\89ö\95¨" },
299 /*JP
300     { DEF_SNAKE, "", "snake" },
301 */
302     { DEF_SNAKE, "", "\83w\83r" },
303 /*JP
304     { DEF_TROLL, "", "troll" },
305 */
306     { DEF_TROLL, "", "\83g\83\8d\83\8b" },
307 /*JP
308     { DEF_UMBER, "", "umber hulk" },
309 */
310     { DEF_UMBER, "", "\83A\83\93\83o\81[\83n\83\8b\83N" },
311 /*JP
312     { DEF_VAMPIRE, "", "vampire" },
313 */
314     { DEF_VAMPIRE, "", "\8bz\8c\8c\8bS" },
315 /*JP
316     { DEF_WRAITH, "", "wraith" },
317 */
318     { DEF_WRAITH, "", "\83\8c\83C\83X" },
319 /*JP
320     { DEF_XORN, "", "xorn" },
321 */
322     { DEF_XORN, "", "\83]\81[\83\93" },
323 /*JP
324     { DEF_YETI, "", "apelike creature" },
325 */
326     { DEF_YETI, "", "\89\8e\82Ì\82æ\82¤\82È\90\95¨" },
327 /*JP
328     { DEF_ZOMBIE, "", "zombie" },
329 */
330     { DEF_ZOMBIE, "", "\83]\83\93\83r" },
331 /*JP
332     { DEF_HUMAN, "", "human or elf" },
333 */
334     { DEF_HUMAN, "", "\90l\8aÔ\82Ü\82½\82Í\83G\83\8b\83t" },
335 /*JP
336     { DEF_GHOST, "", "ghost" },
337 */
338     { DEF_GHOST, "", "\88«\96\82" },
339 /*JP
340     { DEF_GOLEM, "", "golem" },
341 */
342     { DEF_GOLEM, "", "\83S\81[\83\8c\83\80" },
343 /*JP
344     { DEF_DEMON, "", "major demon" },
345 */
346     { DEF_DEMON, "", "\88«\96\82" },
347 /*JP
348     { DEF_EEL, "", "sea monster" },
349 */
350     { DEF_EEL, "", "\8aC\82Ì\89ö\95¨" },
351 /*JP
352     { DEF_LIZARD, "", "lizard" },
353 */
354     { DEF_LIZARD, "", "\83g\83J\83Q" },
355 /*JP
356     { DEF_WORM_TAIL, "", "long worm tail" },
357 */
358     { DEF_WORM_TAIL, "", "\83\8d\83\93\83O\83\8f\81[\83\80\82Ì\90K\94ö" },
359 /*JP
360     { DEF_MIMIC_DEF, "", "mimic" },
361 */
362     { DEF_MIMIC_DEF, "", "\83~\83~\83b\83N" },
363 };
364
365 const struct symdef def_warnsyms[WARNCOUNT] = {
366     /* white warning  */
367 /*JP
368     { '0', "unknown creature causing you worry",    C(CLR_WHITE) },
369 */
370     { '0', "\82 \82È\82½\82ª\8bC\82É\82µ\82Ä\82¢\82é\93ä\82Ì\89ö\95¨", C(CLR_WHITE)},
371     /* pink warning   */
372 /*JP
373     { '1', "unknown creature causing you concern",  C(CLR_RED) },
374 */
375     { '1', "\82 \82È\82½\82ª\90S\94z\82µ\82Ä\82¢\82é\93ä\82Ì\89ö\95¨", C(CLR_RED)},
376     /* red warning    */
377 /*JP
378     { '2', "unknown creature causing you anxiety",  C(CLR_RED) },
379 */
380     { '2', "\82 \82È\82½\82ª\8c\9c\94O\82µ\82Ä\82¢\82é\93ä\82Ì\89ö\95¨", C(CLR_RED)},
381     /* ruby warning   */
382 /*JP
383     { '3', "unknown creature causing you disquiet", C(CLR_RED) },
384 */
385     { '3', "\82 \82È\82½\82ª\8bC\82ð\82à\82ñ\82Å\82¢\82é\93ä\82Ì\89ö\95¨", C(CLR_RED)},
386     /* purple warning */
387 /*JP
388     { '4', "unknown creature causing you alarm",    C(CLR_MAGENTA) },
389 */
390     { '4', "\82 \82È\82½\82ª\8b°\82ê\82Ä\82¢\82é\93ä\82Ì\89ö\95¨", C(CLR_MAGENTA)},
391     /* black warning  */
392 /*JP
393     { '5', "unknown creature causing you dread",    C(CLR_BRIGHT_MAGENTA) },
394 */
395     { '5', "\82 \82È\82½\82ª\94ñ\8fí\82É\8b°\82ê\82Ä\82¢\82é\93ä\82Ì\89ö\95¨", C(CLR_BRIGHT_MAGENTA)},
396 };
397
398 /*
399  *  Default screen symbols with explanations and colors.
400  */
401 const struct symdef defsyms[MAXPCHARS] = {
402 #if 0 /*JP:T*/
403 /* 0*/ { ' ', "dark part of a room", C(NO_COLOR) },  /* stone */
404        { '|', "wall", C(CLR_GRAY) },                 /* vwall */
405        { '-', "wall", C(CLR_GRAY) },                 /* hwall */
406        { '-', "wall", C(CLR_GRAY) },                 /* tlcorn */
407        { '-', "wall", C(CLR_GRAY) },                 /* trcorn */
408        { '-', "wall", C(CLR_GRAY) },                 /* blcorn */
409        { '-', "wall", C(CLR_GRAY) },                 /* brcorn */
410        { '-', "wall", C(CLR_GRAY) },                 /* crwall */
411        { '-', "wall", C(CLR_GRAY) },                 /* tuwall */
412        { '-', "wall", C(CLR_GRAY) },                 /* tdwall */
413 #else
414 /* 0*/ { ' ', "\95\94\89®\82Ì\88Ã\82¢\95\94\95ª", C(NO_COLOR) },       /* stone */
415        { '|', "\95Ç", C(CLR_GRAY) },                   /* vwall */
416        { '-', "\95Ç", C(CLR_GRAY) },                   /* hwall */
417        { '-', "\95Ç", C(CLR_GRAY) },                   /* tlcorn */
418        { '-', "\95Ç", C(CLR_GRAY) },                   /* trcorn */
419        { '-', "\95Ç", C(CLR_GRAY) },                   /* blcorn */
420        { '-', "\95Ç", C(CLR_GRAY) },                   /* brcorn */
421        { '-', "\95Ç", C(CLR_GRAY) },                   /* crwall */
422        { '-', "\95Ç", C(CLR_GRAY) },                   /* tuwall */
423        { '-', "\95Ç", C(CLR_GRAY) },                   /* tdwall */
424 #endif
425 #if 0 /*JP:T*/
426 /*10*/ { '|', "wall", C(CLR_GRAY) },                 /* tlwall */
427        { '|', "wall", C(CLR_GRAY) },                 /* trwall */
428        { '.', "doorway", C(CLR_GRAY) },              /* ndoor */
429        { '-', "open door", C(CLR_BROWN) },           /* vodoor */
430        { '|', "open door", C(CLR_BROWN) },           /* hodoor */
431        { '+', "closed door", C(CLR_BROWN) },         /* vcdoor */
432        { '+', "closed door", C(CLR_BROWN) },         /* hcdoor */
433        { '#', "iron bars", C(HI_METAL) },            /* bars */
434        { '#', "tree", C(CLR_GREEN) },                /* tree */
435        { '.', "floor of a room", C(CLR_GRAY) },      /* room */
436 #else
437 /*10*/ { '|', "\95Ç", C(CLR_GRAY) },                   /* tlwall */
438        { '|', "\95Ç", C(CLR_GRAY) },                   /* trwall */
439        { '.', "\8fo\93ü\8cû", C(CLR_GRAY) },               /* ndoor */
440        { '-', "\8aJ\82¢\82½\94à", C(CLR_BROWN) },            /* vodoor */
441        { '|', "\8aJ\82¢\82½\94à", C(CLR_BROWN) },            /* hodoor */
442        { '+', "\95Â\82\82½\94à", C(CLR_BROWN) },            /* vcdoor */
443        { '+', "\95Â\82\82½\94à", C(CLR_BROWN) },            /* hcdoor */
444        { '#', "\93S\96_", C(HI_METAL) },                 /* bars */
445        { '#', "\96Ø", C(CLR_GREEN) },                  /* tree */
446        { '.', "\95\94\89®\82Ì\8f°", C(CLR_GRAY) },             /* room */
447 #endif
448 #if 0 /*JP:T*/
449 /*20*/ { '.', "dark part of a room", C(CLR_BLACK) }, /* dark room */
450        { '#', "corridor", C(CLR_GRAY) },             /* dark corr */
451        { '#', "lit corridor", C(CLR_GRAY) },   /* lit corr (see mapglyph.c) */
452        { '<', "staircase up", C(CLR_GRAY) },         /* upstair */
453        { '>', "staircase down", C(CLR_GRAY) },       /* dnstair */
454        { '<', "ladder up", C(CLR_BROWN) },           /* upladder */
455        { '>', "ladder down", C(CLR_BROWN) },         /* dnladder */
456        { '_', "altar", C(CLR_GRAY) },                /* altar */
457        { '|', "grave", C(CLR_WHITE) },               /* grave */
458        { '\\', "opulent throne", C(HI_GOLD) },       /* throne */
459 #else
460 /*20*/ { '.', "\95\94\89®\82Ì\88Ã\82¢\95\94\95ª", C(CLR_BLACK) },      /* dark room */
461        { '#', "\92Ê\98H", C(CLR_GRAY) },                 /* dark corr */
462        { '#', "\96¾\82é\82¢\92Ê\98H", C(CLR_GRAY) },     /* lit corr (see mapglyph.c) */
463        { '<', "\8fã\82è\8aK\92i", C(CLR_GRAY) },             /* upstair */
464        { '>', "\89º\82è\8aK\92i", C(CLR_GRAY) },             /* dnstair */
465        { '<', "\8fã\82è\82Í\82µ\82²", C(CLR_BROWN) },          /* upladder */
466        { '>', "\89º\82è\82Í\82µ\82²", C(CLR_BROWN) },          /* dnladder */
467        { '_', "\8dÕ\92d", C(CLR_GRAY) },                 /* altar */
468        { '|', "\95æ", C(CLR_WHITE) },                  /* grave */
469        { '\\', "\89Ø\82â\82©\82È\8bÊ\8dÀ", C(HI_GOLD) },         /* throne */
470 #endif
471 #if 0 /*JP:T*/
472 /*30*/ { '#', "sink", C(CLR_GRAY) },                 /* sink */
473        { '{', "fountain", C(CLR_BRIGHT_BLUE) },      /* fountain */
474        { '}', "water", C(CLR_BLUE) },                /* pool */
475        { '.', "ice", C(CLR_CYAN) },                  /* ice */
476        { '}', "molten lava", C(CLR_RED) },           /* lava */
477        { '.', "lowered drawbridge", C(CLR_BROWN) },  /* vodbridge */
478        { '.', "lowered drawbridge", C(CLR_BROWN) },  /* hodbridge */
479        { '#', "raised drawbridge", C(CLR_BROWN) },   /* vcdbridge */
480        { '#', "raised drawbridge", C(CLR_BROWN) },   /* hcdbridge */
481        { ' ', "air", C(CLR_CYAN) },                  /* open air */
482 #else
483 /*30*/ { '#', "\97¬\82µ\91ä", C(CLR_GRAY) },               /* sink */
484        { '{', "\90ò", C(CLR_BRIGHT_BLUE) },            /* fountain */
485        { '}', "\90\85\82Ì\82½\82Ü\82Á\82½\8fê\8f\8a", C(CLR_BLUE) },     /* pool */
486        { '.', "\95X", C(CLR_CYAN) },                   /* ice */
487        { '}', "\97n\8aâ", C(CLR_RED) },                  /* lava */
488        { '.', "\8d~\82è\82Ä\82¢\82é\92µ\82Ë\8b´", C(CLR_BROWN) },    /* vodbridge */
489        { '.', "\8d~\82è\82Ä\82¢\82é\92µ\82Ë\8b´", C(CLR_BROWN) },    /* hodbridge */
490        { '#', "\8fã\82Á\82Ä\82¢\82é\92µ\82Ë\8b´", C(CLR_BROWN) },    /* vcdbridge */
491        { '#', "\8fã\82Á\82Ä\82¢\82é\92µ\82Ë\8b´", C(CLR_BROWN) },    /* hcdbridge */
492        { ' ', "\8bó\8bC\82Ì\82½\82Ü\82Á\82½\8fê\8f\8a", C(CLR_CYAN) },   /* open air */
493 #endif
494 #if 0 /*JP:T*/
495 /*40*/ { '#', "cloud", C(CLR_GRAY) },                /* [part of] a cloud */
496        { '}', "water", C(CLR_BLUE) },                /* under water */
497        { '^', "arrow trap", C(HI_METAL) },           /* trap */
498        { '^', "dart trap", C(HI_METAL) },            /* trap */
499        { '^', "falling rock trap", C(CLR_GRAY) },    /* trap */
500        { '^', "squeaky board", C(CLR_BROWN) },       /* trap */
501        { '^', "bear trap", C(HI_METAL) },            /* trap */
502        { '^', "land mine", C(CLR_RED) },             /* trap */
503        { '^', "rolling boulder trap", C(CLR_GRAY) }, /* trap */
504        { '^', "sleeping gas trap", C(HI_ZAP) },      /* trap */
505 #else
506 /*40*/ { '#', "\89_", C(CLR_GRAY) },                   /* [part of] a cloud */
507        { '}', "\90\85", C(CLR_BLUE) },                   /* under water */
508        { '^', "\96î\82Ìã©", C(HI_METAL) },               /* trap */
509        { '^', "\93\8a\82°\96î\82Ìã©", C(HI_METAL) },           /* trap */
510        { '^', "\97\8e\90Î\82Ìã©", C(CLR_GRAY) },             /* trap */
511        { '^', "\82«\82µ\82Þ\94Â", C(CLR_BROWN) },            /* trap */
512        { '^', "\8cF\82Ìã©", C(HI_METAL) },               /* trap */
513        { '^', "\92n\97\8b", C(CLR_RED) },                  /* trap */
514        { '^', "\8b\90\8aâ\82Ìã©", C(CLR_GRAY) },             /* trap */
515        { '^', "\90\87\96°\83K\83X\82Ìã©", C(HI_ZAP) },           /* trap */
516 #endif
517 #if 0 /*JP:T*/
518 /*50*/ { '^', "rust trap", C(CLR_BLUE) },            /* trap */
519        { '^', "fire trap", C(CLR_ORANGE) },          /* trap */
520        { '^', "pit", C(CLR_BLACK) },                 /* trap */
521        { '^', "spiked pit", C(CLR_BLACK) },          /* trap */
522        { '^', "hole", C(CLR_BROWN) },                /* trap */
523        { '^', "trap door", C(CLR_BROWN) },           /* trap */
524        { '^', "teleportation trap", C(CLR_MAGENTA) },  /* trap */
525        { '^', "level teleporter", C(CLR_MAGENTA) },    /* trap */
526        { '^', "magic portal", C(CLR_BRIGHT_MAGENTA) }, /* trap */
527        { '"', "web", C(CLR_GRAY) },                    /* web */
528 #else
529 /*50*/ { '^', "\95\85\90H\82Ìã©", C(CLR_BLUE) },             /* trap */
530        { '^', "\89Î\82Ìã©", C(CLR_ORANGE) },             /* trap */
531        { '^', "\97\8e\82µ\8c\8a", C(CLR_BLACK) },              /* trap */
532        { '^', "\83g\83Q\82¾\82ç\82¯\82Ì\97\8e\82µ\8c\8a", C(CLR_BLACK) },  /* trap */
533        { '^', "\8c\8a", C(CLR_BROWN) },                  /* trap */
534        { '^', "\97\8e\82µ\94à", C(CLR_BROWN) },              /* trap */
535        { '^', "\8fu\8aÔ\88Ú\93®\82Ìã©", C(CLR_MAGENTA) },      /* trap */
536        { '^', "\95Ê\82Ì\8aK\82Ö\82Ì\8fu\8aÔ\88Ú\93®\82Ìã©", C(CLR_MAGENTA) }, /* trap */
537        { '^', "\96\82\96@\82Ì\93ü\8cû", C(CLR_BRIGHT_MAGENTA) }, /* trap */
538        { '"', "\82­\82à\82Ì\91\83", C(CLR_GRAY) },             /* web */
539 #endif
540 #if 0 /*JP:T*/
541 /*60*/ { '^', "statue trap", C(CLR_GRAY) },            /* trap */
542        { '^', "magic trap", C(HI_ZAP) },               /* trap */
543        { '^', "anti-magic field", C(HI_ZAP) },         /* trap */
544        { '^', "polymorph trap", C(CLR_BRIGHT_GREEN) }, /* trap */
545        { '~', "vibrating square", C(CLR_MAGENTA) },    /* "trap" */
546        /* zap colors are changed by mapglyph() to match type of beam */
547        { '|', "", C(CLR_GRAY) },                /* vbeam */
548        { '-', "", C(CLR_GRAY) },                /* hbeam */
549        { '\\', "", C(CLR_GRAY) },               /* lslant */
550        { '/', "", C(CLR_GRAY) },                /* rslant */
551        { '*', "", C(CLR_WHITE) },               /* dig beam */
552        { '!', "", C(CLR_WHITE) },               /* camera flash beam */
553        { ')', "", C(HI_WOOD) },                 /* boomerang open left */
554 #else
555 /*60*/ { '^', "\92¤\91\9c\82Ìã©", C(CLR_GRAY) },               /* trap */
556        { '^', "\96\82\96@\82Ìã©", C(HI_ZAP) },                 /* trap */
557        { '^', "\94½\96\82\96@\8bó\8aÔ\82Ìã©", C(HI_ZAP) },           /* trap */
558        { '^', "\95Ï\89»\82Ìã©", C(CLR_BRIGHT_GREEN) },       /* trap */
559        { '~', "\90U\93®\82µ\82Ä\82¢\82é\8fê\8f\8a", C(CLR_MAGENTA) },    /* "trap" */
560        /* zap colors are changed by mapglyph() to match type of beam */
561        { '|', "", C(CLR_GRAY) },              /* vbeam */
562        { '-', "", C(CLR_GRAY) },              /* hbeam */
563        { '\\', "", C(CLR_GRAY) },             /* lslant */
564        { '/', "", C(CLR_GRAY) },              /* rslant */
565        { '*', "", C(CLR_WHITE) },               /* dig beam */
566        { '!', "", C(CLR_WHITE) },               /* camera flash beam */
567        { ')', "", C(HI_WOOD) },                 /* boomerang open left */
568 #endif
569 /*70*/ { '(', "", C(HI_WOOD) },                 /* boomerang open right */
570        { '0', "", C(HI_ZAP) },                  /* 4 magic shield symbols */
571        { '#', "", C(HI_ZAP) },
572        { '@', "", C(HI_ZAP) },
573        { '*', "", C(HI_ZAP) },
574 #if 0 /*JP:T*/
575        { '#', "poison cloud", C(CLR_BRIGHT_GREEN) },   /* part of a cloud */
576        { '?', "valid position", C(CLR_BRIGHT_GREEN) }, /*  target position */
577 #else
578        { '#', "\93Å\89_", C(CLR_BRIGHT_GREEN) },           /* part of a cloud */
579        { '?', "\97L\8cø\82È\88Ê\92u", C(CLR_BRIGHT_GREEN) },     /*  target position */
580 #endif
581        /* swallow colors are changed by mapglyph() to match engulfing monst */
582        { '/', "", C(CLR_GREEN) },         /* swallow top left      */
583        { '-', "", C(CLR_GREEN) },         /* swallow top center    */
584        { '\\', "", C(CLR_GREEN) },        /* swallow top right     */
585 /*80*/ { '|', "", C(CLR_GREEN) },         /* swallow middle left   */
586        { '|', "", C(CLR_GREEN) },         /* swallow middle right  */
587        { '\\', "", C(CLR_GREEN) },        /* swallow bottom left   */
588        { '-', "", C(CLR_GREEN) },         /* swallow bottom center */
589        { '/', "", C(CLR_GREEN) },         /* swallow bottom right  */
590        /* explosion colors are changed by mapglyph() to match type of expl. */
591        { '/', "", C(CLR_ORANGE) },        /* explosion top left     */
592        { '-', "", C(CLR_ORANGE) },        /* explosion top center   */
593        { '\\', "", C(CLR_ORANGE) },       /* explosion top right    */
594        { '|', "", C(CLR_ORANGE) },        /* explosion middle left  */
595        { ' ', "", C(CLR_ORANGE) },        /* explosion middle center*/
596 /*90*/ { '|', "", C(CLR_ORANGE) },        /* explosion middle right */
597        { '\\', "", C(CLR_ORANGE) },       /* explosion bottom left  */
598        { '-', "", C(CLR_ORANGE) },        /* explosion bottom center*/
599        { '/', "", C(CLR_ORANGE) },        /* explosion bottom right */
600 };
601
602 /* default rogue level symbols */
603 static const uchar def_r_oc_syms[MAXOCLASSES] = {
604 /* 0*/ '\0', ILLOBJ_SYM, WEAPON_SYM, ']', /* armor */
605        RING_SYM,
606 /* 5*/ ',',                     /* amulet */
607        TOOL_SYM, ':',           /* food */
608        POTION_SYM, SCROLL_SYM,
609 /*10*/ SPBOOK_SYM, WAND_SYM,
610        GEM_SYM,                /* gold -- yes it's the same as gems */
611        GEM_SYM, ROCK_SYM,
612 /*15*/ BALL_SYM, CHAIN_SYM, VENOM_SYM
613 };
614
615 #undef C
616
617 #if defined(TERMLIB) || defined(CURSES_GRAPHICS)
618 void NDECL((*decgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
619 #endif /* TERMLIB || CURSES */
620
621 #ifdef PC9800
622 void NDECL((*ibmgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
623 void NDECL((*ascgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
624 #endif
625
626 #ifdef CURSES_GRAPHICS
627 void NDECL((*cursesgraphics_mode_callback)) = 0;
628 #endif
629
630 /*
631  * Convert the given character to an object class.  If the character is not
632  * recognized, then MAXOCLASSES is returned.  Used in detect.c, invent.c,
633  * objnam.c, options.c, pickup.c, sp_lev.c, lev_main.c, and tilemap.c.
634  */
635 int
636 def_char_to_objclass(ch)
637 char ch;
638 {
639     int i;
640     for (i = 1; i < MAXOCLASSES; i++)
641         if (ch == def_oc_syms[i].sym)
642             break;
643     return i;
644 }
645
646 /*
647  * Convert a character into a monster class.  This returns the _first_
648  * match made.  If there are are no matches, return MAXMCLASSES.
649  * Used in detect.c, options.c, read.c, sp_lev.c, and lev_main.c
650  */
651 int
652 def_char_to_monclass(ch)
653 char ch;
654 {
655     int i;
656     for (i = 1; i < MAXMCLASSES; i++)
657         if (ch == def_monsyms[i].sym)
658             break;
659     return i;
660 }
661
662 /*
663  * Explanations of the functions found below:
664  *
665  * init_symbols()
666  *                     Sets the current display symbols, the
667  *                     loadable symbols to the default NetHack
668  *                     symbols, including the rogue_syms rogue level
669  *                     symbols. This would typically be done
670  *                     immediately after execution begins. Any
671  *                     previously loaded external symbol sets are
672  *                     discarded.
673  *
674  * switch_symbols(arg)
675  *                     Called to swap in new current display symbols
676  *                     (showsyms) from either the default symbols,
677  *                     or from the loaded symbols.
678  *
679  *                     If (arg == 0) then showsyms are taken from
680  *                     defsyms, def_oc_syms, and def_monsyms.
681  *
682  *                     If (arg != 0), which is the normal expected
683  *                     usage, then showsyms are taken from the
684  *                     adjustable display symbols found in primary_syms.
685  *                     primary_syms may have been loaded from an external
686  *                     symbol file by config file options or interactively
687  *                     in the Options menu.
688  *
689  * assign_graphics(arg)
690  *
691  *                     This is used in the game core to toggle in and
692  *                     out of other {rogue} level display modes.
693  *
694  *                     If arg is ROGUESET, this places the rogue level
695  *                     symbols from rogue_syms into showsyms.
696  *
697  *                     If arg is PRIMARY, this places the symbols
698  *                     from l_monsyms into showsyms.
699  *
700  * update_primary_symset()
701  *                     Update a member of the primary(primary_*) symbol set.
702  *
703  * update_rogue_symset()
704  *                     Update a member of the rogue (rogue_*) symbol set.
705  *
706  * update_ov_primary_symset()
707  *                     Update a member of the overrides for primary symbol set.
708  *
709  * update_ov_rogue_symset()
710  *                     Update a member of the overrides for rogue symbol set.
711  *
712  */
713
714 void
715 init_symbols()
716 {
717     init_ov_primary_symbols();
718     init_ov_rogue_symbols();
719     init_primary_symbols();
720     init_showsyms();
721     init_rogue_symbols();
722 }
723
724 void
725 init_showsyms()
726 {
727     register int i;
728
729     for (i = 0; i < MAXPCHARS; i++)
730         showsyms[i + SYM_OFF_P] = defsyms[i].sym;
731     for (i = 0; i < MAXOCLASSES; i++)
732         showsyms[i + SYM_OFF_O] = def_oc_syms[i].sym;
733     for (i = 0; i < MAXMCLASSES; i++)
734         showsyms[i + SYM_OFF_M] = def_monsyms[i].sym;
735     for (i = 0; i < WARNCOUNT; i++)
736         showsyms[i + SYM_OFF_W] = def_warnsyms[i].sym;
737     for (i = 0; i < MAXOTHER; i++)
738         showsyms[i + SYM_OFF_X] = get_othersym(i, PRIMARY);
739 }
740
741 /* initialize defaults for the overrides to the rogue symset */
742 void
743 init_ov_rogue_symbols()
744 {
745     register int i;
746
747     for (i = 0; i < SYM_MAX; i++)
748         ov_rogue_syms[i] = (nhsym) 0;
749 }
750 /* initialize defaults for the overrides to the primary symset */
751 void
752 init_ov_primary_symbols()
753 {
754     register int i;
755
756     for (i = 0; i < SYM_MAX; i++)
757         ov_primary_syms[i] = (nhsym) 0;
758 }
759
760 nhsym
761 get_othersym(idx, which_set)
762 int idx, which_set;
763 {
764     nhsym sym = (nhsym) 0;
765     int oidx = idx + SYM_OFF_X;
766
767     if (which_set == ROGUESET)
768         sym = ov_rogue_syms[oidx] ? ov_rogue_syms[oidx]
769                                   : rogue_syms[oidx];
770     else
771         sym = ov_primary_syms[oidx] ? ov_primary_syms[oidx]
772                                   : primary_syms[oidx];
773     if (!sym) {
774         switch(idx) {
775             case SYM_BOULDER:
776                 sym = def_oc_syms[ROCK_CLASS].sym;
777                 break;
778             case SYM_INVISIBLE:
779                 sym = DEF_INVISIBLE;
780                 break;
781         }
782     }
783     return sym;
784 }
785
786 /* initialize defaults for the primary symset */
787 void
788 init_primary_symbols()
789 {
790     register int i;
791
792     for (i = 0; i < MAXPCHARS; i++)
793         primary_syms[i + SYM_OFF_P] = defsyms[i].sym;
794     for (i = 0; i < MAXOCLASSES; i++)
795         primary_syms[i + SYM_OFF_O] = def_oc_syms[i].sym;
796     for (i = 0; i < MAXMCLASSES; i++)
797         primary_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
798     for (i = 0; i < WARNCOUNT; i++)
799         primary_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
800     for (i = 0; i < MAXOTHER; i++)
801         primary_syms[i + SYM_OFF_X] = get_othersym(i, PRIMARY);
802
803     clear_symsetentry(PRIMARY, FALSE);
804 }
805
806 /* initialize defaults for the rogue symset */
807 void
808 init_rogue_symbols()
809 {
810     register int i;
811
812     /* These are defaults that can get overwritten
813        later by the roguesymbols option */
814
815     for (i = 0; i < MAXPCHARS; i++)
816         rogue_syms[i + SYM_OFF_P] = defsyms[i].sym;
817     rogue_syms[S_vodoor] = rogue_syms[S_hodoor] = rogue_syms[S_ndoor] = '+';
818     rogue_syms[S_upstair] = rogue_syms[S_dnstair] = '%';
819
820     for (i = 0; i < MAXOCLASSES; i++)
821         rogue_syms[i + SYM_OFF_O] = def_r_oc_syms[i];
822     for (i = 0; i < MAXMCLASSES; i++)
823         rogue_syms[i + SYM_OFF_M] = def_monsyms[i].sym;
824     for (i = 0; i < WARNCOUNT; i++)
825         rogue_syms[i + SYM_OFF_W] = def_warnsyms[i].sym;
826     for (i = 0; i < MAXOTHER; i++)
827         rogue_syms[i + SYM_OFF_X] = get_othersym(i, ROGUESET);
828
829     clear_symsetentry(ROGUESET, FALSE);
830     /* default on Rogue level is no color
831      * but some symbol sets can override that
832      */
833     symset[ROGUESET].nocolor = 1;
834 }
835
836 void
837 assign_graphics(whichset)
838 int whichset;
839 {
840     register int i;
841
842     switch (whichset) {
843     case ROGUESET:
844         /* Adjust graphics display characters on Rogue levels */
845
846         for (i = 0; i < SYM_MAX; i++)
847             showsyms[i] = ov_rogue_syms[i] ? ov_rogue_syms[i]
848                                            : rogue_syms[i];
849
850 #if defined(MSDOS) && defined(USE_TILES)
851         if (iflags.grmode)
852             tileview(FALSE);
853 #endif
854         currentgraphics = ROGUESET;
855         break;
856
857     case PRIMARY:
858     default:
859         for (i = 0; i < SYM_MAX; i++)
860             showsyms[i] = ov_primary_syms[i] ? ov_primary_syms[i]
861                                              : primary_syms[i];
862
863 #if defined(MSDOS) && defined(USE_TILES)
864         if (iflags.grmode)
865             tileview(TRUE);
866 #endif
867         currentgraphics = PRIMARY;
868         break;
869     }
870 }
871
872 void
873 switch_symbols(nondefault)
874 int nondefault;
875 {
876     register int i;
877
878     if (nondefault) {
879         for (i = 0; i < SYM_MAX; i++)
880             showsyms[i] = ov_primary_syms[i] ? ov_primary_syms[i]
881                                              : primary_syms[i];
882 #ifdef PC9800
883         if (SYMHANDLING(H_IBM) && ibmgraphics_mode_callback)
884             (*ibmgraphics_mode_callback)();
885         else if (SYMHANDLING(H_UNK) && ascgraphics_mode_callback)
886             (*ascgraphics_mode_callback)();
887 #endif
888 #if defined(TERMLIB) || defined(CURSES_GRAPHICS)
889         /* curses doesn't assign any routine to dec..._callback but
890            probably does the expected initialization under the hood
891            for terminals capable of rendering DECgraphics */
892         if (SYMHANDLING(H_DEC) && decgraphics_mode_callback)
893             (*decgraphics_mode_callback)();
894 # ifdef CURSES_GRAPHICS
895         /* there aren't any symbol sets with CURS handling, and the
896            curses interface never assigns a routine to curses..._callback */
897         if (SYMHANDLING(H_CURS) && cursesgraphics_mode_callback)
898             (*cursesgraphics_mode_callback)();
899 # endif
900 #endif
901     } else {
902         init_primary_symbols();
903         init_showsyms();
904     }
905 }
906
907 void
908 update_ov_primary_symset(symp, val)
909 struct symparse *symp;
910 int val;
911 {
912     ov_primary_syms[symp->idx] = val;
913 }
914
915 void
916 update_ov_rogue_symset(symp, val)
917 struct symparse *symp;
918 int val;
919 {
920     ov_rogue_syms[symp->idx] = val;
921 }
922
923 void
924 update_primary_symset(symp, val)
925 struct symparse *symp;
926 int val;
927 {
928     primary_syms[symp->idx] = val;
929 }
930
931 void
932 update_rogue_symset(symp, val)
933 struct symparse *symp;
934 int val;
935 {
936     rogue_syms[symp->idx] = val;
937 }
938
939 void
940 clear_symsetentry(which_set, name_too)
941 int which_set;
942 boolean name_too;
943 {
944     if (symset[which_set].desc)
945         free((genericptr_t) symset[which_set].desc);
946     symset[which_set].desc = (char *) 0;
947
948     symset[which_set].handling = H_UNK;
949     symset[which_set].nocolor = 0;
950     /* initialize restriction bits */
951     symset[which_set].primary = 0;
952     symset[which_set].rogue = 0;
953
954     if (name_too) {
955         if (symset[which_set].name)
956             free((genericptr_t) symset[which_set].name);
957         symset[which_set].name = (char *) 0;
958     }
959 }
960
961 /*
962  * If you are adding code somewhere to be able to recognize
963  * particular types of symset "handling", define a
964  * H_XXX macro in include/rm.h and add the name
965  * to this array at the matching offset.
966  */
967 const char *known_handling[] = {
968     "UNKNOWN", /* H_UNK  */
969     "IBM",     /* H_IBM  */
970     "DEC",     /* H_DEC  */
971     "CURS",    /* H_CURS */
972     "MAC",     /* H_MAC  -- pre-OSX MACgraphics */
973     (const char *) 0,
974 };
975
976 /*
977  * Accepted keywords for symset restrictions.
978  * These can be virtually anything that you want to
979  * be able to test in the code someplace.
980  * Be sure to:
981  *    - add a corresponding Bitfield to the symsetentry struct in rm.h
982  *    - initialize the field to zero in parse_sym_line in the SYM_CONTROL
983  *      case 0 section of the idx switch. The location is prefaced with
984  *      with a comment stating "initialize restriction bits".
985  *    - set the value appropriately based on the index of your keyword
986  *      under the case 5 sections of the same SYM_CONTROL idx switches.
987  *    - add the field to clear_symsetentry()
988  */
989 const char *known_restrictions[] = {
990     "primary", "rogue", (const char *) 0,
991 };
992
993 struct symparse loadsyms[] = {
994     { SYM_CONTROL, 0, "start" },
995     { SYM_CONTROL, 0, "begin" },
996     { SYM_CONTROL, 1, "finish" },
997     { SYM_CONTROL, 2, "handling" },
998     { SYM_CONTROL, 3, "description" },
999     { SYM_CONTROL, 4, "color" },
1000     { SYM_CONTROL, 4, "colour" },
1001     { SYM_CONTROL, 5, "restrictions" },
1002     { SYM_PCHAR, S_stone, "S_stone" },
1003     { SYM_PCHAR, S_vwall, "S_vwall" },
1004     { SYM_PCHAR, S_hwall, "S_hwall" },
1005     { SYM_PCHAR, S_tlcorn, "S_tlcorn" },
1006     { SYM_PCHAR, S_trcorn, "S_trcorn" },
1007     { SYM_PCHAR, S_blcorn, "S_blcorn" },
1008     { SYM_PCHAR, S_brcorn, "S_brcorn" },
1009     { SYM_PCHAR, S_crwall, "S_crwall" },
1010     { SYM_PCHAR, S_tuwall, "S_tuwall" },
1011     { SYM_PCHAR, S_tdwall, "S_tdwall" },
1012     { SYM_PCHAR, S_tlwall, "S_tlwall" },
1013     { SYM_PCHAR, S_trwall, "S_trwall" },
1014     { SYM_PCHAR, S_ndoor, "S_ndoor" },
1015     { SYM_PCHAR, S_vodoor, "S_vodoor" },
1016     { SYM_PCHAR, S_hodoor, "S_hodoor" },
1017     { SYM_PCHAR, S_vcdoor, "S_vcdoor" },
1018     { SYM_PCHAR, S_hcdoor, "S_hcdoor" },
1019     { SYM_PCHAR, S_bars, "S_bars" },
1020     { SYM_PCHAR, S_tree, "S_tree" },
1021     { SYM_PCHAR, S_room, "S_room" },
1022     { SYM_PCHAR, S_darkroom, "S_darkroom" },
1023     { SYM_PCHAR, S_corr, "S_corr" },
1024     { SYM_PCHAR, S_litcorr, "S_litcorr" },
1025     { SYM_PCHAR, S_upstair, "S_upstair" },
1026     { SYM_PCHAR, S_dnstair, "S_dnstair" },
1027     { SYM_PCHAR, S_upladder, "S_upladder" },
1028     { SYM_PCHAR, S_dnladder, "S_dnladder" },
1029     { SYM_PCHAR, S_altar, "S_altar" },
1030     { SYM_PCHAR, S_grave, "S_grave" },
1031     { SYM_PCHAR, S_throne, "S_throne" },
1032     { SYM_PCHAR, S_sink, "S_sink" },
1033     { SYM_PCHAR, S_fountain, "S_fountain" },
1034     { SYM_PCHAR, S_pool, "S_pool" },
1035     { SYM_PCHAR, S_ice, "S_ice" },
1036     { SYM_PCHAR, S_lava, "S_lava" },
1037     { SYM_PCHAR, S_vodbridge, "S_vodbridge" },
1038     { SYM_PCHAR, S_hodbridge, "S_hodbridge" },
1039     { SYM_PCHAR, S_vcdbridge, "S_vcdbridge" },
1040     { SYM_PCHAR, S_hcdbridge, "S_hcdbridge" },
1041     { SYM_PCHAR, S_air, "S_air" },
1042     { SYM_PCHAR, S_cloud, "S_cloud" },
1043     { SYM_PCHAR, S_poisoncloud, "S_poisoncloud" },
1044     { SYM_PCHAR, S_water, "S_water" },
1045     { SYM_PCHAR, S_arrow_trap, "S_arrow_trap" },
1046     { SYM_PCHAR, S_dart_trap, "S_dart_trap" },
1047     { SYM_PCHAR, S_falling_rock_trap, "S_falling_rock_trap" },
1048     { SYM_PCHAR, S_squeaky_board, "S_squeaky_board" },
1049     { SYM_PCHAR, S_bear_trap, "S_bear_trap" },
1050     { SYM_PCHAR, S_land_mine, "S_land_mine" },
1051     { SYM_PCHAR, S_rolling_boulder_trap, "S_rolling_boulder_trap" },
1052     { SYM_PCHAR, S_sleeping_gas_trap, "S_sleeping_gas_trap" },
1053     { SYM_PCHAR, S_rust_trap, "S_rust_trap" },
1054     { SYM_PCHAR, S_fire_trap, "S_fire_trap" },
1055     { SYM_PCHAR, S_pit, "S_pit" },
1056     { SYM_PCHAR, S_spiked_pit, "S_spiked_pit" },
1057     { SYM_PCHAR, S_hole, "S_hole" },
1058     { SYM_PCHAR, S_trap_door, "S_trap_door" },
1059     { SYM_PCHAR, S_teleportation_trap, "S_teleportation_trap" },
1060     { SYM_PCHAR, S_level_teleporter, "S_level_teleporter" },
1061     { SYM_PCHAR, S_magic_portal, "S_magic_portal" },
1062     { SYM_PCHAR, S_web, "S_web" },
1063     { SYM_PCHAR, S_statue_trap, "S_statue_trap" },
1064     { SYM_PCHAR, S_magic_trap, "S_magic_trap" },
1065     { SYM_PCHAR, S_anti_magic_trap, "S_anti_magic_trap" },
1066     { SYM_PCHAR, S_polymorph_trap, "S_polymorph_trap" },
1067     { SYM_PCHAR, S_vibrating_square, "S_vibrating_square" },
1068     { SYM_PCHAR, S_vbeam, "S_vbeam" },
1069     { SYM_PCHAR, S_hbeam, "S_hbeam" },
1070     { SYM_PCHAR, S_lslant, "S_lslant" },
1071     { SYM_PCHAR, S_rslant, "S_rslant" },
1072     { SYM_PCHAR, S_digbeam, "S_digbeam" },
1073     { SYM_PCHAR, S_flashbeam, "S_flashbeam" },
1074     { SYM_PCHAR, S_boomleft, "S_boomleft" },
1075     { SYM_PCHAR, S_boomright, "S_boomright" },
1076     { SYM_PCHAR, S_goodpos, "S_goodpos" },
1077     { SYM_PCHAR, S_ss1, "S_ss1" },
1078     { SYM_PCHAR, S_ss2, "S_ss2" },
1079     { SYM_PCHAR, S_ss3, "S_ss3" },
1080     { SYM_PCHAR, S_ss4, "S_ss4" },
1081     { SYM_PCHAR, S_sw_tl, "S_sw_tl" },
1082     { SYM_PCHAR, S_sw_tc, "S_sw_tc" },
1083     { SYM_PCHAR, S_sw_tr, "S_sw_tr" },
1084     { SYM_PCHAR, S_sw_ml, "S_sw_ml" },
1085     { SYM_PCHAR, S_sw_mr, "S_sw_mr" },
1086     { SYM_PCHAR, S_sw_bl, "S_sw_bl" },
1087     { SYM_PCHAR, S_sw_bc, "S_sw_bc" },
1088     { SYM_PCHAR, S_sw_br, "S_sw_br" },
1089     { SYM_PCHAR, S_explode1, "S_explode1" },
1090     { SYM_PCHAR, S_explode2, "S_explode2" },
1091     { SYM_PCHAR, S_explode3, "S_explode3" },
1092     { SYM_PCHAR, S_explode4, "S_explode4" },
1093     { SYM_PCHAR, S_explode5, "S_explode5" },
1094     { SYM_PCHAR, S_explode6, "S_explode6" },
1095     { SYM_PCHAR, S_explode7, "S_explode7" },
1096     { SYM_PCHAR, S_explode8, "S_explode8" },
1097     { SYM_PCHAR, S_explode9, "S_explode9" },
1098     { SYM_OC, ILLOBJ_CLASS + SYM_OFF_O, "S_strange_obj" },
1099     { SYM_OC, WEAPON_CLASS + SYM_OFF_O, "S_weapon" },
1100     { SYM_OC, ARMOR_CLASS + SYM_OFF_O, "S_armor" },
1101     { SYM_OC, ARMOR_CLASS + SYM_OFF_O, "S_armour" },
1102     { SYM_OC, RING_CLASS + SYM_OFF_O, "S_ring" },
1103     { SYM_OC, AMULET_CLASS + SYM_OFF_O, "S_amulet" },
1104     { SYM_OC, TOOL_CLASS + SYM_OFF_O, "S_tool" },
1105     { SYM_OC, FOOD_CLASS + SYM_OFF_O, "S_food" },
1106     { SYM_OC, POTION_CLASS + SYM_OFF_O, "S_potion" },
1107     { SYM_OC, SCROLL_CLASS + SYM_OFF_O, "S_scroll" },
1108     { SYM_OC, SPBOOK_CLASS + SYM_OFF_O, "S_book" },
1109     { SYM_OC, WAND_CLASS + SYM_OFF_O, "S_wand" },
1110     { SYM_OC, COIN_CLASS + SYM_OFF_O, "S_coin" },
1111     { SYM_OC, GEM_CLASS + SYM_OFF_O, "S_gem" },
1112     { SYM_OC, ROCK_CLASS + SYM_OFF_O, "S_rock" },
1113     { SYM_OC, BALL_CLASS + SYM_OFF_O, "S_ball" },
1114     { SYM_OC, CHAIN_CLASS + SYM_OFF_O, "S_chain" },
1115     { SYM_OC, VENOM_CLASS + SYM_OFF_O, "S_venom" },
1116     { SYM_MON, S_ANT + SYM_OFF_M, "S_ant" },
1117     { SYM_MON, S_BLOB + SYM_OFF_M, "S_blob" },
1118     { SYM_MON, S_COCKATRICE + SYM_OFF_M, "S_cockatrice" },
1119     { SYM_MON, S_DOG + SYM_OFF_M, "S_dog" },
1120     { SYM_MON, S_EYE + SYM_OFF_M, "S_eye" },
1121     { SYM_MON, S_FELINE + SYM_OFF_M, "S_feline" },
1122     { SYM_MON, S_GREMLIN + SYM_OFF_M, "S_gremlin" },
1123     { SYM_MON, S_HUMANOID + SYM_OFF_M, "S_humanoid" },
1124     { SYM_MON, S_IMP + SYM_OFF_M, "S_imp" },
1125     { SYM_MON, S_JELLY + SYM_OFF_M, "S_jelly" },
1126     { SYM_MON, S_KOBOLD + SYM_OFF_M, "S_kobold" },
1127     { SYM_MON, S_LEPRECHAUN + SYM_OFF_M, "S_leprechaun" },
1128     { SYM_MON, S_MIMIC + SYM_OFF_M, "S_mimic" },
1129     { SYM_MON, S_NYMPH + SYM_OFF_M, "S_nymph" },
1130     { SYM_MON, S_ORC + SYM_OFF_M, "S_orc" },
1131     { SYM_MON, S_PIERCER + SYM_OFF_M, "S_piercer" },
1132     { SYM_MON, S_QUADRUPED + SYM_OFF_M, "S_quadruped" },
1133     { SYM_MON, S_RODENT + SYM_OFF_M, "S_rodent" },
1134     { SYM_MON, S_SPIDER + SYM_OFF_M, "S_spider" },
1135     { SYM_MON, S_TRAPPER + SYM_OFF_M, "S_trapper" },
1136     { SYM_MON, S_UNICORN + SYM_OFF_M, "S_unicorn" },
1137     { SYM_MON, S_VORTEX + SYM_OFF_M, "S_vortex" },
1138     { SYM_MON, S_WORM + SYM_OFF_M, "S_worm" },
1139     { SYM_MON, S_XAN + SYM_OFF_M, "S_xan" },
1140     { SYM_MON, S_LIGHT + SYM_OFF_M, "S_light" },
1141     { SYM_MON, S_ZRUTY + SYM_OFF_M, "S_zruty" },
1142     { SYM_MON, S_ANGEL + SYM_OFF_M, "S_angel" },
1143     { SYM_MON, S_BAT + SYM_OFF_M, "S_bat" },
1144     { SYM_MON, S_CENTAUR + SYM_OFF_M, "S_centaur" },
1145     { SYM_MON, S_DRAGON + SYM_OFF_M, "S_dragon" },
1146     { SYM_MON, S_ELEMENTAL + SYM_OFF_M, "S_elemental" },
1147     { SYM_MON, S_FUNGUS + SYM_OFF_M, "S_fungus" },
1148     { SYM_MON, S_GNOME + SYM_OFF_M, "S_gnome" },
1149     { SYM_MON, S_GIANT + SYM_OFF_M, "S_giant" },
1150     { SYM_MON, S_JABBERWOCK + SYM_OFF_M, "S_jabberwock" },
1151     { SYM_MON, S_KOP + SYM_OFF_M, "S_kop" },
1152     { SYM_MON, S_LICH + SYM_OFF_M, "S_lich" },
1153     { SYM_MON, S_MUMMY + SYM_OFF_M, "S_mummy" },
1154     { SYM_MON, S_NAGA + SYM_OFF_M, "S_naga" },
1155     { SYM_MON, S_OGRE + SYM_OFF_M, "S_ogre" },
1156     { SYM_MON, S_PUDDING + SYM_OFF_M, "S_pudding" },
1157     { SYM_MON, S_QUANTMECH + SYM_OFF_M, "S_quantmech" },
1158     { SYM_MON, S_RUSTMONST + SYM_OFF_M, "S_rustmonst" },
1159     { SYM_MON, S_SNAKE + SYM_OFF_M, "S_snake" },
1160     { SYM_MON, S_TROLL + SYM_OFF_M, "S_troll" },
1161     { SYM_MON, S_UMBER + SYM_OFF_M, "S_umber" },
1162     { SYM_MON, S_VAMPIRE + SYM_OFF_M, "S_vampire" },
1163     { SYM_MON, S_WRAITH + SYM_OFF_M, "S_wraith" },
1164     { SYM_MON, S_XORN + SYM_OFF_M, "S_xorn" },
1165     { SYM_MON, S_YETI + SYM_OFF_M, "S_yeti" },
1166     { SYM_MON, S_ZOMBIE + SYM_OFF_M, "S_zombie" },
1167     { SYM_MON, S_HUMAN + SYM_OFF_M, "S_human" },
1168     { SYM_MON, S_GHOST + SYM_OFF_M, "S_ghost" },
1169     { SYM_MON, S_GOLEM + SYM_OFF_M, "S_golem" },
1170     { SYM_MON, S_DEMON + SYM_OFF_M, "S_demon" },
1171     { SYM_MON, S_EEL + SYM_OFF_M, "S_eel" },
1172     { SYM_MON, S_LIZARD + SYM_OFF_M, "S_lizard" },
1173     { SYM_MON, S_WORM_TAIL + SYM_OFF_M, "S_worm_tail" },
1174     { SYM_MON, S_MIMIC_DEF + SYM_OFF_M, "S_mimic_def" },
1175     { SYM_OTH, SYM_BOULDER + SYM_OFF_X, "S_boulder" },
1176     { SYM_OTH, SYM_INVISIBLE + SYM_OFF_X, "S_invisible" },
1177     { SYM_OTH, SYM_PET_OVERRIDE + SYM_OFF_X, "S_pet_override" },
1178     { SYM_OTH, SYM_HERO_OVERRIDE + SYM_OFF_X, "S_hero_override" },
1179     { 0, 0, (const char *) 0 } /* fence post */
1180 };
1181
1182 /*drawing.c*/