Apply the new ground_level method.
[crawl.git] / crawl-ref / source / feature.cc
blob4813ef8c5f9c2d23bc9bcdcdf829474776026992
1 #include "AppHdr.h"
3 #include "feature.h"
5 #include "colour.h"
6 #include "debug.h"
7 #include "options.h"
8 #include "show.h"
10 typedef std::map<show_type, feature_def> feat_map;
11 static feat_map Features;
13 const feature_def &get_feature_def(show_type object)
15 // If this is a monster that is hidden explicitly, show items if
16 // any instead, or the base feature if there are no items.
17 if (object.cls == SH_MONSTER)
18 object.cls = (object.item != SHOW_ITEM_NONE)? SH_ITEM : SH_FEATURE;
19 return (Features[object]);
22 const feature_def &get_feature_def(dungeon_feature_type feat)
24 ASSERT(feat < NUM_FEATURES);
25 show_type object;
26 object.cls = SH_FEATURE;
27 object.feat = feat;
28 return (Features[object]);
31 void apply_feature_overrides()
33 for (int i = 0, size = Options.feature_overrides.size(); i < size; ++i)
35 const feature_override &fov = Options.feature_overrides[i];
36 const feature_def &ofeat = fov.override;
37 feature_def &feat = Features[fov.object];
39 if (ofeat.symbol)
40 feat.symbol = ofeat.symbol;
41 if (ofeat.magic_symbol)
42 feat.magic_symbol = ofeat.magic_symbol;
43 if (ofeat.colour)
44 feat.colour = ofeat.colour;
45 if (ofeat.map_colour)
46 feat.map_colour = ofeat.map_colour;
47 if (ofeat.seen_colour)
48 feat.seen_colour = ofeat.seen_colour;
49 if (ofeat.seen_em_colour)
50 feat.seen_em_colour = ofeat.seen_em_colour;
51 if (ofeat.em_colour)
52 feat.em_colour = ofeat.em_colour;
56 static void _init_feat(feature_def &f, dungeon_feature_type feat)
58 switch(feat)
60 case DNGN_UNSEEN:
61 default:
62 break;
64 case DNGN_ROCK_WALL:
65 case DNGN_SLIMY_WALL:
66 case DNGN_PERMAROCK_WALL:
67 f.dchar = DCHAR_WALL;
68 f.colour = ETC_ROCK;
69 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
70 f.minimap = MF_WALL;
71 break;
73 case DNGN_STONE_WALL:
74 f.dchar = DCHAR_WALL;
75 f.colour = ETC_STONE;
76 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
77 f.minimap = MF_WALL;
78 break;
80 case DNGN_CLEAR_ROCK_WALL:
81 case DNGN_CLEAR_STONE_WALL:
82 case DNGN_CLEAR_PERMAROCK_WALL:
83 f.dchar = DCHAR_WALL;
84 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
85 f.colour = LIGHTCYAN;
86 f.minimap = MF_WALL;
87 break;
89 case DNGN_GRATE:
90 f.dchar = DCHAR_GRATE;
91 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
92 f.colour = LIGHTBLUE;
93 f.minimap = MF_WALL;
94 break;
96 case DNGN_TREE:
97 f.dchar = DCHAR_TREE;
98 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
99 f.colour = ETC_TREE;
100 f.minimap = MF_WALL;
101 break;
103 case DNGN_SWAMP_TREE:
104 f.dchar = DCHAR_TREE;
105 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
106 f.colour = ETC_SWAMP_TREE;
107 f.minimap = MF_WALL;
108 break;
110 case DNGN_OPEN_SEA:
111 f.dchar = DCHAR_WALL;
112 f.colour = BLUE;
113 f.minimap = MF_WATER;
114 break;
116 case DNGN_OPEN_DOOR:
117 f.dchar = DCHAR_DOOR_OPEN;
118 f.colour = LIGHTGREY;
119 f.minimap = MF_DOOR;
120 break;
122 case DNGN_CLOSED_DOOR:
123 case DNGN_DETECTED_SECRET_DOOR:
124 f.dchar = DCHAR_DOOR_CLOSED;
125 f.colour = LIGHTGREY;
126 f.minimap = MF_DOOR;
127 break;
129 case DNGN_METAL_WALL:
130 f.dchar = DCHAR_WALL;
131 f.colour = CYAN;
132 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
133 f.minimap = MF_WALL;
134 break;
136 case DNGN_SECRET_DOOR:
137 // Note: get_secret_door_appearance means this probably isn't used.
138 f.dchar = DCHAR_WALL;
139 f.colour = ETC_ROCK;
140 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
141 f.minimap = MF_WALL;
142 break;
144 case DNGN_GREEN_CRYSTAL_WALL:
145 f.dchar = DCHAR_WALL;
146 f.colour = GREEN;
147 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
148 f.minimap = MF_WALL;
149 break;
151 case DNGN_ORCISH_IDOL:
152 f.dchar = DCHAR_STATUE;
153 f.colour = BROWN; // same as clay golem, I hope that's okay
154 f.minimap = MF_WALL;
155 break;
157 case DNGN_WAX_WALL:
158 f.dchar = DCHAR_WALL;
159 f.colour = YELLOW;
160 f.magic_symbol = Options.char_table[ DCHAR_WALL_MAGIC ];
161 f.minimap = MF_WALL;
162 break;
164 case DNGN_GRANITE_STATUE:
165 f.dchar = DCHAR_STATUE;
166 f.colour = DARKGREY;
167 f.minimap = MF_WALL;
168 break;
170 case DNGN_LAVA:
171 f.dchar = DCHAR_WAVY;
172 f.colour = RED;
173 f.minimap = MF_LAVA;
174 break;
176 case DNGN_DEEP_WATER:
177 f.dchar = DCHAR_WAVY;
178 f.colour = BLUE;
179 f.minimap = MF_WATER;
180 break;
182 case DNGN_SHALLOW_WATER:
183 f.dchar = DCHAR_WAVY;
184 f.colour = CYAN;
185 f.minimap = MF_WATER;
186 break;
188 case DNGN_FLOOR:
189 f.dchar = DCHAR_FLOOR;
190 f.colour = ETC_FLOOR;
191 f.magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ];
192 f.minimap = MF_FLOOR;
193 break;
195 case DNGN_EXIT_HELL:
196 f.dchar = DCHAR_ARCH;
197 f.colour = LIGHTRED;
198 f.map_colour = LIGHTGREY;
199 f.seen_colour = LIGHTRED;
200 f.minimap = MF_STAIR_UP;
201 break;
203 case DNGN_ENTER_HELL:
204 f.dchar = DCHAR_ARCH;
205 f.colour = RED;
206 f.flags |= FFT_NOTABLE;
207 f.map_colour = LIGHTGREY;
208 f.seen_colour = RED;
209 f.minimap = MF_STAIR_BRANCH;
210 break;
212 case DNGN_TRAP_MECHANICAL:
213 f.colour = LIGHTCYAN;
214 f.dchar = DCHAR_TRAP;
215 f.map_colour = LIGHTCYAN;
216 f.minimap = MF_TRAP;
217 break;
219 case DNGN_TRAP_MAGICAL:
220 f.colour = MAGENTA;
221 f.dchar = DCHAR_TRAP;
222 f.map_colour = MAGENTA;
223 f.minimap = MF_TRAP;
224 break;
226 case DNGN_TRAP_NATURAL:
227 f.colour = BROWN;
228 f.dchar = DCHAR_TRAP;
229 f.map_colour = BROWN;
230 f.minimap = MF_TRAP;
231 break;
233 case DNGN_UNDISCOVERED_TRAP:
234 f.dchar = DCHAR_FLOOR;
235 f.colour = ETC_FLOOR;
236 f.magic_symbol = Options.char_table[ DCHAR_FLOOR_MAGIC ];
237 f.minimap = MF_FLOOR;
238 break;
240 case DNGN_ENTER_SHOP:
241 f.dchar = DCHAR_ARCH;
242 f.colour = YELLOW;
243 f.flags |= FFT_NOTABLE;
244 f.map_colour = LIGHTGREY;
245 f.seen_colour = YELLOW;
246 f.minimap = MF_FEATURE;
247 break;
249 case DNGN_ABANDONED_SHOP:
250 f.colour = LIGHTGREY;
251 f.dchar = DCHAR_ARCH;
252 f.map_colour = LIGHTGREY;
253 f.minimap = MF_FLOOR;
254 break;
256 case DNGN_ENTER_LABYRINTH:
257 f.dchar = DCHAR_ARCH;
258 f.colour = CYAN;
259 f.flags |= FFT_NOTABLE;
260 f.map_colour = LIGHTGREY;
261 f.seen_colour = CYAN;
262 f.minimap = MF_STAIR_BRANCH;
263 break;
265 case DNGN_ENTER_PORTAL_VAULT:
266 f.flags |= FFT_NOTABLE;
267 // fall through
269 case DNGN_EXIT_PORTAL_VAULT:
270 f.dchar = DCHAR_ARCH;
271 f.colour = ETC_SHIMMER_BLUE;
272 f.map_colour = LIGHTGREY;
273 f.seen_colour = ETC_SHIMMER_BLUE;
274 f.minimap = MF_STAIR_BRANCH;
275 break;
277 case DNGN_TEMP_PORTAL:
278 f.dchar = DCHAR_ARCH;
279 f.colour = ETC_SHIMMER_BLUE;
280 f.map_colour = LIGHTGREY;
281 f.colour = ETC_SHIMMER_BLUE;
282 f.minimap = MF_STAIR_UP;
283 break;
286 case DNGN_ESCAPE_HATCH_DOWN:
287 f.dchar = DCHAR_STAIRS_DOWN;
288 f.colour = BROWN;
289 f.map_colour = BROWN;
290 f.minimap = MF_STAIR_DOWN;
291 break;
293 case DNGN_STONE_STAIRS_DOWN_I:
294 case DNGN_STONE_STAIRS_DOWN_II:
295 case DNGN_STONE_STAIRS_DOWN_III:
296 f.dchar = DCHAR_STAIRS_DOWN;
297 f.colour = RED;
298 f.em_colour = WHITE;
299 f.map_colour = RED;
300 f.seen_em_colour = WHITE;
301 f.minimap = MF_STAIR_DOWN;
302 break;
304 case DNGN_ESCAPE_HATCH_UP:
305 f.dchar = DCHAR_STAIRS_UP;
306 f.colour = BROWN;
307 f.map_colour = BROWN;
308 f.minimap = MF_STAIR_UP;
309 break;
311 case DNGN_STONE_STAIRS_UP_I:
312 case DNGN_STONE_STAIRS_UP_II:
313 case DNGN_STONE_STAIRS_UP_III:
314 f.dchar = DCHAR_STAIRS_UP;
315 f.colour = GREEN;
316 f.map_colour = GREEN;
317 f.em_colour = WHITE;
318 f.seen_em_colour = WHITE;
319 f.minimap = MF_STAIR_UP;
320 break;
322 case DNGN_ENTER_DIS:
323 f.colour = CYAN;
324 f.dchar = DCHAR_ARCH;
325 f.flags |= FFT_NOTABLE;
326 f.map_colour = LIGHTGREY;
327 f.seen_colour = CYAN;
328 f.minimap = MF_STAIR_BRANCH;
329 break;
331 case DNGN_ENTER_GEHENNA:
332 f.colour = RED;
333 f.dchar = DCHAR_ARCH;
334 f.flags |= FFT_NOTABLE;
335 f.map_colour = LIGHTGREY;
336 f.seen_colour = RED;
337 f.minimap = MF_STAIR_BRANCH;
338 break;
340 case DNGN_ENTER_COCYTUS:
341 f.colour = LIGHTCYAN;
342 f.dchar = DCHAR_ARCH;
343 f.flags |= FFT_NOTABLE;
344 f.map_colour = LIGHTGREY;
345 f.seen_colour = LIGHTCYAN;
346 f.minimap = MF_STAIR_BRANCH;
347 break;
349 case DNGN_ENTER_TARTARUS:
350 f.colour = DARKGREY;
351 f.dchar = DCHAR_ARCH;
352 f.flags |= FFT_NOTABLE;
353 f.map_colour = LIGHTGREY;
354 f.seen_colour = DARKGREY;
355 f.minimap = MF_STAIR_BRANCH;
356 break;
358 case DNGN_ENTER_ABYSS:
359 f.colour = ETC_RANDOM;
360 f.dchar = DCHAR_ARCH;
361 f.flags |= FFT_NOTABLE;
362 f.map_colour = LIGHTGREY;
363 f.seen_colour = ETC_RANDOM;
364 f.minimap = MF_STAIR_BRANCH;
365 break;
367 case DNGN_EXIT_ABYSS:
368 f.colour = ETC_RANDOM;
369 f.dchar = DCHAR_ARCH;
370 f.map_colour = ETC_RANDOM;
371 f.minimap = MF_STAIR_BRANCH;
372 break;
374 case DNGN_STONE_ARCH:
375 f.colour = LIGHTGREY;
376 f.dchar = DCHAR_ARCH;
377 f.map_colour = LIGHTGREY;
378 f.minimap = MF_FLOOR;
379 break;
381 case DNGN_ENTER_PANDEMONIUM:
382 f.colour = LIGHTBLUE;
383 f.dchar = DCHAR_ARCH;
384 f.flags |= FFT_NOTABLE;
385 f.map_colour = LIGHTGREY;
386 f.seen_colour = LIGHTBLUE;
387 f.minimap = MF_STAIR_BRANCH;
388 break;
390 case DNGN_EXIT_PANDEMONIUM:
391 f.colour = LIGHTBLUE;
392 f.dchar = DCHAR_ARCH;
393 f.map_colour = LIGHTGREY;
394 f.seen_colour = LIGHTBLUE;
395 f.minimap = MF_STAIR_BRANCH;
396 break;
398 case DNGN_TRANSIT_PANDEMONIUM:
399 f.colour = LIGHTGREEN;
400 f.dchar = DCHAR_ARCH;
401 f.map_colour = LIGHTGREY;
402 f.seen_colour = LIGHTGREEN;
403 f.minimap = MF_STAIR_BRANCH;
404 break;
406 case DNGN_ENTER_DWARVEN_HALL:
407 case DNGN_ENTER_ORCISH_MINES:
408 case DNGN_ENTER_HIVE:
409 case DNGN_ENTER_LAIR:
410 case DNGN_ENTER_SLIME_PITS:
411 case DNGN_ENTER_VAULTS:
412 case DNGN_ENTER_CRYPT:
413 case DNGN_ENTER_HALL_OF_BLADES:
414 case DNGN_ENTER_TEMPLE:
415 case DNGN_ENTER_SNAKE_PIT:
416 case DNGN_ENTER_ELVEN_HALLS:
417 case DNGN_ENTER_TOMB:
418 case DNGN_ENTER_SWAMP:
419 case DNGN_ENTER_SHOALS:
420 f.colour = YELLOW;
421 f.dchar = DCHAR_STAIRS_DOWN;
422 f.flags |= FFT_NOTABLE;
423 f.map_colour = RED;
424 f.seen_colour = YELLOW;
425 f.minimap = MF_STAIR_BRANCH;
426 break;
428 case DNGN_ENTER_ZOT:
429 f.colour = MAGENTA;
430 f.dchar = DCHAR_ARCH;
431 f.flags |= FFT_NOTABLE;
432 f.map_colour = LIGHTGREY;
433 f.seen_colour = MAGENTA;
434 f.minimap = MF_STAIR_BRANCH;
435 break;
437 case DNGN_RETURN_FROM_DWARVEN_HALL:
438 case DNGN_RETURN_FROM_ORCISH_MINES:
439 case DNGN_RETURN_FROM_HIVE:
440 case DNGN_RETURN_FROM_LAIR:
441 case DNGN_RETURN_FROM_SLIME_PITS:
442 case DNGN_RETURN_FROM_VAULTS:
443 case DNGN_RETURN_FROM_CRYPT:
444 case DNGN_RETURN_FROM_HALL_OF_BLADES:
445 case DNGN_RETURN_FROM_TEMPLE:
446 case DNGN_RETURN_FROM_SNAKE_PIT:
447 case DNGN_RETURN_FROM_ELVEN_HALLS:
448 case DNGN_RETURN_FROM_TOMB:
449 case DNGN_RETURN_FROM_SWAMP:
450 case DNGN_RETURN_FROM_SHOALS:
451 f.colour = YELLOW;
452 f.dchar = DCHAR_STAIRS_UP;
453 f.map_colour = GREEN;
454 f.seen_colour = YELLOW;
455 f.minimap = MF_STAIR_BRANCH;
456 break;
458 case DNGN_RETURN_FROM_ZOT:
459 f.colour = MAGENTA;
460 f.dchar = DCHAR_ARCH;
461 f.map_colour = LIGHTGREY;
462 f.seen_colour = MAGENTA;
463 f.minimap = MF_STAIR_BRANCH;
464 break;
466 case DNGN_ALTAR_ZIN:
467 f.colour = LIGHTGREY;
468 f.dchar = DCHAR_ALTAR;
469 f.flags |= FFT_NOTABLE;
470 f.map_colour = DARKGREY;
471 f.seen_colour = LIGHTGREY;
472 f.minimap = MF_FEATURE;
473 break;
475 case DNGN_ALTAR_SHINING_ONE:
476 f.colour = YELLOW;
477 f.dchar = DCHAR_ALTAR;
478 f.flags |= FFT_NOTABLE;
479 f.map_colour = DARKGREY;
480 f.seen_colour = YELLOW;
481 f.minimap = MF_FEATURE;
482 break;
484 case DNGN_ALTAR_KIKUBAAQUDGHA:
485 f.colour = DARKGREY;
486 f.dchar = DCHAR_ALTAR;
487 f.flags |= FFT_NOTABLE;
488 f.map_colour = DARKGREY;
489 f.seen_colour = DARKGREY;
490 f.minimap = MF_FEATURE;
491 break;
493 case DNGN_ALTAR_YREDELEMNUL:
494 f.colour = ETC_UNHOLY;
495 f.dchar = DCHAR_ALTAR;
496 f.flags |= FFT_NOTABLE;
497 f.map_colour = DARKGREY;
498 f.seen_colour = ETC_UNHOLY;
499 f.minimap = MF_FEATURE;
500 break;
502 case DNGN_ALTAR_XOM:
503 f.colour = ETC_RANDOM;
504 f.dchar = DCHAR_ALTAR;
505 f.flags |= FFT_NOTABLE;
506 f.map_colour = DARKGREY;
507 f.seen_colour = ETC_RANDOM;
508 f.minimap = MF_FEATURE;
509 break;
511 case DNGN_ALTAR_VEHUMET:
512 f.colour = ETC_VEHUMET;
513 f.dchar = DCHAR_ALTAR;
514 f.flags |= FFT_NOTABLE;
515 f.map_colour = DARKGREY;
516 f.seen_colour = ETC_VEHUMET;
517 f.minimap = MF_FEATURE;
518 break;
520 case DNGN_ALTAR_OKAWARU:
521 f.colour = CYAN;
522 f.dchar = DCHAR_ALTAR;
523 f.flags |= FFT_NOTABLE;
524 f.map_colour = DARKGREY;
525 f.seen_colour = CYAN;
526 f.minimap = MF_FEATURE;
527 break;
529 case DNGN_ALTAR_MAKHLEB:
530 f.colour = ETC_FIRE;
531 f.dchar = DCHAR_ALTAR;
532 f.flags |= FFT_NOTABLE;
533 f.map_colour = DARKGREY;
534 f.seen_colour = ETC_FIRE;
535 f.minimap = MF_FEATURE;
536 break;
538 case DNGN_ALTAR_SIF_MUNA:
539 f.colour = BLUE;
540 f.dchar = DCHAR_ALTAR;
541 f.flags |= FFT_NOTABLE;
542 f.map_colour = DARKGREY;
543 f.seen_colour = BLUE;
544 f.minimap = MF_FEATURE;
545 break;
547 case DNGN_ALTAR_TROG:
548 f.colour = RED;
549 f.dchar = DCHAR_ALTAR;
550 f.flags |= FFT_NOTABLE;
551 f.map_colour = DARKGREY;
552 f.seen_colour = RED;
553 f.minimap = MF_FEATURE;
554 break;
556 case DNGN_ALTAR_NEMELEX_XOBEH:
557 f.colour = LIGHTMAGENTA;
558 f.dchar = DCHAR_ALTAR;
559 f.flags |= FFT_NOTABLE;
560 f.map_colour = DARKGREY;
561 f.seen_colour = LIGHTMAGENTA;
562 f.minimap = MF_FEATURE;
563 break;
565 case DNGN_ALTAR_ELYVILON:
566 f.colour = WHITE;
567 f.dchar = DCHAR_ALTAR;
568 f.flags |= FFT_NOTABLE;
569 f.map_colour = DARKGREY;
570 f.seen_colour = WHITE;
571 f.minimap = MF_FEATURE;
572 break;
574 case DNGN_ALTAR_LUGONU:
575 f.colour = MAGENTA;
576 f.dchar = DCHAR_ALTAR;
577 f.flags |= FFT_NOTABLE;
578 f.map_colour = DARKGREY;
579 f.seen_colour = MAGENTA;
580 f.minimap = MF_FEATURE;
581 break;
583 case DNGN_ALTAR_BEOGH:
584 f.colour = ETC_BEOGH;
585 f.dchar = DCHAR_ALTAR;
586 f.flags |= FFT_NOTABLE;
587 f.map_colour = DARKGREY;
588 f.seen_colour = ETC_BEOGH;
589 f.minimap = MF_FEATURE;
590 break;
592 case DNGN_ALTAR_JIYVA:
593 f.colour = ETC_SLIME;
594 f.dchar = DCHAR_ALTAR;
595 f.flags |= FFT_NOTABLE;
596 f.map_colour = DARKGREY;
597 f.seen_colour = ETC_SLIME;
598 f.minimap = MF_FEATURE;
599 break;
601 case DNGN_ALTAR_FEDHAS:
602 f.colour = GREEN;
603 f.dchar = DCHAR_ALTAR;
604 f.flags |= FFT_NOTABLE;
605 f.map_colour = DARKGREY;
606 f.seen_colour = GREEN;
607 f.minimap = MF_FEATURE;
608 break;
610 case DNGN_ALTAR_CHEIBRIADOS:
611 f.colour = LIGHTCYAN;
612 f.dchar = DCHAR_ALTAR;
613 f.flags |= FFT_NOTABLE;
614 f.map_colour = DARKGREY;
615 f.seen_colour = LIGHTCYAN;
616 f.minimap = MF_FEATURE;
617 break;
619 case DNGN_ALTAR_ASHENZARI:
620 f.colour = LIGHTRED;
621 f.dchar = DCHAR_ALTAR;
622 f.flags |= FFT_NOTABLE;
623 f.map_colour = DARKGREY;
624 f.seen_colour = LIGHTRED;
625 f.minimap = MF_FEATURE;
626 break;
628 case DNGN_FOUNTAIN_BLUE:
629 f.colour = BLUE;
630 f.dchar = DCHAR_FOUNTAIN;
631 f.minimap = MF_FEATURE;
632 break;
634 case DNGN_FOUNTAIN_SPARKLING:
635 f.colour = LIGHTBLUE;
636 f.dchar = DCHAR_FOUNTAIN;
637 f.minimap = MF_FEATURE;
638 break;
640 case DNGN_FOUNTAIN_BLOOD:
641 f.colour = RED;
642 f.dchar = DCHAR_FOUNTAIN;
643 f.minimap = MF_FEATURE;
644 break;
646 case DNGN_DRY_FOUNTAIN_BLUE:
647 case DNGN_DRY_FOUNTAIN_SPARKLING:
648 case DNGN_DRY_FOUNTAIN_BLOOD:
649 case DNGN_PERMADRY_FOUNTAIN:
650 f.colour = LIGHTGREY;
651 f.dchar = DCHAR_FOUNTAIN;
652 f.minimap = MF_FEATURE;
653 break;
656 if (feat == DNGN_ENTER_ORCISH_MINES || feat == DNGN_ENTER_SLIME_PITS
657 || feat == DNGN_ENTER_LABYRINTH)
659 f.flags |= FFT_EXAMINE_HINT;
663 static void _init_item(feature_def &f, show_item_type item)
665 f.minimap = MF_ITEM;
666 switch (item)
668 case SHOW_ITEM_DETECTED:
669 f.dchar = DCHAR_ITEM_DETECTED;
670 break;
672 case SHOW_ITEM_ORB:
673 f.dchar = DCHAR_ITEM_ORB;
674 break;
676 case SHOW_ITEM_WEAPON:
677 f.dchar = DCHAR_ITEM_WEAPON;
678 break;
680 case SHOW_ITEM_ARMOUR:
681 f.dchar = DCHAR_ITEM_ARMOUR;
682 break;
684 case SHOW_ITEM_WAND:
685 f.dchar = DCHAR_ITEM_WAND;
686 break;
688 case SHOW_ITEM_FOOD:
689 f.dchar = DCHAR_ITEM_FOOD;
690 break;
692 case SHOW_ITEM_SCROLL:
693 f.dchar = DCHAR_ITEM_SCROLL;
694 break;
696 case SHOW_ITEM_RING:
697 f.dchar = DCHAR_ITEM_RING;
698 break;
700 case SHOW_ITEM_POTION:
701 f.dchar = DCHAR_ITEM_POTION;
702 break;
704 case SHOW_ITEM_MISSILE:
705 f.dchar = DCHAR_ITEM_MISSILE;
706 break;
708 case SHOW_ITEM_BOOK:
709 f.dchar = DCHAR_ITEM_BOOK;
710 break;
712 case SHOW_ITEM_STAVE:
713 f.dchar = DCHAR_ITEM_STAVE;
714 break;
716 case SHOW_ITEM_MISCELLANY:
717 f.dchar = DCHAR_ITEM_MISCELLANY;
718 break;
720 case SHOW_ITEM_CORPSE:
721 f.dchar = DCHAR_ITEM_CORPSE;
722 break;
724 case SHOW_ITEM_GOLD:
725 f.dchar = DCHAR_ITEM_GOLD;
726 break;
728 case SHOW_ITEM_AMULET:
729 f.dchar = DCHAR_ITEM_AMULET;
730 break;
732 default:
733 break;
737 void init_show_table(void)
739 show_type obj;
740 for (int i = 0; i < NUM_FEATURES; i++)
742 obj.cls = SH_FEATURE;
743 obj.feat = static_cast<dungeon_feature_type>(i);
745 _init_feat(Features[obj], obj.feat);
748 obj.cls = SH_INVIS_EXPOSED;
749 Features[obj].dchar = DCHAR_INVIS_EXPOSED;
750 Features[obj].minimap = MF_MONS_HOSTILE;
752 for (int i = 0; i < NUM_SHOW_ITEMS; i++)
754 obj.cls = SH_ITEM;
755 obj.item = static_cast<show_item_type>(i);
757 _init_item(Features[obj], obj.item);
760 obj.cls = SH_CLOUD;
761 Features[obj].dchar = DCHAR_CLOUD;
762 Features[obj].minimap = MF_SKIP;
764 for (feat_map::iterator i = Features.begin(); i != Features.end(); ++i)
766 feature_def &f = i->second;
767 if (f.dchar != NUM_DCHAR_TYPES)
768 f.symbol = Options.char_table[f.dchar];
771 apply_feature_overrides();
773 for (feat_map::iterator i = Features.begin(); i != Features.end(); ++i)
775 feature_def &f = i->second;
776 if (!f.magic_symbol)
777 f.magic_symbol = f.symbol;
779 if (f.seen_colour == BLACK)
780 f.seen_colour = f.map_colour;
782 if (f.seen_em_colour == BLACK)
783 f.seen_em_colour = f.seen_colour;
785 if (f.em_colour == BLACK)
786 f.em_colour = f.colour;
790 dungeon_feature_type magic_map_base_feat(dungeon_feature_type feat)
792 const feature_def& fdef = get_feature_def(feat);
793 switch (fdef.dchar)
795 case DCHAR_STATUE:
796 return DNGN_GRANITE_STATUE;
797 case DCHAR_FLOOR:
798 case DCHAR_TRAP:
799 return DNGN_FLOOR;
800 case DCHAR_WAVY:
801 return DNGN_SHALLOW_WATER;
802 case DCHAR_ARCH:
803 return DNGN_ABANDONED_SHOP;
804 case DCHAR_FOUNTAIN:
805 return DNGN_FOUNTAIN_BLUE;
806 case DCHAR_WALL:
807 return DNGN_ROCK_WALL;
808 case DCHAR_ALTAR:
809 return DNGN_ALTAR_FIRST_GOD;
810 default:
811 // We could do more, e.g. map the different upstairs together.
812 return feat;