From 6f1a41c1bd2f3eeb4463553f2e8f250d990a5a66 Mon Sep 17 00:00:00 2001 From: Jan Borsodi Date: Sat, 18 Sep 2010 18:04:53 +0200 Subject: [PATCH] The skill values are now stored in the stats window instead of fetching the current player stats. Values can be set with setValue(). --- apps/openmw/mwgui/layouts.cpp | 90 +++++++++++++++++++++++----- apps/openmw/mwgui/layouts.hpp | 13 +++- apps/openmw/mwgui/window_manager.cpp | 5 ++ apps/openmw/mwgui/window_manager.hpp | 3 + 4 files changed, 94 insertions(+), 17 deletions(-) diff --git a/apps/openmw/mwgui/layouts.cpp b/apps/openmw/mwgui/layouts.cpp index 701d65e136..fcb4a13432 100644 --- a/apps/openmw/mwgui/layouts.cpp +++ b/apps/openmw/mwgui/layouts.cpp @@ -10,6 +10,73 @@ using namespace MWGui; const int StatsWindow::lineHeight = 18; +void StatsWindow::setStyledText(MyGUI::WidgetPtr widget, ColorStyle style, const std::string &value) +{ + widget->setCaption(value); + if (style == CS_Super) + widget->setTextColour(MyGUI::Colour(0, 1, 0)); + else if (style == CS_Sub) + widget->setTextColour(MyGUI::Colour(1, 0, 0)); + else + widget->setTextColour(MyGUI::Colour(1, 1, 1)); +} + +void StatsWindow::setValue (const std::string& id, const MWMechanics::Stat& value) +{ + static struct {const char *id; ESM::Skill::SkillEnum skillId; } skillMap[] = + { + {"SkillBlock", ESM::Skill::Block}, + {"SkillArmorer", ESM::Skill::Armorer}, + {"SkillMediumArmor", ESM::Skill::MediumArmor}, + {"SkillHeavyArmor", ESM::Skill::HeavyArmor}, + {"SkillBluntWeapon", ESM::Skill::BluntWeapon}, + {"SkillLongBlade", ESM::Skill::LongBlade}, + {"SkillAxe", ESM::Skill::Axe}, + {"SkillSpear", ESM::Skill::Spear}, + {"SkillAthletics", ESM::Skill::Athletics}, + {"SkillEnchant", ESM::Skill::Armorer}, + {"SkillDestruction", ESM::Skill::Destruction}, + {"SkillAlteration", ESM::Skill::Alteration}, + {"SkillIllusion", ESM::Skill::Illusion}, + {"SkillConjuration", ESM::Skill::Conjuration}, + {"SkillMysticism", ESM::Skill::Mysticism}, + {"SkillRestoration", ESM::Skill::Restoration}, + {"SkillAlchemy", ESM::Skill::Alchemy}, + {"SkillUnarmored", ESM::Skill::Unarmored}, + {"SkillSecurity", ESM::Skill::Security}, + {"SkillSneak", ESM::Skill::Sneak}, + {"SkillAcrobatics", ESM::Skill::Acrobatics}, + {"SkillLightArmor", ESM::Skill::LightArmor}, + {"SkillShortBlade", ESM::Skill::ShortBlade}, + {"SkillMarksman", ESM::Skill::Marksman}, + {"SkillMercantile", ESM::Skill::Mercantile}, + {"SkillSpeechcraft", ESM::Skill::Speechcraft}, + {"SkillHandToHand", ESM::Skill::HandToHand}, + }; + for (int i = 0; i < sizeof(skillMap)/sizeof(skillMap[0]); ++i) + { + if (skillMap[i].id == id) + { + int skillId = skillMap[i].skillId; + skillValues[skillId] = value; + MyGUI::WidgetPtr widget = skillWidgetMap[skillId]; + if (widget) + { + float modified = value.getModified(), base = value.getBase(); + std::string text = boost::lexical_cast(std::floor(modified)); + ColorStyle style = CS_Normal; + if (modified > base) + style = CS_Super; + else if (modified < base) + style = CS_Sub; + + setStyledText(widget, style, text); + } + break; + } + } +} + void StatsWindow::configureSkills (const std::set& major, const std::set& minor, const std::set& misc) { majorSkills = major; @@ -46,7 +113,7 @@ void StatsWindow::addGroup(const std::string &label, MyGUI::IntCoord &coord1, My coord2.top += lineHeight; } -void StatsWindow::addValueItem(const std::string text, const std::string &value, ColorStyle style, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2) +MyGUI::WidgetPtr StatsWindow::addValueItem(const std::string text, const std::string &value, ColorStyle style, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2) { MyGUI::StaticTextPtr skillNameWidget, skillValueWidget; @@ -54,19 +121,15 @@ void StatsWindow::addValueItem(const std::string text, const std::string &value, skillNameWidget->setCaption(text); skillValueWidget = skillAreaWidget->createWidget("SandTextRight", coord2, MyGUI::Align::Default); - skillValueWidget->setCaption(value); - if (style == CS_Super) - skillValueWidget->setTextColour(MyGUI::Colour(0, 1, 0)); - else if (style == CS_Sub) - skillValueWidget->setTextColour(MyGUI::Colour(1, 0, 0)); - else - skillValueWidget->setTextColour(MyGUI::Colour(1, 1, 1)); + setStyledText(skillValueWidget, style, value); skillWidgets.push_back(skillNameWidget); skillWidgets.push_back(skillValueWidget); coord1.top += lineHeight; coord2.top += lineHeight; + + return skillValueWidget; } void StatsWindow::addItem(const std::string text, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2) @@ -84,11 +147,6 @@ void StatsWindow::addItem(const std::string text, MyGUI::IntCoord &coord1, MyGUI void StatsWindow::addSkills(const std::set &skills, const std::string &titleId, const std::string &titleDefault, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2) { - // Get player and stats - MWWorld::Ptr ptr = environment.mWorld->getPlayerPos().getPlayer(); - MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get (ptr).getCreatureStats (ptr); - MWMechanics::NpcStats& npcStats = MWWorld::Class::get (ptr).getNpcStats (ptr); - WindowManager *wm = environment.mWindowManager; MWMechanics::MechanicsManager *mm = environment.mMechanicsManager; ESMS::ESMStore &store = environment.mWorld->getStore(); @@ -109,8 +167,7 @@ void StatsWindow::addSkills(const std::set &skills, const std::string &titl continue; assert(skillId >= 0 && skillId < ESM::Skill::Length); const std::string &skillNameId = ESMS::Skill::sSkillNameIds[skillId]; - assert(skillId < sizeof(npcStats.mSkill)/sizeof(npcStats.mSkill[0])); - MWMechanics::Stat &stat = npcStats.mSkill[skillId]; + const MWMechanics::Stat &stat = skillValues.find(skillId)->second; float base = stat.getBase(); float modified = stat.getModified(); @@ -119,7 +176,8 @@ void StatsWindow::addSkills(const std::set &skills, const std::string &titl style = CS_Super; else if (modified < base) style = CS_Sub; - addValueItem(wm->getGameSettingString(skillNameId, skillNameId), boost::lexical_cast(static_cast(modified)), style, coord1, coord2); + MyGUI::WidgetPtr widget = addValueItem(wm->getGameSettingString(skillNameId, skillNameId), boost::lexical_cast(static_cast(modified)), style, coord1, coord2); + skillWidgetMap[skillId] = widget; } } diff --git a/apps/openmw/mwgui/layouts.hpp b/apps/openmw/mwgui/layouts.hpp index a9b095a073..64758dc5d2 100644 --- a/apps/openmw/mwgui/layouts.hpp +++ b/apps/openmw/mwgui/layouts.hpp @@ -222,6 +222,12 @@ namespace MWGui } getWidget(skillAreaWidget, "Skills"); + + for (int i = 0; i < ESM::Skill::Length; ++i) + { + skillValues.insert(std::pair >(i, MWMechanics::Stat())); + skillWidgetMap.insert(std::pair(i, nullptr)); + } } void setPlayerName(const std::string& playerName) @@ -293,6 +299,8 @@ namespace MWGui } } + void setValue (const std::string& id, const MWMechanics::Stat& value); + void configureSkills (const std::set& major, const std::set& minor, const std::set& misc); void configureFactions (const std::vector& factions); void configureBirthSign (const std::string &signId); @@ -307,10 +315,11 @@ namespace MWGui CS_Normal, CS_Super }; + void setStyledText(MyGUI::WidgetPtr widget, ColorStyle style, const std::string &value); void addSkills(const std::set &skills, const std::string &titleId, const std::string &titleDefault, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2); void addSeparator(MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2); void addGroup(const std::string &label, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2); - void addValueItem(const std::string text, const std::string &value, ColorStyle style, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2); + MyGUI::WidgetPtr addValueItem(const std::string text, const std::string &value, ColorStyle style, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2); void addItem(const std::string text, MyGUI::IntCoord &coord1, MyGUI::IntCoord &coord2); static const int lineHeight; @@ -318,6 +327,8 @@ namespace MWGui MWWorld::Environment& environment; MyGUI::WidgetPtr skillAreaWidget; std::set majorSkills, minorSkills, miscSkills; + std::map > skillValues; + std::map skillWidgetMap; std::vector factions; std::string birthSignId; int reputation, bounty; diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index a7616a7216..deeb06f81f 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -150,6 +150,11 @@ void WindowManager::setValue (const std::string& id, const MWMechanics::StatsetValue (id, value); } +void WindowManager::setValue (const std::string& id, const MWMechanics::Stat& value) +{ + stats->setValue (id, value); +} + void WindowManager::setValue (const std::string& id, const MWMechanics::DynamicStat& value) { stats->setValue (id, value); diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index 9f473b4f8e..7125824d55 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -129,6 +129,9 @@ namespace MWGui void setValue (const std::string& id, const MWMechanics::Stat& value); ///< Set value for the given ID. + void setValue (const std::string& id, const MWMechanics::Stat& value); + ///< Set value for the given ID. + void setValue (const std::string& id, const MWMechanics::DynamicStat& value); ///< Set value for the given ID.