From 3141cf9e28e846ffa52abc87e02e4165898c7db8 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sun, 13 Aug 2023 16:10:19 +0200 Subject: [PATCH 1/3] Use the correct skills for training again --- apps/openmw/mwgui/trainingwindow.cpp | 37 ++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwgui/trainingwindow.cpp b/apps/openmw/mwgui/trainingwindow.cpp index 5ed22df487..e2749b8e30 100644 --- a/apps/openmw/mwgui/trainingwindow.cpp +++ b/apps/openmw/mwgui/trainingwindow.cpp @@ -65,20 +65,41 @@ namespace MWGui const MWWorld::Store& skillStore = store->get(); // NPC can train you in his best 3 skills + constexpr size_t maxSkills = 3; std::vector> skills; + skills.reserve(maxSkills); - MWMechanics::NpcStats const& actorStats(actor.getClass().getNpcStats(actor)); + const auto sortSkills = [&]() { + for (size_t i = skills.size() - 1; i > 0; --i) + { + if (skills[i].second > skills[i - 1].second) + std::swap(skills[i], skills[i - 1]); + else + break; + } + }; + // Maintain a sorted vector of max maxSkills elements, ordering skills by value and content file order + const MWMechanics::NpcStats& actorStats = actor.getClass().getNpcStats(actor); for (const ESM::Skill& skill : skillStore) { float value = getSkillForTraining(actorStats, skill.mId); - - skills.emplace_back(&skill, value); + if (skills.size() < maxSkills) + { + skills.emplace_back(&skill, value); + sortSkills(); + } + else + { + auto& lowest = skills[maxSkills - 1]; + if (lowest.second < value) + { + lowest.first = &skill; + lowest.second = value; + sortSkills(); + } + } } - std::sort(skills.begin(), skills.end(), [](const auto& left, const auto& right) { - return std::tie(right.second, left.first->mId) < std::tie(left.second, right.first->mId); - }); - MyGUI::EnumeratorWidgetPtr widgets = mTrainingOptions->getEnumerator(); MyGUI::Gui::getInstance().destroyWidgets(widgets); @@ -86,7 +107,7 @@ namespace MWGui const int lineHeight = Settings::gui().mFontSize + 2; - for (int i = 0; i < 3; ++i) + for (size_t i = 0; i < skills.size(); ++i) { const ESM::Skill* skill = skills[i].first; int price = static_cast( From f7edf243564d4437255e5be0628936c6eb6148b1 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sun, 13 Aug 2023 20:26:59 +0200 Subject: [PATCH 2/3] Use std::stable_sort --- apps/openmw/mwgui/trainingwindow.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/apps/openmw/mwgui/trainingwindow.cpp b/apps/openmw/mwgui/trainingwindow.cpp index e2749b8e30..2bd9e06bfe 100644 --- a/apps/openmw/mwgui/trainingwindow.cpp +++ b/apps/openmw/mwgui/trainingwindow.cpp @@ -69,15 +69,10 @@ namespace MWGui std::vector> skills; skills.reserve(maxSkills); - const auto sortSkills = [&]() { - for (size_t i = skills.size() - 1; i > 0; --i) - { - if (skills[i].second > skills[i - 1].second) - std::swap(skills[i], skills[i - 1]); - else - break; - } - }; + const auto sortByValue + = [](const std::pair& lhs, const std::pair& rhs) { + return lhs.second > rhs.second; + }; // Maintain a sorted vector of max maxSkills elements, ordering skills by value and content file order const MWMechanics::NpcStats& actorStats = actor.getClass().getNpcStats(actor); for (const ESM::Skill& skill : skillStore) @@ -86,7 +81,7 @@ namespace MWGui if (skills.size() < maxSkills) { skills.emplace_back(&skill, value); - sortSkills(); + std::stable_sort(skills.begin(), skills.end(), sortByValue); } else { @@ -95,7 +90,7 @@ namespace MWGui { lowest.first = &skill; lowest.second = value; - sortSkills(); + std::stable_sort(skills.begin(), skills.end(), sortByValue); } } } From 1489376951f284f401522deb183e285f8108b177 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Tue, 15 Aug 2023 14:55:13 +0000 Subject: [PATCH 3/3] Apply 1 suggestion(s) to 1 file(s) --- apps/openmw/mwgui/trainingwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwgui/trainingwindow.cpp b/apps/openmw/mwgui/trainingwindow.cpp index 2bd9e06bfe..2b5e64adf0 100644 --- a/apps/openmw/mwgui/trainingwindow.cpp +++ b/apps/openmw/mwgui/trainingwindow.cpp @@ -64,7 +64,7 @@ namespace MWGui const MWWorld::Store& gmst = store->get(); const MWWorld::Store& skillStore = store->get(); - // NPC can train you in his best 3 skills + // NPC can train you in their best 3 skills constexpr size_t maxSkills = 3; std::vector> skills; skills.reserve(maxSkills);