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
def_char_to_objclass(ch)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
def_char_to_monclass(ch)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
assign_graphics(graph_chars,glth,maxlen,offset)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
switch_graphics(gr_set_flag)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
assign_rogue_graphics(is_rlevel)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*/
902