00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SKILLS2_H
00009 #define SKILLS2_H
00010
00011 const int MAX_SKILL_ORDER = 100;
00012
00013 #include <queue>
00014 #include "enum.h"
00015 #include "menu.h"
00016 #include "player.h"
00017
00018 int get_skill_percentage(const skill_type x);
00019 const char *skill_name(skill_type which_skill);
00020 skill_type str_to_skill(const std::string &skill);
00021
00022 std::string skill_title(
00023 skill_type best_skill, uint8_t skill_lev,
00024
00025 int species = -1, int str = -1, int dex = -1, int god = -1);
00026 std::string skill_title_by_rank(
00027 skill_type best_skill, uint8_t skill_rank,
00028
00029 int species = -1, int str = -1, int dex = -1, int god = -1);
00030 unsigned get_skill_rank(unsigned skill_lev);
00031
00032 std::string player_title();
00033
00034 skill_type best_skill(skill_type min_skill, skill_type max_skill,
00035 skill_type excl_skill = SK_NONE);
00036 void init_skill_order();
00037
00038 void calc_mp();
00039 void calc_hp();
00040
00041 int species_apt(skill_type skill, species_type species = you.species);
00042 float species_apt_factor(skill_type sk, species_type sp = you.species);
00043 unsigned int skill_exp_needed(int lev);
00044 unsigned int skill_exp_needed(int lev, skill_type sk,
00045 species_type sp = you.species);
00046
00047 float crosstrain_bonus(skill_type sk);
00048 bool crosstrain_other(skill_type sk, bool show_zero);
00049 bool is_antitrained(skill_type sk);
00050 bool antitrain_other(skill_type sk, bool show_zero);
00051
00052 void skill_menu(bool reskilling = false);
00053 void wield_warning(bool newWeapon = true);
00054 bool is_invalid_skill(skill_type skill);
00055 void dump_skills(std::string &text);
00056 int skill_transfer_amount(skill_type sk);
00057 int transfer_skill_points(skill_type fsk, skill_type tsk, int skp_max,
00058 bool simu);
00059
00060 static const skill_type skill_display_order[] =
00061 {
00062 SK_TITLE,
00063 SK_FIGHTING, SK_SHORT_BLADES, SK_LONG_BLADES, SK_AXES,
00064 SK_MACES_FLAILS, SK_POLEARMS, SK_STAVES, SK_UNARMED_COMBAT,
00065
00066 SK_BLANK_LINE,
00067
00068 SK_BOWS, SK_CROSSBOWS, SK_THROWING, SK_SLINGS,
00069
00070 SK_BLANK_LINE,
00071
00072 SK_ARMOUR, SK_DODGING, SK_STEALTH, SK_SHIELDS,
00073
00074 SK_COLUMN_BREAK, SK_TITLE,
00075
00076 SK_STABBING, SK_TRAPS_DOORS,
00077
00078 SK_BLANK_LINE,
00079
00080 SK_SPELLCASTING, SK_CONJURATIONS, SK_HEXES, SK_CHARMS, SK_SUMMONINGS,
00081 SK_NECROMANCY, SK_TRANSLOCATIONS, SK_TRANSMUTATIONS,
00082 SK_FIRE_MAGIC, SK_ICE_MAGIC, SK_AIR_MAGIC, SK_EARTH_MAGIC, SK_POISON_MAGIC,
00083
00084 SK_BLANK_LINE,
00085
00086 SK_INVOCATIONS, SK_EVOCATIONS,
00087
00088 SK_COLUMN_BREAK,
00089 };
00090
00091 static const int ndisplayed_skills = ARRAYSZ(skill_display_order);
00092
00093
00094
00095 enum skill_menu_flags
00096 {
00097 SKMF_NONE = 0,
00098
00099
00100 SKMF_DO_PRACTISE = 0x001,
00101 SKMF_DO_SHOW_DESC = 0x002,
00102 SKMF_DO_RESKILL_FROM = 0x004,
00103 SKMF_DO_RESKILL_TO = 0x008,
00104 SKMF_ACTION_MASK = 0x00F,
00105
00106
00107 SKMF_DISP_PROGRESS = 0x010,
00108 SKMF_DISP_RESKILL = 0x020,
00109 SKMF_DISP_NEW_LEVEL = 0x040,
00110 SKMF_DISP_POINTS = 0x080,
00111 SKMF_DISP_MASK = 0x0F0,
00112 SKMF_DISP_ALL = 0x100,
00113 SKMF_DISP_APTITUDE = 0x200,
00114
00115
00116 SKMF_RESKILLING = 0x400,
00117
00118 SKMF_SKILL_ICONS = 0x800,
00119 };
00120
00121 class SkillMenu;
00122
00123 class SkillMenuEntry
00124 {
00125 public:
00126 static menu_letter m_letter;
00127 static SkillMenu* m_skm;
00128
00129 SkillMenuEntry() {};
00130 SkillMenuEntry(coord_def coord, MenuFreeform* ff);
00131 void set_skill(skill_type sk = SK_NONE);
00132 skill_type get_skill() const;
00133 void set_name(bool keep_hotkey);
00134 void set_display();
00135 int get_id();
00136 bool is_set(int flag) const;
00137 bool is_selectable() const;
00138 TextItem* get_name_item() const;
00139
00140 private:
00141 skill_type m_sk;
00142
00143 TextItem* m_name;
00144 #ifdef USE_TILE
00145 TextTileItem* m_name_tile;
00146 #endif
00147 NoSelectTextItem* m_level;
00148 NoSelectTextItem* m_progress;
00149 FormattedTextItem* m_aptitude;
00150
00151 COLORS _get_colour() const;
00152 std::string _get_prefix();
00153 void _set_level();
00154 void _set_progress();
00155 void _set_aptitude();
00156 void _set_reskill_progress();
00157 void _set_new_level();
00158 void _set_title();
00159 void _clear();
00160 #ifdef DEBUG_DIAGNOSTICS
00161 void _set_points();
00162 #endif
00163 };
00164
00165 static const int SK_ARR_LN = (ndisplayed_skills - 1) / 2;
00166 static const int SK_ARR_COL = 2;
00167
00168 class SkillMenu : public PrecisionMenu
00169 {
00170 public:
00171 SkillMenu(int flags);
00172 bool is_set(int flag) const;
00173 void set_flag(int flag);
00174 void clear_flag(int flag);
00175 void toggle_flag(int flag);
00176 void change_action();
00177 void change_display();
00178 void toggle_practise(skill_type sk, int keyn);
00179 void show_description(skill_type sk);
00180 void toggle_show_all();
00181 void clear_selections();
00182 void set_crosstrain();
00183 void set_antitrain();
00184
00185 private:
00186 MenuFreeform* m_ff;
00187 BoxMenuHighlighter* m_highlighter;
00188
00189 int m_flags;
00190 int m_current_help;
00191 coord_def m_min_coord;
00192 coord_def m_max_coord;
00193
00194 bool m_crosstrain;
00195 bool m_antitrain;
00196
00197 SkillMenuEntry m_skills[SK_ARR_LN][SK_ARR_COL];
00198
00199 NoSelectTextItem* m_title;
00200 FormattedTextItem* m_help;
00201 NoSelectTextItem* m_current_action;
00202 TextItem* m_next_action;
00203 TextItem* m_next_display;
00204 TextItem* m_show_all;
00205
00206 std::queue<int> m_disp_queue;
00207
00208 SkillMenuEntry* _find_entry(skill_type sk);
00209 void _init_disp_queue();
00210 void _init_title();
00211 void _init_footer(coord_def coord);
00212 void _refresh_display();
00213 void _refresh_names();
00214 void _set_title();
00215 void _set_skills();
00216 void _set_help(int flag = SKMF_NONE);
00217 void _set_footer();
00218 TextItem* _find_closest_selectable(int start_ln, int col);
00219 void _set_links();
00220 int _get_next_action() const;
00221 int _get_next_display() const;
00222 };
00223
00224 #endif