summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/viewchar.cc
blob: 988be62e15fd26e7f21125f7ba541ed009b73da6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "AppHdr.h"

#include "viewchar.h"

#include "feature.h"
#include "options.h"
#include "unicode.h"

// For order and meaning of symbols, see dungeon_char_type in enum.h.
static const ucs_t dchar_table[ NUM_CSET ][ NUM_DCHAR_TYPES ] =
{
    // CSET_DEFAULT
    // It must be limited to stuff present both in CP437 and WGL4.
    {
    //       ▓
        '#', 0x2593, '*', '.', ',', '\'', '+', '^', '>', '<',
    //            ∩       ⌠       ≈
        '#', '_', 0x2229, 0x2320, 0x2248, '8', '{',
#if defined(TARGET_OS_WINDOWS) && !defined(USE_TILE_LOCAL)
    //  ⌂
        0x2302, // CP437 but "optional" in WGL4
#else
    //  ∆
        0x2206, // WGL4 and DEC
#endif
    //       φ
        '0', 0x03C6, ')', '[', '/', '%', '?', '=', '!', '(',
    //                                §     ♣       ©
        ':', '|', '}', '%', '$', '"', 0xA7, 0x2663, 0xA9,
    //                                     ÷
        ' ', '!', '#', '%', '+', ')', '*', 0xF7,       // space .. fired_burst
        '/', '=', '?', 'X', '[', '`', '#',             // fi_stick .. explosion
    //  ═       ║       ╔       ╗       ╚       ╝
        0x2550, 0x2551, 0x2554, 0x2557, 0x255a, 0x255d,
    },
    // CSET_ASCII
    {
        '#', '#', '*', '.', ',', '\'', '+', '^', '>', '<',  // wall .. stairs up
        '#', '_', '\\', '}', '~', '8', '{', '{',       // grate .. item detect
        '{', '}', ')', '[', '/', '%', '?', '=', '!', '(',   // orb .. missile
        ':', '|', '}', '%', '$', '"', '0', '7', '^',   // book .. teleporter
        ' ', '!', '#', '%', ':', ')', '*', '+',        // space .. fired_burst
        '/', '=', '?', 'X', '[', '`', '#',             // fi_stick .. explosion
        '-', '|', '+', '+', '+', '+',
    },

    // CSET_IBM - this is ANSI 437
    {
    //  ▒       ▓       ░       ∙       ·     '     ■              // wall .. stairs up
        0x2592, 0x2593, 0x2591, 0x2219, 0xb7, '\'', 0x25a0, '^', '>', '<',
    //       ▄       ∩       ⌠       ≈
        '#', 0x2584, 0x2229, 0x2320, 0x2248, '8', '{', '{',        // grate .. item detect
    //       φ
        '0', 0x03C6, ')', '[', '/', '%', '?', '=', '!', '(',       // orb .. missile
    //  ∞       \                              ♣       Ω
        0x221e, '\\', '}', '%', '$', '"', '#', 0x2663, 0x3a9,      // book .. teleporter
        ' ', '!', '#', '%', '+', ')', '*', 0xF7,                   // space .. fired_burst
        '/', '=', '?', 'X', '[', '`', '#',                         // fi_stick .. explosion
    //  ═       ║       ╔       ╗       ╚       ╝
        0x2550, 0x2551, 0x2554, 0x2557, 0x255a, 0x255d,
    },

    // CSET_DEC
    // It's better known as "vt100 line drawing characters".
    {
    //  ▒       █       ♦       ·          '     ┼     // wall .. stairs up
        0x2592, 0x2588, 0x2666, 0xb7, ':', '\'', 0x253c, '^', '>', '<',
    //       π      ¶     §     »          →       ¨
        '#', 0x3c0, 0xb6, 0xa7, 0xbb, '8', 0x2192, 0xa8,        // grate .. item detect
        '0', '}', ')', '[', '/', '%', '?', '=', '!', '(',   // orb .. missile
        ':', '\\', '}', '%', '$', '"', '#', '7', '^',  // book .. teleporter
        ' ', '!', '#', '%', '+', ')', '*', '+',        // space .. fired_burst
        '/', '=', '?', 'X', '[', '`', '#',             // fi_stick .. explosion
    //  ─       │       ┌       ┐       └       ┘
        0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518,
    },

    // CSET_OLD_UNICODE
    /* Beware, some popular terminals (PuTTY, xterm) are incapable of coping with
       the lack of a character in the chosen font, and most popular fonts have a
       quite limited repertoire.  A subset that is reasonably likely to be present
       is https://en.wikipedia.org/wiki/WGL4; we could provide a richer alternate
       set for those on more capable terminals under a different name.
    */
    {
    //  ▒       ▓       ░       ·     ◦       '     ◼
        0x2592, 0x2593, 0x2591, 0xB7, 0x25E6, '\'', 0x25FC, '^', '>', '<',
    //            ∩       ⌠       ≈                 ∆
        '#', '_', 0x2229, 0x2320, 0x2248, '8', '{', 0x2206,
        '0', '}', ')', '[', '/', '%', '?', '=', '!', '(',
    //  ∞                                §     ♣       ©
        0x221E, '|', '}', '%', '$', '"', 0xA7, 0x2663, 0xA9,
    //                                     ÷
        ' ', '!', '#', '%', '+', ')', '*', 0xF7,       // space .. fired_burst
        '/', '=', '?', 'X', '[', '`', '#',             // fi_stick .. explosion
    //  ═       ║       ╔       ╗       ╚       ╝
        0x2550, 0x2551, 0x2554, 0x2557, 0x255a, 0x255d,
    },
};

