Merge branch 'skillmenu'
authorShmuale Mark <shm.mark@gmail.com>
Wed, 15 Apr 2015 14:18:49 +0000 (10:18 -0400)
committerShmuale Mark <shm.mark@gmail.com>
Wed, 15 Apr 2015 14:18:49 +0000 (10:18 -0400)
Conflicts:
crawl-ref/source/skill_menu.cc

crawl-ref/source/dat/database/help.txt
crawl-ref/source/hints.cc
crawl-ref/source/player.cc
crawl-ref/source/skill_menu.cc
crawl-ref/source/skill_menu.h

index 81609a1..c3027af 100644 (file)
@@ -226,7 +226,7 @@ corpse on the ground by clicking the <w>left mouse button</w> while pressing
 %%%%
 skill-menu
 
-                               <h>Skill management</h>
+                        <h>Skill management</h>
 You gain experience for killing monsters (and very few other activities).
 This experience is used to train skills. The skill screen allows you to
 select which skills to train.
@@ -235,45 +235,41 @@ see "Training restrictions" below for details.
 
 By pressing its letter, you can cycle if and how a skill is trained:
 <darkgrey>- deselected</darkgrey>    Skill will not be trained.
-+ selected
++ selected      Skill will be trained.
 <w>* focused</w>       Skill will be weighted higher for training.
 
 Pressing a capital letter selects that skill and deselects all the others.
 This shortcut is useful when you want to train only one skill.
 
 Training can be done in two modes, which are toggled with the <w>/</w> key.
-* automatic:    Skills are weighted based on your use of them.
-* manual:       Experience is spread evenly across all activated skills.
+- automatic:    Skills are weighted based on your use of them.
+- manual:       Experience is spread evenly across all activated skills.
 
 How fast you train a skill is governed by the following factors:
-* aptitude: Shown <white>white</white> in the Apt column. Higher numbers mean that
-      less experience is needed to advance a skill. Depends on species.
-* cross-training: Proficiency in some skills carries over to related skills.
-      The enhancer bonus for crosstraining is indicated in <blue>blue</blue>.
-* magic penalties: It is harder to learn an elemental skill if you are
-      proficient in the opposing element (Air-Earth, Ice-Fire).
-      The aptitude penalty is indicated in <red>red</red>.
+- aptitude: Shown <white>white</white> in the Apt column. Higher numbers mean that less
+            experience is needed to advance a skill. Depends on species.
+- skill manuals: Rare books giving an aptitude bonus of <lightgreen>+4</lightgreen> in one skill.
 
 On top of that, there are some effects which directly modify a skill, for
-example draining or some god powers. Reduced skills are shown in <magenta>magenta</magenta>, and
-enhanced skills in <blue>blue</blue>.
-The training percentage (in <brown>brown</brown>) shows the relative
-amount of experience which will be used to train this skill.
+example draining, having trained a related skill (crosstraining), or certain
+god powers. Reduced skills are shown in <magenta>magenta</magenta>, and enhanced skills in <blue>blue</blue>.
+The training percentage (in <brown>brown</brown>) shows the relative amount of experience
+which will be used to train this skill.
 
 Apart from (de)selecting skills, you also have the following toggles:
-<w>/</w> :   Switch between automatic and manual training.
-<w>*</w> :   Shows all skills, even those you can't train yet.
-<w>?</w> :   Allows you to read the descriptions of skills.
-<w>_</w> :   Shows/hides skill modifiers, e.g. from god powers.
+<w>/</w> :  Switch between automatic and manual training modes.
+<w>*</w> :  Display all skills, even those you can't train yet.
+<w>?</w> :  Allows you to read the descriptions of skills.
+<w>_</w> :  Show or hide skill level modifications (drain, god powers, crosstraining).
 
-                               <h>Training restrictions</h>
+                        <h>Training restrictions</h>
 Fighting, Throwing, Armour, Dodging, Stealth, Unarmed Combat, and Spellcasting
 can always be trained. For the rest:
-* Weapon skills require carrying a weapon of the appropriate type.
-* Shields requires that you either be carrying a shield, or worship a deity
+- Weapon skills require carrying a weapon of the appropriate type.
+- Shields requires that you either be carrying a shield, or worship a deity
       who can offer one through divine means (The Shining One).
-* Evocations requires carrying an evocable item, or worshipping Nemelex.
-* Spell schools require knowing a spell of the school.
-* Necromancy can also be trained when worshipping Kikubaaqudgha.
-* Invocations requires worshipping a god whose abilities require it.
+- Evocations requires carrying an evocable item, or worshipping Nemelex Xobeh.
+- Spell schools require knowing a spell of the school.
+- Necromancy can also be trained when worshipping Kikubaaqudgha.
+- Invocations requires worshipping a god whose abilities require it.
 %%%%
