forked from mirror/openmw-tes3mp
Merge branch 'bountydisease' into dialogue
This commit is contained in:
commit
4994a253da
38 changed files with 541 additions and 255 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -14,3 +14,4 @@ Makefile
|
||||||
makefile
|
makefile
|
||||||
data
|
data
|
||||||
*.kdev4
|
*.kdev4
|
||||||
|
CMakeLists.txt.user
|
||||||
|
|
|
@ -77,6 +77,12 @@ namespace MWBase
|
||||||
virtual void restoreDynamicStats() = 0;
|
virtual void restoreDynamicStats() = 0;
|
||||||
///< If the player is sleeping, this should be called every hour.
|
///< If the player is sleeping, this should be called every hour.
|
||||||
|
|
||||||
|
virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying) = 0;
|
||||||
|
///< This is used by every service to determine the price of objects given the trading skills of the player and NPC.
|
||||||
|
|
||||||
|
virtual int getDerivedDisposition(const MWWorld::Ptr& ptr) = 0;
|
||||||
|
///< Calculate the diposition of an NPC toward the player.
|
||||||
|
|
||||||
virtual int countDeaths (const std::string& id) const = 0;
|
virtual int countDeaths (const std::string& id) const = 0;
|
||||||
///< Return the number of deaths for actors with the given ID.
|
///< Return the number of deaths for actors with the given ID.
|
||||||
};
|
};
|
||||||
|
|
|
@ -29,6 +29,7 @@ namespace ESM
|
||||||
struct Class;
|
struct Class;
|
||||||
struct Potion;
|
struct Potion;
|
||||||
struct Spell;
|
struct Spell;
|
||||||
|
struct NPC;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MWRender
|
namespace MWRender
|
||||||
|
@ -230,24 +231,28 @@ namespace MWBase
|
||||||
///< Toggle a render mode.
|
///< Toggle a render mode.
|
||||||
///< \return Resulting mode
|
///< \return Resulting mode
|
||||||
|
|
||||||
virtual std::pair<std::string, const ESM::Potion *> createRecord (const ESM::Potion& record)
|
virtual const ESM::Potion *createRecord (const ESM::Potion& record)
|
||||||
= 0;
|
= 0;
|
||||||
///< Create a new recrod (of type potion) in the ESM store.
|
///< Create a new recrod (of type potion) in the ESM store.
|
||||||
/// \return ID, pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
virtual std::pair<std::string, const ESM::Spell *> createRecord (const ESM::Spell& record)
|
virtual const ESM::Spell *createRecord (const ESM::Spell& record)
|
||||||
= 0;
|
= 0;
|
||||||
///< Create a new recrod (of type spell) in the ESM store.
|
///< Create a new recrod (of type spell) in the ESM store.
|
||||||
/// \return ID, pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
virtual std::pair<std::string, const ESM::Class *> createRecord (const ESM::Class& record)
|
virtual const ESM::Class *createRecord (const ESM::Class& record)
|
||||||
= 0;
|
= 0;
|
||||||
///< Create a new recrod (of type class) in the ESM store.
|
///< Create a new recrod (of type class) in the ESM store.
|
||||||
/// \return ID, pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
virtual const ESM::Cell *createRecord (const ESM::Cell& record) = 0;
|
virtual const ESM::Cell *createRecord (const ESM::Cell& record) = 0;
|
||||||
///< Create a new recrod (of type cell) in the ESM store.
|
///< Create a new recrod (of type cell) in the ESM store.
|
||||||
/// \return ID, pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
|
virtual const ESM::NPC *createRecord(const ESM::NPC &record) = 0;
|
||||||
|
///< Create a new recrod (of type npc) in the ESM store.
|
||||||
|
/// \return pointer to created record
|
||||||
|
|
||||||
virtual void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName,
|
virtual void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName,
|
||||||
int mode, int number = 1) = 0;
|
int mode, int number = 1) = 0;
|
||||||
|
|
|
@ -95,6 +95,7 @@ namespace MWClass
|
||||||
data->mCreatureStats.setFatigue (ref->mBase->mNpdt52.mFatigue);
|
data->mCreatureStats.setFatigue (ref->mBase->mNpdt52.mFatigue);
|
||||||
|
|
||||||
data->mCreatureStats.setLevel(ref->mBase->mNpdt52.mLevel);
|
data->mCreatureStats.setLevel(ref->mBase->mNpdt52.mLevel);
|
||||||
|
data->mNpcStats.setDisposition(ref->mBase->mNpdt52.mDisposition);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -464,7 +464,7 @@ namespace MWDialogue
|
||||||
|| services & ESM::NPC::Misc)
|
|| services & ESM::NPC::Misc)
|
||||||
windowServices |= MWGui::DialogueWindow::Service_Trade;
|
windowServices |= MWGui::DialogueWindow::Service_Trade;
|
||||||
|
|
||||||
if( !mActor.get<ESM::NPC>()->mBase->mTransport.empty())
|
if(mActor.getTypeName() == typeid(ESM::NPC).name() && !mActor.get<ESM::NPC>()->mBase->mTransport.empty())
|
||||||
windowServices |= MWGui::DialogueWindow::Service_Travel;
|
windowServices |= MWGui::DialogueWindow::Service_Travel;
|
||||||
|
|
||||||
if (services & ESM::NPC::Spells)
|
if (services & ESM::NPC::Spells)
|
||||||
|
|
|
@ -559,6 +559,7 @@ void CharacterCreation::onCreateClassDialogDone(WindowBase* parWindow)
|
||||||
klass.mData.mSkills[i][1] = majorSkills[i];
|
klass.mData.mSkills[i][1] = majorSkills[i];
|
||||||
klass.mData.mSkills[i][0] = minorSkills[i];
|
klass.mData.mSkills[i][0] = minorSkills[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
MWBase::Environment::get().getMechanicsManager()->setPlayerClass(klass);
|
MWBase::Environment::get().getMechanicsManager()->setPlayerClass(klass);
|
||||||
mPlayerClass = klass;
|
mPlayerClass = klass;
|
||||||
mWM->setPlayerClass(klass);
|
mWM->setPlayerClass(klass);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "../mwbase/dialoguemanager.hpp"
|
#include "../mwbase/dialoguemanager.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
|
||||||
#include "dialogue_history.hpp"
|
#include "dialogue_history.hpp"
|
||||||
#include "widgets.hpp"
|
#include "widgets.hpp"
|
||||||
|
@ -50,7 +51,7 @@ std::string::size_type find_str_ci(const std::string& str, const std::string& su
|
||||||
|
|
||||||
DialogueWindow::DialogueWindow(MWBase::WindowManager& parWindowManager)
|
DialogueWindow::DialogueWindow(MWBase::WindowManager& parWindowManager)
|
||||||
: WindowBase("openmw_dialogue_window.layout", parWindowManager)
|
: WindowBase("openmw_dialogue_window.layout", parWindowManager)
|
||||||
, mEnabled(true)
|
, mEnabled(false)
|
||||||
, mServices(0)
|
, mServices(0)
|
||||||
{
|
{
|
||||||
// Centre dialog
|
// Centre dialog
|
||||||
|
@ -299,10 +300,13 @@ void DialogueWindow::updateOptions()
|
||||||
mTopicsList->clear();
|
mTopicsList->clear();
|
||||||
mHistory->eraseText(0, mHistory->getTextLength());
|
mHistory->eraseText(0, mHistory->getTextLength());
|
||||||
|
|
||||||
|
if (mPtr.getTypeName() == typeid(ESM::NPC).name())
|
||||||
|
{
|
||||||
mDispositionBar->setProgressRange(100);
|
mDispositionBar->setProgressRange(100);
|
||||||
mDispositionBar->setProgressPosition(40);
|
mDispositionBar->setProgressPosition(MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mPtr));
|
||||||
mDispositionText->eraseText(0, mDispositionText->getTextLength());
|
mDispositionText->eraseText(0, mDispositionText->getTextLength());
|
||||||
mDispositionText->addText("#B29154"+std::string("40/100")+"#B29154");
|
mDispositionText->addText("#B29154"+boost::lexical_cast<std::string>(MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mPtr))+std::string("/100")+"#B29154");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DialogueWindow::goodbye()
|
void DialogueWindow::goodbye()
|
||||||
|
@ -316,3 +320,14 @@ void DialogueWindow::onReferenceUnavailable()
|
||||||
{
|
{
|
||||||
mWindowManager.removeGuiMode(GM_Dialogue);
|
mWindowManager.removeGuiMode(GM_Dialogue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DialogueWindow::onFrame()
|
||||||
|
{
|
||||||
|
if(mEnabled && mPtr.getTypeName() == typeid(ESM::NPC).name())
|
||||||
|
{
|
||||||
|
mDispositionBar->setProgressRange(100);
|
||||||
|
mDispositionBar->setProgressPosition(MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mPtr));
|
||||||
|
mDispositionText->eraseText(0, mDispositionText->getTextLength());
|
||||||
|
mDispositionText->addText("#B29154"+boost::lexical_cast<std::string>(MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mPtr))+std::string("/100")+"#B29154");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ namespace MWGui
|
||||||
void addTitle(std::string text);
|
void addTitle(std::string text);
|
||||||
void askQuestion(std::string question);
|
void askQuestion(std::string question);
|
||||||
void goodbye();
|
void goodbye();
|
||||||
|
void onFrame();
|
||||||
|
|
||||||
// make sure to call these before setKeywords()
|
// make sure to call these before setKeywords()
|
||||||
void setServices(int services) { mServices = services; }
|
void setServices(int services) { mServices = services; }
|
||||||
|
|
|
@ -108,7 +108,8 @@ namespace MWGui
|
||||||
|
|
||||||
void LevelupDialog::open()
|
void LevelupDialog::open()
|
||||||
{
|
{
|
||||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld ()->getPlayer().getPlayer();
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
MWWorld::Ptr player = world->getPlayer().getPlayer();
|
||||||
MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get(player).getCreatureStats (player);
|
MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get(player).getCreatureStats (player);
|
||||||
MWMechanics::NpcStats& pcStats = MWWorld::Class::get(player).getNpcStats (player);
|
MWMechanics::NpcStats& pcStats = MWWorld::Class::get(player).getNpcStats (player);
|
||||||
|
|
||||||
|
@ -119,20 +120,13 @@ namespace MWGui
|
||||||
|
|
||||||
setAttributeValues();
|
setAttributeValues();
|
||||||
|
|
||||||
// set class image
|
const ESM::NPC *playerData = player.get<ESM::NPC>()->mBase;
|
||||||
const ESM::Class& playerClass = MWBase::Environment::get().getWorld ()->getPlayer ().getClass ();
|
|
||||||
// retrieve the ID to this class
|
|
||||||
std::string classId;
|
|
||||||
const MWWorld::Store<ESM::Class> &classes =
|
|
||||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::Class>();
|
|
||||||
|
|
||||||
MWWorld::Store<ESM::Class>::iterator it = classes.begin();
|
// set class image
|
||||||
for (; it != classes.end(); ++it)
|
const ESM::Class *cls =
|
||||||
{
|
world->getStore().get<ESM::Class>().find(playerData->mClass);
|
||||||
if (playerClass.mName == it->mName)
|
|
||||||
classId = it->mId;
|
mClassImage->setImageTexture ("textures\\levelup\\" + cls->mId + ".dds");
|
||||||
}
|
|
||||||
mClassImage->setImageTexture ("textures\\levelup\\" + classId + ".dds");
|
|
||||||
|
|
||||||
/// \todo replace this with INI-imported texts
|
/// \todo replace this with INI-imported texts
|
||||||
int level = creatureStats.getLevel ()+1;
|
int level = creatureStats.getLevel ()+1;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwbase/soundmanager.hpp"
|
#include "../mwbase/soundmanager.hpp"
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
|
||||||
#include "../mwworld/player.hpp"
|
#include "../mwworld/player.hpp"
|
||||||
#include "../mwworld/manualref.hpp"
|
#include "../mwworld/manualref.hpp"
|
||||||
|
@ -52,9 +53,9 @@ namespace MWGui
|
||||||
const MWWorld::ESMStore &store =
|
const MWWorld::ESMStore &store =
|
||||||
MWBase::Environment::get().getWorld()->getStore();
|
MWBase::Environment::get().getWorld()->getStore();
|
||||||
|
|
||||||
const ESM::Spell* spell = store.get<ESM::Spell>().find(spellId);
|
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(spellId);
|
||||||
|
|
||||||
int price = spell->mData.mCost*store.get<ESM::GameSetting>().find("fSpellValueMult")->getFloat();
|
int price = spell->mData.mCost*store.get<ESM::GameSetting>().find("fSpellValueMult")->getFloat();
|
||||||
|
price = MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr,price,true);
|
||||||
|
|
||||||
MyGUI::Button* toAdd =
|
MyGUI::Button* toAdd =
|
||||||
mSpellsView->createWidget<MyGUI::Button>(
|
mSpellsView->createWidget<MyGUI::Button>(
|
||||||
|
@ -67,7 +68,6 @@ namespace MWGui
|
||||||
);
|
);
|
||||||
|
|
||||||
mCurrentY += sLineHeight;
|
mCurrentY += sLineHeight;
|
||||||
/// \todo price adjustment depending on merchantile skill
|
|
||||||
|
|
||||||
toAdd->setUserData(price);
|
toAdd->setUserData(price);
|
||||||
toAdd->setCaptionWithReplacing(spell->mName+" - "+boost::lexical_cast<std::string>(price)+"#{sgp}");
|
toAdd->setCaptionWithReplacing(spell->mName+" - "+boost::lexical_cast<std::string>(price)+"#{sgp}");
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/soundmanager.hpp"
|
#include "../mwbase/soundmanager.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
|
||||||
#include "../mwworld/esmstore.hpp"
|
#include "../mwworld/esmstore.hpp"
|
||||||
#include "../mwworld/player.hpp"
|
#include "../mwworld/player.hpp"
|
||||||
|
@ -336,12 +337,12 @@ namespace MWGui
|
||||||
|
|
||||||
MWBase::Environment::get().getSoundManager()->playSound ("Item Gold Up", 1.0, 1.0);
|
MWBase::Environment::get().getSoundManager()->playSound ("Item Gold Up", 1.0, 1.0);
|
||||||
|
|
||||||
std::pair<std::string, const ESM::Spell*> result = MWBase::Environment::get().getWorld()->createRecord(mSpell);
|
const ESM::Spell* spell = MWBase::Environment::get().getWorld()->createRecord(mSpell);
|
||||||
|
|
||||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||||
MWMechanics::CreatureStats& stats = MWWorld::Class::get(player).getCreatureStats(player);
|
MWMechanics::CreatureStats& stats = MWWorld::Class::get(player).getCreatureStats(player);
|
||||||
MWMechanics::Spells& spells = stats.getSpells();
|
MWMechanics::Spells& spells = stats.getSpells();
|
||||||
spells.add (result.first);
|
spells.add (spell->mId);
|
||||||
|
|
||||||
MWBase::Environment::get().getSoundManager()->playSound ("Item Gold Up", 1.0, 1.0);
|
MWBase::Environment::get().getSoundManager()->playSound ("Item Gold Up", 1.0, 1.0);
|
||||||
|
|
||||||
|
@ -399,8 +400,7 @@ namespace MWGui
|
||||||
float fSpellMakingValueMult =
|
float fSpellMakingValueMult =
|
||||||
store.get<ESM::GameSetting>().find("fSpellMakingValueMult")->getFloat();
|
store.get<ESM::GameSetting>().find("fSpellMakingValueMult")->getFloat();
|
||||||
|
|
||||||
/// \todo mercantile
|
int price = MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr,int(y) * fSpellMakingValueMult,true);
|
||||||
int price = int(y) * fSpellMakingValueMult;
|
|
||||||
|
|
||||||
mPriceLabel->setCaption(boost::lexical_cast<std::string>(int(price)));
|
mPriceLabel->setCaption(boost::lexical_cast<std::string>(int(price)));
|
||||||
|
|
||||||
|
|
|
@ -253,7 +253,10 @@ void StatsWindow::onFrame ()
|
||||||
|
|
||||||
setFactions(PCstats.getFactionRanks());
|
setFactions(PCstats.getFactionRanks());
|
||||||
|
|
||||||
setBirthSign(MWBase::Environment::get().getWorld()->getPlayer().getBirthsign());
|
const std::string &signId =
|
||||||
|
MWBase::Environment::get().getWorld()->getPlayer().getBirthSign();
|
||||||
|
|
||||||
|
setBirthSign(signId);
|
||||||
|
|
||||||
if (mChanged)
|
if (mChanged)
|
||||||
updateSkillArea();
|
updateSkillArea();
|
||||||
|
@ -426,11 +429,13 @@ void StatsWindow::updateSkillArea()
|
||||||
if (!mMiscSkills.empty())
|
if (!mMiscSkills.empty())
|
||||||
addSkills(mMiscSkills, "sSkillClassMisc", "Misc Skills", coord1, coord2);
|
addSkills(mMiscSkills, "sSkillClassMisc", "Misc Skills", coord1, coord2);
|
||||||
|
|
||||||
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
const MWWorld::ESMStore &store = world->getStore();
|
||||||
|
const ESM::NPC *player =
|
||||||
|
world->getPlayer().getPlayer().get<ESM::NPC>()->mBase;
|
||||||
|
|
||||||
// race tooltip
|
// race tooltip
|
||||||
const ESM::Race* playerRace =
|
const ESM::Race* playerRace = store.get<ESM::Race>().find(player->mRace);
|
||||||
store.get<ESM::Race>().find (MWBase::Environment::get().getWorld()->getPlayer().getRace());
|
|
||||||
|
|
||||||
MyGUI::Widget* raceWidget;
|
MyGUI::Widget* raceWidget;
|
||||||
getWidget(raceWidget, "RaceText");
|
getWidget(raceWidget, "RaceText");
|
||||||
|
@ -440,11 +445,14 @@ void StatsWindow::updateSkillArea()
|
||||||
|
|
||||||
// class tooltip
|
// class tooltip
|
||||||
MyGUI::Widget* classWidget;
|
MyGUI::Widget* classWidget;
|
||||||
const ESM::Class& playerClass = MWBase::Environment::get().getWorld()->getPlayer().getClass();
|
|
||||||
|
const ESM::Class *playerClass =
|
||||||
|
store.get<ESM::Class>().find(player->mClass);
|
||||||
|
|
||||||
getWidget(classWidget, "ClassText");
|
getWidget(classWidget, "ClassText");
|
||||||
ToolTips::createClassToolTip(classWidget, playerClass);
|
ToolTips::createClassToolTip(classWidget, *playerClass);
|
||||||
getWidget(classWidget, "Class_str");
|
getWidget(classWidget, "Class_str");
|
||||||
ToolTips::createClassToolTip(classWidget, playerClass);
|
ToolTips::createClassToolTip(classWidget, *playerClass);
|
||||||
|
|
||||||
if (!mFactions.empty())
|
if (!mFactions.empty())
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,10 +6,16 @@
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwbase/soundmanager.hpp"
|
#include "../mwbase/soundmanager.hpp"
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
|
||||||
#include "../mwworld/inventorystore.hpp"
|
#include "../mwworld/inventorystore.hpp"
|
||||||
#include "../mwworld/manualref.hpp"
|
#include "../mwworld/manualref.hpp"
|
||||||
|
|
||||||
|
#include "../mwmechanics/creaturestats.hpp"
|
||||||
|
#include "../mwmechanics/npcstats.hpp"
|
||||||
|
|
||||||
|
#include "../mwworld/player.hpp"
|
||||||
|
|
||||||
#include "inventorywindow.hpp"
|
#include "inventorywindow.hpp"
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
|
@ -52,6 +58,8 @@ namespace MWGui
|
||||||
|
|
||||||
mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &TradeWindow::onCancelButtonClicked);
|
mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &TradeWindow::onCancelButtonClicked);
|
||||||
mOfferButton->eventMouseButtonClick += MyGUI::newDelegate(this, &TradeWindow::onOfferButtonClicked);
|
mOfferButton->eventMouseButtonClick += MyGUI::newDelegate(this, &TradeWindow::onOfferButtonClicked);
|
||||||
|
mIncreaseButton->eventMouseButtonClick += MyGUI::newDelegate(this, &TradeWindow::onIncreaseButtonClicked);
|
||||||
|
mDecreaseButton->eventMouseButtonClick += MyGUI::newDelegate(this, &TradeWindow::onDecreaseButtonClicked);
|
||||||
|
|
||||||
setCoord(400, 0, 400, 300);
|
setCoord(400, 0, 400, 300);
|
||||||
|
|
||||||
|
@ -63,6 +71,7 @@ namespace MWGui
|
||||||
setTitle(MWWorld::Class::get(actor).getName(actor));
|
setTitle(MWWorld::Class::get(actor).getName(actor));
|
||||||
|
|
||||||
mCurrentBalance = 0;
|
mCurrentBalance = 0;
|
||||||
|
mCurrentMerchantOffer = 0;
|
||||||
|
|
||||||
mWindowManager.getInventoryWindow()->startTrade();
|
mWindowManager.getInventoryWindow()->startTrade();
|
||||||
|
|
||||||
|
@ -135,6 +144,9 @@ namespace MWGui
|
||||||
|
|
||||||
void TradeWindow::onOfferButtonClicked(MyGUI::Widget* _sender)
|
void TradeWindow::onOfferButtonClicked(MyGUI::Widget* _sender)
|
||||||
{
|
{
|
||||||
|
const MWWorld::Store<ESM::GameSetting> &gmst =
|
||||||
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
||||||
|
|
||||||
// were there any items traded at all?
|
// were there any items traded at all?
|
||||||
MWWorld::ContainerStore& playerBought = mWindowManager.getInventoryWindow()->getBoughtItems();
|
MWWorld::ContainerStore& playerBought = mWindowManager.getInventoryWindow()->getBoughtItems();
|
||||||
MWWorld::ContainerStore& merchantBought = getBoughtItems();
|
MWWorld::ContainerStore& merchantBought = getBoughtItems();
|
||||||
|
@ -178,6 +190,56 @@ namespace MWGui
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(mCurrentBalance > mCurrentMerchantOffer)
|
||||||
|
{
|
||||||
|
//if npc is a creature: reject (no haggle)
|
||||||
|
if (mPtr.getTypeName() != typeid(ESM::NPC).name())
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->
|
||||||
|
messageBox("#{sNotifyMessage9}", std::vector<std::string>());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int a = abs(mCurrentMerchantOffer);
|
||||||
|
int b = abs(mCurrentBalance);
|
||||||
|
int d = 0;
|
||||||
|
if (mCurrentMerchantOffer<0) d = int(100 * (a - b) / a);
|
||||||
|
else d = int(100 * (b - a) / a);
|
||||||
|
|
||||||
|
float clampedDisposition = std::max<int>(0,std::min<int>(int(MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mPtr)),100));
|
||||||
|
|
||||||
|
MWMechanics::NpcStats sellerSkill = MWWorld::Class::get(mPtr).getNpcStats(mPtr);
|
||||||
|
MWMechanics::CreatureStats sellerStats = MWWorld::Class::get(mPtr).getCreatureStats(mPtr);
|
||||||
|
MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||||
|
MWMechanics::NpcStats playerSkill = MWWorld::Class::get(playerPtr).getNpcStats(playerPtr);
|
||||||
|
MWMechanics::CreatureStats playerStats = MWWorld::Class::get(playerPtr).getCreatureStats(playerPtr);
|
||||||
|
|
||||||
|
float a1 = std::min(playerSkill.getSkill(ESM::Skill::Mercantile).getModified(), 100.f);
|
||||||
|
float b1 = std::min(0.1f * playerStats.getAttribute(ESM::Attribute::Luck).getModified(), 10.f);
|
||||||
|
float c1 = std::min(0.2f * playerStats.getAttribute(ESM::Attribute::Personality).getModified(), 10.f);
|
||||||
|
float d1 = std::min(sellerSkill.getSkill(ESM::Skill::Mercantile).getModified(), 100.f);
|
||||||
|
float e1 = std::min(0.1f * sellerStats.getAttribute(ESM::Attribute::Luck).getModified(), 10.f);
|
||||||
|
float f1 = std::min(0.2f * sellerStats.getAttribute(ESM::Attribute::Personality).getModified(), 10.f);
|
||||||
|
|
||||||
|
float pcTerm = (clampedDisposition - 50 + a1 + b1 + c1) * playerStats.getFatigueTerm();
|
||||||
|
float npcTerm = (d1 + e1 + f1) * sellerStats.getFatigueTerm();
|
||||||
|
float x = gmst.find("fBargainOfferMulti")->getFloat() * d + gmst.find("fBargainOfferBase")->getFloat();
|
||||||
|
if (mCurrentMerchantOffer<0) x += abs(int(pcTerm - npcTerm));
|
||||||
|
else x += abs(int(npcTerm - pcTerm));
|
||||||
|
|
||||||
|
int roll = std::rand()%100 + 1;
|
||||||
|
if(roll > x) //trade refused
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->
|
||||||
|
messageBox("#{sNotifyMessage9}", std::vector<std::string>());
|
||||||
|
/// \todo adjust npc temporary disposition by iBarterSuccessDisposition or iBarterFailDisposition
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// \todo adjust npc temporary disposition by iBarterSuccessDisposition or iBarterFailDisposition
|
||||||
|
|
||||||
// success! make the item transfer.
|
// success! make the item transfer.
|
||||||
transferBoughtItems();
|
transferBoughtItems();
|
||||||
mWindowManager.getInventoryWindow()->transferBoughtItems();
|
mWindowManager.getInventoryWindow()->transferBoughtItems();
|
||||||
|
@ -202,6 +264,20 @@ namespace MWGui
|
||||||
mWindowManager.removeGuiMode(GM_Barter);
|
mWindowManager.removeGuiMode(GM_Barter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TradeWindow::onIncreaseButtonClicked(MyGUI::Widget* _sender)
|
||||||
|
{
|
||||||
|
if(mCurrentBalance<=-1) mCurrentBalance -= 1;
|
||||||
|
if(mCurrentBalance>=1) mCurrentBalance += 1;
|
||||||
|
updateLabels();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TradeWindow::onDecreaseButtonClicked(MyGUI::Widget* _sender)
|
||||||
|
{
|
||||||
|
if(mCurrentBalance<-1) mCurrentBalance += 1;
|
||||||
|
if(mCurrentBalance>1) mCurrentBalance -= 1;
|
||||||
|
updateLabels();
|
||||||
|
}
|
||||||
|
|
||||||
void TradeWindow::updateLabels()
|
void TradeWindow::updateLabels()
|
||||||
{
|
{
|
||||||
mPlayerGold->setCaptionWithReplacing("#{sYourGold} " + boost::lexical_cast<std::string>(mWindowManager.getInventoryWindow()->getPlayerGold()));
|
mPlayerGold->setCaptionWithReplacing("#{sYourGold} " + boost::lexical_cast<std::string>(mWindowManager.getInventoryWindow()->getPlayerGold()));
|
||||||
|
@ -320,19 +396,17 @@ namespace MWGui
|
||||||
|
|
||||||
void TradeWindow::sellToNpc(MWWorld::Ptr item, int count)
|
void TradeWindow::sellToNpc(MWWorld::Ptr item, int count)
|
||||||
{
|
{
|
||||||
/// \todo price adjustment depending on merchantile skill
|
|
||||||
|
|
||||||
mCurrentBalance -= MWWorld::Class::get(item).getValue(item) * count;
|
|
||||||
|
|
||||||
|
mCurrentBalance -= MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr, MWWorld::Class::get(item).getValue(item) * count,true);
|
||||||
|
mCurrentMerchantOffer -= MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr, MWWorld::Class::get(item).getValue(item) * count,true);
|
||||||
updateLabels();
|
updateLabels();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TradeWindow::buyFromNpc(MWWorld::Ptr item, int count)
|
void TradeWindow::buyFromNpc(MWWorld::Ptr item, int count)
|
||||||
{
|
{
|
||||||
/// \todo price adjustment depending on merchantile skill
|
|
||||||
|
|
||||||
mCurrentBalance += MWWorld::Class::get(item).getValue(item) * count;
|
|
||||||
|
|
||||||
|
mCurrentBalance += MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr, MWWorld::Class::get(item).getValue(item) * count,false);
|
||||||
|
mCurrentMerchantOffer += MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr, MWWorld::Class::get(item).getValue(item) * count,false);
|
||||||
updateLabels();
|
updateLabels();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,11 +55,14 @@ namespace MWGui
|
||||||
MyGUI::TextBox* mMerchantGold;
|
MyGUI::TextBox* mMerchantGold;
|
||||||
|
|
||||||
int mCurrentBalance;
|
int mCurrentBalance;
|
||||||
|
int mCurrentMerchantOffer;
|
||||||
|
|
||||||
void onWindowResize(MyGUI::Window* _sender);
|
void onWindowResize(MyGUI::Window* _sender);
|
||||||
void onFilterChanged(MyGUI::Widget* _sender);
|
void onFilterChanged(MyGUI::Widget* _sender);
|
||||||
void onOfferButtonClicked(MyGUI::Widget* _sender);
|
void onOfferButtonClicked(MyGUI::Widget* _sender);
|
||||||
void onCancelButtonClicked(MyGUI::Widget* _sender);
|
void onCancelButtonClicked(MyGUI::Widget* _sender);
|
||||||
|
void onIncreaseButtonClicked(MyGUI::Widget* _sender);
|
||||||
|
void onDecreaseButtonClicked(MyGUI::Widget* _sender);
|
||||||
|
|
||||||
// don't show items that the NPC has equipped in his trade-window.
|
// don't show items that the NPC has equipped in his trade-window.
|
||||||
virtual bool ignoreEquippedItems() { return true; }
|
virtual bool ignoreEquippedItems() { return true; }
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
|
||||||
#include "../mwworld/player.hpp"
|
#include "../mwworld/player.hpp"
|
||||||
|
|
||||||
|
@ -78,8 +79,8 @@ namespace MWGui
|
||||||
|
|
||||||
for (int i=0; i<3; ++i)
|
for (int i=0; i<3; ++i)
|
||||||
{
|
{
|
||||||
/// \todo mercantile skill
|
int price = MWBase::Environment::get().getMechanicsManager()->getBarterOffer
|
||||||
int price = pcStats.getSkill (bestSkills[i].first).getBase() * gmst.find("iTrainingMod")->getInt ();
|
(mPtr,pcStats.getSkill (bestSkills[i].first).getBase() * gmst.find("iTrainingMod")->getInt (),true);
|
||||||
|
|
||||||
std::string skin = (price > mWindowManager.getInventoryWindow ()->getPlayerGold ()) ? "SandTextGreyedOut" : "SandTextButton";
|
std::string skin = (price > mWindowManager.getInventoryWindow ()->getPlayerGold ()) ? "SandTextGreyedOut" : "SandTextButton";
|
||||||
|
|
||||||
|
@ -119,8 +120,8 @@ namespace MWGui
|
||||||
const MWWorld::ESMStore &store =
|
const MWWorld::ESMStore &store =
|
||||||
MWBase::Environment::get().getWorld()->getStore();
|
MWBase::Environment::get().getWorld()->getStore();
|
||||||
|
|
||||||
/// \todo mercantile skill
|
|
||||||
int price = pcStats.getSkill (skillId).getBase() * store.get<ESM::GameSetting>().find("iTrainingMod")->getInt ();
|
int price = pcStats.getSkill (skillId).getBase() * store.get<ESM::GameSetting>().find("iTrainingMod")->getInt ();
|
||||||
|
price = MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr,price,true);
|
||||||
|
|
||||||
if (mWindowManager.getInventoryWindow()->getPlayerGold()<price)
|
if (mWindowManager.getInventoryWindow()->getPlayerGold()<price)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -69,9 +69,10 @@ namespace MWGui
|
||||||
price = d/gmst.find("fTravelMult")->getFloat();
|
price = d/gmst.find("fTravelMult")->getFloat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
price = MWBase::Environment::get().getMechanicsManager()->getBarterOffer(mPtr,price,true);
|
||||||
|
|
||||||
MyGUI::Button* toAdd = mDestinationsView->createWidget<MyGUI::Button>((price>mWindowManager.getInventoryWindow()->getPlayerGold()) ? "SandTextGreyedOut" : "SandTextButton", 0, mCurrentY, 200, sLineHeight, MyGUI::Align::Default);
|
MyGUI::Button* toAdd = mDestinationsView->createWidget<MyGUI::Button>((price>mWindowManager.getInventoryWindow()->getPlayerGold()) ? "SandTextGreyedOut" : "SandTextButton", 0, mCurrentY, 200, sLineHeight, MyGUI::Align::Default);
|
||||||
mCurrentY += sLineHeight;
|
mCurrentY += sLineHeight;
|
||||||
/// \todo price adjustment depending on merchantile skill
|
|
||||||
if(interior)
|
if(interior)
|
||||||
toAdd->setUserString("interior","y");
|
toAdd->setUserString("interior","y");
|
||||||
else
|
else
|
||||||
|
|
|
@ -83,7 +83,6 @@ WindowManager::WindowManager(
|
||||||
, mSpellCreationDialog(NULL)
|
, mSpellCreationDialog(NULL)
|
||||||
, mEnchantingDialog(NULL)
|
, mEnchantingDialog(NULL)
|
||||||
, mTrainingWindow(NULL)
|
, mTrainingWindow(NULL)
|
||||||
, mPlayerClass()
|
|
||||||
, mPlayerName()
|
, mPlayerName()
|
||||||
, mPlayerRaceId()
|
, mPlayerRaceId()
|
||||||
, mPlayerAttributes()
|
, mPlayerAttributes()
|
||||||
|
@ -499,8 +498,7 @@ void WindowManager::setValue (const std::string& id, int value)
|
||||||
|
|
||||||
void WindowManager::setPlayerClass (const ESM::Class &class_)
|
void WindowManager::setPlayerClass (const ESM::Class &class_)
|
||||||
{
|
{
|
||||||
mPlayerClass = class_;
|
mStatsWindow->setValue("class", class_.mName);
|
||||||
mStatsWindow->setValue("class", mPlayerClass.mName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::configureSkills (const SkillList& major, const SkillList& minor)
|
void WindowManager::configureSkills (const SkillList& major, const SkillList& minor)
|
||||||
|
@ -584,6 +582,8 @@ void WindowManager::onFrame (float frameDuration)
|
||||||
mDragAndDrop->mDraggedWidget->setPosition(MyGUI::InputManager::getInstance().getMousePosition());
|
mDragAndDrop->mDraggedWidget->setPosition(MyGUI::InputManager::getInstance().getMousePosition());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mDialogueWindow->onFrame();
|
||||||
|
|
||||||
mInventoryWindow->onFrame();
|
mInventoryWindow->onFrame();
|
||||||
|
|
||||||
mStatsWindow->onFrame();
|
mStatsWindow->onFrame();
|
||||||
|
@ -774,6 +774,13 @@ void WindowManager::pushGuiMode(GuiMode mode)
|
||||||
if (mode==GM_Inventory && mAllowed==GW_None)
|
if (mode==GM_Inventory && mAllowed==GW_None)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
// If this mode already exists somewhere in the stack, just bring it to the front.
|
||||||
|
if (std::find(mGuiModes.begin(), mGuiModes.end(), mode) != mGuiModes.end())
|
||||||
|
{
|
||||||
|
mGuiModes.erase(std::find(mGuiModes.begin(), mGuiModes.end(), mode));
|
||||||
|
}
|
||||||
|
|
||||||
mGuiModes.push_back(mode);
|
mGuiModes.push_back(mode);
|
||||||
|
|
||||||
bool gameMode = !isGuiMode();
|
bool gameMode = !isGuiMode();
|
||||||
|
|
|
@ -261,7 +261,6 @@ namespace MWGui
|
||||||
|
|
||||||
/// \todo get rid of this stuff. Move it to the respective UI element classes, if needed.
|
/// \todo get rid of this stuff. Move it to the respective UI element classes, if needed.
|
||||||
// Various stats about player as needed by window manager
|
// Various stats about player as needed by window manager
|
||||||
ESM::Class mPlayerClass;
|
|
||||||
std::string mPlayerName;
|
std::string mPlayerName;
|
||||||
std::string mPlayerRaceId;
|
std::string mPlayerRaceId;
|
||||||
std::map<int, MWMechanics::Stat<int> > mPlayerAttributes;
|
std::map<int, MWMechanics::Stat<int> > mPlayerAttributes;
|
||||||
|
|
|
@ -279,7 +279,7 @@ void MWMechanics::Alchemy::addPotion (const std::string& name)
|
||||||
|
|
||||||
newRecord.mEffects.mList = mEffects;
|
newRecord.mEffects.mList = mEffects;
|
||||||
|
|
||||||
record = MWBase::Environment::get().getWorld()->createRecord (newRecord).second;
|
record = MWBase::Environment::get().getWorld()->createRecord (newRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
MWWorld::ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), record->mId);
|
MWWorld::ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), record->mId);
|
||||||
|
|
|
@ -232,4 +232,14 @@ namespace MWMechanics
|
||||||
mDead = false;
|
mDead = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CreatureStats::hasCommonDisease() const
|
||||||
|
{
|
||||||
|
return mSpells.hasCommonDisease();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CreatureStats::hasBlightDisease() const
|
||||||
|
{
|
||||||
|
return mSpells.hasBlightDisease();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,10 @@ namespace MWMechanics
|
||||||
bool isDead() const;
|
bool isDead() const;
|
||||||
|
|
||||||
void resurrect();
|
void resurrect();
|
||||||
|
|
||||||
|
bool hasCommonDisease() const;
|
||||||
|
|
||||||
|
bool hasBlightDisease() const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,15 +38,16 @@ namespace MWMechanics
|
||||||
creatureStats.getAttribute(6).setBase (player->mNpdt52.mPersonality);
|
creatureStats.getAttribute(6).setBase (player->mNpdt52.mPersonality);
|
||||||
creatureStats.getAttribute(7).setBase (player->mNpdt52.mLuck);
|
creatureStats.getAttribute(7).setBase (player->mNpdt52.mLuck);
|
||||||
|
|
||||||
|
const MWWorld::ESMStore &esmStore =
|
||||||
|
MWBase::Environment::get().getWorld()->getStore();
|
||||||
|
|
||||||
// race
|
// race
|
||||||
if (mRaceSelected)
|
if (mRaceSelected)
|
||||||
{
|
{
|
||||||
const ESM::Race *race =
|
const ESM::Race *race =
|
||||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::Race>().find (
|
esmStore.get<ESM::Race>().find(player->mRace);
|
||||||
MWBase::Environment::get().getWorld()->getPlayer().getRace()
|
|
||||||
);
|
|
||||||
|
|
||||||
bool male = MWBase::Environment::get().getWorld()->getPlayer().isMale();
|
bool male = (player->mFlags & ESM::NPC::Female) == 0;
|
||||||
|
|
||||||
for (int i=0; i<8; ++i)
|
for (int i=0; i<8; ++i)
|
||||||
{
|
{
|
||||||
|
@ -89,11 +90,13 @@ namespace MWMechanics
|
||||||
}
|
}
|
||||||
|
|
||||||
// birthsign
|
// birthsign
|
||||||
if (!MWBase::Environment::get().getWorld()->getPlayer().getBirthsign().empty())
|
const std::string &signId =
|
||||||
|
MWBase::Environment::get().getWorld()->getPlayer().getBirthSign();
|
||||||
|
|
||||||
|
if (!signId.empty())
|
||||||
{
|
{
|
||||||
const ESM::BirthSign *sign =
|
const ESM::BirthSign *sign =
|
||||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::BirthSign>().find (
|
esmStore.get<ESM::BirthSign>().find(signId);
|
||||||
MWBase::Environment::get().getWorld()->getPlayer().getBirthsign());
|
|
||||||
|
|
||||||
for (std::vector<std::string>::const_iterator iter (sign->mPowers.mList.begin());
|
for (std::vector<std::string>::const_iterator iter (sign->mPowers.mList.begin());
|
||||||
iter!=sign->mPowers.mList.end(); ++iter)
|
iter!=sign->mPowers.mList.end(); ++iter)
|
||||||
|
@ -105,11 +108,12 @@ namespace MWMechanics
|
||||||
// class
|
// class
|
||||||
if (mClassSelected)
|
if (mClassSelected)
|
||||||
{
|
{
|
||||||
const ESM::Class& class_ = MWBase::Environment::get().getWorld()->getPlayer().getClass();
|
const ESM::Class *class_ =
|
||||||
|
esmStore.get<ESM::Class>().find(player->mClass);
|
||||||
|
|
||||||
for (int i=0; i<2; ++i)
|
for (int i=0; i<2; ++i)
|
||||||
{
|
{
|
||||||
int attribute = class_.mData.mAttribute[i];
|
int attribute = class_->mData.mAttribute[i];
|
||||||
if (attribute>=0 && attribute<8)
|
if (attribute>=0 && attribute<8)
|
||||||
{
|
{
|
||||||
creatureStats.getAttribute(attribute).setBase (
|
creatureStats.getAttribute(attribute).setBase (
|
||||||
|
@ -123,7 +127,7 @@ namespace MWMechanics
|
||||||
|
|
||||||
for (int i2=0; i2<5; ++i2)
|
for (int i2=0; i2<5; ++i2)
|
||||||
{
|
{
|
||||||
int index = class_.mData.mSkills[i2][i];
|
int index = class_->mData.mSkills[i2][i];
|
||||||
|
|
||||||
if (index>=0 && index<27)
|
if (index>=0 && index<27)
|
||||||
{
|
{
|
||||||
|
@ -134,12 +138,12 @@ namespace MWMechanics
|
||||||
}
|
}
|
||||||
|
|
||||||
const MWWorld::Store<ESM::Skill> &skills =
|
const MWWorld::Store<ESM::Skill> &skills =
|
||||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::Skill>();
|
esmStore.get<ESM::Skill>();
|
||||||
|
|
||||||
MWWorld::Store<ESM::Skill>::iterator iter = skills.begin();
|
MWWorld::Store<ESM::Skill>::iterator iter = skills.begin();
|
||||||
for (; iter != skills.end(); ++iter)
|
for (; iter != skills.end(); ++iter)
|
||||||
{
|
{
|
||||||
if (iter->mData.mSpecialization==class_.mData.mSpecialization)
|
if (iter->mData.mSpecialization==class_->mData.mSpecialization)
|
||||||
{
|
{
|
||||||
int index = iter->mIndex;
|
int index = iter->mIndex;
|
||||||
|
|
||||||
|
@ -267,11 +271,17 @@ namespace MWMechanics
|
||||||
MWBase::Environment::get().getWindowManager();
|
MWBase::Environment::get().getWindowManager();
|
||||||
|
|
||||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
MWWorld::Player &player = world->getPlayer();
|
const ESM::NPC *player =
|
||||||
|
world->getPlayer().getPlayer().get<ESM::NPC>()->mBase;
|
||||||
|
|
||||||
winMgr->setValue ("name", player.getName());
|
const ESM::Race *race =
|
||||||
winMgr->setValue ("race", world->getStore().get<ESM::Race>().find (player.getRace())->mName);
|
world->getStore().get<ESM::Race>().find(player->mRace);
|
||||||
winMgr->setValue ("class", player.getClass().mName);
|
const ESM::Class *cls =
|
||||||
|
world->getStore().get<ESM::Class>().find(player->mClass);
|
||||||
|
|
||||||
|
winMgr->setValue ("name", player->mName);
|
||||||
|
winMgr->setValue ("race", race->mName);
|
||||||
|
winMgr->setValue ("class", cls->mName);
|
||||||
|
|
||||||
mUpdatePlayer = false;
|
mUpdatePlayer = false;
|
||||||
|
|
||||||
|
@ -280,8 +290,8 @@ namespace MWMechanics
|
||||||
|
|
||||||
for (int i=0; i<5; ++i)
|
for (int i=0; i<5; ++i)
|
||||||
{
|
{
|
||||||
minorSkills[i] = player.getClass().mData.mSkills[i][0];
|
minorSkills[i] = cls->mData.mSkills[i][0];
|
||||||
majorSkills[i] = player.getClass().mData.mSkills[i][1];
|
majorSkills[i] = cls->mData.mSkills[i][1];
|
||||||
}
|
}
|
||||||
|
|
||||||
winMgr->configureSkills (majorSkills, minorSkills);
|
winMgr->configureSkills (majorSkills, minorSkills);
|
||||||
|
@ -297,14 +307,33 @@ namespace MWMechanics
|
||||||
|
|
||||||
void MechanicsManager::setPlayerName (const std::string& name)
|
void MechanicsManager::setPlayerName (const std::string& name)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld()->getPlayer().setName (name);
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
|
||||||
|
ESM::NPC player =
|
||||||
|
*world->getPlayer().getPlayer().get<ESM::NPC>()->mBase;
|
||||||
|
player.mName = name;
|
||||||
|
|
||||||
|
world->createRecord(player);
|
||||||
|
|
||||||
mUpdatePlayer = true;
|
mUpdatePlayer = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::setPlayerRace (const std::string& race, bool male)
|
void MechanicsManager::setPlayerRace (const std::string& race, bool male)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld()->getPlayer().setGender (male);
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
MWBase::Environment::get().getWorld()->getPlayer().setRace (race);
|
|
||||||
|
ESM::NPC player =
|
||||||
|
*world->getPlayer().getPlayer().get<ESM::NPC>()->mBase;
|
||||||
|
|
||||||
|
player.mRace = race;
|
||||||
|
|
||||||
|
player.mFlags |= ESM::NPC::Female;
|
||||||
|
if (male) {
|
||||||
|
player.mFlags ^= ESM::NPC::Female;
|
||||||
|
}
|
||||||
|
|
||||||
|
world->createRecord(player);
|
||||||
|
|
||||||
mRaceSelected = true;
|
mRaceSelected = true;
|
||||||
buildPlayer();
|
buildPlayer();
|
||||||
mUpdatePlayer = true;
|
mUpdatePlayer = true;
|
||||||
|
@ -312,29 +341,148 @@ namespace MWMechanics
|
||||||
|
|
||||||
void MechanicsManager::setPlayerBirthsign (const std::string& id)
|
void MechanicsManager::setPlayerBirthsign (const std::string& id)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld()->getPlayer().setBirthsign (id);
|
MWBase::Environment::get().getWorld()->getPlayer().setBirthSign(id);
|
||||||
buildPlayer();
|
buildPlayer();
|
||||||
mUpdatePlayer = true;
|
mUpdatePlayer = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::setPlayerClass (const std::string& id)
|
void MechanicsManager::setPlayerClass (const std::string& id)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld()->getPlayer().setClass (
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
*MWBase::Environment::get().getWorld()->getStore().get<ESM::Class>().find (id)
|
|
||||||
);
|
ESM::NPC player =
|
||||||
|
*world->getPlayer().getPlayer().get<ESM::NPC>()->mBase;
|
||||||
|
player.mClass = id;
|
||||||
|
|
||||||
|
world->createRecord(player);
|
||||||
|
|
||||||
mClassSelected = true;
|
mClassSelected = true;
|
||||||
buildPlayer();
|
buildPlayer();
|
||||||
mUpdatePlayer = true;
|
mUpdatePlayer = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::setPlayerClass (const ESM::Class& class_)
|
void MechanicsManager::setPlayerClass (const ESM::Class &cls)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld()->getPlayer().setClass (class_);
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
|
||||||
|
const ESM::Class *ptr = world->createRecord(cls);
|
||||||
|
|
||||||
|
ESM::NPC player =
|
||||||
|
*world->getPlayer().getPlayer().get<ESM::NPC>()->mBase;
|
||||||
|
player.mClass = ptr->mId;
|
||||||
|
|
||||||
|
world->createRecord(player);
|
||||||
|
|
||||||
mClassSelected = true;
|
mClassSelected = true;
|
||||||
buildPlayer();
|
buildPlayer();
|
||||||
mUpdatePlayer = true;
|
mUpdatePlayer = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string toLower (const std::string& name)
|
||||||
|
{
|
||||||
|
std::string lowerCase;
|
||||||
|
|
||||||
|
std::transform (name.begin(), name.end(), std::back_inserter (lowerCase),
|
||||||
|
(int(*)(int)) std::tolower);
|
||||||
|
|
||||||
|
return lowerCase;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MechanicsManager::getDerivedDisposition(const MWWorld::Ptr& ptr)
|
||||||
|
{
|
||||||
|
MWMechanics::NpcStats npcSkill = MWWorld::Class::get(ptr).getNpcStats(ptr);
|
||||||
|
float x = npcSkill.getDisposition();
|
||||||
|
|
||||||
|
MWWorld::LiveCellRef<ESM::NPC>* npc = ptr.get<ESM::NPC>();
|
||||||
|
MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||||
|
MWWorld::LiveCellRef<ESM::NPC>* player = playerPtr.get<ESM::NPC>();
|
||||||
|
MWMechanics::CreatureStats playerStats = MWWorld::Class::get(playerPtr).getCreatureStats(playerPtr);
|
||||||
|
MWMechanics::NpcStats playerSkill = MWWorld::Class::get(playerPtr).getNpcStats(playerPtr);
|
||||||
|
|
||||||
|
if (toLower(npc->mBase->mRace) == toLower(player->mBase->mRace)) x += MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispRaceMod")->getFloat();
|
||||||
|
|
||||||
|
x += MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispPersonalityMult")->getFloat()
|
||||||
|
* (playerStats.getAttribute(ESM::Attribute::Personality).getModified() - MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispPersonalityBase")->getFloat());
|
||||||
|
|
||||||
|
float reaction = 0;
|
||||||
|
int rank = 0;
|
||||||
|
std::string npcFaction = "";
|
||||||
|
if(!npcSkill.getFactionRanks().empty()) npcFaction = npcSkill.getFactionRanks().begin()->first;
|
||||||
|
|
||||||
|
if (playerSkill.getFactionRanks().find(toLower(npcFaction)) != playerSkill.getFactionRanks().end())
|
||||||
|
{
|
||||||
|
for(std::vector<ESM::Faction::Reaction>::const_iterator it = MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find(toLower(npcFaction))->mReactions.begin();
|
||||||
|
it != MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find(toLower(npcFaction))->mReactions.end(); it++)
|
||||||
|
{
|
||||||
|
if(toLower(it->mFaction) == toLower(npcFaction)) reaction = it->mReaction;
|
||||||
|
}
|
||||||
|
rank = playerSkill.getFactionRanks().find(toLower(npcFaction))->second;
|
||||||
|
}
|
||||||
|
else if (npcFaction != "")
|
||||||
|
{
|
||||||
|
for(std::vector<ESM::Faction::Reaction>::const_iterator it = MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find(toLower(npcFaction))->mReactions.begin();
|
||||||
|
it != MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find(toLower(npcFaction))->mReactions.end();it++)
|
||||||
|
{
|
||||||
|
if(playerSkill.getFactionRanks().find(toLower(it->mFaction)) != playerSkill.getFactionRanks().end() )
|
||||||
|
{
|
||||||
|
if(it->mReaction<reaction) reaction = it->mReaction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rank = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reaction = 0;
|
||||||
|
rank = 0;
|
||||||
|
}
|
||||||
|
x += (MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispFactionRankMult")->getFloat() * rank
|
||||||
|
+ MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispFactionRankBase")->getFloat())
|
||||||
|
* MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispFactionMod")->getFloat() * reaction;
|
||||||
|
|
||||||
|
/// \todo implement bounty and disease
|
||||||
|
//x -= MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispCrimeMod") * pcBounty;
|
||||||
|
//if (pc has a disease) x += MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispDiseaseMod");
|
||||||
|
if (playerSkill.getDrawState() == MWMechanics::DrawState_::DrawState_Weapon) x += MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fDispWeaponDrawn")->getFloat();
|
||||||
|
|
||||||
|
int effective_disposition = std::max(0,std::min(int(x),100));//, normally clamped to [0..100] when used
|
||||||
|
return effective_disposition;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MechanicsManager::getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying)
|
||||||
|
{
|
||||||
|
if (ptr.getTypeName() == typeid(ESM::Creature).name())
|
||||||
|
return basePrice;
|
||||||
|
|
||||||
|
MWMechanics::NpcStats sellerSkill = MWWorld::Class::get(ptr).getNpcStats(ptr);
|
||||||
|
MWMechanics::CreatureStats sellerStats = MWWorld::Class::get(ptr).getCreatureStats(ptr);
|
||||||
|
|
||||||
|
MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||||
|
MWMechanics::NpcStats playerSkill = MWWorld::Class::get(playerPtr).getNpcStats(playerPtr);
|
||||||
|
MWMechanics::CreatureStats playerStats = MWWorld::Class::get(playerPtr).getCreatureStats(playerPtr);
|
||||||
|
|
||||||
|
int clampedDisposition = std::min(getDerivedDisposition(ptr),100);
|
||||||
|
float a = std::min(playerSkill.getSkill(ESM::Skill::Mercantile).getModified(), 100.f);
|
||||||
|
float b = std::min(0.1f * playerStats.getAttribute(ESM::Attribute::Luck).getModified(), 10.f);
|
||||||
|
float c = std::min(0.2f * playerStats.getAttribute(ESM::Attribute::Personality).getModified(), 10.f);
|
||||||
|
float d = std::min(sellerSkill.getSkill(ESM::Skill::Mercantile).getModified(), 100.f);
|
||||||
|
float e = std::min(0.1f * sellerStats.getAttribute(ESM::Attribute::Luck).getModified(), 10.f);
|
||||||
|
float f = std::min(0.2f * sellerStats.getAttribute(ESM::Attribute::Personality).getModified(), 10.f);
|
||||||
|
|
||||||
|
float pcTerm = (clampedDisposition - 50 + a + b + c) * playerStats.getFatigueTerm();
|
||||||
|
float npcTerm = (d + e + f) * sellerStats.getFatigueTerm();
|
||||||
|
float buyTerm = 0.01 * (100 - 0.5 * (pcTerm - npcTerm));
|
||||||
|
float sellTerm = 0.01 * (50 - 0.5 * (npcTerm - pcTerm));
|
||||||
|
|
||||||
|
float x;
|
||||||
|
if(buying) x = buyTerm;
|
||||||
|
else x = std::min(buyTerm, sellTerm);
|
||||||
|
int offerPrice;
|
||||||
|
if (x < 1) offerPrice = int(x * basePrice);
|
||||||
|
if (x >= 1) offerPrice = basePrice + int((x - 1) * basePrice);
|
||||||
|
offerPrice = std::max(1, offerPrice);
|
||||||
|
return offerPrice;
|
||||||
|
}
|
||||||
|
|
||||||
int MechanicsManager::countDeaths (const std::string& id) const
|
int MechanicsManager::countDeaths (const std::string& id) const
|
||||||
{
|
{
|
||||||
return mActors.countDeaths (id);
|
return mActors.countDeaths (id);
|
||||||
|
|
|
@ -79,6 +79,12 @@ namespace MWMechanics
|
||||||
virtual void restoreDynamicStats();
|
virtual void restoreDynamicStats();
|
||||||
///< If the player is sleeping, this should be called every hour.
|
///< If the player is sleeping, this should be called every hour.
|
||||||
|
|
||||||
|
virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying);
|
||||||
|
///< This is used by every service to determine the price of objects given the trading skills of the player and NPC.
|
||||||
|
|
||||||
|
virtual int getDerivedDisposition(const MWWorld::Ptr& ptr);
|
||||||
|
///< Calculate the diposition of an NPC toward the player.
|
||||||
|
|
||||||
virtual int countDeaths (const std::string& id) const;
|
virtual int countDeaths (const std::string& id) const;
|
||||||
///< Return the number of deaths for actors with the given ID.
|
///< Return the number of deaths for actors with the given ID.
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,9 @@
|
||||||
#include "../mwbase/soundmanager.hpp"
|
#include "../mwbase/soundmanager.hpp"
|
||||||
|
|
||||||
MWMechanics::NpcStats::NpcStats()
|
MWMechanics::NpcStats::NpcStats()
|
||||||
: mMovementFlags (0), mDrawState (DrawState_Nothing)
|
: mMovementFlags (0), mDrawState (DrawState_Nothing), mBounty (0)
|
||||||
, mLevelProgress(0)
|
, mLevelProgress(0), mDisposition(0)
|
||||||
|
|
||||||
{
|
{
|
||||||
mSkillIncreases.resize (ESM::Attribute::Length);
|
mSkillIncreases.resize (ESM::Attribute::Length);
|
||||||
for (int i=0; i<ESM::Attribute::Length; ++i)
|
for (int i=0; i<ESM::Attribute::Length; ++i)
|
||||||
|
@ -36,6 +37,16 @@ void MWMechanics::NpcStats::setDrawState (DrawState_ state)
|
||||||
mDrawState = state;
|
mDrawState = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int MWMechanics::NpcStats::getDisposition() const
|
||||||
|
{
|
||||||
|
return mDisposition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MWMechanics::NpcStats::setDisposition(int disposition)
|
||||||
|
{
|
||||||
|
mDisposition = disposition;
|
||||||
|
}
|
||||||
|
|
||||||
bool MWMechanics::NpcStats::getMovementFlag (Flag flag) const
|
bool MWMechanics::NpcStats::getMovementFlag (Flag flag) const
|
||||||
{
|
{
|
||||||
return mMovementFlags & flag;
|
return mMovementFlags & flag;
|
||||||
|
@ -238,3 +249,13 @@ bool MWMechanics::NpcStats::hasBeenUsed (const std::string& id) const
|
||||||
{
|
{
|
||||||
return mUsedIds.find (id)!=mUsedIds.end();
|
return mUsedIds.find (id)!=mUsedIds.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int MWMechanics::NpcStats::getBounty() const
|
||||||
|
{
|
||||||
|
return mBounty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MWMechanics::NpcStats::setBounty (int bounty)
|
||||||
|
{
|
||||||
|
mBounty = bounty;
|
||||||
|
}
|
||||||
|
|
|
@ -43,8 +43,10 @@ namespace MWMechanics
|
||||||
std::map<std::string, int> mFactionRank;
|
std::map<std::string, int> mFactionRank;
|
||||||
|
|
||||||
DrawState_ mDrawState;
|
DrawState_ mDrawState;
|
||||||
|
int mDisposition;
|
||||||
unsigned int mMovementFlags;
|
unsigned int mMovementFlags;
|
||||||
Stat<float> mSkill[27];
|
Stat<float> mSkill[27];
|
||||||
|
int mBounty;
|
||||||
|
|
||||||
int mLevelProgress; // 0-10
|
int mLevelProgress; // 0-10
|
||||||
|
|
||||||
|
@ -60,6 +62,10 @@ namespace MWMechanics
|
||||||
|
|
||||||
void setDrawState (DrawState_ state);
|
void setDrawState (DrawState_ state);
|
||||||
|
|
||||||
|
int getDisposition() const;
|
||||||
|
|
||||||
|
void setDisposition(int disposition);
|
||||||
|
|
||||||
bool getMovementFlag (Flag flag) const;
|
bool getMovementFlag (Flag flag) const;
|
||||||
|
|
||||||
void setMovementFlag (Flag flag, bool state);
|
void setMovementFlag (Flag flag, bool state);
|
||||||
|
@ -92,6 +98,10 @@ namespace MWMechanics
|
||||||
void flagAsUsed (const std::string& id);
|
void flagAsUsed (const std::string& id);
|
||||||
|
|
||||||
bool hasBeenUsed (const std::string& id) const;
|
bool hasBeenUsed (const std::string& id) const;
|
||||||
|
|
||||||
|
int getBounty() const;
|
||||||
|
|
||||||
|
void setBounty (int bounty);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,4 +75,32 @@ namespace MWMechanics
|
||||||
{
|
{
|
||||||
return mSelectedSpell;
|
return mSelectedSpell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Spells::hasCommonDisease() const
|
||||||
|
{
|
||||||
|
for (TIterator iter = mSpells.begin(); iter!=mSpells.end(); ++iter)
|
||||||
|
{
|
||||||
|
const ESM::Spell *spell =
|
||||||
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find (*iter);
|
||||||
|
|
||||||
|
if (spell->mData.mFlags & ESM::Spell::ST_Disease)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Spells::hasBlightDisease() const
|
||||||
|
{
|
||||||
|
for (TIterator iter = mSpells.begin(); iter!=mSpells.end(); ++iter)
|
||||||
|
{
|
||||||
|
const ESM::Spell *spell =
|
||||||
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find (*iter);
|
||||||
|
|
||||||
|
if (spell->mData.mFlags & ESM::Spell::ST_Blight)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,10 @@ namespace MWMechanics
|
||||||
|
|
||||||
const std::string getSelectedSpell() const;
|
const std::string getSelectedSpell() const;
|
||||||
///< May return an empty string.
|
///< May return an empty string.
|
||||||
|
|
||||||
|
bool hasCommonDisease() const;
|
||||||
|
|
||||||
|
bool hasBlightDisease() const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -146,8 +146,13 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
T *insert(const T &x) {
|
const T *insert(const T &x) {
|
||||||
Store<T> &store = const_cast<Store<T> &>(get<T>());
|
Store<T> &store = const_cast<Store<T> &>(get<T>());
|
||||||
|
if (store.search(x.mId) != 0) {
|
||||||
|
std::ostringstream msg;
|
||||||
|
msg << "Try to override existing record '" << x.mId << "'";
|
||||||
|
throw std::runtime_error(msg.str());
|
||||||
|
}
|
||||||
T record = x;
|
T record = x;
|
||||||
|
|
||||||
std::ostringstream id;
|
std::ostringstream id;
|
||||||
|
@ -168,10 +173,30 @@ namespace MWWorld
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
inline ESM::Cell *ESMStore::insert<ESM::Cell>(const ESM::Cell &cell) {
|
inline const ESM::Cell *ESMStore::insert<ESM::Cell>(const ESM::Cell &cell) {
|
||||||
return mCells.insert(cell);
|
return mCells.insert(cell);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline const ESM::NPC *ESMStore::insert<ESM::NPC>(const ESM::NPC &npc) {
|
||||||
|
if (StringUtils::ciEqual(npc.mId, "player")) {
|
||||||
|
return mNpcs.insert(npc);
|
||||||
|
} else if (mNpcs.search(npc.mId) != 0) {
|
||||||
|
std::ostringstream msg;
|
||||||
|
msg << "Try to override existing record '" << npc.mId << "'";
|
||||||
|
throw std::runtime_error(msg.str());
|
||||||
|
}
|
||||||
|
ESM::NPC record = npc;
|
||||||
|
|
||||||
|
std::ostringstream id;
|
||||||
|
id << "$dynamic" << mDynamicCount++;
|
||||||
|
record.mId = id.str();
|
||||||
|
|
||||||
|
ESM::NPC *ptr = mNpcs.insert(record);
|
||||||
|
mIds[ptr->mId] = ESM::REC_NPC_;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
inline const Store<ESM::Activator> &ESMStore::get<ESM::Activator>() const {
|
inline const Store<ESM::Activator> &ESMStore::get<ESM::Activator>() const {
|
||||||
return mActivators;
|
return mActivators;
|
||||||
|
|
|
@ -13,33 +13,16 @@
|
||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
Player::Player (const ESM::NPC *player, const MWBase::World& world) :
|
Player::Player (const ESM::NPC *player, const MWBase::World& world)
|
||||||
mCellStore (0), mClass (0),
|
: mCellStore(0),
|
||||||
mAutoMove (false), mForwardBackward (0)
|
mAutoMove(false),
|
||||||
|
mForwardBackward (0)
|
||||||
{
|
{
|
||||||
mPlayer.mBase = player;
|
mPlayer.mBase = player;
|
||||||
mPlayer.mRef.mRefID = "player";
|
mPlayer.mRef.mRefID = "player";
|
||||||
mName = player->mName;
|
|
||||||
mMale = !(player->mFlags & ESM::NPC::Female);
|
|
||||||
mRace = player->mRace;
|
|
||||||
|
|
||||||
float* playerPos = mPlayer.mData.getPosition().pos;
|
float* playerPos = mPlayer.mData.getPosition().pos;
|
||||||
playerPos[0] = playerPos[1] = playerPos[2] = 0;
|
playerPos[0] = playerPos[1] = playerPos[2] = 0;
|
||||||
|
|
||||||
/// \todo Do not make a copy of classes defined in esm/p records.
|
|
||||||
mClass = new ESM::Class (*world.getStore().get<ESM::Class>().find (player->mClass));
|
|
||||||
}
|
|
||||||
|
|
||||||
Player::~Player()
|
|
||||||
{
|
|
||||||
delete mClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::setClass (const ESM::Class& class_)
|
|
||||||
{
|
|
||||||
ESM::Class *new_class = new ESM::Class (class_);
|
|
||||||
delete mClass;
|
|
||||||
mClass = new_class;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::setDrawState (MWMechanics::DrawState_ state)
|
void Player::setDrawState (MWMechanics::DrawState_ state)
|
||||||
|
@ -102,5 +85,4 @@ namespace MWWorld
|
||||||
MWWorld::Ptr ptr = getPlayer();
|
MWWorld::Ptr ptr = getPlayer();
|
||||||
return MWWorld::Class::get(ptr).getNpcStats(ptr).getDrawState();
|
return MWWorld::Class::get(ptr).getNpcStats(ptr).getDrawState();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
#ifndef GAME_MWWORLD_PLAYER_H
|
#ifndef GAME_MWWORLD_PLAYER_H
|
||||||
#define GAME_MWWORLD_PLAYER_H
|
#define GAME_MWWORLD_PLAYER_H
|
||||||
|
|
||||||
#include "OgreCamera.h"
|
|
||||||
|
|
||||||
#include "../mwworld/cellstore.hpp"
|
#include "../mwworld/cellstore.hpp"
|
||||||
#include "../mwworld/refdata.hpp"
|
#include "../mwworld/refdata.hpp"
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
|
@ -23,19 +21,15 @@ namespace MWWorld
|
||||||
{
|
{
|
||||||
LiveCellRef<ESM::NPC> mPlayer;
|
LiveCellRef<ESM::NPC> mPlayer;
|
||||||
MWWorld::CellStore *mCellStore;
|
MWWorld::CellStore *mCellStore;
|
||||||
std::string mName;
|
std::string mSign;
|
||||||
bool mMale;
|
|
||||||
std::string mRace;
|
|
||||||
std::string mBirthsign;
|
|
||||||
ESM::Class *mClass;
|
|
||||||
bool mAutoMove;
|
bool mAutoMove;
|
||||||
int mForwardBackward;
|
int mForwardBackward;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Player(const ESM::NPC *player, const MWBase::World& world);
|
Player(const ESM::NPC *player, const MWBase::World& world);
|
||||||
|
|
||||||
~Player();
|
|
||||||
|
|
||||||
void setCell (MWWorld::CellStore *cellStore)
|
void setCell (MWWorld::CellStore *cellStore)
|
||||||
{
|
{
|
||||||
mCellStore = cellStore;
|
mCellStore = cellStore;
|
||||||
|
@ -47,55 +41,16 @@ namespace MWWorld
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setName (const std::string& name)
|
void setBirthSign(const std::string &sign) {
|
||||||
{
|
mSign = sign;
|
||||||
mName = name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setGender (bool male)
|
const std::string &getBirthSign() const {
|
||||||
{
|
return mSign;
|
||||||
mMale = male;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRace (const std::string& race)
|
|
||||||
{
|
|
||||||
mRace = race;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setBirthsign (const std::string& birthsign)
|
|
||||||
{
|
|
||||||
mBirthsign = birthsign;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setClass (const ESM::Class& class_);
|
|
||||||
|
|
||||||
void setDrawState (MWMechanics::DrawState_ state);
|
void setDrawState (MWMechanics::DrawState_ state);
|
||||||
|
|
||||||
std::string getName() const
|
|
||||||
{
|
|
||||||
return mName;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isMale() const
|
|
||||||
{
|
|
||||||
return mMale;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string getRace() const
|
|
||||||
{
|
|
||||||
return mRace;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string getBirthsign() const
|
|
||||||
{
|
|
||||||
return mBirthsign;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ESM::Class& getClass() const
|
|
||||||
{
|
|
||||||
return *mClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool getAutoMove() const
|
bool getAutoMove() const
|
||||||
{
|
{
|
||||||
return mAutoMove;
|
return mAutoMove;
|
||||||
|
|
|
@ -168,26 +168,6 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
T *search(const std::string &id) {
|
|
||||||
std::string key = StringUtils::lowerCase(id);
|
|
||||||
typename Dynamic::iterator dit = mDynamic.find(key);
|
|
||||||
|
|
||||||
if (dit != mDynamic.end()) {
|
|
||||||
return &dit->second;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
T *find(const std::string &id) {
|
|
||||||
T *ptr = search(id);
|
|
||||||
if (ptr == 0) {
|
|
||||||
std::ostringstream msg;
|
|
||||||
msg << "Object '" << id << "' not found (non-const)";
|
|
||||||
throw std::runtime_error(msg.str());
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
T *insert(const T &item) {
|
T *insert(const T &item) {
|
||||||
std::string id = StringUtils::lowerCase(item.mId);
|
std::string id = StringUtils::lowerCase(item.mId);
|
||||||
std::pair<typename Dynamic::iterator, bool> result =
|
std::pair<typename Dynamic::iterator, bool> result =
|
||||||
|
@ -523,43 +503,6 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ESM::Cell *search(const std::string &id) {
|
|
||||||
std::string key = StringUtils::lowerCase(id);
|
|
||||||
DynamicInt::iterator it = mDynamicInt.find(key);
|
|
||||||
if (it != mDynamicInt.end()) {
|
|
||||||
return &it->second;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ESM::Cell *find(const std::string &id) {
|
|
||||||
ESM::Cell *ptr = search(id);
|
|
||||||
if (ptr == 0) {
|
|
||||||
std::ostringstream msg;
|
|
||||||
msg << "Interior '" << id << "' not found (non-const)";
|
|
||||||
throw std::runtime_error(msg.str());
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ESM::Cell *search(int x, int y) {
|
|
||||||
DynamicExt::iterator it = mDynamicExt.find(std::make_pair(x, y));
|
|
||||||
if (it != mDynamicExt.end()) {
|
|
||||||
return &it->second;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ESM::Cell *find(int x, int y) {
|
|
||||||
ESM::Cell *ptr = search(x, y);
|
|
||||||
if (ptr == 0) {
|
|
||||||
std::ostringstream msg;
|
|
||||||
msg << "Exterior at (" << x << ", " << y << ") not found (non-const";
|
|
||||||
throw std::runtime_error(msg.str());
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ESM::Cell *insert(const ESM::Cell &cell) {
|
ESM::Cell *insert(const ESM::Cell &cell) {
|
||||||
if (search(cell) != 0) {
|
if (search(cell) != 0) {
|
||||||
std::ostringstream msg;
|
std::ostringstream msg;
|
||||||
|
|
|
@ -779,22 +779,19 @@ namespace MWWorld
|
||||||
return mRendering->toggleRenderMode (mode);
|
return mRendering->toggleRenderMode (mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<std::string, const ESM::Potion *> World::createRecord (const ESM::Potion& record)
|
const ESM::Potion *World::createRecord (const ESM::Potion& record)
|
||||||
{
|
{
|
||||||
const ESM::Potion *ptr = mStore.insert(record);
|
return mStore.insert(record);
|
||||||
return std::make_pair(ptr->mId, ptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<std::string, const ESM::Class *> World::createRecord (const ESM::Class& record)
|
const ESM::Class *World::createRecord (const ESM::Class& record)
|
||||||
{
|
{
|
||||||
const ESM::Class *ptr = mStore.insert(record);
|
return mStore.insert(record);
|
||||||
return std::make_pair(ptr->mId, ptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<std::string, const ESM::Spell *> World::createRecord (const ESM::Spell& record)
|
const ESM::Spell *World::createRecord (const ESM::Spell& record)
|
||||||
{
|
{
|
||||||
const ESM::Spell *ptr = mStore.insert(record);
|
return mStore.insert(record);
|
||||||
return std::make_pair(ptr->mId, ptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const ESM::Cell *World::createRecord (const ESM::Cell& record)
|
const ESM::Cell *World::createRecord (const ESM::Cell& record)
|
||||||
|
@ -802,6 +799,11 @@ namespace MWWorld
|
||||||
return mStore.insert(record);
|
return mStore.insert(record);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ESM::NPC *World::createRecord(const ESM::NPC &record)
|
||||||
|
{
|
||||||
|
return mStore.insert(record);
|
||||||
|
}
|
||||||
|
|
||||||
void World::playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode,
|
void World::playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode,
|
||||||
int number)
|
int number)
|
||||||
{
|
{
|
||||||
|
|
|
@ -250,21 +250,26 @@ namespace MWWorld
|
||||||
///< Toggle a render mode.
|
///< Toggle a render mode.
|
||||||
///< \return Resulting mode
|
///< \return Resulting mode
|
||||||
|
|
||||||
virtual std::pair<std::string, const ESM::Potion *> createRecord (const ESM::Potion& record);
|
virtual const ESM::Potion *createRecord (const ESM::Potion& record);
|
||||||
///< Create a new recrod (of type potion) in the ESM store.
|
///< Create a new recrod (of type potion) in the ESM store.
|
||||||
/// \return ID, pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
virtual std::pair<std::string, const ESM::Spell *> createRecord (const ESM::Spell& record);
|
virtual const ESM::Spell *createRecord (const ESM::Spell& record);
|
||||||
///< Create a new recrod (of type spell) in the ESM store.
|
///< Create a new recrod (of type spell) in the ESM store.
|
||||||
/// \return ID, pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
virtual std::pair<std::string, const ESM::Class *> createRecord (const ESM::Class& record);
|
virtual const ESM::Class *createRecord (const ESM::Class& record);
|
||||||
///< Create a new recrod (of type class) in the ESM store.
|
///< Create a new recrod (of type class) in the ESM store.
|
||||||
/// \return ID, pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
virtual const ESM::Cell *createRecord (const ESM::Cell& record);
|
virtual const ESM::Cell *createRecord (const ESM::Cell& record);
|
||||||
///< Create a new recrod (of type cell) in the ESM store.
|
///< Create a new recrod (of type cell) in the ESM store.
|
||||||
/// \return ID, pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
|
virtual const ESM::NPC *createRecord(const ESM::NPC &record);
|
||||||
|
///< Create a new recrod (of type npc) in the ESM store.
|
||||||
|
/// \return pointer to created record
|
||||||
|
|
||||||
|
|
||||||
virtual void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName,
|
virtual void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName,
|
||||||
int mode, int number = 1);
|
int mode, int number = 1);
|
||||||
|
|
|
@ -69,7 +69,7 @@ btVector3 ManualBulletShapeLoader::getbtVector(Ogre::Vector3 &v)
|
||||||
|
|
||||||
void ManualBulletShapeLoader::loadResource(Ogre::Resource *resource)
|
void ManualBulletShapeLoader::loadResource(Ogre::Resource *resource)
|
||||||
{
|
{
|
||||||
cShape = static_cast<BulletShape *>(resource);
|
cShape = static_cast<OEngine::Physic::BulletShape *>(resource);
|
||||||
resourceName = cShape->getName();
|
resourceName = cShape->getName();
|
||||||
cShape->mCollide = false;
|
cShape->mCollide = false;
|
||||||
mBoundingBox = NULL;
|
mBoundingBox = NULL;
|
||||||
|
@ -314,8 +314,8 @@ void ManualBulletShapeLoader::handleNiTriShape(Nif::NiTriShape *shape, int flags
|
||||||
void ManualBulletShapeLoader::load(const std::string &name,const std::string &group)
|
void ManualBulletShapeLoader::load(const std::string &name,const std::string &group)
|
||||||
{
|
{
|
||||||
// Check if the resource already exists
|
// Check if the resource already exists
|
||||||
Ogre::ResourcePtr ptr = BulletShapeManager::getSingleton().getByName(name, group);
|
Ogre::ResourcePtr ptr = OEngine::Physic::BulletShapeManager::getSingleton().getByName(name, group);
|
||||||
if (!ptr.isNull())
|
if (!ptr.isNull())
|
||||||
return;
|
return;
|
||||||
BulletShapeManager::getSingleton().create(name,group,true,this);
|
OEngine::Physic::BulletShapeManager::getSingleton().create(name,group,true,this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ namespace NifBullet
|
||||||
/**
|
/**
|
||||||
*Load bulletShape from NIF files.
|
*Load bulletShape from NIF files.
|
||||||
*/
|
*/
|
||||||
class ManualBulletShapeLoader : public BulletShapeLoader
|
class ManualBulletShapeLoader : public OEngine::Physic::BulletShapeLoader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ private:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BulletShape* cShape;//current shape
|
OEngine::Physic::BulletShape* cShape;//current shape
|
||||||
btTriangleMesh *mTriMesh;
|
btTriangleMesh *mTriMesh;
|
||||||
btBoxShape *mBoundingBox;
|
btBoxShape *mBoundingBox;
|
||||||
btBvhTriangleMeshShape* currentShape;//the shape curently under construction
|
btBvhTriangleMeshShape* currentShape;//the shape curently under construction
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#include "BulletShapeLoader.h"
|
#include "BulletShapeLoader.h"
|
||||||
|
|
||||||
|
namespace OEngine {
|
||||||
|
namespace Physic
|
||||||
|
{
|
||||||
|
|
||||||
BulletShape::BulletShape(Ogre::ResourceManager* creator, const Ogre::String &name,
|
BulletShape::BulletShape(Ogre::ResourceManager* creator, const Ogre::String &name,
|
||||||
Ogre::ResourceHandle handle, const Ogre::String &group, bool isManual,
|
Ogre::ResourceHandle handle, const Ogre::String &group, bool isManual,
|
||||||
|
@ -64,21 +66,24 @@ size_t BulletShape::calculateSize() const
|
||||||
|
|
||||||
|
|
||||||
//=============================================================================================================
|
//=============================================================================================================
|
||||||
template<> BulletShapeManager *Ogre::Singleton<BulletShapeManager>::msSingleton = 0;
|
BulletShapeManager *BulletShapeManager::sThis = 0;
|
||||||
|
|
||||||
BulletShapeManager *BulletShapeManager::getSingletonPtr()
|
BulletShapeManager *BulletShapeManager::getSingletonPtr()
|
||||||
{
|
{
|
||||||
return msSingleton;
|
return sThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
BulletShapeManager &BulletShapeManager::getSingleton()
|
BulletShapeManager &BulletShapeManager::getSingleton()
|
||||||
{
|
{
|
||||||
assert(msSingleton);
|
assert(sThis);
|
||||||
return(*msSingleton);
|
return(*sThis);
|
||||||
}
|
}
|
||||||
|
|
||||||
BulletShapeManager::BulletShapeManager()
|
BulletShapeManager::BulletShapeManager()
|
||||||
{
|
{
|
||||||
|
assert(!sThis);
|
||||||
|
sThis = this;
|
||||||
|
|
||||||
mResourceType = "BulletShape";
|
mResourceType = "BulletShape";
|
||||||
|
|
||||||
// low, because it will likely reference other resources
|
// low, because it will likely reference other resources
|
||||||
|
@ -92,6 +97,8 @@ BulletShapeManager::~BulletShapeManager()
|
||||||
{
|
{
|
||||||
// and this is how we unregister it
|
// and this is how we unregister it
|
||||||
Ogre::ResourceGroupManager::getSingleton()._unregisterResourceManager(mResourceType);
|
Ogre::ResourceGroupManager::getSingleton()._unregisterResourceManager(mResourceType);
|
||||||
|
|
||||||
|
sThis = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BulletShapePtr BulletShapeManager::load(const Ogre::String &name, const Ogre::String &group)
|
BulletShapePtr BulletShapeManager::load(const Ogre::String &name, const Ogre::String &group)
|
||||||
|
@ -124,3 +131,6 @@ void BulletShapeLoader::loadResource(Ogre::Resource *resource)
|
||||||
|
|
||||||
void BulletShapeLoader::load(const std::string &name,const std::string &group)
|
void BulletShapeLoader::load(const std::string &name,const std::string &group)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,8 +5,10 @@
|
||||||
#include <OgreResourceManager.h>
|
#include <OgreResourceManager.h>
|
||||||
#include <btBulletCollisionCommon.h>
|
#include <btBulletCollisionCommon.h>
|
||||||
#include <OgreVector3.h>
|
#include <OgreVector3.h>
|
||||||
//For some reason, Ogre Singleton cannot be used in another namespace, that's why there is no namespace here.
|
|
||||||
//But the risk of name collision seems pretty low here.
|
namespace OEngine {
|
||||||
|
namespace Physic
|
||||||
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*Define a new resource which describe a Shape usable by bullet.See BulletShapeManager for how to get/use them.
|
*Define a new resource which describe a Shape usable by bullet.See BulletShapeManager for how to get/use them.
|
||||||
|
@ -107,7 +109,7 @@ public:
|
||||||
*Important Note: i have no idea of what happen if you try to load two time the same resource without unloading.
|
*Important Note: i have no idea of what happen if you try to load two time the same resource without unloading.
|
||||||
*It won't crash, but it might lead to memory leaks(I don't know how Ogre handle this). So don't do it!
|
*It won't crash, but it might lead to memory leaks(I don't know how Ogre handle this). So don't do it!
|
||||||
*/
|
*/
|
||||||
class BulletShapeManager : public Ogre::ResourceManager, public Ogre::Singleton<BulletShapeManager>
|
class BulletShapeManager : public Ogre::ResourceManager
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -116,6 +118,16 @@ protected:
|
||||||
const Ogre::String &group, bool isManual, Ogre::ManualResourceLoader *loader,
|
const Ogre::String &group, bool isManual, Ogre::ManualResourceLoader *loader,
|
||||||
const Ogre::NameValuePairList *createParams);
|
const Ogre::NameValuePairList *createParams);
|
||||||
|
|
||||||
|
static BulletShapeManager *sThis;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** \brief Explicit private copy constructor. This is a forbidden operation.*/
|
||||||
|
BulletShapeManager(const BulletShapeManager &);
|
||||||
|
|
||||||
|
/** \brief Private operator= . This is a forbidden operation. */
|
||||||
|
BulletShapeManager& operator=(const BulletShapeManager &);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
BulletShapeManager();
|
BulletShapeManager();
|
||||||
|
@ -139,4 +151,7 @@ public:
|
||||||
virtual void load(const std::string &name,const std::string &group);
|
virtual void load(const std::string &name,const std::string &group);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -251,7 +251,6 @@ namespace Physic
|
||||||
|
|
||||||
PhysicEngine::~PhysicEngine()
|
PhysicEngine::~PhysicEngine()
|
||||||
{
|
{
|
||||||
|
|
||||||
HeightFieldContainer::iterator hf_it = mHeightFieldMap.begin();
|
HeightFieldContainer::iterator hf_it = mHeightFieldMap.begin();
|
||||||
for (; hf_it != mHeightFieldMap.end(); ++hf_it)
|
for (; hf_it != mHeightFieldMap.end(); ++hf_it)
|
||||||
{
|
{
|
||||||
|
@ -293,6 +292,8 @@ namespace Physic
|
||||||
delete broadphase;
|
delete broadphase;
|
||||||
delete pairCache;
|
delete pairCache;
|
||||||
delete mShapeLoader;
|
delete mShapeLoader;
|
||||||
|
|
||||||
|
delete BulletShapeManager::getSingletonPtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicEngine::addHeightField(float* heights,
|
void PhysicEngine::addHeightField(float* heights,
|
||||||
|
|
Loading…
Reference in a new issue