1 | /* SCCS Id: @(#)drawing.c 3.3 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 *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 *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 *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 | "spider", "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 | "yeti, ape or other large beast", "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 */
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 trap 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 invent.c, options.c,
616 | * 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(WIN32) || defined(OS2)
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 | # ifdef ASCIIGRAPH
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 | showsyms[S_arrow_trap] = 0x04; /* diamond (cards) */
846 | showsyms[S_dart_trap] = 0x04;
847 | showsyms[S_falling_rock_trap] = 0x04;
848 | showsyms[S_squeaky_board] = 0x04;
849 | showsyms[S_bear_trap] = 0x04;
850 | showsyms[S_land_mine] = 0x04;
851 | showsyms[S_rolling_boulder_trap] = 0x04;
852 | showsyms[S_sleeping_gas_trap] = 0x04;
853 | showsyms[S_rust_trap] = 0x04;
854 | showsyms[S_fire_trap] = 0x04;
855 | showsyms[S_pit] = 0x04;
856 | showsyms[S_spiked_pit] = 0x04;
857 | showsyms[S_hole] = 0x04;
858 | showsyms[S_trap_door] = 0x04;
859 | showsyms[S_teleportation_trap] = 0x04;
860 | showsyms[S_level_teleporter] = 0x04;
861 | showsyms[S_magic_portal] = 0x04;
862 | showsyms[S_web] = 0x04;
863 | showsyms[S_statue_trap] = 0x04;
864 | showsyms[S_magic_trap] = 0x04;
865 | showsyms[S_anti_magic_trap] = 0x04;
866 | showsyms[S_polymorph_trap] = 0x04;
867 | }
868 | #endif /* ASCIIGRAPH */
869 |
870 | for (i = 0; i < MAXOCLASSES; i++) {
871 | #ifdef ASCIIGRAPH
872 | if (iflags.IBMgraphics
873 | # if defined(USE_TILES) && defined(MSDOS)
874 | && !iflags.grmode
875 | # endif
876 | )
877 | oc_syms[i] = IBM_r_oc_syms[i];
878 | else
879 | #endif /* ASCIIGRAPH */
880 | oc_syms[i] = r_oc_syms[i];
881 | }
882 | #if defined(MSDOS) && defined(USE_TILES)
883 | if (iflags.grmode) tileview(FALSE);
884 | #endif
885 | } else {
886 | (void) memcpy((genericptr_t)showsyms,
887 | (genericptr_t)save_showsyms, sizeof showsyms);
888 | (void) memcpy((genericptr_t)oc_syms,
889 | (genericptr_t)save_oc_syms, sizeof oc_syms);
890 | (void) memcpy((genericptr_t)monsyms,
891 | (genericptr_t)save_monsyms, sizeof monsyms);
892 | #if defined(MSDOS) && defined(USE_TILES)
893 | if (iflags.grmode) tileview(TRUE);
894 | #endif
895 | }
896 | }
897 | #endif /* REINCARNATION */
898 |
899 | /*drawing.c*/