index b26581a..c476d56 100644 (file)
@@ -2873,8 +2873,7 @@ string hints_skills_info()
         "experience is allocated to go towards that skill. "
         "You can toggle which skills to train by "
         "pressing their slot letters. A <darkgrey>grey</darkgrey> skill "
-        "will not be trained and ease the training of others. "
-        "Press <w>?</w> to read your skills' descriptions.";
+        "will not be trained and ease the training of others.";
     text << broken;
     text << "</" << colour_to_str(channel_to_colour(MSGCH_TUTORIAL)) << ">";
 
index b05e203..99678e4 100644 (file)
@@ -5826,6 +5826,9 @@ int player::shield_tohit_penalty(bool random_factor, int scale) const
 
 int player::skill(skill_type sk, int scale, bool real, bool drained) const
 {
+    // If you add another enhancement/reduction, be sure to change
+    // SkillMenuSwitch::get_help() to reflect that
+
     // wizard racechange, or upgraded old save
     if (is_useless_skill(sk))
         return 0;
index e9f289c..52f78f5 100644 (file)
@@ -314,11 +314,7 @@ string SkillMenuEntry::get_prefix()
                                    (you.train[m_sk] == 2) ? '*' :
                                           you.train[m_sk] ? '+'
                                                           : '-';
-#ifdef USE_TILE_LOCAL
     return make_stringf(" %c %c", letter, sign);
-#else
-    return make_stringf("%c %c", letter, sign);
-#endif
 }
 
 void SkillMenuEntry::set_aptitude()
@@ -375,15 +371,18 @@ void SkillMenuEntry::set_level()
 void SkillMenuEntry::set_new_level()
 {
     const bool real = skm.get_state(SKM_LEVEL) != SKM_LEVEL_ENHANCED;
+    int new_level = 0;
     if (is_set(SKMF_EXPERIENCE) && is_selectable())
     {
+        new_level = you.skill(m_sk, 10, real);
         m_progress->set_fg_colour(CYAN);
-        m_progress->set_text(make_stringf("->%4.1f",
-                                          you.skill(m_sk, 10, real) / 10.0));
+        if (you.training[m_sk])
+            m_progress->set_text(make_stringf("> %4.1f", new_level / 10.0));
+        else
+            m_progress->set_text(string(PROGRESS_SIZE, ' '));
         return;
     }
 
-    int new_level = 0;
     if (you.skills[m_sk] > 0 && is_set(SKMF_RESKILL_FROM)
         || m_sk == you.transfer_from_skill)
     {
@@ -401,7 +400,7 @@ void SkillMenuEntry::set_new_level()
     }
 
     if (is_selectable() || m_sk == you.transfer_from_skill)
-        m_progress->set_text(make_stringf("->%4.1f", new_level / 10.0));
+        m_progress->set_text(make_stringf("> %4.1f", new_level / 10.0));
     else
         m_progress->set_text("");
 }
@@ -446,7 +445,7 @@ void SkillMenuEntry::set_reskill_progress()
 void SkillMenuEntry::set_title()
 {
     m_name->allow_highlight(false);
-    m_name->set_text("    Skill");
+    m_name->set_text("     Skill");
     m_level->set_text("Level");
 
     m_name->set_fg_colour(BLUE);
@@ -458,7 +457,10 @@ void SkillMenuEntry::set_title()
 
     if (is_set(SKMF_RESKILLING))
     {
-        m_progress->set_text("-> Lvl");
+        if (is_set(SKMF_RESKILL_FROM))
+            m_progress->set_text("Source");
+        else
+            m_progress->set_text("Target");
         return;
     }
 
@@ -467,8 +469,8 @@ void SkillMenuEntry::set_title()
     case SKM_VIEW_TRAINING:  m_progress->set_text("Train"); break;
     case SKM_VIEW_PROGRESS:  m_progress->set_text("Progr"); break;
     case SKM_VIEW_TRANSFER:  m_progress->set_text("Trnsf"); break;
-    case SKM_VIEW_POINTS:    m_progress->set_text("Pnts");  break;
-    case SKM_VIEW_NEW_LEVEL: m_progress->set_text("New");   break;
+    case SKM_VIEW_POINTS:    m_progress->set_text("Points");break;
+    case SKM_VIEW_NEW_LEVEL: m_progress->set_text("> New"); break;
     default: die("Invalid view state.");
     }
 }
