Self-enchanting mechanics

This commit is contained in:
Glorf 2013-03-30 19:08:42 +01:00
parent a031c77619
commit 7dbc779c3a
3 changed files with 76 additions and 10 deletions

View file

@ -19,7 +19,6 @@ namespace MWGui
: WindowBase("openmw_enchanting_dialog.layout", parWindowManager) : WindowBase("openmw_enchanting_dialog.layout", parWindowManager)
, EffectEditorBase(parWindowManager) , EffectEditorBase(parWindowManager)
, mItemSelectionDialog(NULL) , mItemSelectionDialog(NULL)
, mEnchanting(MWBase::Environment::get().getWorld()->getPlayer().getPlayer())
{ {
getWidget(mName, "NameEdit"); getWidget(mName, "NameEdit");
getWidget(mCancelButton, "CancelButton"); getWidget(mCancelButton, "CancelButton");
@ -87,6 +86,9 @@ namespace MWGui
void EnchantingDialog::startEnchanting (MWWorld::Ptr actor) void EnchantingDialog::startEnchanting (MWWorld::Ptr actor)
{ {
mEnchanting.setSelfEnchanting(false);
mEnchanting.setEnchanter(actor);
mPtr = actor; mPtr = actor;
startEditing (); startEditing ();
@ -94,7 +96,14 @@ namespace MWGui
void EnchantingDialog::startSelfEnchanting(MWWorld::Ptr soulgem) void EnchantingDialog::startSelfEnchanting(MWWorld::Ptr soulgem)
{ {
/// \todo MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
mEnchanting.setSelfEnchanting(true);
mEnchanting.setEnchanter(player);
mPtr = player;
startEditing();
} }
void EnchantingDialog::onReferenceUnavailable () void EnchantingDialog::onReferenceUnavailable ()
@ -264,8 +273,13 @@ namespace MWGui
mEnchanting.setNewItemName(mName->getCaption()); mEnchanting.setNewItemName(mName->getCaption());
mEnchanting.setEffect(mEffectList); mEnchanting.setEffect(mEffectList);
mEnchanting.create(); int result = mEnchanting.create();
mWindowManager.messageBox ("#{sEnchantmentMenu12}");
if(result==1)
mWindowManager.messageBox ("#{sEnchantmentMenu12}");
else
mWindowManager.messageBox ("#{sNotifyMessage34}");
mWindowManager.removeGuiMode (GM_Enchanting); mWindowManager.removeGuiMode (GM_Enchanting);
} }
} }

View file

