1 /* NetHack 3.6 drawing.c $NHDT-Date: 1463706747 2016/05/20 01:12:27 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.51 $ */
2 /* Copyright (c) NetHack Development Team 1992. */
3 /* NetHack may be freely redistributed. See license for details. */
8 /* Relevant header information in rm.h, objclass.h, and monsym.h. */
20 struct symsetentry symset
[NUM_GRAPHICS
];
22 int currentgraphics
= 0;
24 nhsym showsyms
[SYM_MAX
] = DUMMY
; /* symbols to be displayed */
25 nhsym l_syms
[SYM_MAX
] = DUMMY
; /* loaded symbols */
26 nhsym r_syms
[SYM_MAX
] = DUMMY
; /* rogue symbols */
28 nhsym warnsyms
[WARNCOUNT
] = DUMMY
; /* the current warning display symbols */
29 const char invisexplain
[] = "remembered, unseen, creature";
31 /* Default object class symbols. See objclass.h.
32 * {symbol, name, explain}
33 * name: used in object_detect().
34 * explain: used in do_look().
36 const struct class_sym def_oc_syms
[MAXOCLASSES
] = {
37 { '\0', "", "" }, /* placeholder for the "random class" */
38 { ILLOBJ_SYM
, "illegal objects", "strange object" },
39 { WEAPON_SYM
, "weapons", "weapon" },
40 { ARMOR_SYM
, "armor", "suit or piece of armor" },
41 { RING_SYM
, "rings", "ring" },
42 { AMULET_SYM
, "amulets", "amulet" },
43 { TOOL_SYM
, "tools", "useful item (pick-axe, key, lamp...)" },
44 { FOOD_SYM
, "food", "piece of food" },
45 { POTION_SYM
, "potions", "potion" },
46 { SCROLL_SYM
, "scrolls", "scroll" },
47 { SPBOOK_SYM
, "spellbooks", "spellbook" },
48 { WAND_SYM
, "wands", "wand" },
49 { GOLD_SYM
, "coins", "pile of coins" },
50 { GEM_SYM
, "rocks", "gem or rock" },
51 { ROCK_SYM
, "large stones", "boulder or statue" },
52 { BALL_SYM
, "iron balls", "iron ball" },
53 { CHAIN_SYM
, "chains", "iron chain" },
54 { VENOM_SYM
, "venoms", "splash of venom" }
57 /* Default monster class symbols. See monsym.h. */
58 const struct class_sym def_monsyms
[MAXMCLASSES
] = {
60 { DEF_ANT
, "", "ant or other insect" },
61 { DEF_BLOB
, "", "blob" },
62 { DEF_COCKATRICE
, "", "cockatrice" },
63 { DEF_DOG
, "", "dog or other canine" },
64 { DEF_EYE
, "", "eye or sphere" },
65 { DEF_FELINE
, "", "cat or other feline" },
66 { DEF_GREMLIN
, "", "gremlin" },
67 { DEF_HUMANOID
, "", "humanoid" },
68 { DEF_IMP
, "", "imp or minor demon" },
69 { DEF_JELLY
, "", "jelly" },
70 { DEF_KOBOLD
, "", "kobold" },
71 { DEF_LEPRECHAUN
, "", "leprechaun" },
72 { DEF_MIMIC
, "", "mimic" },
73 { DEF_NYMPH
, "", "nymph" },
74 { DEF_ORC
, "", "orc" },
75 { DEF_PIERCER
, "", "piercer" },
76 { DEF_QUADRUPED
, "", "quadruped" },
77 { DEF_RODENT
, "", "rodent" },
78 { DEF_SPIDER
, "", "arachnid or centipede" },
79 { DEF_TRAPPER
, "", "trapper or lurker above" },
80 { DEF_UNICORN
, "", "unicorn or horse" },
81 { DEF_VORTEX
, "", "vortex" },
82 { DEF_WORM
, "", "worm" },
83 { DEF_XAN
, "", "xan or other mythical/fantastic insect" },
84 { DEF_LIGHT
, "", "light" },
85 { DEF_ZRUTY
, "", "zruty" },
86 { DEF_ANGEL
, "", "angelic being" },
87 { DEF_BAT
, "", "bat or bird" },
88 { DEF_CENTAUR
, "", "centaur" },
89 { DEF_DRAGON
, "", "dragon" },
90 { DEF_ELEMENTAL
, "", "elemental" },
91 { DEF_FUNGUS
, "", "fungus or mold" },
92 { DEF_GNOME
, "", "gnome" },
93 { DEF_GIANT
, "", "giant humanoid" },
94 { '\0', "", "invisible monster" },
95 { DEF_JABBERWOCK
, "", "jabberwock" },
96 { DEF_KOP
, "", "Keystone Kop" },
97 { DEF_LICH
, "", "lich" },
98 { DEF_MUMMY
, "", "mummy" },
99 { DEF_NAGA
, "", "naga" },
100 { DEF_OGRE
, "", "ogre" },
101 { DEF_PUDDING
, "", "pudding or ooze" },
102 { DEF_QUANTMECH
, "", "quantum mechanic" },
103 { DEF_RUSTMONST
, "", "rust monster or disenchanter" },
104 { DEF_SNAKE
, "", "snake" },
105 { DEF_TROLL
, "", "troll" },
106 { DEF_UMBER
, "", "umber hulk" },
107 { DEF_VAMPIRE
, "", "vampire" },
108 { DEF_WRAITH
, "", "wraith" },
109 { DEF_XORN
, "", "xorn" },
110 { DEF_YETI
, "", "apelike creature" },
111 { DEF_ZOMBIE
, "", "zombie" },
112 { DEF_HUMAN
, "", "human or elf" },
113 { DEF_GHOST
, "", "ghost" },
114 { DEF_GOLEM
, "", "golem" },
115 { DEF_DEMON
, "", "major demon" },
116 { DEF_EEL
, "", "sea monster" },
117 { DEF_LIZARD
, "", "lizard" },
118 { DEF_WORM_TAIL
, "", "long worm tail" },
119 { DEF_MIMIC_DEF
, "", "mimic" },
122 const struct symdef def_warnsyms
[WARNCOUNT
] = {
124 { '0', "unknown creature causing you worry", C(CLR_WHITE
) },
126 { '1', "unknown creature causing you concern", C(CLR_RED
) },
128 { '2', "unknown creature causing you anxiety", C(CLR_RED
) },
130 { '3', "unknown creature causing you disquiet", C(CLR_RED
) },
132 { '4', "unknown creature causing you alarm", C(CLR_MAGENTA
) },
134 { '5', "unknown creature causing you dread", C(CLR_BRIGHT_MAGENTA
) },
138 * Default screen symbols with explanations and colors.
140 const struct symdef defsyms
[MAXPCHARS
] = {
141 /* 0*/ { ' ', "dark part of a room", C(NO_COLOR
) }, /* stone */
142 { '|', "wall", C(CLR_GRAY
) }, /* vwall */
143 { '-', "wall", C(CLR_GRAY
) }, /* hwall */
144 { '-', "wall", C(CLR_GRAY
) }, /* tlcorn */
145 { '-', "wall", C(CLR_GRAY
) }, /* trcorn */
146 { '-', "wall", C(CLR_GRAY
) }, /* blcorn */
147 { '-', "wall", C(CLR_GRAY
) }, /* brcorn */
148 { '-', "wall", C(CLR_GRAY
) }, /* crwall */
149 { '-', "wall", C(CLR_GRAY
) }, /* tuwall */
150 { '-', "wall", C(CLR_GRAY
) }, /* tdwall */
151 /*10*/ { '|', "wall", C(CLR_GRAY
) }, /* tlwall */
152 { '|', "wall", C(CLR_GRAY
) }, /* trwall */
153 { '.', "doorway", C(CLR_GRAY
) }, /* ndoor */
154 { '-', "open door", C(CLR_BROWN
) }, /* vodoor */
155 { '|', "open door", C(CLR_BROWN
) }, /* hodoor */
156 { '+', "closed door", C(CLR_BROWN
) }, /* vcdoor */
157 { '+', "closed door", C(CLR_BROWN
) }, /* hcdoor */
158 { '#', "iron bars", C(HI_METAL
) }, /* bars */
159 { '#', "tree", C(CLR_GREEN
) }, /* tree */
160 { '.', "floor of a room", C(CLR_GRAY
) }, /* room */
161 /*20*/ { '.', "dark part of a room", C(CLR_BLACK
) }, /* dark room */
162 { '#', "corridor", C(CLR_GRAY
) }, /* dark corr */
163 { '#', "lit corridor", C(CLR_GRAY
) }, /* lit corr (see mapglyph.c) */
164 { '<', "staircase up", C(CLR_GRAY
) }, /* upstair */
165 { '>', "staircase down", C(CLR_GRAY
) }, /* dnstair */
166 { '<', "ladder up", C(CLR_BROWN
) }, /* upladder */
167 { '>', "ladder down", C(CLR_BROWN
) }, /* dnladder */
168 { '_', "altar", C(CLR_GRAY
) }, /* altar */
169 { '|', "grave", C(CLR_GRAY
) }, /* grave */
170 { '\\', "opulent throne", C(HI_GOLD
) }, /* throne */
171 /*30*/ { '#', "sink", C(CLR_GRAY
) }, /* sink */
172 { '{', "fountain", C(CLR_BRIGHT_BLUE
) }, /* fountain */
173 { '}', "water", C(CLR_BLUE
) }, /* pool */
174 { '.', "ice", C(CLR_CYAN
) }, /* ice */
175 { '}', "molten lava", C(CLR_RED
) }, /* lava */
176 { '.', "lowered drawbridge", C(CLR_BROWN
) }, /* vodbridge */
177 { '.', "lowered drawbridge", C(CLR_BROWN
) }, /* hodbridge */
178 { '#', "raised drawbridge", C(CLR_BROWN
) }, /* vcdbridge */
179 { '#', "raised drawbridge", C(CLR_BROWN
) }, /* hcdbridge */
180 { ' ', "air", C(CLR_CYAN
) }, /* open air */
181 /*40*/ { '#', "cloud", C(CLR_GRAY
) }, /* [part of] a cloud */
182 { '}', "water", C(CLR_BLUE
) }, /* under water */
183 { '^', "arrow trap", C(HI_METAL
) }, /* trap */
184 { '^', "dart trap", C(HI_METAL
) }, /* trap */
185 { '^', "falling rock trap", C(CLR_GRAY
) }, /* trap */
186 { '^', "squeaky board", C(CLR_BROWN
) }, /* trap */
187 { '^', "bear trap", C(HI_METAL
) }, /* trap */
188 { '^', "land mine", C(CLR_RED
) }, /* trap */
189 { '^', "rolling boulder trap", C(CLR_GRAY
) }, /* trap */
190 { '^', "sleeping gas trap", C(HI_ZAP
) }, /* trap */
191 /*50*/ { '^', "rust trap", C(CLR_BLUE
) }, /* trap */
192 { '^', "fire trap", C(CLR_ORANGE
) }, /* trap */
193 { '^', "pit", C(CLR_BLACK
) }, /* trap */
194 { '^', "spiked pit", C(CLR_BLACK
) }, /* trap */
195 { '^', "hole", C(CLR_BROWN
) }, /* trap */
196 { '^', "trap door", C(CLR_BROWN
) }, /* trap */
197 { '^', "teleportation trap", C(CLR_MAGENTA
) }, /* trap */
198 { '^', "level teleporter", C(CLR_MAGENTA
) }, /* trap */
199 { '^', "magic portal", C(CLR_BRIGHT_MAGENTA
) }, /* trap */
200 { '"', "web", C(CLR_GRAY
) }, /* web */
201 /*60*/ { '^', "statue trap", C(CLR_GRAY
) }, /* trap */
202 { '^', "magic trap", C(HI_ZAP
) }, /* trap */
203 { '^', "anti-magic field", C(HI_ZAP
) }, /* trap */
204 { '^', "polymorph trap", C(CLR_BRIGHT_GREEN
) }, /* trap */
205 { '~', "vibrating square", C(CLR_MAGENTA
) }, /* "trap" */
206 /* zap colors are changed by mapglyph() to match type of beam */
207 { '|', "", C(CLR_GRAY
) }, /* vbeam */
208 { '-', "", C(CLR_GRAY
) }, /* hbeam */
209 { '\\', "", C(CLR_GRAY
) }, /* lslant */
210 { '/', "", C(CLR_GRAY
) }, /* rslant */
211 { '*', "", C(CLR_WHITE
) }, /* dig beam */
212 { '!', "", C(CLR_WHITE
) }, /* camera flash beam */
213 { ')', "", C(HI_WOOD
) }, /* boomerang open left */
214 /*70*/ { '(', "", C(HI_WOOD
) }, /* boomerang open right */
215 { '0', "", C(HI_ZAP
) }, /* 4 magic shield symbols */
216 { '#', "", C(HI_ZAP
) },
217 { '@', "", C(HI_ZAP
) },
218 { '*', "", C(HI_ZAP
) },
219 { '#', "poison cloud", C(CLR_BRIGHT_GREEN
) }, /* part of a cloud */
220 { '?', "valid position", C(CLR_BRIGHT_GREEN
) }, /* target position */
221 /* swallow colors are changed by mapglyph() to match engulfing monst */
222 { '/', "", C(CLR_GREEN
) }, /* swallow top left */
223 { '-', "", C(CLR_GREEN
) }, /* swallow top center */
224 { '\\', "", C(CLR_GREEN
) }, /* swallow top right */
225 /*80*/ { '|', "", C(CLR_GREEN
) }, /* swallow middle left */
226 { '|', "", C(CLR_GREEN
) }, /* swallow middle right */
227 { '\\', "", C(CLR_GREEN
) }, /* swallow bottom left */
228 { '-', "", C(CLR_GREEN
) }, /* swallow bottom center */
229 { '/', "", C(CLR_GREEN
) }, /* swallow bottom right */
230 /* explosion colors are changed by mapglyph() to match type of expl. */
231 { '/', "", C(CLR_ORANGE
) }, /* explosion top left */
232 { '-', "", C(CLR_ORANGE
) }, /* explosion top center */
233 { '\\', "", C(CLR_ORANGE
) }, /* explosion top right */
234 { '|', "", C(CLR_ORANGE
) }, /* explosion middle left */
235 { ' ', "", C(CLR_ORANGE
) }, /* explosion middle center*/
236 /*90*/ { '|', "", C(CLR_ORANGE
) }, /* explosion middle right */
237 { '\\', "", C(CLR_ORANGE
) }, /* explosion bottom left */
238 { '-', "", C(CLR_ORANGE
) }, /* explosion bottom center*/
239 { '/', "", C(CLR_ORANGE
) }, /* explosion bottom right */
242 /* default rogue level symbols */
243 static const uchar def_r_oc_syms
[MAXOCLASSES
] = {
244 /* 0*/ '\0', ILLOBJ_SYM
, WEAPON_SYM
, ']', /* armor */
246 /* 5*/ ',', /* amulet */
247 TOOL_SYM
, ':', /* food */
248 POTION_SYM
, SCROLL_SYM
,
249 /*10*/ SPBOOK_SYM
, WAND_SYM
,
250 GEM_SYM
, /* gold -- yes it's the same as gems */
252 /*15*/ BALL_SYM
, CHAIN_SYM
, VENOM_SYM
258 void NDECL((*decgraphics_mode_callback
)) = 0; /* set in tty_start_screen() */
262 void NDECL((*ibmgraphics_mode_callback
)) = 0; /* set in tty_start_screen() */
263 void NDECL((*ascgraphics_mode_callback
)) = 0; /* set in tty_start_screen() */
267 * Convert the given character to an object class. If the character is not
268 * recognized, then MAXOCLASSES is returned. Used in detect.c, invent.c,
269 * objnam.c, options.c, pickup.c, sp_lev.c, lev_main.c, and tilemap.c.
272 def_char_to_objclass(ch
)
276 for (i
= 1; i
< MAXOCLASSES
; i
++)
277 if (ch
== def_oc_syms
[i
].sym
)
283 * Convert a character into a monster class. This returns the _first_
284 * match made. If there are are no matches, return MAXMCLASSES.
285 * Used in detect.c, options.c, read.c, sp_lev.c, and lev_main.c
288 def_char_to_monclass(ch
)
292 for (i
= 1; i
< MAXMCLASSES
; i
++)
293 if (ch
== def_monsyms
[i
].sym
)
299 * Explanations of the functions found below:
302 * Sets the current display symbols, the
303 * loadable symbols to the default NetHack
304 * symbols, including the r_syms rogue level
305 * symbols. This would typically be done
306 * immediately after execution begins. Any
307 * previously loaded external symbol sets are
310 * switch_symbols(arg)
311 * Called to swap in new current display symbols
312 * (showsyms) from either the default symbols,
313 * or from the loaded symbols.
315 * If (arg == 0) then showsyms are taken from
316 * defsyms, def_oc_syms, and def_monsyms.
318 * If (arg != 0), which is the normal expected
319 * usage, then showsyms are taken from the
320 * adjustable display symbols found in l_syms.
321 * l_syms may have been loaded from an external
322 * symbol file by config file options or interactively
323 * in the Options menu.
325 * assign_graphics(arg)
327 * This is used in the game core to toggle in and
328 * out of other {rogue} level display modes.
330 * If arg is ROGUESET, this places the rogue level
331 * symbols from r_syms into showsyms.
333 * If arg is PRIMARY, this places the symbols
334 * from l_monsyms into showsyms.
337 * Update a member of the loadable (l_*) symbol set.
340 * Update a member of the rogue (r_*) symbol set.
355 showsyms
[SYM_BOULDER
+ SYM_OFF_X
] = iflags
.bouldersym
;
356 l_syms
[SYM_BOULDER
+ SYM_OFF_X
] = iflags
.bouldersym
;
357 r_syms
[SYM_BOULDER
+ SYM_OFF_X
] = iflags
.bouldersym
;
365 for (i
= 0; i
< MAXPCHARS
; i
++)
366 showsyms
[i
+ SYM_OFF_P
] = defsyms
[i
].sym
;
367 for (i
= 0; i
< MAXOCLASSES
; i
++)
368 showsyms
[i
+ SYM_OFF_O
] = def_oc_syms
[i
].sym
;
369 for (i
= 0; i
< MAXMCLASSES
; i
++)
370 showsyms
[i
+ SYM_OFF_M
] = def_monsyms
[i
].sym
;
371 for (i
= 0; i
< WARNCOUNT
; i
++)
372 showsyms
[i
+ SYM_OFF_W
] = def_warnsyms
[i
].sym
;
373 for (i
= 0; i
< MAXOTHER
; i
++) {
374 if (i
== SYM_BOULDER
)
375 showsyms
[i
+ SYM_OFF_X
] = iflags
.bouldersym
377 : def_oc_syms
[ROCK_CLASS
].sym
;
378 else if (i
== SYM_INVISIBLE
)
379 showsyms
[i
+ SYM_OFF_X
] = DEF_INVISIBLE
;
383 /* initialize defaults for the loadable symset */
389 for (i
= 0; i
< MAXPCHARS
; i
++)
390 l_syms
[i
+ SYM_OFF_P
] = defsyms
[i
].sym
;
391 for (i
= 0; i
< MAXOCLASSES
; i
++)
392 l_syms
[i
+ SYM_OFF_O
] = def_oc_syms
[i
].sym
;
393 for (i
= 0; i
< MAXMCLASSES
; i
++)
394 l_syms
[i
+ SYM_OFF_M
] = def_monsyms
[i
].sym
;
395 for (i
= 0; i
< WARNCOUNT
; i
++)
396 l_syms
[i
+ SYM_OFF_W
] = def_warnsyms
[i
].sym
;
397 for (i
= 0; i
< MAXOTHER
; i
++) {
398 if (i
== SYM_BOULDER
)
399 l_syms
[i
+ SYM_OFF_X
] = iflags
.bouldersym
401 : def_oc_syms
[ROCK_CLASS
].sym
;
402 else if (i
== SYM_INVISIBLE
)
403 l_syms
[i
+ SYM_OFF_X
] = DEF_INVISIBLE
;
406 clear_symsetentry(PRIMARY
, FALSE
);
414 /* These are defaults that can get overwritten
415 later by the roguesymbols option */
417 for (i
= 0; i
< MAXPCHARS
; i
++)
418 r_syms
[i
+ SYM_OFF_P
] = defsyms
[i
].sym
;
419 r_syms
[S_vodoor
] = r_syms
[S_hodoor
] = r_syms
[S_ndoor
] = '+';
420 r_syms
[S_upstair
] = r_syms
[S_dnstair
] = '%';
422 for (i
= 0; i
< MAXOCLASSES
; i
++)
423 r_syms
[i
+ SYM_OFF_O
] = def_r_oc_syms
[i
];
424 for (i
= 0; i
< MAXMCLASSES
; i
++)
425 r_syms
[i
+ SYM_OFF_M
] = def_monsyms
[i
].sym
;
426 for (i
= 0; i
< WARNCOUNT
; i
++)
427 r_syms
[i
+ SYM_OFF_W
] = def_warnsyms
[i
].sym
;
428 for (i
= 0; i
< MAXOTHER
; i
++) {
429 if (i
== SYM_BOULDER
)
430 r_syms
[i
+ SYM_OFF_X
] = iflags
.bouldersym
432 : def_oc_syms
[ROCK_CLASS
].sym
;
433 else if (i
== SYM_INVISIBLE
)
434 r_syms
[i
+ SYM_OFF_X
] = DEF_INVISIBLE
;
437 clear_symsetentry(ROGUESET
, FALSE
);
438 /* default on Rogue level is no color
439 * but some symbol sets can override that
441 symset
[ROGUESET
].nocolor
= 1;
445 assign_graphics(whichset
)
452 /* Adjust graphics display characters on Rogue levels */
454 for (i
= 0; i
< SYM_MAX
; i
++)
455 showsyms
[i
] = r_syms
[i
];
457 #if defined(MSDOS) && defined(USE_TILES)
461 currentgraphics
= ROGUESET
;
466 for (i
= 0; i
< SYM_MAX
; i
++)
467 showsyms
[i
] = l_syms
[i
];
469 #if defined(MSDOS) && defined(USE_TILES)
473 currentgraphics
= PRIMARY
;
479 switch_symbols(nondefault
)
485 for (i
= 0; i
< SYM_MAX
; i
++)
486 showsyms
[i
] = l_syms
[i
];
488 if (SYMHANDLING(H_IBM
) && ibmgraphics_mode_callback
)
489 (*ibmgraphics_mode_callback
)();
490 else if (!symset
[currentgraphics
].name
&& ascgraphics_mode_callback
)
491 (*ascgraphics_mode_callback
)();
494 if (SYMHANDLING(H_DEC
) && decgraphics_mode_callback
)
495 (*decgraphics_mode_callback
)();
502 update_l_symset(symp
, val
)
503 struct symparse
*symp
;
506 l_syms
[symp
->idx
] = val
;
510 update_r_symset(symp
, val
)
511 struct symparse
*symp
;
514 r_syms
[symp
->idx
] = val
;
518 clear_symsetentry(which_set
, name_too
)
522 if (symset
[which_set
].desc
)
523 free((genericptr_t
) symset
[which_set
].desc
);
524 symset
[which_set
].desc
= (char *) 0;
526 symset
[which_set
].handling
= H_UNK
;
527 symset
[which_set
].nocolor
= 0;
528 /* initialize restriction bits */
529 symset
[which_set
].primary
= 0;
530 symset
[which_set
].rogue
= 0;
533 if (symset
[which_set
].name
)
534 free((genericptr_t
) symset
[which_set
].name
);
535 symset
[which_set
].name
= (char *) 0;
540 * If you are adding code somewhere to be able to recognize
541 * particular types of symset "handling", define a
542 * H_XXX macro in include/rm.h and add the name
543 * to this array at the matching offset.
545 const char *known_handling
[] = {
546 "UNKNOWN", /* H_UNK */
553 * Accepted keywords for symset restrictions.
554 * These can be virtually anything that you want to
555 * be able to test in the code someplace.
557 * - add a corresponding Bitfield to the symsetentry struct in rm.h
558 * - initialize the field to zero in parse_sym_line in the SYM_CONTROL
559 * case 0 section of the idx switch. The location is prefaced with
560 * with a comment stating "initialize restriction bits".
561 * - set the value appropriately based on the index of your keyword
562 * under the case 5 sections of the same SYM_CONTROL idx switches.
563 * - add the field to clear_symsetentry()
565 const char *known_restrictions
[] = {
566 "primary", "rogue", (const char *) 0,
569 struct symparse loadsyms
[] = {
570 { SYM_CONTROL
, 0, "start" },
571 { SYM_CONTROL
, 0, "begin" },
572 { SYM_CONTROL
, 1, "finish" },
573 { SYM_CONTROL
, 2, "handling" },
574 { SYM_CONTROL
, 3, "description" },
575 { SYM_CONTROL
, 4, "color" },
576 { SYM_CONTROL
, 4, "colour" },
577 { SYM_CONTROL
, 5, "restrictions" },
578 { SYM_PCHAR
, S_stone
, "S_stone" },
579 { SYM_PCHAR
, S_vwall
, "S_vwall" },
580 { SYM_PCHAR
, S_hwall
, "S_hwall" },
581 { SYM_PCHAR
, S_tlcorn
, "S_tlcorn" },
582 { SYM_PCHAR
, S_trcorn
, "S_trcorn" },
583 { SYM_PCHAR
, S_blcorn
, "S_blcorn" },
584 { SYM_PCHAR
, S_brcorn
, "S_brcorn" },
585 { SYM_PCHAR
, S_crwall
, "S_crwall" },
586 { SYM_PCHAR
, S_tuwall
, "S_tuwall" },
587 { SYM_PCHAR
, S_tdwall
, "S_tdwall" },
588 { SYM_PCHAR
, S_tlwall
, "S_tlwall" },
589 { SYM_PCHAR
, S_trwall
, "S_trwall" },
590 { SYM_PCHAR
, S_ndoor
, "S_ndoor" },
591 { SYM_PCHAR
, S_vodoor
, "S_vodoor" },
592 { SYM_PCHAR
, S_hodoor
, "S_hodoor" },
593 { SYM_PCHAR
, S_vcdoor
, "S_vcdoor" },
594 { SYM_PCHAR
, S_hcdoor
, "S_hcdoor" },
595 { SYM_PCHAR
, S_bars
, "S_bars" },
596 { SYM_PCHAR
, S_tree
, "S_tree" },
597 { SYM_PCHAR
, S_room
, "S_room" },
598 { SYM_PCHAR
, S_darkroom
, "S_darkroom" },
599 { SYM_PCHAR
, S_corr
, "S_corr" },
600 { SYM_PCHAR
, S_litcorr
, "S_litcorr" },
601 { SYM_PCHAR
, S_upstair
, "S_upstair" },
602 { SYM_PCHAR
, S_dnstair
, "S_dnstair" },
603 { SYM_PCHAR
, S_upladder
, "S_upladder" },
604 { SYM_PCHAR
, S_dnladder
, "S_dnladder" },
605 { SYM_PCHAR
, S_altar
, "S_altar" },
606 { SYM_PCHAR
, S_grave
, "S_grave" },
607 { SYM_PCHAR
, S_throne
, "S_throne" },
608 { SYM_PCHAR
, S_sink
, "S_sink" },
609 { SYM_PCHAR
, S_fountain
, "S_fountain" },
610 { SYM_PCHAR
, S_pool
, "S_pool" },
611 { SYM_PCHAR
, S_ice
, "S_ice" },
612 { SYM_PCHAR
, S_lava
, "S_lava" },
613 { SYM_PCHAR
, S_vodbridge
, "S_vodbridge" },
614 { SYM_PCHAR
, S_hodbridge
, "S_hodbridge" },
615 { SYM_PCHAR
, S_vcdbridge
, "S_vcdbridge" },
616 { SYM_PCHAR
, S_hcdbridge
, "S_hcdbridge" },
617 { SYM_PCHAR
, S_air
, "S_air" },
618 { SYM_PCHAR
, S_cloud
, "S_cloud" },
619 { SYM_PCHAR
, S_poisoncloud
, "S_poisoncloud" },
620 { SYM_PCHAR
, S_water
, "S_water" },
621 { SYM_PCHAR
, S_arrow_trap
, "S_arrow_trap" },
622 { SYM_PCHAR
, S_dart_trap
, "S_dart_trap" },
623 { SYM_PCHAR
, S_falling_rock_trap
, "S_falling_rock_trap" },
624 { SYM_PCHAR
, S_squeaky_board
, "S_squeaky_board" },
625 { SYM_PCHAR
, S_bear_trap
, "S_bear_trap" },
626 { SYM_PCHAR
, S_land_mine
, "S_land_mine" },
627 { SYM_PCHAR
, S_rolling_boulder_trap
, "S_rolling_boulder_trap" },
628 { SYM_PCHAR
, S_sleeping_gas_trap
, "S_sleeping_gas_trap" },
629 { SYM_PCHAR
, S_rust_trap
, "S_rust_trap" },
630 { SYM_PCHAR
, S_fire_trap
, "S_fire_trap" },
631 { SYM_PCHAR
, S_pit
, "S_pit" },
632 { SYM_PCHAR
, S_spiked_pit
, "S_spiked_pit" },
633 { SYM_PCHAR
, S_hole
, "S_hole" },
634 { SYM_PCHAR
, S_trap_door
, "S_trap_door" },
635 { SYM_PCHAR
, S_teleportation_trap
, "S_teleportation_trap" },
636 { SYM_PCHAR
, S_level_teleporter
, "S_level_teleporter" },
637 { SYM_PCHAR
, S_magic_portal
, "S_magic_portal" },
638 { SYM_PCHAR
, S_web
, "S_web" },
639 { SYM_PCHAR
, S_statue_trap
, "S_statue_trap" },
640 { SYM_PCHAR
, S_magic_trap
, "S_magic_trap" },
641 { SYM_PCHAR
, S_anti_magic_trap
, "S_anti_magic_trap" },
642 { SYM_PCHAR
, S_polymorph_trap
, "S_polymorph_trap" },
643 { SYM_PCHAR
, S_vibrating_square
, "S_vibrating_square" },
644 { SYM_PCHAR
, S_vbeam
, "S_vbeam" },
645 { SYM_PCHAR
, S_hbeam
, "S_hbeam" },
646 { SYM_PCHAR
, S_lslant
, "S_lslant" },
647 { SYM_PCHAR
, S_rslant
, "S_rslant" },
648 { SYM_PCHAR
, S_digbeam
, "S_digbeam" },
649 { SYM_PCHAR
, S_flashbeam
, "S_flashbeam" },
650 { SYM_PCHAR
, S_boomleft
, "S_boomleft" },
651 { SYM_PCHAR
, S_boomright
, "S_boomright" },
652 { SYM_PCHAR
, S_goodpos
, "S_goodpos" },
653 { SYM_PCHAR
, S_ss1
, "S_ss1" },
654 { SYM_PCHAR
, S_ss2
, "S_ss2" },
655 { SYM_PCHAR
, S_ss3
, "S_ss3" },
656 { SYM_PCHAR
, S_ss4
, "S_ss4" },
657 { SYM_PCHAR
, S_sw_tl
, "S_sw_tl" },
658 { SYM_PCHAR
, S_sw_tc
, "S_sw_tc" },
659 { SYM_PCHAR
, S_sw_tr
, "S_sw_tr" },
660 { SYM_PCHAR
, S_sw_ml
, "S_sw_ml" },
661 { SYM_PCHAR
, S_sw_mr
, "S_sw_mr" },
662 { SYM_PCHAR
, S_sw_bl
, "S_sw_bl" },
663 { SYM_PCHAR
, S_sw_bc
, "S_sw_bc" },
664 { SYM_PCHAR
, S_sw_br
, "S_sw_br" },
665 { SYM_PCHAR
, S_explode1
, "S_explode1" },
666 { SYM_PCHAR
, S_explode2
, "S_explode2" },
667 { SYM_PCHAR
, S_explode3
, "S_explode3" },
668 { SYM_PCHAR
, S_explode4
, "S_explode4" },
669 { SYM_PCHAR
, S_explode5
, "S_explode5" },
670 { SYM_PCHAR
, S_explode6
, "S_explode6" },
671 { SYM_PCHAR
, S_explode7
, "S_explode7" },
672 { SYM_PCHAR
, S_explode8
, "S_explode8" },
673 { SYM_PCHAR
, S_explode9
, "S_explode9" },
674 { SYM_OC
, ILLOBJ_CLASS
+ SYM_OFF_O
, "S_strange_obj" },
675 { SYM_OC
, WEAPON_CLASS
+ SYM_OFF_O
, "S_weapon" },
676 { SYM_OC
, ARMOR_CLASS
+ SYM_OFF_O
, "S_armor" },
677 { SYM_OC
, ARMOR_CLASS
+ SYM_OFF_O
, "S_armour" },
678 { SYM_OC
, RING_CLASS
+ SYM_OFF_O
, "S_ring" },
679 { SYM_OC
, AMULET_CLASS
+ SYM_OFF_O
, "S_amulet" },
680 { SYM_OC
, TOOL_CLASS
+ SYM_OFF_O
, "S_tool" },
681 { SYM_OC
, FOOD_CLASS
+ SYM_OFF_O
, "S_food" },
682 { SYM_OC
, POTION_CLASS
+ SYM_OFF_O
, "S_potion" },
683 { SYM_OC
, SCROLL_CLASS
+ SYM_OFF_O
, "S_scroll" },
684 { SYM_OC
, SPBOOK_CLASS
+ SYM_OFF_O
, "S_book" },
685 { SYM_OC
, WAND_CLASS
+ SYM_OFF_O
, "S_wand" },
686 { SYM_OC
, COIN_CLASS
+ SYM_OFF_O
, "S_coin" },
687 { SYM_OC
, GEM_CLASS
+ SYM_OFF_O
, "S_gem" },
688 { SYM_OC
, ROCK_CLASS
+ SYM_OFF_O
, "S_rock" },
689 { SYM_OC
, BALL_CLASS
+ SYM_OFF_O
, "S_ball" },
690 { SYM_OC
, CHAIN_CLASS
+ SYM_OFF_O
, "S_chain" },
691 { SYM_OC
, VENOM_CLASS
+ SYM_OFF_O
, "S_venom" },
692 { SYM_MON
, S_ANT
+ SYM_OFF_M
, "S_ant" },
693 { SYM_MON
, S_BLOB
+ SYM_OFF_M
, "S_blob" },
694 { SYM_MON
, S_COCKATRICE
+ SYM_OFF_M
, "S_cockatrice" },
695 { SYM_MON
, S_DOG
+ SYM_OFF_M
, "S_dog" },
696 { SYM_MON
, S_EYE
+ SYM_OFF_M
, "S_eye" },
697 { SYM_MON
, S_FELINE
+ SYM_OFF_M
, "S_feline" },
698 { SYM_MON
, S_GREMLIN
+ SYM_OFF_M
, "S_gremlin" },
699 { SYM_MON
, S_HUMANOID
+ SYM_OFF_M
, "S_humanoid" },
700 { SYM_MON
, S_IMP
+ SYM_OFF_M
, "S_imp" },
701 { SYM_MON
, S_JELLY
+ SYM_OFF_M
, "S_jelly" },
702 { SYM_MON
, S_KOBOLD
+ SYM_OFF_M
, "S_kobold" },
703 { SYM_MON
, S_LEPRECHAUN
+ SYM_OFF_M
, "S_leprechaun" },
704 { SYM_MON
, S_MIMIC
+ SYM_OFF_M
, "S_mimic" },
705 { SYM_MON
, S_NYMPH
+ SYM_OFF_M
, "S_nymph" },
706 { SYM_MON
, S_ORC
+ SYM_OFF_M
, "S_orc" },
707 { SYM_MON
, S_PIERCER
+ SYM_OFF_M
, "S_piercer" },
708 { SYM_MON
, S_QUADRUPED
+ SYM_OFF_M
, "S_quadruped" },
709 { SYM_MON
, S_RODENT
+ SYM_OFF_M
, "S_rodent" },
710 { SYM_MON
, S_SPIDER
+ SYM_OFF_M
, "S_spider" },
711 { SYM_MON
, S_TRAPPER
+ SYM_OFF_M
, "S_trapper" },
712 { SYM_MON
, S_UNICORN
+ SYM_OFF_M
, "S_unicorn" },
713 { SYM_MON
, S_VORTEX
+ SYM_OFF_M
, "S_vortex" },
714 { SYM_MON
, S_WORM
+ SYM_OFF_M
, "S_worm" },
715 { SYM_MON
, S_XAN
+ SYM_OFF_M
, "S_xan" },
716 { SYM_MON
, S_LIGHT
+ SYM_OFF_M
, "S_light" },
717 { SYM_MON
, S_ZRUTY
+ SYM_OFF_M
, "S_zruty" },
718 { SYM_MON
, S_ANGEL
+ SYM_OFF_M
, "S_angel" },
719 { SYM_MON
, S_BAT
+ SYM_OFF_M
, "S_bat" },
720 { SYM_MON
, S_CENTAUR
+ SYM_OFF_M
, "S_centaur" },
721 { SYM_MON
, S_DRAGON
+ SYM_OFF_M
, "S_dragon" },
722 { SYM_MON
, S_ELEMENTAL
+ SYM_OFF_M
, "S_elemental" },
723 { SYM_MON
, S_FUNGUS
+ SYM_OFF_M
, "S_fungus" },
724 { SYM_MON
, S_GNOME
+ SYM_OFF_M
, "S_gnome" },
725 { SYM_MON
, S_GIANT
+ SYM_OFF_M
, "S_giant" },
726 { SYM_MON
, S_JABBERWOCK
+ SYM_OFF_M
, "S_jabberwock" },
727 { SYM_MON
, S_KOP
+ SYM_OFF_M
, "S_kop" },
728 { SYM_MON
, S_LICH
+ SYM_OFF_M
, "S_lich" },
729 { SYM_MON
, S_MUMMY
+ SYM_OFF_M
, "S_mummy" },
730 { SYM_MON
, S_NAGA
+ SYM_OFF_M
, "S_naga" },
731 { SYM_MON
, S_OGRE
+ SYM_OFF_M
, "S_ogre" },
732 { SYM_MON
, S_PUDDING
+ SYM_OFF_M
, "S_pudding" },
733 { SYM_MON
, S_QUANTMECH
+ SYM_OFF_M
, "S_quantmech" },
734 { SYM_MON
, S_RUSTMONST
+ SYM_OFF_M
, "S_rustmonst" },
735 { SYM_MON
, S_SNAKE
+ SYM_OFF_M
, "S_snake" },
736 { SYM_MON
, S_TROLL
+ SYM_OFF_M
, "S_troll" },
737 { SYM_MON
, S_UMBER
+ SYM_OFF_M
, "S_umber" },
738 { SYM_MON
, S_VAMPIRE
+ SYM_OFF_M
, "S_vampire" },
739 { SYM_MON
, S_WRAITH
+ SYM_OFF_M
, "S_wraith" },
740 { SYM_MON
, S_XORN
+ SYM_OFF_M
, "S_xorn" },
741 { SYM_MON
, S_YETI
+ SYM_OFF_M
, "S_yeti" },
742 { SYM_MON
, S_ZOMBIE
+ SYM_OFF_M
, "S_zombie" },
743 { SYM_MON
, S_HUMAN
+ SYM_OFF_M
, "S_human" },
744 { SYM_MON
, S_GHOST
+ SYM_OFF_M
, "S_ghost" },
745 { SYM_MON
, S_GOLEM
+ SYM_OFF_M
, "S_golem" },
746 { SYM_MON
, S_DEMON
+ SYM_OFF_M
, "S_demon" },
747 { SYM_MON
, S_EEL
+ SYM_OFF_M
, "S_eel" },
748 { SYM_MON
, S_LIZARD
+ SYM_OFF_M
, "S_lizard" },
749 { SYM_MON
, S_WORM_TAIL
+ SYM_OFF_M
, "S_worm_tail" },
750 { SYM_MON
, S_MIMIC_DEF
+ SYM_OFF_M
, "S_mimic_def" },
751 { SYM_OTH
, SYM_BOULDER
+ SYM_OFF_X
, "S_boulder" },
752 { SYM_OTH
, SYM_INVISIBLE
+ SYM_OFF_X
, "S_invisible" },
753 { 0, 0, (const char *) 0 } /* fence post */