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. */
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. */
13 /* Relevant header information in rm.h, objclass.h, and monsym.h. */
25 struct symsetentry symset[NUM_GRAPHICS];
27 int currentgraphics = 0;
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 */
36 const char invisexplain[] = "remembered, unseen, creature",
37 altinvisexplain[] = "unseen creature"; /* for clairvoyance */
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 */
43 /* Default object class symbols. See objclass.h.
44 * {symbol, name, explain}
45 * name: used in object_detect().
46 * explain: used in do_look().
48 const struct class_sym def_oc_syms[MAXOCLASSES] = {
49 { '\0', "", "" }, /* placeholder for the "random class" */
51 { ILLOBJ_SYM, "illegal objects", "strange object" },
53 { ILLOBJ_SYM, "
\8aï
\96
\82È
\95¨
\91Ì", "
\8aï
\96
\82È
\95¨
\91Ì" },
55 { WEAPON_SYM, "weapons", "weapon" },
57 { WEAPON_SYM, "
\95\90\8aí", "
\95\90\8aí" },
59 { ARMOR_SYM, "armor", "suit or piece of armor" },
61 { ARMOR_SYM, "
\8aZ", "
\95\9e\82Ü
\82½
\82Í
\8aZ
\82Ì
\82½
\82®
\82¢" },
63 { RING_SYM, "rings", "ring" },
65 { RING_SYM, "
\8ew
\97Ö", "
\8ew
\97Ö" },
67 { AMULET_SYM, "amulets", "amulet" },
69 { AMULET_SYM, "
\96\82\8f\9c\82¯", "
\96\82\8f\9c\82¯" },
71 { TOOL_SYM, "tools", "useful item (pick-axe, key, lamp...)" },
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)" },
75 { FOOD_SYM, "food", "piece of food" },
77 { FOOD_SYM, "
\90H
\97¿", "
\90H
\97¿" },
79 { POTION_SYM, "potions", "potion" },
81 { POTION_SYM, "
\96ò", "
\96ò" },
83 { SCROLL_SYM, "scrolls", "scroll" },
85 { SCROLL_SYM, "
\8aª
\95¨", "
\8aª
\95¨" },
87 { SPBOOK_SYM, "spellbooks", "spellbook" },
89 { SPBOOK_SYM, "
\96\82\96@
\8f\91", "
\96\82\96@
\8f\91" },
91 { WAND_SYM, "wands", "wand" },
93 { WAND_SYM, "
\8fñ", "
\8fñ" },
95 { GOLD_SYM, "coins", "pile of coins" },
97 { GOLD_SYM, "
\8bà
\89Ý", "
\8bà
\89Ý
\82Ì
\8eR" },
99 { GEM_SYM, "rocks", "gem or rock" },
101 { GEM_SYM, "
\90Î", "
\95ó
\90Î
\82Ü
\82½
\82Í
\90Î" },
103 { ROCK_SYM, "large stones", "boulder or statue" },
105 { ROCK_SYM, "
\8b\90\90Î", "
\8aâ
\82Ü
\82½
\82Í
\91\9c" },
107 { BALL_SYM, "iron balls", "iron ball" },
109 { BALL_SYM, "
\93S
\8b\85", "
\93S
\8b\85" },
111 { CHAIN_SYM, "chains", "iron chain" },
113 { CHAIN_SYM, "
\8d½", "
\93S
\82Ì
\8d½" },
115 { VENOM_SYM, "venoms", "splash of venom" }
117 { VENOM_SYM, "
\93Å", "
\93Å
\89t" }
120 /* Default monster class symbols. See monsym.h. */
121 const struct class_sym def_monsyms[MAXMCLASSES] = {
124 { DEF_ANT, "", "ant or other insect" },
126 { DEF_ANT, "", "
\8ba
\82Ü
\82½
\82Í
\91¼
\82Ì
\8d©
\92\8e" },
128 { DEF_BLOB, "", "blob" },
130 { DEF_BLOB, "", "
\83u
\83\8d\83b
\83u" },
132 { DEF_COCKATRICE, "", "cockatrice" },
134 { DEF_COCKATRICE, "", "
\83R
\83J
\83g
\83\8a\83X" },
136 { DEF_DOG, "", "dog or other canine" },
138 { DEF_DOG, "", "
\8c¢
\82Ü
\82½
\82Í
\83C
\83k
\89È
\82Ì
\93®
\95¨" },
140 { DEF_EYE, "", "eye or sphere" },
142 { DEF_EYE, "", "
\96Ú
\82Ü
\82½
\82Í
\8b\85\91Ì" },
144 { DEF_FELINE, "", "cat or other feline" },
146 { DEF_FELINE, "", "
\94L
\82Ü
\82½
\82Í
\83l
\83R
\89È
\82Ì
\93®
\95¨" },
148 { DEF_GREMLIN, "", "gremlin" },
150 { DEF_GREMLIN, "", "
\83O
\83\8c\83\80\83\8a\83\93" },
152 { DEF_HUMANOID, "", "humanoid" },
154 { DEF_HUMANOID, "", "
\83q
\83\85\81[
\83}
\83m
\83C
\83h" },
156 { DEF_IMP, "", "imp or minor demon" },
158 { DEF_IMP, "", "
\83C
\83\93\83v
\82Ü
\82½
\82Í
\89º
\8b\89\88«
\96\82" },
160 { DEF_JELLY, "", "jelly" },
162 { DEF_JELLY, "", "
\83[
\83\8a\81[" },
164 { DEF_KOBOLD, "", "kobold" },
166 { DEF_KOBOLD, "", "
\83R
\83{
\83\8b\83g" },
168 { DEF_LEPRECHAUN, "", "leprechaun" },
170 { DEF_LEPRECHAUN, "", "
\83\8c\83v
\83\89\83R
\81[
\83\93" },
172 { DEF_MIMIC, "", "mimic" },
174 { DEF_MIMIC, "", "
\83~
\83~
\83b
\83N" },
176 { DEF_NYMPH, "", "nymph" },
178 { DEF_NYMPH, "", "
\83j
\83\93\83t" },
180 { DEF_ORC, "", "orc" },
182 { DEF_ORC, "", "
\83I
\81[
\83N" },
184 { DEF_PIERCER, "", "piercer" },
186 { DEF_PIERCER, "", "
\8c\8a\8bò
\82¢" },
188 { DEF_QUADRUPED, "", "quadruped" },
190 { DEF_QUADRUPED, "", "
\8el
\91«
\93®
\95¨" },
192 { DEF_RODENT, "", "rodent" },
194 { DEF_RODENT, "", "ê
\96\8e\95\93®
\95¨" },
196 { DEF_SPIDER, "", "arachnid or centipede" },
198 { DEF_SPIDER, "", "
\83N
\83\82\8c`
\97Þ
\93®
\95¨
\82Ü
\82½
\82Í
\83\80\83J
\83f" },
200 { DEF_TRAPPER, "", "trapper or lurker above" },
202 { DEF_TRAPPER, "", "
\83g
\83\89\83b
\83p
\81[
\82Ü
\82½
\82Í
\83\89\81[
\83J
\81[" },
204 { DEF_UNICORN, "", "unicorn or horse" },
206 { DEF_UNICORN, "", "
\83\86\83j
\83R
\81[
\83\93\82Ü
\82½
\82Í
\94n" },
208 { DEF_VORTEX, "", "vortex" },
210 { DEF_VORTEX, "", "
\89Q" },
212 { DEF_WORM, "", "worm" },
214 { DEF_WORM, "", "
\83\8f\81[
\83\80" },
216 { DEF_XAN, "", "xan or other mythical/fantastic insect" },
218 { DEF_XAN, "", "
\83U
\83\93\82Ü
\82½
\82Í
\90_
\98b
\82â
\83t
\83@
\83\93\83^
\83W
\81[
\82Ì
\8d©
\92\8e" },
220 { DEF_LIGHT, "", "light" },
222 { DEF_LIGHT, "", "
\8cõ" },
224 { DEF_ZRUTY, "", "zruty" },
226 { DEF_ZRUTY, "", "
\83Y
\83\8b\83e
\83B" },
228 { DEF_ANGEL, "", "angelic being" },
230 { DEF_ANGEL, "", "
\93V
\8eg" },
232 { DEF_BAT, "", "bat or bird" },
234 { DEF_BAT, "", "
\82±
\82¤
\82à
\82è
\82Ü
\82½
\82Í
\92¹" },
236 { DEF_CENTAUR, "", "centaur" },
238 { DEF_CENTAUR, "", "
\83P
\83\93\83^
\83E
\83\8d\83X" },
240 { DEF_DRAGON, "", "dragon" },
242 { DEF_DRAGON, "", "
\83h
\83\89\83S
\83\93" },
244 { DEF_ELEMENTAL, "", "elemental" },
246 { DEF_ELEMENTAL, "", "
\90¸
\97ì" },
248 { DEF_FUNGUS, "", "fungus or mold" },
250 { DEF_FUNGUS, "", "
\83L
\83m
\83R
\82Ü
\82½
\82Í
\83\82\81[
\83\8b\83h" },
252 { DEF_GNOME, "", "gnome" },
254 { DEF_GNOME, "", "
\83m
\81[
\83\80" },
256 { DEF_GIANT, "", "giant humanoid" },
258 { DEF_GIANT, "", "
\8b\90\90l" },
260 { '\0', "", "invisible monster" },
262 { '\0', "", "
\93§
\96¾
\82È
\89ö
\95¨" },
264 { DEF_JABBERWOCK, "", "jabberwock" },
266 { DEF_JABBERWOCK, "", "
\83W
\83\83\83o
\83E
\83H
\83b
\83N" },
268 { DEF_KOP, "", "Keystone Kop" },
270 { DEF_KOP, "", "
\8cx
\94õ
\88õ" },
272 { DEF_LICH, "", "lich" },
274 { DEF_LICH, "", "
\83\8a\83b
\83`" },
276 { DEF_MUMMY, "", "mummy" },
278 { DEF_MUMMY, "", "
\83~
\83C
\83\89" },
280 { DEF_NAGA, "", "naga" },
282 { DEF_NAGA, "", "
\83i
\81[
\83K" },
284 { DEF_OGRE, "", "ogre" },
286 { DEF_OGRE, "", "
\83I
\81[
\83K" },
288 { DEF_PUDDING, "", "pudding or ooze" },
290 { DEF_PUDDING, "", "
\83v
\83\8a\83\93\82Ü
\82½
\82Í
\83E
\81[
\83Y" },
292 { DEF_QUANTMECH, "", "quantum mechanic" },
294 { DEF_QUANTMECH, "", "
\97Ê
\8eq
\8fê" },
296 { DEF_RUSTMONST, "", "rust monster or disenchanter" },
298 { DEF_RUSTMONST, "", "
\8eK
\82Ì
\89ö
\95¨
\82Ü
\82½
\82Í
\8bz
\96\82\82Ì
\89ö
\95¨" },
300 { DEF_SNAKE, "", "snake" },
302 { DEF_SNAKE, "", "
\83w
\83r" },
304 { DEF_TROLL, "", "troll" },
306 { DEF_TROLL, "", "
\83g
\83\8d\83\8b" },
308 { DEF_UMBER, "", "umber hulk" },
310 { DEF_UMBER, "", "
\83A
\83\93\83o
\81[
\83n
\83\8b\83N" },
312 { DEF_VAMPIRE, "", "vampire" },
314 { DEF_VAMPIRE, "", "
\8bz
\8c\8c\8bS" },
316 { DEF_WRAITH, "", "wraith" },
318 { DEF_WRAITH, "", "
\83\8c\83C
\83X" },
320 { DEF_XORN, "", "xorn" },
322 { DEF_XORN, "", "
\83]
\81[
\83\93" },
324 { DEF_YETI, "", "apelike creature" },
326 { DEF_YETI, "", "
\89\8e\82Ì
\82æ
\82¤
\82È
\90¶
\95¨" },
328 { DEF_ZOMBIE, "", "zombie" },
330 { DEF_ZOMBIE, "", "
\83]
\83\93\83r" },
332 { DEF_HUMAN, "", "human or elf" },
334 { DEF_HUMAN, "", "
\90l
\8aÔ
\82Ü
\82½
\82Í
\83G
\83\8b\83t" },
336 { DEF_GHOST, "", "ghost" },
338 { DEF_GHOST, "", "
\88«
\96\82" },
340 { DEF_GOLEM, "", "golem" },
342 { DEF_GOLEM, "", "
\83S
\81[
\83\8c\83\80" },
344 { DEF_DEMON, "", "major demon" },
346 { DEF_DEMON, "", "
\88«
\96\82" },
348 { DEF_EEL, "", "sea monster" },
350 { DEF_EEL, "", "
\8aC
\82Ì
\89ö
\95¨" },
352 { DEF_LIZARD, "", "lizard" },
354 { DEF_LIZARD, "", "
\83g
\83J
\83Q" },
356 { DEF_WORM_TAIL, "", "long worm tail" },
358 { DEF_WORM_TAIL, "", "
\83\8d\83\93\83O
\83\8f\81[
\83\80\82Ì
\90K
\94ö" },
360 { DEF_MIMIC_DEF, "", "mimic" },
362 { DEF_MIMIC_DEF, "", "
\83~
\83~
\83b
\83N" },
365 const struct symdef def_warnsyms[WARNCOUNT] = {
368 { '0', "unknown creature causing you worry", C(CLR_WHITE) },
370 { '0', "
\82 \82È
\82½
\82ª
\8bC
\82É
\82µ
\82Ä
\82¢
\82é
\93ä
\82Ì
\89ö
\95¨", C(CLR_WHITE)},
373 { '1', "unknown creature causing you concern", C(CLR_RED) },
375 { '1', "
\82 \82È
\82½
\82ª
\90S
\94z
\82µ
\82Ä
\82¢
\82é
\93ä
\82Ì
\89ö
\95¨", C(CLR_RED)},
378 { '2', "unknown creature causing you anxiety", C(CLR_RED) },
380 { '2', "
\82 \82È
\82½
\82ª
\8c\9c\94O
\82µ
\82Ä
\82¢
\82é
\93ä
\82Ì
\89ö
\95¨", C(CLR_RED)},
383 { '3', "unknown creature causing you disquiet", C(CLR_RED) },
385 { '3', "
\82 \82È
\82½
\82ª
\8bC
\82ð
\82à
\82ñ
\82Å
\82¢
\82é
\93ä
\82Ì
\89ö
\95¨", C(CLR_RED)},
388 { '4', "unknown creature causing you alarm", C(CLR_MAGENTA) },
390 { '4', "
\82 \82È
\82½
\82ª
\8b°
\82ê
\82Ä
\82¢
\82é
\93ä
\82Ì
\89ö
\95¨", C(CLR_MAGENTA)},
393 { '5', "unknown creature causing you dread", C(CLR_BRIGHT_MAGENTA) },
395 { '5', "
\82 \82È
\82½
\82ª
\94ñ
\8fí
\82É
\8b°
\82ê
\82Ä
\82¢
\82é
\93ä
\82Ì
\89ö
\95¨", C(CLR_BRIGHT_MAGENTA)},
399 * Default screen symbols with explanations and colors.
401 const struct symdef defsyms[MAXPCHARS] = {
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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) },
575 { '#', "poison cloud", C(CLR_BRIGHT_GREEN) }, /* part of a cloud */
576 { '?', "valid position", C(CLR_BRIGHT_GREEN) }, /* target position */
578 { '#', "
\93Å
\89_", C(CLR_BRIGHT_GREEN) }, /* part of a cloud */
579 { '?', "
\97L
\8cø
\82È
\88Ê
\92u", C(CLR_BRIGHT_GREEN) }, /* target position */
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 */
602 /* default rogue level symbols */
603 static const uchar def_r_oc_syms[MAXOCLASSES] = {
604 /* 0*/ '\0', ILLOBJ_SYM, WEAPON_SYM, ']', /* armor */
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 */
612 /*15*/ BALL_SYM, CHAIN_SYM, VENOM_SYM
617 #if defined(TERMLIB) || defined(CURSES_GRAPHICS)
618 void NDECL((*decgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
619 #endif /* TERMLIB || CURSES */
622 void NDECL((*ibmgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
623 void NDECL((*ascgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
626 #ifdef CURSES_GRAPHICS
627 void NDECL((*cursesgraphics_mode_callback)) = 0;
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.
636 def_char_to_objclass(ch)
640 for (i = 1; i < MAXOCLASSES; i++)
641 if (ch == def_oc_syms[i].sym)
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
652 def_char_to_monclass(ch)
656 for (i = 1; i < MAXMCLASSES; i++)
657 if (ch == def_monsyms[i].sym)
663 * Explanations of the functions found below:
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
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.
679 * If (arg == 0) then showsyms are taken from
680 * defsyms, def_oc_syms, and def_monsyms.
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.
689 * assign_graphics(arg)
691 * This is used in the game core to toggle in and
692 * out of other {rogue} level display modes.
694 * If arg is ROGUESET, this places the rogue level
695 * symbols from rogue_syms into showsyms.
697 * If arg is PRIMARY, this places the symbols
698 * from l_monsyms into showsyms.
700 * update_primary_symset()
701 * Update a member of the primary(primary_*) symbol set.
703 * update_rogue_symset()
704 * Update a member of the rogue (rogue_*) symbol set.
706 * update_ov_primary_symset()
707 * Update a member of the overrides for primary symbol set.
709 * update_ov_rogue_symset()
710 * Update a member of the overrides for rogue symbol set.
717 init_ov_primary_symbols();
718 init_ov_rogue_symbols();
719 init_primary_symbols();
721 init_rogue_symbols();
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);
741 /* initialize defaults for the overrides to the rogue symset */
743 init_ov_rogue_symbols()
747 for (i = 0; i < SYM_MAX; i++)
748 ov_rogue_syms[i] = (nhsym) 0;
750 /* initialize defaults for the overrides to the primary symset */
752 init_ov_primary_symbols()
756 for (i = 0; i < SYM_MAX; i++)
757 ov_primary_syms[i] = (nhsym) 0;
761 get_othersym(idx, which_set)
764 nhsym sym = (nhsym) 0;
765 int oidx = idx + SYM_OFF_X;
767 if (which_set == ROGUESET)
768 sym = ov_rogue_syms[oidx] ? ov_rogue_syms[oidx]
771 sym = ov_primary_syms[oidx] ? ov_primary_syms[oidx]
772 : primary_syms[oidx];
776 sym = def_oc_syms[ROCK_CLASS].sym;
786 /* initialize defaults for the primary symset */
788 init_primary_symbols()
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);
803 clear_symsetentry(PRIMARY, FALSE);
806 /* initialize defaults for the rogue symset */
812 /* These are defaults that can get overwritten
813 later by the roguesymbols option */
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] = '%';
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);
829 clear_symsetentry(ROGUESET, FALSE);
830 /* default on Rogue level is no color
831 * but some symbol sets can override that
833 symset[ROGUESET].nocolor = 1;
837 assign_graphics(whichset)
844 /* Adjust graphics display characters on Rogue levels */
846 for (i = 0; i < SYM_MAX; i++)
847 showsyms[i] = ov_rogue_syms[i] ? ov_rogue_syms[i]
850 #if defined(MSDOS) && defined(USE_TILES)
854 currentgraphics = ROGUESET;
859 for (i = 0; i < SYM_MAX; i++)
860 showsyms[i] = ov_primary_syms[i] ? ov_primary_syms[i]
863 #if defined(MSDOS) && defined(USE_TILES)
867 currentgraphics = PRIMARY;
873 switch_symbols(nondefault)
879 for (i = 0; i < SYM_MAX; i++)
880 showsyms[i] = ov_primary_syms[i] ? ov_primary_syms[i]
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)();
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)();
902 init_primary_symbols();
908 update_ov_primary_symset(symp, val)
909 struct symparse *symp;
912 ov_primary_syms[symp->idx] = val;
916 update_ov_rogue_symset(symp, val)
917 struct symparse *symp;
920 ov_rogue_syms[symp->idx] = val;
924 update_primary_symset(symp, val)
925 struct symparse *symp;
928 primary_syms[symp->idx] = val;
932 update_rogue_symset(symp, val)
933 struct symparse *symp;
936 rogue_syms[symp->idx] = val;
940 clear_symsetentry(which_set, name_too)
944 if (symset[which_set].desc)
945 free((genericptr_t) symset[which_set].desc);
946 symset[which_set].desc = (char *) 0;
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;
955 if (symset[which_set].name)
956 free((genericptr_t) symset[which_set].name);
957 symset[which_set].name = (char *) 0;
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.
967 const char *known_handling[] = {
968 "UNKNOWN", /* H_UNK */
972 "MAC", /* H_MAC -- pre-OSX MACgraphics */
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.
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()
989 const char *known_restrictions[] = {
990 "primary", "rogue", (const char *) 0,
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 */