@ -3,10 +3,13 @@
#include "../mwworld/manualref.hpp" #include "../mwworld/manualref.hpp"
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
#include "../mwworld/containerstore.hpp" #include "../mwworld/containerstore.hpp"
#include "creaturestats.hpp"
#include "npcstats.hpp"
namespace MWMechanics namespace MWMechanics
{ {
Enchanting::Enchanting(MWWorld::Ptr enchanter): Enchanting::Enchanting():
mEnchanter(enchanter),
mEnchantType(0) mEnchantType(0)
{} {}
@ -45,11 +48,20 @@ namespace MWMechanics
mSoulGemPtr=soulGem; mSoulGemPtr=soulGem;
} }
void Enchanting::create() int Enchanting::create()
{ {
mOldItemPtr.getRefData().setCount(mOldItemPtr.getRefData().getCount()-1);
mSoulGemPtr.getRefData().setCount(mSoulGemPtr.getRefData().getCount()-1); mSoulGemPtr.getRefData().setCount(mSoulGemPtr.getRefData().getCount()-1);
if(mSelfEnchanting)
{
if(getEnchantChance()<std::rand()/static_cast<double> (RAND_MAX)*100)
return 0;
MWWorld::Class::get (mEnchanter).skillUsageSucceeded (mEnchanter, ESM::Skill::Enchant, 1);
}
mOldItemPtr.getRefData().setCount(mOldItemPtr.getRefData().getCount()-1);
mEnchantment.mData.mCharge = getGemCharge(); mEnchantment.mData.mCharge = getGemCharge();
if(mEnchantType==3) if(mEnchantType==3)
{ {
@ -67,6 +79,7 @@ namespace MWMechanics
MWWorld::Ptr result = mOldItemPtr; MWWorld::Ptr result = mOldItemPtr;
result.mPtr = newobjPtr.mPtr; result.mPtr = newobjPtr.mPtr;
MWWorld::Class::get (mEnchanter).getContainerStore (mEnchanter).add (result); MWWorld::Class::get (mEnchanter).getContainerStore (mEnchanter).add (result);
return 1;
} }
void Enchanting::nextEnchantType() void Enchanting::nextEnchantType()
@ -110,6 +123,10 @@ namespace MWMechanics
float cost = 0; float cost = 0;
std::vector<ESM::ENAMstruct> mEffects = mEffectList.mList; std::vector<ESM::ENAMstruct> mEffects = mEffectList.mList;
int i=mEffects.size(); int i=mEffects.size();
/*
Formula from http://www.uesp.net/wiki/Morrowind:Enchant
*/
for (std::vector<ESM::ENAMstruct>::const_iterator it = mEffects.begin(); it != mEffects.end(); ++it) for (std::vector<ESM::ENAMstruct>::const_iterator it = mEffects.begin(); it != mEffects.end(); ++it)
{ {
const ESM::MagicEffect* effect = store.get<ESM::MagicEffect>().find(it->mEffectID); const ESM::MagicEffect* effect = store.get<ESM::MagicEffect>().find(it->mEffectID);
@ -164,4 +181,34 @@ namespace MWMechanics
return true; return true;
return false; return false;
} }
void Enchanting::setSelfEnchanting(bool selfEnchanting)
{
mSelfEnchanting = selfEnchanting;
}
void Enchanting::setEnchanter(MWWorld::Ptr enchanter)
{
mEnchanter = enchanter;
}
float Enchanting::getEnchantChance()
{
/*
Formula from http://www.uesp.net/wiki/Morrowind:Enchant
*/
const CreatureStats& creatureStats = MWWorld::Class::get (mEnchanter).getCreatureStats (mEnchanter);
const NpcStats& npcStats = MWWorld::Class::get (mEnchanter).getNpcStats (mEnchanter);
float chance1 = (npcStats.getSkill (ESM::Skill::Enchant).getModified() +
(0.25 * creatureStats.getAttribute (ESM::Attribute::Intelligence).getModified())
+ (0.125 * creatureStats.getAttribute (ESM::Attribute::Luck).getModified()));
float chance2 = 2.5 * getEnchantCost();
if(mEnchantType==3)
{
chance2 *= 2;
}
return (chance1-chance2);
}
} }

View file

@ -16,6 +16,8 @@ namespace MWMechanics
const MWWorld::Ptr *mNewItemPtr; const MWWorld::Ptr *mNewItemPtr;
int mEnchantType; int mEnchantType;
bool mSelfEnchanting;
ESM::EffectList mEffectList; ESM::EffectList mEffectList;
ESM::Enchantment mEnchantment; ESM::Enchantment mEnchantment;
@ -23,17 +25,20 @@ namespace MWMechanics
std::string mObjectType; std::string mObjectType;
std::string mOldItemId; std::string mOldItemId;
public: public:
Enchanting(MWWorld::Ptr enchanter); Enchanting();
void setEnchanter(MWWorld::Ptr enchanter);
void setSelfEnchanting(bool selfEnchanting);
void setOldItem(MWWorld::Ptr oldItem); void setOldItem(MWWorld::Ptr oldItem);
void setNewItemName(std::string s); void setNewItemName(std::string s);
void setEffect(ESM::EffectList effectList); void setEffect(ESM::EffectList effectList);
void setSoulGem(MWWorld::Ptr soulGem); void setSoulGem(MWWorld::Ptr soulGem);
void create(); int create();
void nextEnchantType(); void nextEnchantType();
int getEnchantType(); int getEnchantType();
int getEnchantCost(); int getEnchantCost();
int getMaxEnchantValue(); int getMaxEnchantValue();
int getGemCharge(); int getGemCharge();
float getEnchantChance();
bool soulEmpty(); bool soulEmpty();
bool itemEmpty(); bool itemEmpty();
}; };