@@ -499,57 +501,93 @@ skill_menu_state SkillMenuSwitch::get_state()
     return m_state;
 }
 
+static bool _any_crosstrained()
+{
+    for (skill_type sk = SK_FIRST_SKILL; sk < NUM_SKILLS; ++sk)
+    {
+        // Assumes crosstraining is symmetric; otherwise we should
+        // iterate over the result of get_crosstrain_skills and
+        // check the levels of *those* skills
+        if (you.skill_points[sk]
+            && !get_crosstrain_skills(sk).empty())
+        {
+            // Didn't necessarily boost us by a noticeable amount,
+            // but close enough.
+            return true;
+        }
+    }
+    return false;
+}
+
 string SkillMenuSwitch::get_help()
 {
     switch (m_state)
     {
     case SKM_MODE_AUTO:
-        return "In automatic mode, skills are trained as you use them. ";
+        return "In automatic mode, skills are trained as you use them.";
     case SKM_MODE_MANUAL:
         return "In manual mode, experience is spread evenly across all "
-                "activated skills. ";
+                "activated skills.";
     case SKM_DO_PRACTISE:
         if (skm.is_set(SKMF_SIMPLE))
             return hints_skills_info();
         else
-        {
             return "Press the letter of a skill to choose whether you want to "
-                   "practise it. Skills marked with '-' will not be trained. ";
-        }
+                   "practise it. Skills marked with '<darkgrey>-</darkgrey>' "
+                   "will not be trained.";
     case SKM_DO_FOCUS:
         return "Press the letter of a skill to cycle between "
-               "<darkgrey>disabled</darkgrey> (-), enabled (+) and "
-               "<white>focused</white> (*). Focused skills train twice as "
-               "fast as others. ";
+               "<darkgrey>disabled</darkgrey> (<darkgrey>-</darkgrey>), "
+               "enabled (+) and <white>focused</white> (<white>*</white>). "
+               "Focused skills train twice as fast relative to others.";
     case SKM_LEVEL_ENHANCED:
+    {
+        string result;
         if (skm.is_set(SKMF_ENHANCED))
-            return make_stringf("Enhanced skills are in <blue>blue</blue>. ");
-        else
+        {
+            vector<const char *> causes;
+            if (you.duration[DUR_HEROISM])
+                causes.push_back("Heroism");
+            if (you_worship(GOD_ASHENZARI))
+                causes.push_back("Ashenzari's power");
+            if (_any_crosstrained())
+                causes.push_back("cross-training");
+            result = "Skills enhanced by "
+                     + comma_separated_line(causes.begin(), causes.end())
+                     + " are in <blue>blue</blue>.";
+        }
+
+        if (skm.is_set(SKMF_REDUCED))
         {
             vector<const char *> causes;
             if (you.attribute[ATTR_XP_DRAIN])
                 causes.push_back("draining");
             if (player_under_penance(GOD_ASHENZARI))
-                causes.push_back("the power of Ashenzari");
-            return "Skills reduced by "
-                   + comma_separated_line(causes.begin(), causes.end())
-                   + " are in <magenta>magenta</magenta>. ";
+                causes.push_back("Ashenzari's anger");
+
+            if (!result.empty())
+                result += "\n";
+            result += "Skills reduced by "
+                      + comma_separated_line(causes.begin(), causes.end())
+                      + " are in <magenta>magenta</magenta>.";
         }
+
+        if (!result.empty())
+            return result;
+    }
     case SKM_VIEW_TRAINING:
         if (skm.is_set(SKMF_SIMPLE))
             return hints_skill_training_info();
         else
-        {
-            return "The percentage of the experience used to train each skill "
-                   "is in <brown>brown</brown>.\n";
-        }
+            return "The percentage of incoming experience used"
+                   " to train each skill is in <brown>brown</brown>.\n";
     case SKM_VIEW_PROGRESS:
         return "The percentage of the progress done before reaching next "
                "level is in <cyan>cyan</cyan>.\n";
     case SKM_VIEW_TRANSFER:
         return "The progress of the knowledge transfer is displayed in "
                "<cyan>cyan</cyan> in front of the skill receiving the "
-               "knowledge. The donating skill is marked with '*'. ";
+               "knowledge. The donating skill is marked with <cyan>*</cyan>.";
     default: return "";
     }
 }