dungeon_char_type dchar_by_name(const string &name)
{
    const char *dchar_names[] =
    {
        "wall", "permawall", "wall_magic", "floor", "floor_magic", "door_open",
        "door_closed", "trap", "stairs_down", "stairs_up",
        "grate", "altar", "arch", "fountain", "wavy", "statue",
        "invis_exposed", "item_detected",
        "item_orb", "item_rune", "item_weapon", "item_armour", "item_wand", "item_food",
        "item_scroll", "item_ring", "item_potion", "item_missile", "item_book",
        "item_stave", "item_miscellany", "item_corpse", "item_gold",
        "item_amulet", "cloud", "tree", "teleporter",
        "space", "fired_flask", "fired_bolt", "fired_chunk", "fired_book",
        "fired_weapon", "fired_zap", "fired_burst", "fired_stick",
        "fired_trinket", "fired_scroll", "fired_debug", "fired_armour",
        "fired_missile", "explosion", "frame_horiz", "frame_vert",
        "frame_top_left", "frame_top_right", "frame_bottom_left",
        "frame_bottom_right",
    };
    COMPILE_CHECK(ARRAYSZ(dchar_names) == NUM_DCHAR_TYPES);

    for (unsigned i = 0; i < ARRAYSZ(dchar_names); ++i)
        if (dchar_names[i] == name)
            return dungeon_char_type(i);

    return NUM_DCHAR_TYPES;
}

void init_char_table(char_set_type set)
{
    for (int i = 0; i < NUM_DCHAR_TYPES; i++)
    {
        ucs_t c;
        if (Options.cset_override[i])
            c = Options.cset_override[i];
        else
            c = dchar_table[set][i];
        if (wcwidth(c) != 1)
            c = dchar_table[CSET_ASCII][i];
        Options.char_table[i] = c;
    }
}

ucs_t dchar_glyph(dungeon_char_type dchar)
{
    if (dchar >= 0 && dchar < NUM_DCHAR_TYPES)
        return Options.char_table[dchar];
    else
        return 0;
}

string stringize_glyph(ucs_t glyph)
{
    char buf[5];
    buf[wctoutf8(buf, glyph)] = 0;

    return buf;
}

dungeon_char_type get_feature_dchar(dungeon_feature_type feat)
{
    return get_feature_def(feat).dchar;
}