mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 07:49:56 +00:00
1e4a854433
It was just adding a level of indirection to Ptr.getClass(). All the call were replaced by that instead. The number of lines changed is important, but the change itself is trivial, so everything should be fine. :)
174 lines
6.2 KiB
C++
174 lines
6.2 KiB
C++
#include "trainingwindow.hpp"
|
|
|
|
#include <boost/lexical_cast.hpp>
|
|
|
|
#include <openengine/ogre/fader.hpp>
|
|
|
|
#include "../mwbase/windowmanager.hpp"
|
|
#include "../mwbase/environment.hpp"
|
|
#include "../mwbase/world.hpp"
|
|
#include "../mwbase/mechanicsmanager.hpp"
|
|
|
|
#include "../mwworld/class.hpp"
|
|
#include "../mwworld/containerstore.hpp"
|
|
|
|
#include "../mwmechanics/npcstats.hpp"
|
|
|
|
#include "tooltips.hpp"
|
|
|
|
namespace MWGui
|
|
{
|
|
|
|
TrainingWindow::TrainingWindow()
|
|
: WindowBase("openmw_trainingwindow.layout")
|
|
, mFadeTimeRemaining(0)
|
|
{
|
|
getWidget(mTrainingOptions, "TrainingOptions");
|
|
getWidget(mCancelButton, "CancelButton");
|
|
getWidget(mPlayerGold, "PlayerGold");
|
|
|
|
mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &TrainingWindow::onCancelButtonClicked);
|
|
}
|
|
|
|
void TrainingWindow::open()
|
|
{
|
|
center();
|
|
}
|
|
|
|
void TrainingWindow::startTraining (MWWorld::Ptr actor)
|
|
{
|
|
mPtr = actor;
|
|
|
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
|
int playerGold = player.getClass().getContainerStore(player).count(MWWorld::ContainerStore::sGoldId);
|
|
|
|
mPlayerGold->setCaptionWithReplacing("#{sGold}: " + boost::lexical_cast<std::string>(playerGold));
|
|
|
|
MWMechanics::NpcStats& npcStats = actor.getClass().getNpcStats (actor);
|
|
|
|
// NPC can train you in his best 3 skills
|
|
std::vector< std::pair<int, int> > bestSkills;
|
|
bestSkills.push_back (std::make_pair(-1, -1));
|
|
bestSkills.push_back (std::make_pair(-1, -1));
|
|
bestSkills.push_back (std::make_pair(-1, -1));
|
|
|
|
for (int i=0; i<ESM::Skill::Length; ++i)
|
|
{
|
|
int value = npcStats.getSkill (i).getBase ();
|
|
|
|
for (int j=0; j<3; ++j)
|
|
{
|
|
if (value > bestSkills[j].second)
|
|
{
|
|
if (j<2)
|
|
{
|
|
bestSkills[j+1] = bestSkills[j];
|
|
}
|
|
bestSkills[j] = std::make_pair(i, value);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
MyGUI::EnumeratorWidgetPtr widgets = mTrainingOptions->getEnumerator ();
|
|
MyGUI::Gui::getInstance ().destroyWidgets (widgets);
|
|
|
|
MWMechanics::NpcStats& pcStats = player.getClass().getNpcStats (player);
|
|
|
|
const MWWorld::Store<ESM::GameSetting> &gmst =
|
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
|
|
|
for (int i=0; i<3; ++i)
|
|
{
|
|
int price = MWBase::Environment::get().getMechanicsManager()->getBarterOffer
|
|
(mPtr,pcStats.getSkill (bestSkills[i].first).getBase() * gmst.find("iTrainingMod")->getInt (),true);
|
|
|
|
MyGUI::Button* button = mTrainingOptions->createWidget<MyGUI::Button>("SandTextButton",
|
|
MyGUI::IntCoord(5, 5+i*18, mTrainingOptions->getWidth()-10, 18), MyGUI::Align::Default);
|
|
|
|
button->setEnabled(price <= playerGold);
|
|
button->setUserData(bestSkills[i].first);
|
|
button->eventMouseButtonClick += MyGUI::newDelegate(this, &TrainingWindow::onTrainingSelected);
|
|
|
|
button->setCaptionWithReplacing("#{" + ESM::Skill::sSkillNameIds[bestSkills[i].first] + "} - " + boost::lexical_cast<std::string>(price));
|
|
|
|
button->setSize(button->getTextSize ().width+12, button->getSize().height);
|
|
|
|
ToolTips::createSkillToolTip (button, bestSkills[i].first);
|
|
}
|
|
|
|
center();
|
|
}
|
|
|
|
void TrainingWindow::onReferenceUnavailable ()
|
|
{
|
|
MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Training);
|
|
}
|
|
|
|
void TrainingWindow::onCancelButtonClicked (MyGUI::Widget *sender)
|
|
{
|
|
MWBase::Environment::get().getWindowManager()->removeGuiMode (GM_Training);
|
|
}
|
|
|
|
void TrainingWindow::onTrainingSelected (MyGUI::Widget *sender)
|
|
{
|
|
int skillId = *sender->getUserData<int>();
|
|
|
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld ()->getPlayerPtr();
|
|
MWMechanics::NpcStats& pcStats = player.getClass().getNpcStats (player);
|
|
|
|
const MWWorld::ESMStore &store =
|
|
MWBase::Environment::get().getWorld()->getStore();
|
|
|
|
int price = pcStats.getSkill (skillId).getBase() * store.get<ESM::GameSetting>().find("iTrainingMod")->getInt ();
|
|
price = MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr,price,true);
|
|
|
|
MWMechanics::NpcStats& npcStats = mPtr.getClass().getNpcStats (mPtr);
|
|
if (npcStats.getSkill (skillId).getBase () <= pcStats.getSkill (skillId).getBase ())
|
|
{
|
|
MWBase::Environment::get().getWindowManager()->messageBox ("#{sServiceTrainingWords}");
|
|
return;
|
|
}
|
|
|
|
// You can not train a skill above its governing attribute
|
|
const ESM::Skill* skill = MWBase::Environment::get().getWorld()->getStore().get<ESM::Skill>().find(skillId);
|
|
if (pcStats.getSkill(skillId).getBase() >= pcStats.getAttribute(skill->mData.mAttribute).getBase())
|
|
{
|
|
MWBase::Environment::get().getWindowManager()->messageBox ("#{sNotifyMessage17}");
|
|
return;
|
|
}
|
|
|
|
// increase skill
|
|
MWWorld::LiveCellRef<ESM::NPC> *playerRef = player.get<ESM::NPC>();
|
|
|
|
const ESM::Class *class_ =
|
|
store.get<ESM::Class>().find(playerRef->mBase->mClass);
|
|
pcStats.increaseSkill (skillId, *class_, true);
|
|
|
|
// remove gold
|
|
player.getClass().getContainerStore(player).remove(MWWorld::ContainerStore::sGoldId, price, player);
|
|
|
|
// go back to game mode
|
|
MWBase::Environment::get().getWindowManager()->removeGuiMode (GM_Training);
|
|
MWBase::Environment::get().getWindowManager()->removeGuiMode (GM_Dialogue);
|
|
|
|
// advance time
|
|
MWBase::Environment::get().getWorld ()->advanceTime (2);
|
|
MWBase::Environment::get().getMechanicsManager()->rest(false);
|
|
MWBase::Environment::get().getMechanicsManager()->rest(false);
|
|
|
|
MWBase::Environment::get().getWorld ()->getFader()->fadeOut(0.25);
|
|
mFadeTimeRemaining = 0.5;
|
|
}
|
|
|
|
void TrainingWindow::onFrame(float dt)
|
|
{
|
|
if (mFadeTimeRemaining <= 0)
|
|
return;
|
|
|
|
mFadeTimeRemaining -= dt;
|
|
|
|
if (mFadeTimeRemaining <= 0)
|
|
MWBase::Environment::get().getWorld ()->getFader()->fadeIn(0.25);
|
|
}
|
|
}
|