@@ -560,17 +598,17 @@ string SkillMenuSwitch::get_name(skill_menu_state state)
     {
     case SKM_MODE_AUTO:      return "auto";
     case SKM_MODE_MANUAL:    return "manual";
-    case SKM_DO_PRACTISE:    return "practise";
+    case SKM_DO_PRACTISE:    return "train";
     case SKM_DO_FOCUS:       return "focus";
     case SKM_SHOW_KNOWN:     return "known";
-    case SKM_SHOW_DEFAULT:   return "default";
+    case SKM_SHOW_DEFAULT:   return "trainable";
     case SKM_SHOW_ALL:       return "all";
     case SKM_LEVEL_ENHANCED:
         return (skm.is_set(SKMF_ENHANCED)
-                && skm.is_set(SKMF_REDUCED)) ? "changed" :
+                && skm.is_set(SKMF_REDUCED)) ? "modified" :
                    skm.is_set(SKMF_ENHANCED) ? "enhanced"
                                              : "reduced";
-    case SKM_LEVEL_NORMAL:   return "normal";
+    case SKM_LEVEL_NORMAL:   return "base";
     case SKM_VIEW_TRAINING:  return "training";
     case SKM_VIEW_PROGRESS:  return "progress";
     case SKM_VIEW_TRANSFER:  return "transfer";
@@ -627,8 +665,7 @@ void SkillMenuSwitch::update()
 
     const vector<int> hotkeys = get_hotkeys();
     ASSERT(hotkeys.size());
-    string text = make_stringf("[%s(<yellow>%c</yellow>): ",
-                               m_name.c_str(), hotkeys[0]);
+    string text = make_stringf(" [<yellow>%c</yellow>] ", hotkeys[0]);
     for (auto it = m_states.begin(); it != m_states.end(); ++it)
     {
         if (it != m_states.begin())
@@ -638,7 +675,10 @@ void SkillMenuSwitch::update()
         text += make_stringf("<%s>%s</%s>", col.c_str(), get_name(*it).c_str(),
                              col.c_str());
     }
-    text += ']';
+    if (m_name != "")
+        text += make_stringf(" %s  ", m_name.c_str());
+    else
+        text += "  ";
     set_text(text);
 }
 
@@ -674,7 +714,7 @@ void SkillMenu::init(int flag)
     const int char_height = tiles.get_crt_font()->char_height();
     if (Options.tile_menu_icons)
     {
-        line_height = min((tiles.get_crt()->wy - char_height * 4) / SK_ARR_LN,
+        line_height = min((tiles.get_crt()->wy - char_height * 5) / SK_ARR_LN,
                           Options.tile_cell_pixels);
         set_flag(SKMF_SKILL_ICONS);
     }
@@ -886,9 +926,9 @@ void SkillMenu::help()
         if (is_set(SKMF_SIMPLE))
             text = hints_skills_description_info();
         else
-            text = "Press the letter of a skill to read its description. "
-                   "Press ? for an explanation of how skills work and the "
-                   "various modes.";
+            text = "Press the letter of a skill to read its description.\n"
+                   "Press <w>?</w> for a general explanation"
+                   " of skilling and the various toggles.";
         set_help(text);
     }
     else
