OSDN Git Service

Initial Import
[nethackexpress/trunk.git] / src / drawing.c
1 /*      SCCS Id: @(#)drawing.c  3.4     1999/12/02      */
2 /* Copyright (c) NetHack Development Team 1992.                   */
3 /* NetHack may be freely redistributed.  See license for details. */
4
5 #include "hack.h"
6 #include "tcap.h"
7
8 /* Relevent header information in rm.h and objclass.h. */
9
10 #ifdef C
11 #undef C
12 #endif
13
14 #ifdef TEXTCOLOR
15 #define C(n) n
16 #else
17 #define C(n)
18 #endif
19
20 #define g_FILLER(symbol) 0
21
22 uchar oc_syms[MAXOCLASSES] = DUMMY; /* the current object  display symbols */
23 uchar showsyms[MAXPCHARS]  = DUMMY; /* the current feature display symbols */
24 uchar monsyms[MAXMCLASSES] = DUMMY; /* the current monster display symbols */
25 uchar warnsyms[WARNCOUNT]  = DUMMY;  /* the current warning display symbols */
26
27 /* Default object class symbols.  See objclass.h. */
28 const char def_oc_syms[MAXOCLASSES] = {
29 /* 0*/  '\0',           /* placeholder for the "random class" */
30         ILLOBJ_SYM,
31         WEAPON_SYM,
32         ARMOR_SYM,
33         RING_SYM,
34 /* 5*/  AMULET_SYM,
35         TOOL_SYM,
36         FOOD_SYM,
37         POTION_SYM,
38         SCROLL_SYM,
39 /*10*/  SPBOOK_SYM,
40         WAND_SYM,
41         GOLD_SYM,
42         GEM_SYM,
43         ROCK_SYM,
44 /*15*/  BALL_SYM,
45         CHAIN_SYM,
46         VENOM_SYM
47 };
48
49 const char invisexplain[] = "remembered, unseen, creature";
50
51 /* Object descriptions.  Used in do_look(). */
52 const char * const objexplain[] = {     /* these match def_oc_syms, above */
53 /* 0*/  0,
54         "strange object",
55         "weapon",
56         "suit or piece of armor",
57         "ring",
58 /* 5*/  "amulet",
59         "useful item (pick-axe, key, lamp...)",
60         "piece of food",
61         "potion",
62         "scroll",
63 /*10*/  "spellbook",
64         "wand",
65         "pile of coins",
66         "gem or rock",
67         "boulder or statue",
68 /*15*/  "iron ball",
69         "iron chain",
70         "splash of venom"
71 };
72
73 /* Object class names.  Used in object_detect(). */
74 const char * const oclass_names[] = {
75 /* 0*/  0,
76         "illegal objects",
77         "weapons",
78         "armor",
79         "rings",
80 /* 5*/  "amulets",
81         "tools",
82         "food",
83         "potions",
84         "scrolls",
85 /*10*/  "spellbooks",
86         "wands",
87         "coins",
88         "rocks",
89         "large stones",
90 /*15*/  "iron balls",
91         "chains",
92         "venoms"
93 };
94
95 /* Default monster class symbols.  See monsym.h. */
96 const char def_monsyms[MAXMCLASSES] = {
97         '\0',           /* holder */
98         DEF_ANT,
99         DEF_BLOB,
100         DEF_COCKATRICE,
101         DEF_DOG,
102         DEF_EYE,
103         DEF_FELINE,
104         DEF_GREMLIN,
105         DEF_HUMANOID,
106         DEF_IMP,
107         DEF_JELLY,              /* 10 */
108         DEF_KOBOLD,
109         DEF_LEPRECHAUN,
110         DEF_MIMIC,
111         DEF_NYMPH,
112         DEF_ORC,
113         DEF_PIERCER,
114         DEF_QUADRUPED,
115         DEF_RODENT,
116         DEF_SPIDER,
117         DEF_TRAPPER,            /* 20 */
118         DEF_UNICORN,
119         DEF_VORTEX,
120         DEF_WORM,
121         DEF_XAN,
122         DEF_LIGHT,
123         DEF_ZRUTY,
124         DEF_ANGEL,
125         DEF_BAT,
126         DEF_CENTAUR,
127         DEF_DRAGON,             /* 30 */
128         DEF_ELEMENTAL,
129         DEF_FUNGUS,
130         DEF_GNOME,
131         DEF_GIANT,
132         '\0',
133         DEF_JABBERWOCK,
134         DEF_KOP,
135         DEF_LICH,
136         DEF_MUMMY,
137         DEF_NAGA,               /* 40 */
138         DEF_OGRE,
139         DEF_PUDDING,
140         DEF_QUANTMECH,
141         DEF_RUSTMONST,
142         DEF_SNAKE,
143         DEF_TROLL,
144         DEF_UMBER,
145         DEF_VAMPIRE,
146         DEF_WRAITH,
147         DEF_XORN,               /* 50 */
148         DEF_YETI,
149         DEF_ZOMBIE,
150         DEF_HUMAN,
151         DEF_GHOST,
152         DEF_GOLEM,
153         DEF_DEMON,
154         DEF_EEL,
155         DEF_LIZARD,
156         DEF_WORM_TAIL,
157         DEF_MIMIC_DEF,          /* 60 */
158 };
159
160 /* The explanations below are also used when the user gives a string
161  * for blessed genocide, so no text should wholly contain any later
162  * text.  They should also always contain obvious names (eg. cat/feline).
163  */
164 const char * const monexplain[MAXMCLASSES] = {
165     0,
166     "ant or other insect",      "blob",                 "cockatrice",
167     "dog or other canine",      "eye or sphere",        "cat or other feline",
168     "gremlin",                  "humanoid",             "imp or minor demon",
169     "jelly",                    "kobold",               "leprechaun",
170     "mimic",                    "nymph",                "orc",
171     "piercer",                  "quadruped",            "rodent",
172     "arachnid or centipede",    "trapper or lurker above", "unicorn or horse",
173     "vortex",           "worm", "xan or other mythical/fantastic insect",
174     "light",                    "zruty",
175
176     "angelic being",            "bat or bird",          "centaur",
177     "dragon",                   "elemental",            "fungus or mold",
178     "gnome",                    "giant humanoid",       0,
179     "jabberwock",               "Keystone Kop",         "lich",
180     "mummy",                    "naga",                 "ogre",
181     "pudding or ooze",          "quantum mechanic",     "rust monster or disenchanter",
182     "snake",                    "troll",                "umber hulk",
183     "vampire",                  "wraith",               "xorn",
184     "apelike creature",         "zombie",
185
186     "human or elf",             "ghost",                "golem",
187     "major demon",              "sea monster",          "lizard",
188     "long worm tail",           "mimic"
189 };
190
191 const struct symdef def_warnsyms[WARNCOUNT] = {
192         {'0', "unknown creature causing you worry", C(CLR_WHITE)},      /* white warning  */
193         {'1', "unknown creature causing you concern", C(CLR_RED)},      /* pink warning   */
194         {'2', "unknown creature causing you anxiety", C(CLR_RED)},      /* red warning    */
195         {'3', "unknown creature causing you disquiet", C(CLR_RED)},     /* ruby warning   */
196         {'4', "unknown creature causing you alarm",
197                                                 C(CLR_MAGENTA)},        /* purple warning */
198         {'5', "unknown creature causing you dread",
199                                                 C(CLR_BRIGHT_MAGENTA)}  /* black warning  */
200 };
201
202 /*
203  *  Default screen symbols with explanations and colors.
204  *  Note:  {ibm|dec|mac}_graphics[] arrays also depend on this symbol order.
205  */
206 const struct symdef defsyms[MAXPCHARS] = {
207 /* 0*/  {' ', "dark part of a room",C(NO_COLOR)},       /* stone */
208         {'|', "wall",           C(CLR_GRAY)},   /* vwall */
209         {'-', "wall",           C(CLR_GRAY)},   /* hwall */
210         {'-', "wall",           C(CLR_GRAY)},   /* tlcorn */
211         {'-', "wall",           C(CLR_GRAY)},   /* trcorn */
212         {'-', "wall",           C(CLR_GRAY)},   /* blcorn */
213         {'-', "wall",           C(CLR_GRAY)},   /* brcorn */
214         {'-', "wall",           C(CLR_GRAY)},   /* crwall */
215         {'-', "wall",           C(CLR_GRAY)},   /* tuwall */
216         {'-', "wall",           C(CLR_GRAY)},   /* tdwall */
217 /*10*/  {'|', "wall",           C(CLR_GRAY)},   /* tlwall */
218         {'|', "wall",           C(CLR_GRAY)},   /* trwall */
219         {'.', "doorway",        C(CLR_GRAY)},   /* ndoor */
220         {'-', "open door",      C(CLR_BROWN)},  /* vodoor */
221         {'|', "open door",      C(CLR_BROWN)},  /* hodoor */
222         {'+', "closed door",    C(CLR_BROWN)},  /* vcdoor */
223         {'+', "closed door",    C(CLR_BROWN)},  /* hcdoor */
224         {'#', "iron bars",      C(HI_METAL)},   /* bars */
225         {'#', "tree",           C(CLR_GREEN)},  /* tree */
226         {'.', "floor of a room",C(CLR_GRAY)},   /* room */
227 /*20*/  {'#', "corridor",       C(CLR_GRAY)},   /* dark corr */
228         {'#', "lit corridor",   C(CLR_GRAY)},   /* lit corr (see mapglyph.c) */
229         {'<', "staircase up",   C(CLR_GRAY)},   /* upstair */
230         {'>', "staircase down", C(CLR_GRAY)},   /* dnstair */
231         {'<', "ladder up",      C(CLR_BROWN)},  /* upladder */
232         {'>', "ladder down",    C(CLR_BROWN)},  /* dnladder */
233         {'_', "altar",          C(CLR_GRAY)},   /* altar */
234         {'|', "grave",      C(CLR_GRAY)},   /* grave */
235         {'\\', "opulent throne",C(HI_GOLD)},    /* throne */
236 #ifdef SINKS
237         {'#', "sink",           C(CLR_GRAY)},   /* sink */
238 #else
239         {'#', "",               C(CLR_GRAY)},   /* sink */
240 #endif
241 /*30*/  {'{', "fountain",       C(CLR_BLUE)},   /* fountain */
242         {'}', "water",          C(CLR_BLUE)},   /* pool */
243         {'.', "ice",            C(CLR_CYAN)},   /* ice */
244         {'}', "molten lava",    C(CLR_RED)},    /* lava */
245         {'.', "lowered drawbridge",C(CLR_BROWN)},       /* vodbridge */
246         {'.', "lowered drawbridge",C(CLR_BROWN)},       /* hodbridge */
247         {'#', "raised drawbridge",C(CLR_BROWN)},/* vcdbridge */
248         {'#', "raised drawbridge",C(CLR_BROWN)},/* hcdbridge */
249         {' ', "air",            C(CLR_CYAN)},   /* open air */
250         {'#', "cloud",          C(CLR_GRAY)},   /* [part of] a cloud */
251 /*40*/  {'}', "water",          C(CLR_BLUE)},   /* under water */
252         {'^', "arrow trap",     C(HI_METAL)},   /* trap */
253         {'^', "dart trap",      C(HI_METAL)},   /* trap */
254         {'^', "falling rock trap",C(CLR_GRAY)}, /* trap */
255         {'^', "squeaky board",  C(CLR_BROWN)},  /* trap */
256         {'^', "bear trap",      C(HI_METAL)},   /* trap */
257         {'^', "land mine",      C(CLR_RED)},    /* trap */
258         {'^', "rolling boulder trap",   C(CLR_GRAY)},   /* trap */
259         {'^', "sleeping gas trap",C(HI_ZAP)},   /* trap */
260         {'^', "rust trap",      C(CLR_BLUE)},   /* trap */
261 /*50*/  {'^', "fire trap",      C(CLR_ORANGE)}, /* trap */
262         {'^', "pit",            C(CLR_BLACK)},  /* trap */
263         {'^', "spiked pit",     C(CLR_BLACK)},  /* trap */
264         {'^', "hole",   C(CLR_BROWN)},  /* trap */
265         {'^', "trap door",      C(CLR_BROWN)},  /* trap */
266         {'^', "teleportation trap", C(CLR_MAGENTA)},    /* trap */
267         {'^', "level teleporter", C(CLR_MAGENTA)},      /* trap */
268         {'^', "magic portal",   C(CLR_BRIGHT_MAGENTA)}, /* trap */
269         {'"', "web",            C(CLR_GRAY)},   /* web */
270         {'^', "statue trap",    C(CLR_GRAY)},   /* trap */
271 /*60*/  {'^', "magic trap",     C(HI_ZAP)},     /* trap */
272         {'^', "anti-magic field", C(HI_ZAP)},   /* trap */
273         {'^', "polymorph trap", C(CLR_BRIGHT_GREEN)},   /* trap */
274         {'|', "wall",           C(CLR_GRAY)},   /* vbeam */
275         {'-', "wall",           C(CLR_GRAY)},   /* hbeam */
276         {'\\',"wall",           C(CLR_GRAY)},   /* lslant */
277         {'/', "wall",           C(CLR_GRAY)},   /* rslant */
278         {'*', "",               C(CLR_WHITE)},  /* dig beam */
279         {'!', "",               C(CLR_WHITE)},  /* camera flash beam */
280         {')', "",               C(HI_WOOD)},    /* boomerang open left */
281 /*70*/  {'(', "",               C(HI_WOOD)},    /* boomerang open right */
282         {'0', "",               C(HI_ZAP)},     /* 4 magic shield symbols */
283         {'#', "",               C(HI_ZAP)},
284         {'@', "",               C(HI_ZAP)},
285         {'*', "",               C(HI_ZAP)},
286         {'/', "",               C(CLR_GREEN)},  /* swallow top left     */
287         {'-', "",               C(CLR_GREEN)},  /* swallow top center   */
288         {'\\', "",              C(CLR_GREEN)},  /* swallow top right    */
289         {'|', "",               C(CLR_GREEN)},  /* swallow middle left  */
290         {'|', "",               C(CLR_GREEN)},  /* swallow middle right */
291 /*80*/  {'\\', "",              C(CLR_GREEN)},  /* swallow bottom left  */
292         {'-', "",               C(CLR_GREEN)},  /* swallow bottom center*/
293         {'/', "",               C(CLR_GREEN)},  /* swallow bottom right */
294         {'/', "",               C(CLR_ORANGE)}, /* explosion top left     */
295         {'-', "",               C(CLR_ORANGE)}, /* explosion top center   */
296         {'\\', "",              C(CLR_ORANGE)}, /* explosion top right    */
297         {'|', "",               C(CLR_ORANGE)}, /* explosion middle left  */
298         {' ', "",               C(CLR_ORANGE)}, /* explosion middle center*/
299         {'|', "",               C(CLR_ORANGE)}, /* explosion middle right */
300         {'\\', "",              C(CLR_ORANGE)}, /* explosion bottom left  */
301 /*90*/  {'-', "",               C(CLR_ORANGE)}, /* explosion bottom center*/
302         {'/', "",               C(CLR_ORANGE)}, /* explosion bottom right */
303 /*
304  *  Note: Additions to this array should be reflected in the
305  *        {ibm,dec,mac}_graphics[] arrays below.
306  */
307 };
308
309 #undef C
310
311 #ifdef ASCIIGRAPH
312
313 #ifdef PC9800
314 void NDECL((*ibmgraphics_mode_callback)) = 0;   /* set in tty_start_screen() */
315 #endif /* PC9800 */
316
317 static uchar ibm_graphics[MAXPCHARS] = {
318 /* 0*/  g_FILLER(S_stone),
319         0xb3,   /* S_vwall:     meta-3, vertical rule */
320         0xc4,   /* S_hwall:     meta-D, horizontal rule */
321         0xda,   /* S_tlcorn:    meta-Z, top left corner */
322         0xbf,   /* S_trcorn:    meta-?, top right corner */
323         0xc0,   /* S_blcorn:    meta-@, bottom left */
324         0xd9,   /* S_brcorn:    meta-Y, bottom right */
325         0xc5,   /* S_crwall:    meta-E, cross */
326         0xc1,   /* S_tuwall:    meta-A, T up */
327         0xc2,   /* S_tdwall:    meta-B, T down */
328 /*10*/  0xb4,   /* S_tlwall:    meta-4, T left */
329         0xc3,   /* S_trwall:    meta-C, T right */
330         0xfa,   /* S_ndoor:     meta-z, centered dot */
331         0xfe,   /* S_vodoor:    meta-~, small centered square */
332         0xfe,   /* S_hodoor:    meta-~, small centered square */
333         g_FILLER(S_vcdoor),
334         g_FILLER(S_hcdoor),
335         240,    /* S_bars:      equivalence symbol */
336         241,    /* S_tree:      plus or minus symbol */
337         0xfa,   /* S_room:      meta-z, centered dot */
338 /*20*/  0xb0,   /* S_corr:      meta-0, light shading */
339         0xb1,   /* S_litcorr:   meta-1, medium shading */
340         g_FILLER(S_upstair),
341         g_FILLER(S_dnstair),
342         g_FILLER(S_upladder),
343         g_FILLER(S_dnladder),
344         g_FILLER(S_altar),
345         g_FILLER(S_grave),
346         g_FILLER(S_throne),
347         g_FILLER(S_sink),
348 /*30*/  0xf4,   /* S_fountain:  meta-t, integral top half */
349         0xf7,   /* S_pool:      meta-w, approx. equals */
350         0xfa,   /* S_ice:       meta-z, centered dot */
351         0xf7,   /* S_lava:      meta-w, approx. equals */
352         0xfa,   /* S_vodbridge: meta-z, centered dot */
353         0xfa,   /* S_hodbridge: meta-z, centered dot */
354         g_FILLER(S_vcdbridge),
355         g_FILLER(S_hcdbridge),
356         g_FILLER(S_air),
357         g_FILLER(S_cloud),
358 /*40*/  0xf7,   /* S_water:     meta-w, approx. equals */
359         g_FILLER(S_arrow_trap),
360         g_FILLER(S_dart_trap),
361         g_FILLER(S_falling_rock_trap),
362         g_FILLER(S_squeaky_board),
363         g_FILLER(S_bear_trap),
364         g_FILLER(S_land_mine),
365         g_FILLER(S_rolling_boulder_trap),
366         g_FILLER(S_sleeping_gas_trap),
367         g_FILLER(S_rust_trap),
368 /*50*/  g_FILLER(S_fire_trap),
369         g_FILLER(S_pit),
370         g_FILLER(S_spiked_pit),
371         g_FILLER(S_hole),
372         g_FILLER(S_trap_door),
373         g_FILLER(S_teleportation_trap),
374         g_FILLER(S_level_teleporter),
375         g_FILLER(S_magic_portal),
376         g_FILLER(S_web),
377         g_FILLER(S_statue_trap),
378 /*60*/  g_FILLER(S_magic_trap),
379         g_FILLER(S_anti_magic_trap),
380         g_FILLER(S_polymorph_trap),
381         0xb3,   /* S_vbeam:     meta-3, vertical rule */
382         0xc4,   /* S_hbeam:     meta-D, horizontal rule */
383         g_FILLER(S_lslant),
384         g_FILLER(S_rslant),
385         g_FILLER(S_digbeam),
386         g_FILLER(S_flashbeam),
387         g_FILLER(S_boomleft),
388 /*70*/  g_FILLER(S_boomright),
389         g_FILLER(S_ss1),
390         g_FILLER(S_ss2),
391         g_FILLER(S_ss3),
392         g_FILLER(S_ss4),
393         g_FILLER(S_sw_tl),
394         g_FILLER(S_sw_tc),
395         g_FILLER(S_sw_tr),
396         0xb3,   /* S_sw_ml:     meta-3, vertical rule */
397         0xb3,   /* S_sw_mr:     meta-3, vertical rule */
398 /*80*/  g_FILLER(S_sw_bl),
399         g_FILLER(S_sw_bc),
400         g_FILLER(S_sw_br),
401         g_FILLER(S_explode1),
402         g_FILLER(S_explode2),
403         g_FILLER(S_explode3),
404         0xb3,   /* S_explode4:  meta-3, vertical rule */
405         g_FILLER(S_explode5),
406         0xb3,   /* S_explode6:  meta-3, vertical rule */
407         g_FILLER(S_explode7),
408 /*90*/  g_FILLER(S_explode8),
409         g_FILLER(S_explode9)
410 };
411 #endif  /* ASCIIGRAPH */
412
413 #ifdef TERMLIB
414 void NDECL((*decgraphics_mode_callback)) = 0;  /* set in tty_start_screen() */
415
416 static uchar dec_graphics[MAXPCHARS] = {
417 /* 0*/  g_FILLER(S_stone),
418         0xf8,   /* S_vwall:     meta-x, vertical rule */
419         0xf1,   /* S_hwall:     meta-q, horizontal rule */
420         0xec,   /* S_tlcorn:    meta-l, top left corner */
421         0xeb,   /* S_trcorn:    meta-k, top right corner */
422         0xed,   /* S_blcorn:    meta-m, bottom left */
423         0xea,   /* S_brcorn:    meta-j, bottom right */
424         0xee,   /* S_crwall:    meta-n, cross */
425         0xf6,   /* S_tuwall:    meta-v, T up */
426         0xf7,   /* S_tdwall:    meta-w, T down */
427 /*10*/  0xf5,   /* S_tlwall:    meta-u, T left */
428         0xf4,   /* S_trwall:    meta-t, T right */
429         0xfe,   /* S_ndoor:     meta-~, centered dot */
430         0xe1,   /* S_vodoor:    meta-a, solid block */
431         0xe1,   /* S_hodoor:    meta-a, solid block */
432         g_FILLER(S_vcdoor),
433         g_FILLER(S_hcdoor),
434         0xfb,   /* S_bars:      meta-{, small pi */
435         0xe7,   /* S_tree:      meta-g, plus-or-minus */
436         0xfe,   /* S_room:      meta-~, centered dot */
437 /*20*/  g_FILLER(S_corr),
438         g_FILLER(S_litcorr),
439         g_FILLER(S_upstair),
440         g_FILLER(S_dnstair),
441         0xf9,   /* S_upladder:  meta-y, greater-than-or-equals */
442         0xfa,   /* S_dnladder:  meta-z, less-than-or-equals */
443         g_FILLER(S_altar),      /* 0xc3, \E)3: meta-C, dagger */
444         g_FILLER(S_grave),
445         g_FILLER(S_throne),
446         g_FILLER(S_sink),
447 /*30*/  g_FILLER(S_fountain),   /* 0xdb, \E)3: meta-[, integral top half */
448         0xe0,   /* S_pool:      meta-\, diamond */
449         0xfe,   /* S_ice:       meta-~, centered dot */
450         0xe0,   /* S_lava:      meta-\, diamond */
451         0xfe,   /* S_vodbridge: meta-~, centered dot */
452         0xfe,   /* S_hodbridge: meta-~, centered dot */
453         g_FILLER(S_vcdbridge),
454         g_FILLER(S_hcdbridge),
455         g_FILLER(S_air),
456         g_FILLER(S_cloud),
457 /*40*/  0xe0,   /* S_water:     meta-\, diamond */
458         g_FILLER(S_arrow_trap),
459         g_FILLER(S_dart_trap),
460         g_FILLER(S_falling_rock_trap),
461         g_FILLER(S_squeaky_board),
462         g_FILLER(S_bear_trap),
463         g_FILLER(S_land_mine),
464         g_FILLER(S_rolling_boulder_trap),
465         g_FILLER(S_sleeping_gas_trap),
466         g_FILLER(S_rust_trap),
467 /*50*/  g_FILLER(S_fire_trap),
468         g_FILLER(S_pit),
469         g_FILLER(S_spiked_pit),
470         g_FILLER(S_hole),
471         g_FILLER(S_trap_door),
472         g_FILLER(S_teleportation_trap),
473         g_FILLER(S_level_teleporter),
474         g_FILLER(S_magic_portal),
475         g_FILLER(S_web),        /* 0xbd, \E)3: meta-=, int'l currency */
476         g_FILLER(S_statue_trap),
477 /*60*/  g_FILLER(S_magic_trap),
478         g_FILLER(S_anti_magic_trap),
479         g_FILLER(S_polymorph_trap),
480         0xf8,   /* S_vbeam:     meta-x, vertical rule */
481         0xf1,   /* S_hbeam:     meta-q, horizontal rule */
482         g_FILLER(S_lslant),
483         g_FILLER(S_rslant),
484         g_FILLER(S_digbeam),
485         g_FILLER(S_flashbeam),
486         g_FILLER(S_boomleft),
487 /*70*/  g_FILLER(S_boomright),
488         g_FILLER(S_ss1),
489         g_FILLER(S_ss2),
490         g_FILLER(S_ss3),
491         g_FILLER(S_ss4),
492         g_FILLER(S_sw_tl),
493         0xef,   /* S_sw_tc:     meta-o, high horizontal line */
494         g_FILLER(S_sw_tr),
495         0xf8,   /* S_sw_ml:     meta-x, vertical rule */
496         0xf8,   /* S_sw_mr:     meta-x, vertical rule */
497 /*80*/  g_FILLER(S_sw_bl),
498         0xf3,   /* S_sw_bc:     meta-s, low horizontal line */
499         g_FILLER(S_sw_br),
500         g_FILLER(S_explode1),
501         0xef,   /* S_explode2:  meta-o, high horizontal line */
502         g_FILLER(S_explode3),
503         0xf8,   /* S_explode4:  meta-x, vertical rule */
504         g_FILLER(S_explode5),
505         0xf8,   /* S_explode6:  meta-x, vertical rule */
506         g_FILLER(S_explode7),
507 /*90*/  0xf3,   /* S_explode8:  meta-s, low horizontal line */
508         g_FILLER(S_explode9)
509 };
510 #endif  /* TERMLIB */
511
512 #ifdef MAC_GRAPHICS_ENV
513 static uchar mac_graphics[MAXPCHARS] = {
514 /* 0*/  g_FILLER(S_stone),
515         0xba,   /* S_vwall */
516         0xcd,   /* S_hwall */
517         0xc9,   /* S_tlcorn */
518         0xbb,   /* S_trcorn */
519         0xc8,   /* S_blcorn */
520         0xbc,   /* S_brcorn */
521         0xce,   /* S_crwall */
522         0xca,   /* S_tuwall */
523         0xcb,   /* S_tdwall */
524 /*10*/  0xb9,   /* S_tlwall */
525         0xcc,   /* S_trwall */
526         0xb0,   /* S_ndoor */
527         0xee,   /* S_vodoor */
528         0xee,   /* S_hodoor */
529         0xef,   /* S_vcdoor */
530         0xef,   /* S_hcdoor */
531         0xf0,   /* S_bars:      equivalency symbol */
532         0xf1,   /* S_tree:      plus-or-minus */
533         g_FILLER(S_Room),
534 /*20*/  0xB0,   /* S_corr */
535         g_FILLER(S_litcorr),
536         g_FILLER(S_upstair),
537         g_FILLER(S_dnstair),
538         g_FILLER(S_upladder),
539         g_FILLER(S_dnladder),
540         g_FILLER(S_altar),
541         0xef,   /* S_grave:     same as open door */
542         g_FILLER(S_throne),
543         g_FILLER(S_sink),
544 /*30*/  g_FILLER(S_fountain),
545         0xe0,   /* S_pool */
546         g_FILLER(S_ice),
547         g_FILLER(S_lava),
548         g_FILLER(S_vodbridge),
549         g_FILLER(S_hodbridge),
550         g_FILLER(S_vcdbridge),
551         g_FILLER(S_hcdbridge),
552         g_FILLER(S_air),
553         g_FILLER(S_cloud),
554 /*40*/  g_FILLER(S_water),
555         g_FILLER(S_arrow_trap),
556         g_FILLER(S_dart_trap),
557         g_FILLER(S_falling_rock_trap),
558         g_FILLER(S_squeaky_board),
559         g_FILLER(S_bear_trap),
560         g_FILLER(S_land_mine),
561         g_FILLER(S_rolling_boulder_trap),
562         g_FILLER(S_sleeping_gas_trap),
563         g_FILLER(S_rust_trap),
564 /*50*/  g_FILLER(S_fire_trap),
565         g_FILLER(S_pit),
566         g_FILLER(S_spiked_pit),
567         g_FILLER(S_hole),
568         g_FILLER(S_trap_door),
569         g_FILLER(S_teleportation_trap),
570         g_FILLER(S_level_teleporter),
571         g_FILLER(S_magic_portal),
572         g_FILLER(S_web),
573         g_FILLER(S_statue_trap),
574 /*60*/  g_FILLER(S_magic_trap),
575         g_FILLER(S_anti_magic_trap),
576         g_FILLER(S_polymorph_trap),
577         g_FILLER(S_vbeam),
578         g_FILLER(S_hbeam),
579         g_FILLER(S_lslant),
580         g_FILLER(S_rslant),
581         g_FILLER(S_digbeam),
582         g_FILLER(S_flashbeam),
583         g_FILLER(S_boomleft),
584 /*70*/  g_FILLER(S_boomright),
585         g_FILLER(S_ss1),
586         g_FILLER(S_ss2),
587         g_FILLER(S_ss3),
588         g_FILLER(S_ss4),
589         g_FILLER(S_sw_tl),
590         g_FILLER(S_sw_tc),
591         g_FILLER(S_sw_tr),
592         g_FILLER(S_sw_ml),
593         g_FILLER(S_sw_mr),
594 /*80*/  g_FILLER(S_sw_bl),
595         g_FILLER(S_sw_bc),
596         g_FILLER(S_sw_br),
597         g_FILLER(S_explode1),
598         g_FILLER(S_explode2),
599         g_FILLER(S_explode3),
600         g_FILLER(S_explode4),
601         g_FILLER(S_explode5),
602         g_FILLER(S_explode6),
603         g_FILLER(S_explode7),
604 /*90*/  g_FILLER(S_explode8),
605         g_FILLER(S_explode9)
606 };
607 #endif  /* MAC_GRAPHICS_ENV */
608
609 #ifdef PC9800
610 void NDECL((*ascgraphics_mode_callback)) = 0;   /* set in tty_start_screen() */
611 #endif
612
613 /*
614  * Convert the given character to an object class.  If the character is not
615  * recognized, then MAXOCLASSES is returned.  Used in detect.c invent.c,
616  * options.c, pickup.c, sp_lev.c, and lev_main.c.
617  */
618 int
619 def_char_to_objclass(ch)
620     char ch;
621 {
622     int i;
623     for (i = 1; i < MAXOCLASSES; i++)
624         if (ch == def_oc_syms[i]) break;
625     return i;
626 }
627
628 /*
629  * Convert a character into a monster class.  This returns the _first_
630  * match made.  If there are are no matches, return MAXMCLASSES.
631  */
632 int
633 def_char_to_monclass(ch)
634     char ch;
635 {
636     int i;
637     for (i = 1; i < MAXMCLASSES; i++)
638         if (def_monsyms[i] == ch) break;
639     return i;
640 }
641
642 void
643 assign_graphics(graph_chars, glth, maxlen, offset)
644 register uchar *graph_chars;
645 int glth, maxlen, offset;
646 {
647     register int i;
648
649     for (i = 0; i < maxlen; i++)
650         showsyms[i+offset] = (((i < glth) && graph_chars[i]) ?
651                        graph_chars[i] : defsyms[i+offset].sym);
652 }
653
654 void
655 switch_graphics(gr_set_flag)
656 int gr_set_flag;
657 {
658     switch (gr_set_flag) {
659         default:
660         case ASCII_GRAPHICS:
661             assign_graphics((uchar *)0, 0, MAXPCHARS, 0);
662 #ifdef PC9800
663             if (ascgraphics_mode_callback) (*ascgraphics_mode_callback)();
664 #endif
665             break;
666 #ifdef ASCIIGRAPH
667         case IBM_GRAPHICS:
668 /*
669  * Use the nice IBM Extended ASCII line-drawing characters (codepage 437).
670  *
671  * OS/2 defaults to a multilingual character set (codepage 850, corresponding
672  * to the ISO 8859 character set.  We should probably do a VioSetCp() call to
673  * set the codepage to 437.
674  */
675             iflags.IBMgraphics = TRUE;
676             iflags.DECgraphics = FALSE;
677             assign_graphics(ibm_graphics, SIZE(ibm_graphics), MAXPCHARS, 0);
678 #ifdef PC9800
679             if (ibmgraphics_mode_callback) (*ibmgraphics_mode_callback)();
680 #endif
681             break;
682 #endif /* ASCIIGRAPH */
683 #ifdef TERMLIB
684         case DEC_GRAPHICS:
685 /*
686  * Use the VT100 line drawing character set.
687  */
688             iflags.DECgraphics = TRUE;
689             iflags.IBMgraphics = FALSE;
690             assign_graphics(dec_graphics, SIZE(dec_graphics), MAXPCHARS, 0);
691             if (decgraphics_mode_callback) (*decgraphics_mode_callback)();
692             break;
693 #endif /* TERMLIB */
694 #ifdef MAC_GRAPHICS_ENV
695         case MAC_GRAPHICS:
696             assign_graphics(mac_graphics, SIZE(mac_graphics), MAXPCHARS, 0);
697             break;
698 #endif
699         }
700     return;
701 }
702
703
704 #ifdef REINCARNATION
705
706 /*
707  * saved display symbols for objects & features.
708  */
709 static uchar save_oc_syms[MAXOCLASSES] = DUMMY;
710 static uchar save_showsyms[MAXPCHARS]  = DUMMY;
711 static uchar save_monsyms[MAXPCHARS]   = DUMMY;
712
713 static const uchar r_oc_syms[MAXOCLASSES] = {
714 /* 0*/  '\0',
715         ILLOBJ_SYM,
716         WEAPON_SYM,
717         ']',                    /* armor */
718         RING_SYM,
719 /* 5*/  ',',                    /* amulet */
720         TOOL_SYM,
721         ':',                    /* food */
722         POTION_SYM,
723         SCROLL_SYM,
724 /*10*/  SPBOOK_SYM,
725         WAND_SYM,
726         GEM_SYM,                /* gold -- yes it's the same as gems */
727         GEM_SYM,
728         ROCK_SYM,
729 /*15*/  BALL_SYM,
730         CHAIN_SYM,
731         VENOM_SYM
732 };
733
734 # ifdef ASCIIGRAPH
735 /* Rogue level graphics.  Under IBM graphics mode, use the symbols that were
736  * used for Rogue on the IBM PC.  Unfortunately, this can't be completely
737  * done because some of these are control characters--armor and rings under
738  * DOS, and a whole bunch of them under Linux.  Use the TTY Rogue characters
739  * for those cases.
740  */
741 static const uchar IBM_r_oc_syms[MAXOCLASSES] = {       /* a la EPYX Rogue */
742 /* 0*/  '\0',
743         ILLOBJ_SYM,
744 #  if defined(MSDOS) || defined(OS2) || ( defined(WIN32) && !defined(MSWIN_GRAPHICS) )
745         0x18,                   /* weapon: up arrow */
746 /*      0x0a, */ ARMOR_SYM,     /* armor:  Vert rect with o */
747 /*      0x09, */ RING_SYM,      /* ring:   circle with arrow */
748 /* 5*/  0x0c,                   /* amulet: "female" symbol */
749         TOOL_SYM,
750         0x05,                   /* food:   club (as in cards) */
751         0xad,                   /* potion: upside down '!' */
752         0x0e,                   /* scroll: musical note */
753 /*10*/  SPBOOK_SYM,
754         0xe7,                   /* wand:   greek tau */
755         0x0f,                   /* gold:   yes it's the same as gems */
756         0x0f,                   /* gems:   fancy '*' */
757 #  else
758         ')',                    /* weapon  */
759         ARMOR_SYM,              /* armor */
760         RING_SYM,               /* ring */
761 /* 5*/  ',',                    /* amulet  */
762         TOOL_SYM,
763         ':',                    /* food    */
764         0xad,                   /* potion: upside down '!' */
765         SCROLL_SYM,             /* scroll  */
766 /*10*/  SPBOOK_SYM,
767         0xe7,                   /* wand:   greek tau */
768         GEM_SYM,                /* gold:   yes it's the same as gems */
769         GEM_SYM,                /* gems    */
770 #  endif
771         ROCK_SYM,
772 /*15*/  BALL_SYM,
773         CHAIN_SYM,
774         VENOM_SYM
775 };
776 # endif /* ASCIIGRAPH */
777
778 void
779 assign_rogue_graphics(is_rlevel)
780 boolean is_rlevel;
781 {
782     /* Adjust graphics display characters on Rogue levels */
783
784     if (is_rlevel) {
785         register int i;
786
787         (void) memcpy((genericptr_t)save_showsyms,
788                       (genericptr_t)showsyms, sizeof showsyms);
789         (void) memcpy((genericptr_t)save_oc_syms,
790                       (genericptr_t)oc_syms, sizeof oc_syms);
791         (void) memcpy((genericptr_t)save_monsyms,
792                       (genericptr_t)monsyms, sizeof monsyms);
793
794         /* Use a loop: char != uchar on some machines. */
795         for (i = 0; i < MAXMCLASSES; i++)
796             monsyms[i] = def_monsyms[i];
797 # if defined(ASCIIGRAPH) && !defined(MSWIN_GRAPHICS)
798         if (iflags.IBMgraphics
799 #  if defined(USE_TILES) && defined(MSDOS)
800                 && !iflags.grmode
801 #  endif
802                 )
803             monsyms[S_HUMAN] = 0x01; /* smiley face */
804 # endif
805         for (i = 0; i < MAXPCHARS; i++)
806             showsyms[i] = defsyms[i].sym;
807
808 /*
809  * Some day if these rogue showsyms get much more extensive than this,
810  * we may want to create r_showsyms, and IBM_r_showsyms arrays to hold
811  * all of this info and to simply initialize it via a for() loop like r_oc_syms.
812  */
813
814 # ifdef ASCIIGRAPH
815         if (!iflags.IBMgraphics
816 #  if defined(USE_TILES) && defined(MSDOS)
817                 || iflags.grmode
818 #  endif
819                                 ) {
820 # endif
821             showsyms[S_vodoor]  = showsyms[S_hodoor]  = showsyms[S_ndoor] = '+';
822             showsyms[S_upstair] = showsyms[S_dnstair] = '%';
823 # ifdef ASCIIGRAPH
824         } else {
825             /* a la EPYX Rogue */
826             showsyms[S_vwall]   = 0xba; /* all walls now use    */
827             showsyms[S_hwall]   = 0xcd; /* double line graphics */
828             showsyms[S_tlcorn]  = 0xc9;
829             showsyms[S_trcorn]  = 0xbb;
830             showsyms[S_blcorn]  = 0xc8;
831             showsyms[S_brcorn]  = 0xbc;
832             showsyms[S_crwall]  = 0xce;
833             showsyms[S_tuwall]  = 0xca;
834             showsyms[S_tdwall]  = 0xcb;
835             showsyms[S_tlwall]  = 0xb9;
836             showsyms[S_trwall]  = 0xcc;
837             showsyms[S_ndoor]   = 0xce;
838             showsyms[S_vodoor]  = 0xce;
839             showsyms[S_hodoor]  = 0xce;
840             showsyms[S_room]    = 0xfa; /* centered dot */
841             showsyms[S_corr]    = 0xb1;
842             showsyms[S_litcorr] = 0xb2;
843             showsyms[S_upstair] = 0xf0; /* Greek Xi */
844             showsyms[S_dnstair] = 0xf0;
845 #ifndef MSWIN_GRAPHICS
846             showsyms[S_arrow_trap] = 0x04; /* diamond (cards) */
847             showsyms[S_dart_trap] = 0x04;
848             showsyms[S_falling_rock_trap] = 0x04;
849             showsyms[S_squeaky_board] = 0x04;
850             showsyms[S_bear_trap] = 0x04;
851             showsyms[S_land_mine] = 0x04;
852             showsyms[S_rolling_boulder_trap] = 0x04;
853             showsyms[S_sleeping_gas_trap] = 0x04;
854             showsyms[S_rust_trap] = 0x04;
855             showsyms[S_fire_trap] = 0x04;
856             showsyms[S_pit] = 0x04;
857             showsyms[S_spiked_pit] = 0x04;
858             showsyms[S_hole] = 0x04;
859             showsyms[S_trap_door] = 0x04;
860             showsyms[S_teleportation_trap] = 0x04;
861             showsyms[S_level_teleporter] = 0x04;
862             showsyms[S_magic_portal] = 0x04;
863             showsyms[S_web] = 0x04;
864             showsyms[S_statue_trap] = 0x04;
865             showsyms[S_magic_trap] = 0x04;
866             showsyms[S_anti_magic_trap] = 0x04;
867             showsyms[S_polymorph_trap] = 0x04;
868 #endif
869         }
870 #endif /* ASCIIGRAPH */
871
872         for (i = 0; i < MAXOCLASSES; i++) {
873 #ifdef ASCIIGRAPH
874             if (iflags.IBMgraphics
875 # if defined(USE_TILES) && defined(MSDOS)
876                 && !iflags.grmode
877 # endif
878                 )
879                 oc_syms[i] = IBM_r_oc_syms[i];
880             else
881 #endif /* ASCIIGRAPH */
882                 oc_syms[i] = r_oc_syms[i];
883         }
884 #if defined(MSDOS) && defined(USE_TILES)
885         if (iflags.grmode) tileview(FALSE);
886 #endif
887     } else {
888         (void) memcpy((genericptr_t)showsyms,
889                       (genericptr_t)save_showsyms, sizeof showsyms);
890         (void) memcpy((genericptr_t)oc_syms,
891                       (genericptr_t)save_oc_syms, sizeof oc_syms);
892         (void) memcpy((genericptr_t)monsyms,
893                       (genericptr_t)save_monsyms, sizeof monsyms);
894 #if defined(MSDOS) && defined(USE_TILES)
895         if (iflags.grmode) tileview(TRUE);
896 #endif
897     }
898 }
899 #endif /* REINCARNATION */
900
901 /*drawing.c*/