File: skill-menu.h

package info (click to toggle)
crawl 2%3A0.34.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 100,188 kB
  • sloc: cpp: 363,709; ansic: 27,765; javascript: 9,516; python: 8,463; perl: 3,293; java: 3,132; xml: 2,380; makefile: 1,835; sh: 611; objc: 250; cs: 15; sed: 9; lisp: 3
file content (210 lines) | stat: -rw-r--r-- 4,944 bytes parent folder | download | duplicates (2)
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/**
 * @file
 * @brief Skill menu.
**/

#pragma once

#include <vector>

#include "enum.h"
#include "menu.h"
#include "precision-menu.h"
#include "skills.h"

using std::vector;

// Skill Menu

enum skill_menu_flags
{
    SKMF_EXPERIENCE        = 1<<0,
    SKMF_SPECIAL           = SKMF_EXPERIENCE,

    SKMF_MANUAL            = 1<<1,
    SKMF_ENHANCED          = 1<<2,
    SKMF_REDUCED           = 1<<3,
    SKMF_CHANGED           = SKMF_ENHANCED | SKMF_REDUCED,

    SKMF_SKILL_ICONS       = 1<<4,
    SKMF_APTITUDE          = 1<<5,
    SKMF_SIMPLE            = 1<<6, // Simple mode for tutorial and hint mode.
    SKMF_HELP              = 1<<7,
    SKMF_SET_TARGET        = 1<<8,
};

// these need to both be negative, because positive ids are used by the
// skill selection buttons.
enum skill_menu_button
{
    // skip -1: it's the default value for MenuItem::m_item_id
    SKM_HELP = -2,
    SKM_CLEAR_TARGETS = -3,
    SKM_SET_TARGET = -4,
};

enum skill_menu_switch
{
    SKM_SWITCH_FIRST = -5,
    SKM_MODE  = SKM_SWITCH_FIRST,
    SKM_DO    = -6,
    SKM_SHOW  = -7,
    SKM_LEVEL = -8,
    SKM_VIEW  = -9,
};

class SkillMenu;

#ifdef USE_TILE_LOCAL
class SkillTextTileItem : public TextTileItem
{
public:
    SkillTextTileItem() {};
protected:
    bool handle_mouse(const wm_mouse_event& me) override;
};
#endif

class SkillMenuEntry
{
public:
    static menu_letter2 m_letter;

    SkillMenuEntry() {};
    SkillMenuEntry(coord_def coord);
    int get_id();
    TextItem* get_name_item() const;
    skill_type get_skill() const;
    bool is_selectable(bool keep_hotkey = true);
    bool is_set(int flag) const;
    bool mastered() const;
    void refresh(bool keep_hotkey);
    void set_display();
    void set_name(bool keep_hotkey);
    void set_skill(skill_type sk = SK_NONE);
    void set_cost();
    EditableTextItem *get_progress();

private:
    skill_type m_sk;

#ifdef USE_TILE_LOCAL
    SkillTextTileItem* m_name;
#else
    TextItem* m_name;
#endif
    NoSelectTextItem* m_level;
    EditableTextItem* m_progress;
    FormattedTextItem* m_aptitude;

    void _clear();
    COLOURS get_colour() const;
    string get_prefix();
    void set_aptitude();
    void set_level();
    void set_new_level();
    void set_points();
    void set_progress();
    void set_title();
    void set_training();
    void set_targets();
};

class SkillMenuSwitch : public FormattedTextItem
{
public:
    SkillMenuSwitch(string name, int hotkey);
    void add(skill_menu_state state);
    string get_help();
    string get_name(skill_menu_state state);
    skill_menu_state get_state();
    void set_state(skill_menu_state state);
    int size() const;
    bool toggle();
    void update();

private:
    string m_name;
    skill_menu_state m_state;
    vector<skill_menu_state> m_states;
};

static const int SK_ARR_LN  = (ndisplayed_skills - 1) / 2;
static const int SK_ARR_COL =  2;

class SkillMenu : public PrecisionMenu
{
public:
    SkillMenu();

    void clear_flag(int flag);
    void init(int flag, int region_height);
    void clear() override;
    bool is_set(int flag) const;
    void set_flag(int flag);
    void toggle_flag(int flag);

    void add_item(TextItem* item, const int size, coord_def &coord);
    void cancel_help();
    bool exit(bool just_reset = false);
#ifdef USE_TILE_LOCAL
    int get_line_height();
#endif
    int get_raw_skill_level(skill_type sk);
    int get_saved_skill_level(skill_type sk, bool real);
    skill_menu_state get_state(skill_menu_switch sw);
    void help();
    void clear_targets();
    void set_target_mode();
    void cancel_set_target();
    int read_skill_target(skill_type sk);
    void select(skill_type sk, int keyn);
    void toggle(skill_menu_switch sw);

    void init_experience();
    void finish_experience(bool experience_change);

private:
    MenuFreeform*        m_ff;
    BoxMenuHighlighter*  m_highlighter;

    int m_flags;
    coord_def m_min_coord;
    coord_def m_max_coord;
    coord_def m_pos;
#ifdef USE_TILE_LOCAL
    int line_height;
#endif

    SkillMenuEntry  m_skills[SK_ARR_LN][SK_ARR_COL];

    NoSelectTextItem*  m_title;
    FormattedTextItem* m_help;

    map<skill_menu_switch, SkillMenuSwitch*> m_switches;
    FormattedTextItem* m_help_button;
    FormattedTextItem* m_middle_button;
    FormattedTextItem* m_clear_targets_button;

    skill_state m_skill_backup;

    SkillMenuEntry* find_entry(skill_type sk);
    void init_flags();
    void init_button_row();
    void init_title();
    void init_switches();
    void refresh_display();
    void refresh_button_row();
    void refresh_names();
    void set_default_help();
    void set_help(string msg);
    void set_skills();
    void set_title();
    void shift_bottom_down();
    void show_description(skill_type sk);
    void toggle_practise(skill_type sk, int keyn);

    TextItem* find_closest_selectable(int start_ln, int col);
    void set_links();
    bool do_skill_enabled_check();
};