@@ -1012,28 +1052,36 @@ void SkillMenu::init_title()
 void SkillMenu::init_help()
 {
     m_help = new FormattedTextItem();
-    int help_height;
+    int help_height = 3;
     if (is_set(SKMF_SIMPLE))
     {
         // We just assume that the player won't learn too many skills while
         // in tutorial/hint mode.
-        m_pos.y -= 4;
-        help_height = 6;
+        m_pos.y -= 1;
+        help_height += 2;
     }
-    else
-        help_height = 2;
 
     m_help->set_bounds(m_pos, coord_def(m_max_coord.x, m_pos.y + help_height));
     m_pos.y += help_height;
     m_ff->attach_item(m_help);
     m_help->set_fg_colour(LIGHTGREY);
     m_help->set_visible(true);
+
+    if (!is_set(SKMF_SPECIAL))
+    {
+        m_help_button = new FormattedTextItem();
+        m_help_button->set_id(SKM_HELP);
+        m_help_button->add_hotkey('?');
+        m_help_button->set_highlight_colour(YELLOW);
+        refresh_help_button();
+        add_item(m_help_button, 60, m_pos);
+    }
 }
 
 void SkillMenu::init_switches()
 {
     SkillMenuSwitch* sw;
-    sw = new SkillMenuSwitch("Mode", '/');
+    sw = new SkillMenuSwitch("mode", '/');
     m_switches[SKM_MODE] = sw;
     sw->add(SKM_MODE_AUTO);
     if (!is_set(SKMF_SPECIAL) && !is_set(SKMF_SIMPLE))
@@ -1044,7 +1092,7 @@ void SkillMenu::init_switches()
     sw->set_id(SKM_MODE);
     add_item(sw, sw->size(), m_pos);
 
-    sw = new SkillMenuSwitch("Do", '|');
+    sw = new SkillMenuSwitch("skill", '|');
     m_switches[SKM_DO] = sw;
     if (!is_set(SKMF_EXPERIENCE)
         && (is_set(SKMF_SIMPLE) || Options.skill_focus != SKM_FOCUS_ON))
@@ -1062,9 +1110,8 @@ void SkillMenu::init_switches()
     sw->set_id(SKM_DO);
     add_item(sw, sw->size(), m_pos);
 
-    sw = new SkillMenuSwitch("Show", '*');
+    sw = new SkillMenuSwitch("skills", '*');
     m_switches[SKM_SHOW] = sw;
-    //sw->add(SKM_SHOW_KNOWN);
     sw->add(SKM_SHOW_DEFAULT);
     if (!is_set(SKMF_SIMPLE) && !is_set(SKMF_EXPERIENCE))
         sw->add(SKM_SHOW_ALL);
@@ -1074,7 +1121,7 @@ void SkillMenu::init_switches()
 
     if (is_set(SKMF_CHANGED))
     {
-        sw = new SkillMenuSwitch("Level", '_');
+        sw = new SkillMenuSwitch("level", '_');
         m_switches[SKM_LEVEL] = sw;
         sw->add(SKM_LEVEL_ENHANCED);
         sw->add(SKM_LEVEL_NORMAL);
@@ -1083,7 +1130,7 @@ void SkillMenu::init_switches()
         add_item(sw, sw->size(), m_pos);
     }
 
-    sw = new SkillMenuSwitch("View", '!');
+    sw = new SkillMenuSwitch("", '!');
     m_switches[SKM_VIEW] = sw;
     const bool transferring = !is_invalid_skill(you.transfer_to_skill);
     if (!is_set(SKMF_SPECIAL) || you.wizard)
@@ -1113,16 +1160,6 @@ void SkillMenu::init_switches()
     sw->update();
     sw->set_id(SKM_VIEW);
     add_item(sw, sw->size(), m_pos);
-
-    if (!is_set(SKMF_SPECIAL))
-    {
-        m_help_button = new FormattedTextItem();
-        m_help_button->set_text("[Help(<yellow>?</yellow>)]");
-        m_help_button->set_id(SKM_HELP);
-        m_help_button->add_hotkey('?');
-        m_help_button->set_highlight_colour(YELLOW);
-        add_item(m_help_button, 9, m_pos);
-    }
 }
 
 void SkillMenu::refresh_display()
@@ -1138,6 +1175,23 @@ void SkillMenu::refresh_display()
         m_skill_backup.restore_levels();
 }
 
+void SkillMenu::refresh_help_button()
+{
+    if (is_set(SKMF_SPECIAL))
+        return;
+    const string helpstring = "[<yellow>?</yellow>] ";
+
+    string legend = is_set(SKMF_SIMPLE) ? "Read skill descriptions" : "Help";
+    if (is_set(SKMF_HELP))
+    {
+        legend = is_set(SKMF_SIMPLE) ? "Return to skill selection"
+                 : "<w>Help</w>                "
+                 "[<yellow>a</yellow>-<yellow>z</yellow>] skill descriptions";
+    }
+
+    m_help_button->set_text(helpstring + legend + "\n");
+}
+
 void SkillMenu::refresh_names()
 {
     SkillMenuEntry::m_letter = '9';
@@ -1159,6 +1213,7 @@ void SkillMenu::refresh_names()
     {
         m_ff->activate_default_item();
     }
+    refresh_help_button();
 }
 
 void SkillMenu::set_default_help()
@@ -1190,15 +1245,12 @@ void SkillMenu::set_default_help()
             text = m_switches[SKM_VIEW]->get_help();
 
         if (get_state(SKM_LEVEL) == SKM_LEVEL_ENHANCED)
-            text += m_switches[SKM_LEVEL]->get_help();
+            text += m_switches[SKM_LEVEL]->get_help() + " ";
         else
             text += "The species aptitude is in <white>white</white>. ";
 
         if (is_set(SKMF_MANUAL))
-
-        {
-            text += "Manual usage is in <green>green</green>. ";
-        }
+            text += "Bonus from skill manuals is in <lightgreen>green</lightgreen>. ";
     }
 
     // This one takes priority.
index 0e5d108..5b05b25 100644 (file)
@@ -175,6 +175,7 @@ private:
     void init_title();
     void init_switches();
     void refresh_display();
+    void refresh_help_button();
     void refresh_names();
     void set_default_help();
     void set_help(string msg);