Move getpos return values to header
[aNetHack.git] / src / drawing.c
blob4a16c1f9004f76481cb89e09a1aa110015116978
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. */
5 #include "hack.h"
6 #include "tcap.h"
8 /* Relevant header information in rm.h, objclass.h, and monsym.h. */
10 #ifdef C
11 #undef C
12 #endif
14 #ifdef TEXTCOLOR
15 #define C(n) n
16 #else
17 #define C(n)
18 #endif
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] = {
59 { '\0', "", "" },
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] = {
123 /* white warning */
124 { '0', "unknown creature causing you worry", C(CLR_WHITE) },
125 /* pink warning */
126 { '1', "unknown creature causing you concern", C(CLR_RED) },
127 /* red warning */
128 { '2', "unknown creature causing you anxiety", C(CLR_RED) },
129 /* ruby warning */
130 { '3', "unknown creature causing you disquiet", C(CLR_RED) },
131 /* purple warning */
132 { '4', "unknown creature causing you alarm", C(CLR_MAGENTA) },
133 /* black warning */
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 */
245 RING_SYM,
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 */
251 GEM_SYM, ROCK_SYM,
252 /*15*/ BALL_SYM, CHAIN_SYM, VENOM_SYM
255 #undef C
257 #ifdef TERMLIB
258 void NDECL((*decgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
259 #endif /* TERMLIB */
261 #ifdef PC9800
262 void NDECL((*ibmgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
263 void NDECL((*ascgraphics_mode_callback)) = 0; /* set in tty_start_screen() */
264 #endif
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)
273 char ch;
275 int i;
276 for (i = 1; i < MAXOCLASSES; i++)
277 if (ch == def_oc_syms[i].sym)
278 break;
279 return i;
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)
289 char ch;
291 int i;
292 for (i = 1; i < MAXMCLASSES; i++)
293 if (ch == def_monsyms[i].sym)
294 break;
295 return i;
299 * Explanations of the functions found below:
301 * init_symbols()
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
308 * discarded.
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.
336 * update_l_symset()
337 * Update a member of the loadable (l_*) symbol set.
339 * update_r_symset()
340 * Update a member of the rogue (r_*) symbol set.
344 void
345 init_symbols()
347 init_l_symbols();
348 init_showsyms();
349 init_r_symbols();
352 void
353 update_bouldersym()
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;
360 void
361 init_showsyms()
363 register int i;
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
376 ? 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 */
384 void
385 init_l_symbols()
387 register int i;
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
400 ? 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);
409 void
410 init_r_symbols()
412 register int i;
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
431 ? 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;
444 void
445 assign_graphics(whichset)
446 int whichset;
448 register int i;
450 switch (whichset) {
451 case ROGUESET:
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)
458 if (iflags.grmode)
459 tileview(FALSE);
460 #endif
461 currentgraphics = ROGUESET;
462 break;
464 case PRIMARY:
465 default:
466 for (i = 0; i < SYM_MAX; i++)
467 showsyms[i] = l_syms[i];
469 #if defined(MSDOS) && defined(USE_TILES)
470 if (iflags.grmode)
471 tileview(TRUE);
472 #endif
473 currentgraphics = PRIMARY;
474 break;
478 void
479 switch_symbols(nondefault)
480 int nondefault;
482 register int i;
484 if (nondefault) {
485 for (i = 0; i < SYM_MAX; i++)
486 showsyms[i] = l_syms[i];
487 #ifdef PC9800
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)();
492 #endif
493 #ifdef TERMLIB
494 if (SYMHANDLING(H_DEC) && decgraphics_mode_callback)
495 (*decgraphics_mode_callback)();
496 #endif
497 } else
498 init_symbols();
501 void
502 update_l_symset(symp, val)
503 struct symparse *symp;
504 int val;
506 l_syms[symp->idx] = val;
509 void
510 update_r_symset(symp, val)
511 struct symparse *symp;
512 int val;
514 r_syms[symp->idx] = val;
517 void
518 clear_symsetentry(which_set, name_too)
519 int which_set;
520 boolean 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;
532 if (name_too) {
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 */
547 "IBM", /* H_IBM */
548 "DEC", /* H_DEC */
549 (const char *) 0,
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.
556 * Be sure to:
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, WEAPON_CLASS + SYM_OFF_O, "S_weapon" },
675 { SYM_OC, ARMOR_CLASS + SYM_OFF_O, "S_armor" },
676 { SYM_OC, ARMOR_CLASS + SYM_OFF_O, "S_armour" },
677 { SYM_OC, RING_CLASS + SYM_OFF_O, "S_ring" },
678 { SYM_OC, AMULET_CLASS + SYM_OFF_O, "S_amulet" },
679 { SYM_OC, TOOL_CLASS + SYM_OFF_O, "S_tool" },
680 { SYM_OC, FOOD_CLASS + SYM_OFF_O, "S_food" },
681 { SYM_OC, POTION_CLASS + SYM_OFF_O, "S_potion" },
682 { SYM_OC, SCROLL_CLASS + SYM_OFF_O, "S_scroll" },
683 { SYM_OC, SPBOOK_CLASS + SYM_OFF_O, "S_book" },
684 { SYM_OC, WAND_CLASS + SYM_OFF_O, "S_wand" },
685 { SYM_OC, COIN_CLASS + SYM_OFF_O, "S_coin" },
686 { SYM_OC, GEM_CLASS + SYM_OFF_O, "S_gem" },
687 { SYM_OC, ROCK_CLASS + SYM_OFF_O, "S_rock" },
688 { SYM_OC, BALL_CLASS + SYM_OFF_O, "S_ball" },
689 { SYM_OC, CHAIN_CLASS + SYM_OFF_O, "S_chain" },
690 { SYM_OC, VENOM_CLASS + SYM_OFF_O, "S_venom" },
691 { SYM_MON, S_ANT + SYM_OFF_M, "S_ant" },
692 { SYM_MON, S_BLOB + SYM_OFF_M, "S_blob" },
693 { SYM_MON, S_COCKATRICE + SYM_OFF_M, "S_cockatrice" },
694 { SYM_MON, S_DOG + SYM_OFF_M, "S_dog" },
695 { SYM_MON, S_EYE + SYM_OFF_M, "S_eye" },
696 { SYM_MON, S_FELINE + SYM_OFF_M, "S_feline" },
697 { SYM_MON, S_GREMLIN + SYM_OFF_M, "S_gremlin" },
698 { SYM_MON, S_HUMANOID + SYM_OFF_M, "S_humanoid" },
699 { SYM_MON, S_IMP + SYM_OFF_M, "S_imp" },
700 { SYM_MON, S_JELLY + SYM_OFF_M, "S_jelly" },
701 { SYM_MON, S_KOBOLD + SYM_OFF_M, "S_kobold" },
702 { SYM_MON, S_LEPRECHAUN + SYM_OFF_M, "S_leprechaun" },
703 { SYM_MON, S_MIMIC + SYM_OFF_M, "S_mimic" },
704 { SYM_MON, S_NYMPH + SYM_OFF_M, "S_nymph" },
705 { SYM_MON, S_ORC + SYM_OFF_M, "S_orc" },
706 { SYM_MON, S_PIERCER + SYM_OFF_M, "S_piercer" },
707 { SYM_MON, S_QUADRUPED + SYM_OFF_M, "S_quadruped" },
708 { SYM_MON, S_RODENT + SYM_OFF_M, "S_rodent" },
709 { SYM_MON, S_SPIDER + SYM_OFF_M, "S_spider" },
710 { SYM_MON, S_TRAPPER + SYM_OFF_M, "S_trapper" },
711 { SYM_MON, S_UNICORN + SYM_OFF_M, "S_unicorn" },
712 { SYM_MON, S_VORTEX + SYM_OFF_M, "S_vortex" },
713 { SYM_MON, S_WORM + SYM_OFF_M, "S_worm" },
714 { SYM_MON, S_XAN + SYM_OFF_M, "S_xan" },
715 { SYM_MON, S_LIGHT + SYM_OFF_M, "S_light" },
716 { SYM_MON, S_ZRUTY + SYM_OFF_M, "S_zruty" },
717 { SYM_MON, S_ANGEL + SYM_OFF_M, "S_angel" },
718 { SYM_MON, S_BAT + SYM_OFF_M, "S_bat" },
719 { SYM_MON, S_CENTAUR + SYM_OFF_M, "S_centaur" },
720 { SYM_MON, S_DRAGON + SYM_OFF_M, "S_dragon" },
721 { SYM_MON, S_ELEMENTAL + SYM_OFF_M, "S_elemental" },
722 { SYM_MON, S_FUNGUS + SYM_OFF_M, "S_fungus" },
723 { SYM_MON, S_GNOME + SYM_OFF_M, "S_gnome" },
724 { SYM_MON, S_GIANT + SYM_OFF_M, "S_giant" },
725 { SYM_MON, S_JABBERWOCK + SYM_OFF_M, "S_jabberwock" },
726 { SYM_MON, S_KOP + SYM_OFF_M, "S_kop" },
727 { SYM_MON, S_LICH + SYM_OFF_M, "S_lich" },
728 { SYM_MON, S_MUMMY + SYM_OFF_M, "S_mummy" },
729 { SYM_MON, S_NAGA + SYM_OFF_M, "S_naga" },
730 { SYM_MON, S_OGRE + SYM_OFF_M, "S_ogre" },
731 { SYM_MON, S_PUDDING + SYM_OFF_M, "S_pudding" },
732 { SYM_MON, S_QUANTMECH + SYM_OFF_M, "S_quantmech" },
733 { SYM_MON, S_RUSTMONST + SYM_OFF_M, "S_rustmonst" },
734 { SYM_MON, S_SNAKE + SYM_OFF_M, "S_snake" },
735 { SYM_MON, S_TROLL + SYM_OFF_M, "S_troll" },
736 { SYM_MON, S_UMBER + SYM_OFF_M, "S_umber" },
737 { SYM_MON, S_VAMPIRE + SYM_OFF_M, "S_vampire" },
738 { SYM_MON, S_WRAITH + SYM_OFF_M, "S_wraith" },
739 { SYM_MON, S_XORN + SYM_OFF_M, "S_xorn" },
740 { SYM_MON, S_YETI + SYM_OFF_M, "S_yeti" },
741 { SYM_MON, S_ZOMBIE + SYM_OFF_M, "S_zombie" },
742 { SYM_MON, S_HUMAN + SYM_OFF_M, "S_human" },
743 { SYM_MON, S_GHOST + SYM_OFF_M, "S_ghost" },
744 { SYM_MON, S_GOLEM + SYM_OFF_M, "S_golem" },
745 { SYM_MON, S_DEMON + SYM_OFF_M, "S_demon" },
746 { SYM_MON, S_EEL + SYM_OFF_M, "S_eel" },
747 { SYM_MON, S_LIZARD + SYM_OFF_M, "S_lizard" },
748 { SYM_MON, S_WORM_TAIL + SYM_OFF_M, "S_worm_tail" },
749 { SYM_MON, S_MIMIC_DEF + SYM_OFF_M, "S_mimic_def" },
750 { SYM_OTH, SYM_BOULDER + SYM_OFF_X, "S_boulder" },
751 { SYM_OTH, SYM_INVISIBLE + SYM_OFF_X, "S_invisible" },
752 { 0, 0, (const char *) 0 } /* fence post */
755 /*drawing.c*/