From c991f68a2dbf929a7a158593042e4dd08163fc18 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 15 Oct 2012 21:54:19 +0200 Subject: [PATCH] buying created spell --- apps/openmw/mwbase/world.hpp | 6 ++++ apps/openmw/mwgui/spellcreationdialog.cpp | 42 +++++++++++++++++++++++ apps/openmw/mwworld/worldimp.cpp | 14 ++++++++ apps/openmw/mwworld/worldimp.hpp | 4 +++ 4 files changed, 66 insertions(+) diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index 521bbb988..1cb120b5c 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -28,6 +28,7 @@ namespace ESM struct Cell; struct Class; struct Potion; + struct Spell; } namespace ESMS @@ -235,6 +236,11 @@ namespace MWBase ///< Create a new recrod (of type potion) in the ESM store. /// \return ID, pointer to created record + virtual std::pair createRecord (const ESM::Spell& record) + = 0; + ///< Create a new recrod (of type spell) in the ESM store. + /// \return ID, pointer to created record + virtual std::pair createRecord (const ESM::Class& record) = 0; ///< Create a new recrod (of type class) in the ESM store. diff --git a/apps/openmw/mwgui/spellcreationdialog.cpp b/apps/openmw/mwgui/spellcreationdialog.cpp index 02ce763ea..bb066e8ff 100644 --- a/apps/openmw/mwgui/spellcreationdialog.cpp +++ b/apps/openmw/mwgui/spellcreationdialog.cpp @@ -8,6 +8,7 @@ #include "../mwbase/world.hpp" #include "../mwbase/environment.hpp" +#include "../mwbase/soundmanager.hpp" #include "../mwworld/player.hpp" #include "../mwworld/class.hpp" @@ -297,7 +298,35 @@ namespace MWGui void SpellCreationDialog::onBuyButtonClicked (MyGUI::Widget* sender) { + if (mEffects.size() <= 0) + { + mWindowManager.messageBox ("#{sNotifyMessage30}", std::vector()); + return; + } + if (mNameEdit->getCaption () == "") + { + mWindowManager.messageBox ("#{sNotifyMessage10}", std::vector()); + return; + } + + ESM::Spell newSpell; + ESM::EffectList effectList; + effectList.mList = mEffects; + newSpell.mEffects = effectList; + newSpell.mName = mNameEdit->getCaption(); + newSpell.mData.mType = ESM::Spell::ST_Spell; + + std::pair result = MWBase::Environment::get().getWorld()->createRecord(newSpell); + + MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer(); + MWMechanics::CreatureStats& stats = MWWorld::Class::get(player).getCreatureStats(player); + MWMechanics::Spells& spells = stats.getSpells(); + spells.add (result.first); + + MWBase::Environment::get().getSoundManager()->playSound ("Item Gold Up", 1.0, 1.0); + + mWindowManager.removeGuiMode (GM_SpellCreation); } void SpellCreationDialog::open() @@ -372,6 +401,9 @@ namespace MWGui ToolTips::createMagicEffectToolTip (w, *it); } + + mEffects.clear(); + updateEffectsView (); } void EffectEditorBase::setWidgets (Widgets::MWList *availableEffectsList, MyGUI::ScrollView *usedEffectsView) @@ -413,6 +445,16 @@ namespace MWGui { short effectId = *sender->getUserData(); + + for (std::vector::const_iterator it = mEffects.begin(); it != mEffects.end(); ++it) + { + if (it->mEffectID == effectId) + { + MWBase::Environment::get().getWindowManager()->messageBox ("#{sOnetypeEffectMessage}", std::vector()); + return; + } + } + const ESM::MagicEffect* effect = MWBase::Environment::get().getWorld()->getStore().magicEffects.find(effectId); mAddEffectDialog.newEffect (effect); diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 6fc228f0b..495deb1ad 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -802,6 +802,20 @@ namespace MWWorld return std::make_pair (stream.str(), created); } + std::pair World::createRecord (const ESM::Spell& record) + { + /// \todo See function above. + std::ostringstream stream; + stream << "$dynamic" << mNextDynamicRecord++; + + const ESM::Spell *created = + &mStore.spells.list.insert (std::make_pair (stream.str(), record)).first->second; + + mStore.all.insert (std::make_pair (stream.str(), ESM::REC_SPEL)); + + return std::make_pair (stream.str(), created); + } + const ESM::Cell *World::createRecord (const ESM::Cell& record) { if (record.mData.mFlags & ESM::Cell::Interior) diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 90cd2151b..830a29918 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -253,6 +253,10 @@ namespace MWWorld ///< Create a new recrod (of type potion) in the ESM store. /// \return ID, pointer to created record + virtual std::pair createRecord (const ESM::Spell& record); + ///< Create a new recrod (of type spell) in the ESM store. + /// \return ID, pointer to created record + virtual std::pair createRecord (const ESM::Class& record); ///< Create a new recrod (of type class) in the ESM store. /// \return ID, pointer to created record