2012-09-22 22:36:20 +00:00
# include "spellcreationdialog.hpp"
2015-01-10 01:50:43 +00:00
# include <MyGUI_ImageBox.h>
# include <MyGUI_Gui.h>
2014-12-19 10:26:54 +00:00
# include <components/esm/records.hpp>
2015-01-10 02:56:06 +00:00
# include <components/widgets/list.hpp>
2014-08-12 10:18:38 +00:00
2017-04-24 16:46:12 +00:00
/*
Start of tes3mp addition
Include additional headers for multiplayer purposes
*/
2016-12-29 13:19:26 +00:00
# include "../mwmp/Main.hpp"
# include "../mwmp/LocalPlayer.hpp"
2017-04-24 16:46:12 +00:00
/*
End of tes3mp addition
*/
2016-12-29 13:19:26 +00:00
2012-09-22 22:36:20 +00:00
# include "../mwbase/windowmanager.hpp"
2012-11-05 18:53:55 +00:00
# include "../mwbase/mechanicsmanager.hpp"
2014-01-18 09:52:16 +00:00
# include "../mwbase/environment.hpp"
# include "../mwbase/world.hpp"
2012-09-22 22:36:20 +00:00
2013-11-21 03:27:53 +00:00
# include "../mwworld/containerstore.hpp"
2014-01-18 09:52:16 +00:00
# include "../mwworld/class.hpp"
2014-12-19 10:26:54 +00:00
# include "../mwworld/esmstore.hpp"
2012-09-22 22:36:20 +00:00
2013-11-16 00:19:39 +00:00
# include "../mwmechanics/spellcasting.hpp"
2014-01-18 09:52:16 +00:00
# include "../mwmechanics/spells.hpp"
# include "../mwmechanics/creaturestats.hpp"
2015-08-21 09:12:39 +00:00
# include "../mwmechanics/actorutil.hpp"
2012-10-23 09:42:38 +00:00
2012-09-22 22:36:20 +00:00
# include "tooltips.hpp"
2012-10-03 13:06:54 +00:00
# include "class.hpp"
2015-01-10 02:56:06 +00:00
# include "widgets.hpp"
2012-09-22 22:36:20 +00:00
namespace
{
bool sortMagicEffects ( short id1 , short id2 )
{
2012-11-05 19:41:26 +00:00
const MWWorld : : Store < ESM : : GameSetting > & gmst =
MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : GameSetting > ( ) ;
return gmst . find ( ESM : : MagicEffect : : effectIdToString ( id1 ) ) - > getString ( )
< gmst . find ( ESM : : MagicEffect : : effectIdToString ( id2 ) ) - > getString ( ) ;
2012-09-22 22:36:20 +00:00
}
2015-01-12 19:25:25 +00:00
void init ( ESM : : ENAMstruct & effect )
{
effect . mArea = 0 ;
effect . mDuration = 0 ;
effect . mEffectID = - 1 ;
effect . mMagnMax = 0 ;
effect . mMagnMin = 0 ;
effect . mRange = 0 ;
effect . mSkill = - 1 ;
effect . mAttribute = - 1 ;
}
2012-09-22 22:36:20 +00:00
}
namespace MWGui
{
2013-04-10 18:46:21 +00:00
EditEffectDialog : : EditEffectDialog ( )
: WindowModal ( " openmw_edit_effect.layout " )
2012-10-03 13:06:54 +00:00
, mEditing ( false )
2014-09-26 15:12:48 +00:00
, mMagicEffect ( NULL )
2015-01-05 04:33:51 +00:00
, mConstantEffect ( false )
2012-09-24 06:09:16 +00:00
{
2015-01-12 19:25:25 +00:00
init ( mEffect ) ;
init ( mOldEffect ) ;
2012-09-24 06:09:16 +00:00
getWidget ( mCancelButton , " CancelButton " ) ;
getWidget ( mOkButton , " OkButton " ) ;
getWidget ( mDeleteButton , " DeleteButton " ) ;
getWidget ( mRangeButton , " RangeButton " ) ;
getWidget ( mMagnitudeMinValue , " MagnitudeMinValue " ) ;
getWidget ( mMagnitudeMaxValue , " MagnitudeMaxValue " ) ;
getWidget ( mDurationValue , " DurationValue " ) ;
getWidget ( mAreaValue , " AreaValue " ) ;
getWidget ( mMagnitudeMinSlider , " MagnitudeMinSlider " ) ;
getWidget ( mMagnitudeMaxSlider , " MagnitudeMaxSlider " ) ;
getWidget ( mDurationSlider , " DurationSlider " ) ;
getWidget ( mAreaSlider , " AreaSlider " ) ;
getWidget ( mEffectImage , " EffectImage " ) ;
getWidget ( mEffectName , " EffectName " ) ;
getWidget ( mAreaText , " AreaText " ) ;
2012-10-11 16:26:29 +00:00
getWidget ( mDurationBox , " DurationBox " ) ;
getWidget ( mAreaBox , " AreaBox " ) ;
getWidget ( mMagnitudeBox , " MagnitudeBox " ) ;
2012-09-24 06:09:16 +00:00
mRangeButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EditEffectDialog : : onRangeButtonClicked ) ;
mOkButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EditEffectDialog : : onOkButtonClicked ) ;
mCancelButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EditEffectDialog : : onCancelButtonClicked ) ;
mDeleteButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EditEffectDialog : : onDeleteButtonClicked ) ;
2012-10-11 16:26:29 +00:00
mMagnitudeMinSlider - > eventScrollChangePosition + = MyGUI : : newDelegate ( this , & EditEffectDialog : : onMagnitudeMinChanged ) ;
mMagnitudeMaxSlider - > eventScrollChangePosition + = MyGUI : : newDelegate ( this , & EditEffectDialog : : onMagnitudeMaxChanged ) ;
mDurationSlider - > eventScrollChangePosition + = MyGUI : : newDelegate ( this , & EditEffectDialog : : onDurationChanged ) ;
mAreaSlider - > eventScrollChangePosition + = MyGUI : : newDelegate ( this , & EditEffectDialog : : onAreaChanged ) ;
2015-01-05 04:33:51 +00:00
}
void EditEffectDialog : : setConstantEffect ( bool constant )
{
mConstantEffect = constant ;
2012-09-24 06:09:16 +00:00
}
2017-09-22 15:10:53 +00:00
void EditEffectDialog : : onOpen ( )
2012-09-24 06:09:16 +00:00
{
2017-09-22 15:10:53 +00:00
WindowModal : : onOpen ( ) ;
2012-09-24 06:09:16 +00:00
center ( ) ;
}
2017-09-23 10:18:39 +00:00
bool EditEffectDialog : : exit ( )
2014-05-27 07:00:31 +00:00
{
if ( mEditing )
eventEffectModified ( mOldEffect ) ;
else
eventEffectRemoved ( mEffect ) ;
2017-09-23 10:18:39 +00:00
return true ;
2014-05-27 07:00:31 +00:00
}
2012-10-03 13:06:54 +00:00
void EditEffectDialog : : newEffect ( const ESM : : MagicEffect * effect )
{
2015-03-06 10:19:57 +00:00
bool allowSelf = ( effect - > mData . mFlags & ESM : : MagicEffect : : CastSelf ) ! = 0 ;
2015-01-05 04:33:51 +00:00
bool allowTouch = ( effect - > mData . mFlags & ESM : : MagicEffect : : CastTouch ) & & ! mConstantEffect ;
bool allowTarget = ( effect - > mData . mFlags & ESM : : MagicEffect : : CastTarget ) & & ! mConstantEffect ;
2014-12-10 16:48:49 +00:00
if ( ! allowSelf & & ! allowTouch & & ! allowTarget )
return ; // TODO: Show an error message popup?
2012-10-03 13:06:54 +00:00
setMagicEffect ( effect ) ;
mEditing = false ;
mDeleteButton - > setVisible ( false ) ;
2012-10-11 16:26:29 +00:00
mEffect . mRange = ESM : : RT_Self ;
2014-12-10 16:48:49 +00:00
if ( ! allowSelf )
2013-07-31 11:33:30 +00:00
mEffect . mRange = ESM : : RT_Touch ;
2014-12-10 16:48:49 +00:00
if ( ! allowTouch )
2013-07-31 11:33:30 +00:00
mEffect . mRange = ESM : : RT_Target ;
mEffect . mMagnMin = 1 ;
mEffect . mMagnMax = 1 ;
mEffect . mDuration = 1 ;
mEffect . mArea = 0 ;
2013-11-16 00:19:39 +00:00
mEffect . mSkill = - 1 ;
mEffect . mAttribute = - 1 ;
2013-07-31 11:33:30 +00:00
eventEffectAdded ( mEffect ) ;
2012-10-11 16:26:29 +00:00
onRangeButtonClicked ( mRangeButton ) ;
mMagnitudeMinSlider - > setScrollPosition ( 0 ) ;
mMagnitudeMaxSlider - > setScrollPosition ( 0 ) ;
mAreaSlider - > setScrollPosition ( 0 ) ;
mDurationSlider - > setScrollPosition ( 0 ) ;
mDurationValue - > setCaption ( " 1 " ) ;
mMagnitudeMinValue - > setCaption ( " 1 " ) ;
mMagnitudeMaxValue - > setCaption ( " - 1 " ) ;
mAreaValue - > setCaption ( " 0 " ) ;
2014-12-10 16:48:49 +00:00
setVisible ( true ) ;
2012-10-03 13:06:54 +00:00
}
void EditEffectDialog : : editEffect ( ESM : : ENAMstruct effect )
{
2012-11-05 19:41:26 +00:00
const ESM : : MagicEffect * magicEffect =
MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : MagicEffect > ( ) . find ( effect . mEffectID ) ;
2012-10-03 13:06:54 +00:00
setMagicEffect ( magicEffect ) ;
2013-07-31 11:33:30 +00:00
mOldEffect = effect ;
2012-10-03 13:06:54 +00:00
mEffect = effect ;
mEditing = true ;
mDeleteButton - > setVisible ( true ) ;
2012-10-11 16:26:29 +00:00
mMagnitudeMinSlider - > setScrollPosition ( effect . mMagnMin - 1 ) ;
mMagnitudeMaxSlider - > setScrollPosition ( effect . mMagnMax - 1 ) ;
mAreaSlider - > setScrollPosition ( effect . mArea ) ;
mDurationSlider - > setScrollPosition ( effect . mDuration - 1 ) ;
2017-07-15 10:03:36 +00:00
if ( mEffect . mRange = = ESM : : RT_Self )
mRangeButton - > setCaptionWithReplacing ( " #{sRangeSelf} " ) ;
else if ( mEffect . mRange = = ESM : : RT_Target )
mRangeButton - > setCaptionWithReplacing ( " #{sRangeTarget} " ) ;
else if ( mEffect . mRange = = ESM : : RT_Touch )
mRangeButton - > setCaptionWithReplacing ( " #{sRangeTouch} " ) ;
2012-10-11 16:26:29 +00:00
onMagnitudeMinChanged ( mMagnitudeMinSlider , effect . mMagnMin - 1 ) ;
onMagnitudeMaxChanged ( mMagnitudeMinSlider , effect . mMagnMax - 1 ) ;
onAreaChanged ( mAreaSlider , effect . mArea ) ;
onDurationChanged ( mDurationSlider , effect . mDuration - 1 ) ;
2013-07-31 11:33:30 +00:00
eventEffectModified ( mEffect ) ;
2017-07-15 10:03:36 +00:00
updateBoxes ( ) ;
2012-10-03 13:06:54 +00:00
}
void EditEffectDialog : : setMagicEffect ( const ESM : : MagicEffect * effect )
2012-09-24 06:09:16 +00:00
{
2015-05-01 16:37:24 +00:00
mEffectImage - > setImageTexture ( MWBase : : Environment : : get ( ) . getWindowManager ( ) - > correctIconPath ( effect - > mIcon ) ) ;
2012-09-24 06:09:16 +00:00
2012-10-01 21:33:07 +00:00
mEffectName - > setCaptionWithReplacing ( " #{ " + ESM : : MagicEffect : : effectIdToString ( effect - > mIndex ) + " } " ) ;
2012-10-03 13:06:54 +00:00
mEffect . mEffectID = effect - > mIndex ;
2012-10-11 16:26:29 +00:00
mMagicEffect = effect ;
updateBoxes ( ) ;
}
void EditEffectDialog : : updateBoxes ( )
{
static int startY = mMagnitudeBox - > getPosition ( ) . top ;
int curY = startY ;
mMagnitudeBox - > setVisible ( false ) ;
mDurationBox - > setVisible ( false ) ;
mAreaBox - > setVisible ( false ) ;
if ( ! ( mMagicEffect - > mData . mFlags & ESM : : MagicEffect : : NoMagnitude ) )
{
mMagnitudeBox - > setPosition ( mMagnitudeBox - > getPosition ( ) . left , curY ) ;
mMagnitudeBox - > setVisible ( true ) ;
curY + = mMagnitudeBox - > getSize ( ) . height ;
}
2015-01-05 04:33:51 +00:00
if ( ! ( mMagicEffect - > mData . mFlags & ESM : : MagicEffect : : NoDuration ) & & mConstantEffect = = false )
2012-10-11 16:26:29 +00:00
{
mDurationBox - > setPosition ( mDurationBox - > getPosition ( ) . left , curY ) ;
mDurationBox - > setVisible ( true ) ;
curY + = mDurationBox - > getSize ( ) . height ;
}
2013-07-31 10:26:34 +00:00
if ( mEffect . mRange ! = ESM : : RT_Self )
2012-10-11 16:26:29 +00:00
{
mAreaBox - > setPosition ( mAreaBox - > getPosition ( ) . left , curY ) ;
mAreaBox - > setVisible ( true ) ;
2014-09-26 15:12:48 +00:00
//curY += mAreaBox->getSize().height;
2012-10-11 16:26:29 +00:00
}
2012-09-24 06:09:16 +00:00
}
void EditEffectDialog : : onRangeButtonClicked ( MyGUI : : Widget * sender )
{
2012-10-01 15:54:45 +00:00
mEffect . mRange = ( mEffect . mRange + 1 ) % 3 ;
2012-09-24 06:09:16 +00:00
2012-10-11 16:26:29 +00:00
// cycle through range types until we find something that's allowed
2014-12-10 16:48:49 +00:00
// does not handle the case where nothing is allowed (this should be prevented before opening the Add Effect dialog)
2015-03-06 10:19:57 +00:00
bool allowSelf = ( mMagicEffect - > mData . mFlags & ESM : : MagicEffect : : CastSelf ) ! = 0 ;
2015-01-05 04:33:51 +00:00
bool allowTouch = ( mMagicEffect - > mData . mFlags & ESM : : MagicEffect : : CastTouch ) & & ! mConstantEffect ;
bool allowTarget = ( mMagicEffect - > mData . mFlags & ESM : : MagicEffect : : CastTarget ) & & ! mConstantEffect ;
2014-12-10 16:48:49 +00:00
if ( mEffect . mRange = = ESM : : RT_Self & & ! allowSelf )
mEffect . mRange = ( mEffect . mRange + 1 ) % 3 ;
if ( mEffect . mRange = = ESM : : RT_Touch & & ! allowTouch )
mEffect . mRange = ( mEffect . mRange + 1 ) % 3 ;
if ( mEffect . mRange = = ESM : : RT_Target & & ! allowTarget )
mEffect . mRange = ( mEffect . mRange + 1 ) % 3 ;
2012-10-11 16:26:29 +00:00
2013-07-31 10:26:34 +00:00
if ( mEffect . mRange = = ESM : : RT_Self )
{
mAreaSlider - > setScrollPosition ( 0 ) ;
onAreaChanged ( mAreaSlider , 0 ) ;
}
2014-12-10 16:48:49 +00:00
if ( mEffect . mRange = = ESM : : RT_Self )
mRangeButton - > setCaptionWithReplacing ( " #{sRangeSelf} " ) ;
else if ( mEffect . mRange = = ESM : : RT_Target )
mRangeButton - > setCaptionWithReplacing ( " #{sRangeTarget} " ) ;
else if ( mEffect . mRange = = ESM : : RT_Touch )
mRangeButton - > setCaptionWithReplacing ( " #{sRangeTouch} " ) ;
2012-10-11 16:26:29 +00:00
updateBoxes ( ) ;
2013-07-31 11:33:30 +00:00
eventEffectModified ( mEffect ) ;
2012-09-24 06:09:16 +00:00
}
void EditEffectDialog : : onDeleteButtonClicked ( MyGUI : : Widget * sender )
{
2012-10-03 13:06:54 +00:00
setVisible ( false ) ;
2012-09-24 06:09:16 +00:00
2012-10-03 13:06:54 +00:00
eventEffectRemoved ( mEffect ) ;
2012-09-24 06:09:16 +00:00
}
void EditEffectDialog : : onOkButtonClicked ( MyGUI : : Widget * sender )
{
setVisible ( false ) ;
}
void EditEffectDialog : : onCancelButtonClicked ( MyGUI : : Widget * sender )
{
2017-09-23 10:18:39 +00:00
setVisible ( false ) ;
2014-05-27 07:00:31 +00:00
exit ( ) ;
2012-09-24 06:09:16 +00:00
}
2012-10-03 13:06:54 +00:00
void EditEffectDialog : : setSkill ( int skill )
{
mEffect . mSkill = skill ;
2013-07-31 11:33:30 +00:00
eventEffectModified ( mEffect ) ;
2012-10-03 13:06:54 +00:00
}
void EditEffectDialog : : setAttribute ( int attribute )
{
mEffect . mAttribute = attribute ;
2013-07-31 11:33:30 +00:00
eventEffectModified ( mEffect ) ;
2012-10-03 13:06:54 +00:00
}
2012-10-11 16:26:29 +00:00
void EditEffectDialog : : onMagnitudeMinChanged ( MyGUI : : ScrollBar * sender , size_t pos )
{
2015-01-10 02:01:01 +00:00
mMagnitudeMinValue - > setCaption ( MyGUI : : utility : : toString ( pos + 1 ) ) ;
2012-10-11 16:26:29 +00:00
mEffect . mMagnMin = pos + 1 ;
// trigger the check again (see below)
onMagnitudeMaxChanged ( mMagnitudeMaxSlider , mMagnitudeMaxSlider - > getScrollPosition ( ) ) ;
2013-07-31 11:33:30 +00:00
eventEffectModified ( mEffect ) ;
2012-10-11 16:26:29 +00:00
}
void EditEffectDialog : : onMagnitudeMaxChanged ( MyGUI : : ScrollBar * sender , size_t pos )
{
// make sure the max value is actually larger or equal than the min value
size_t magnMin = std : : abs ( mEffect . mMagnMin ) ; // should never be < 0, this is just here to avoid the compiler warning
if ( pos + 1 < magnMin )
{
pos = mEffect . mMagnMin - 1 ;
sender - > setScrollPosition ( pos ) ;
}
mEffect . mMagnMax = pos + 1 ;
2015-01-10 02:01:01 +00:00
mMagnitudeMaxValue - > setCaption ( " - " + MyGUI : : utility : : toString ( pos + 1 ) ) ;
2013-07-31 11:33:30 +00:00
eventEffectModified ( mEffect ) ;
2012-10-11 16:26:29 +00:00
}
void EditEffectDialog : : onDurationChanged ( MyGUI : : ScrollBar * sender , size_t pos )
{
2015-01-10 02:01:01 +00:00
mDurationValue - > setCaption ( MyGUI : : utility : : toString ( pos + 1 ) ) ;
2012-10-11 16:26:29 +00:00
mEffect . mDuration = pos + 1 ;
2013-07-31 11:33:30 +00:00
eventEffectModified ( mEffect ) ;
2012-10-11 16:26:29 +00:00
}
void EditEffectDialog : : onAreaChanged ( MyGUI : : ScrollBar * sender , size_t pos )
{
2015-01-10 02:01:01 +00:00
mAreaValue - > setCaption ( MyGUI : : utility : : toString ( pos ) ) ;
2012-10-11 16:26:29 +00:00
mEffect . mArea = pos ;
2013-07-31 11:33:30 +00:00
eventEffectModified ( mEffect ) ;
2012-10-11 16:26:29 +00:00
}
2012-09-24 06:09:16 +00:00
// ------------------------------------------------------------------------------------------------
2013-04-10 18:46:21 +00:00
SpellCreationDialog : : SpellCreationDialog ( )
: WindowBase ( " openmw_spellcreation_dialog.layout " )
2014-08-24 19:59:52 +00:00
, EffectEditorBase ( EffectEditorBase : : Spellmaking )
2012-09-22 22:36:20 +00:00
{
getWidget ( mNameEdit , " NameEdit " ) ;
getWidget ( mMagickaCost , " MagickaCost " ) ;
getWidget ( mSuccessChance , " SuccessChance " ) ;
getWidget ( mAvailableEffectsList , " AvailableEffects " ) ;
getWidget ( mUsedEffectsView , " UsedEffects " ) ;
getWidget ( mPriceLabel , " PriceLabel " ) ;
getWidget ( mBuyButton , " BuyButton " ) ;
getWidget ( mCancelButton , " CancelButton " ) ;
mCancelButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & SpellCreationDialog : : onCancelButtonClicked ) ;
mBuyButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & SpellCreationDialog : : onBuyButtonClicked ) ;
2017-09-24 11:05:52 +00:00
mNameEdit - > eventEditSelectAccept + = MyGUI : : newDelegate ( this , & SpellCreationDialog : : onAccept ) ;
2012-09-24 06:09:16 +00:00
2012-10-03 13:36:10 +00:00
setWidgets ( mAvailableEffectsList , mUsedEffectsView ) ;
}
2012-10-03 13:06:54 +00:00
2017-09-22 19:26:41 +00:00
void SpellCreationDialog : : setPtr ( const MWWorld : : Ptr & actor )
2012-10-03 13:36:10 +00:00
{
mPtr = actor ;
2012-11-05 19:47:28 +00:00
mNameEdit - > setCaption ( " " ) ;
2012-10-03 13:36:10 +00:00
startEditing ( ) ;
2012-09-22 22:36:20 +00:00
}
2012-10-03 13:36:10 +00:00
void SpellCreationDialog : : onCancelButtonClicked ( MyGUI : : Widget * sender )
{
2017-09-23 10:18:39 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeGuiMode ( MWGui : : GM_SpellCreation ) ;
2012-10-03 13:36:10 +00:00
}
void SpellCreationDialog : : onBuyButtonClicked ( MyGUI : : Widget * sender )
{
2012-10-15 19:54:19 +00:00
if ( mEffects . size ( ) < = 0 )
{
2013-04-10 04:32:05 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage30} " ) ;
2012-10-15 19:54:19 +00:00
return ;
}
if ( mNameEdit - > getCaption ( ) = = " " )
{
2013-04-10 04:32:05 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage10} " ) ;
2012-10-15 19:54:19 +00:00
return ;
}
2012-10-23 09:42:38 +00:00
if ( mMagickaCost - > getCaption ( ) = = " 0 " )
{
2013-04-10 04:32:05 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sEnchantmentMenu8} " ) ;
2012-10-23 09:42:38 +00:00
return ;
}
2015-08-21 09:12:39 +00:00
MWWorld : : Ptr player = MWMechanics : : getPlayer ( ) ;
2014-01-08 22:37:46 +00:00
int playerGold = player . getClass ( ) . getContainerStore ( player ) . count ( MWWorld : : ContainerStore : : sGoldId ) ;
2015-01-10 02:01:01 +00:00
if ( MyGUI : : utility : : parseInt ( mPriceLabel - > getCaption ( ) ) > playerGold )
2012-10-23 09:42:38 +00:00
{
2013-04-10 04:32:05 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage18} " ) ;
2012-10-23 09:42:38 +00:00
return ;
}
2012-10-15 19:54:19 +00:00
2012-10-23 09:42:38 +00:00
mSpell . mName = mNameEdit - > getCaption ( ) ;
2015-01-10 02:01:01 +00:00
int price = MyGUI : : utility : : parseInt ( mPriceLabel - > getCaption ( ) ) ;
2014-07-27 22:55:57 +00:00
player . getClass ( ) . getContainerStore ( player ) . remove ( MWWorld : : ContainerStore : : sGoldId , price , player ) ;
// add gold to NPC trading gold pool
MWMechanics : : CreatureStats & npcStats = mPtr . getClass ( ) . getCreatureStats ( mPtr ) ;
npcStats . setGoldPool ( npcStats . getGoldPool ( ) + price ) ;
2012-10-23 09:42:38 +00:00
2017-07-10 11:48:00 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > playSound ( " Mysticism Hit " ) ;
2012-10-23 09:42:38 +00:00
2012-11-07 21:52:34 +00:00
const ESM : : Spell * spell = MWBase : : Environment : : get ( ) . getWorld ( ) - > createRecord ( mSpell ) ;
2012-10-15 19:54:19 +00:00
2014-05-22 18:37:22 +00:00
MWMechanics : : CreatureStats & stats = player . getClass ( ) . getCreatureStats ( player ) ;
2012-10-15 19:54:19 +00:00
MWMechanics : : Spells & spells = stats . getSpells ( ) ;
2012-11-07 21:52:34 +00:00
spells . add ( spell - > mId ) ;
2012-10-15 19:54:19 +00:00
2017-02-26 14:59:53 +00:00
/*
Start of tes3mp addition
Send an ID_PLAYER_SPELLBOOK packet every time a player buys a custom spell from
the Spellmaking screen
2017-07-26 02:36:12 +00:00
Include a messagebox notifying players that custom spells are not synced yet
2017-02-26 14:59:53 +00:00
*/
2017-07-26 02:36:12 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " Custom spells are not synchronized in multiplayer yet and their effects cannot be seen by other players in most cases. " ) ;
2016-12-29 13:19:26 +00:00
mwmp : : Main : : get ( ) . getLocalPlayer ( ) - > sendSpellAddition ( * spell ) ;
2017-02-26 14:59:53 +00:00
/*
End of tes3mp addition
*/
2016-12-29 13:19:26 +00:00
2013-04-10 04:32:05 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeGuiMode ( GM_SpellCreation ) ;
2012-10-03 13:36:10 +00:00
}
2012-09-22 22:36:20 +00:00
2017-09-24 11:05:52 +00:00
void SpellCreationDialog : : onAccept ( MyGUI : : EditBox * sender )
2012-09-22 22:36:20 +00:00
{
2017-09-24 11:05:52 +00:00
onBuyButtonClicked ( sender ) ;
2012-09-22 22:36:20 +00:00
}
2017-09-22 15:10:53 +00:00
void SpellCreationDialog : : onOpen ( )
2014-05-27 07:00:31 +00:00
{
2012-09-22 22:36:20 +00:00
center ( ) ;
2017-09-23 10:55:28 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > setKeyFocusWidget ( mNameEdit ) ;
2014-05-27 07:00:31 +00:00
}
2012-09-22 22:36:20 +00:00
void SpellCreationDialog : : onReferenceUnavailable ( )
{
2013-04-10 04:32:05 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeGuiMode ( GM_Dialogue ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeGuiMode ( GM_SpellCreation ) ;
2012-09-22 22:36:20 +00:00
}
2012-10-23 09:42:38 +00:00
void SpellCreationDialog : : notifyEffectsChanged ( )
{
2014-08-12 16:53:03 +00:00
if ( mEffects . empty ( ) )
{
mMagickaCost - > setCaption ( " 0 " ) ;
mPriceLabel - > setCaption ( " 0 " ) ;
mSuccessChance - > setCaption ( " 0 " ) ;
return ;
}
2012-10-23 09:42:38 +00:00
float y = 0 ;
2012-11-05 19:41:26 +00:00
const MWWorld : : ESMStore & store =
MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) ;
2012-10-23 09:42:38 +00:00
for ( std : : vector < ESM : : ENAMstruct > : : const_iterator it = mEffects . begin ( ) ; it ! = mEffects . end ( ) ; + + it )
{
2017-06-30 12:27:18 +00:00
const ESM : : ENAMstruct & effect = * it ;
2012-10-23 09:42:38 +00:00
2017-06-30 12:27:18 +00:00
y + = std : : max ( 1.f , MWMechanics : : calcEffectCost ( effect ) ) ;
2012-11-05 19:41:26 +00:00
2017-06-30 12:27:18 +00:00
if ( effect . mRange = = ESM : : RT_Target )
2012-10-23 09:42:38 +00:00
y * = 1.5 ;
}
ESM : : EffectList effectList ;
effectList . mList = mEffects ;
mSpell . mEffects = effectList ;
2014-10-01 22:32:22 +00:00
mSpell . mData . mCost = int ( y ) ;
2012-10-23 09:42:38 +00:00
mSpell . mData . mType = ESM : : Spell : : ST_Spell ;
2014-10-01 22:32:22 +00:00
mSpell . mData . mFlags = 0 ;
2012-10-23 09:42:38 +00:00
2015-01-10 02:01:01 +00:00
mMagickaCost - > setCaption ( MyGUI : : utility : : toString ( int ( y ) ) ) ;
2012-10-23 09:42:38 +00:00
2012-11-05 19:41:26 +00:00
float fSpellMakingValueMult =
store . get < ESM : : GameSetting > ( ) . find ( " fSpellMakingValueMult " ) - > getFloat ( ) ;
2012-10-23 09:42:38 +00:00
2015-03-08 00:07:29 +00:00
int price = MWBase : : Environment : : get ( ) . getMechanicsManager ( ) - > getBarterOffer ( mPtr , static_cast < int > ( y * fSpellMakingValueMult ) , true ) ;
2012-10-23 09:42:38 +00:00
2015-01-10 02:01:01 +00:00
mPriceLabel - > setCaption ( MyGUI : : utility : : toString ( int ( price ) ) ) ;
2012-10-23 09:42:38 +00:00
2017-06-30 12:27:18 +00:00
float chance = MWMechanics : : calcSpellBaseSuccessChance ( & mSpell , MWMechanics : : getPlayer ( ) , NULL ) ;
int intChance = std : : min ( 100 , int ( chance ) ) ;
mSuccessChance - > setCaption ( MyGUI : : utility : : toString ( intChance ) ) ;
2012-10-23 09:42:38 +00:00
}
2012-10-03 13:36:10 +00:00
// ------------------------------------------------------------------------------------------------
2014-08-24 19:59:52 +00:00
EffectEditorBase : : EffectEditorBase ( Type type )
2015-05-01 00:24:27 +00:00
: mAvailableEffectsList ( NULL )
2014-10-10 23:20:33 +00:00
, mUsedEffectsView ( NULL )
2015-05-01 00:24:27 +00:00
, mAddEffectDialog ( )
2012-10-03 13:36:10 +00:00
, mSelectAttributeDialog ( NULL )
, mSelectSkillDialog ( NULL )
2014-10-10 23:20:33 +00:00
, mSelectedEffect ( 0 )
, mSelectedKnownEffectId ( 0 )
2015-01-05 04:33:51 +00:00
, mConstantEffect ( false )
2015-05-01 00:24:27 +00:00
, mType ( type )
2012-09-22 22:36:20 +00:00
{
2012-10-03 13:36:10 +00:00
mAddEffectDialog . eventEffectAdded + = MyGUI : : newDelegate ( this , & EffectEditorBase : : onEffectAdded ) ;
mAddEffectDialog . eventEffectModified + = MyGUI : : newDelegate ( this , & EffectEditorBase : : onEffectModified ) ;
mAddEffectDialog . eventEffectRemoved + = MyGUI : : newDelegate ( this , & EffectEditorBase : : onEffectRemoved ) ;
mAddEffectDialog . setVisible ( false ) ;
}
2012-09-22 22:36:20 +00:00
2013-06-09 21:08:57 +00:00
EffectEditorBase : : ~ EffectEditorBase ( )
{
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : startEditing ( )
{
2012-09-22 22:36:20 +00:00
// get the list of magic effects that are known to the player
2015-08-21 09:12:39 +00:00
MWWorld : : Ptr player = MWMechanics : : getPlayer ( ) ;
2014-05-22 18:37:22 +00:00
MWMechanics : : CreatureStats & stats = player . getClass ( ) . getCreatureStats ( player ) ;
2012-09-22 22:36:20 +00:00
MWMechanics : : Spells & spells = stats . getSpells ( ) ;
std : : vector < short > knownEffects ;
for ( MWMechanics : : Spells : : TIterator it = spells . begin ( ) ; it ! = spells . end ( ) ; + + it )
{
2015-11-27 00:02:29 +00:00
const ESM : : Spell * spell = it - > first ;
2012-09-22 22:36:20 +00:00
// only normal spells count
2012-10-01 15:54:45 +00:00
if ( spell - > mData . mType ! = ESM : : Spell : : ST_Spell )
2012-09-22 22:36:20 +00:00
continue ;
2012-10-01 15:54:45 +00:00
const std : : vector < ESM : : ENAMstruct > & list = spell - > mEffects . mList ;
2012-09-22 22:36:20 +00:00
for ( std : : vector < ESM : : ENAMstruct > : : const_iterator it2 = list . begin ( ) ; it2 ! = list . end ( ) ; + + it2 )
{
2014-08-24 19:59:52 +00:00
const ESM : : MagicEffect * effect = MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : MagicEffect > ( ) . find ( it2 - > mEffectID ) ;
// skip effects that do not allow spellmaking/enchanting
int requiredFlags = ( mType = = Spellmaking ) ? ESM : : MagicEffect : : AllowSpellmaking : ESM : : MagicEffect : : AllowEnchanting ;
if ( ! ( effect - > mData . mFlags & requiredFlags ) )
continue ;
2012-10-01 15:54:45 +00:00
if ( std : : find ( knownEffects . begin ( ) , knownEffects . end ( ) , it2 - > mEffectID ) = = knownEffects . end ( ) )
knownEffects . push_back ( it2 - > mEffectID ) ;
2012-09-22 22:36:20 +00:00
}
}
std : : sort ( knownEffects . begin ( ) , knownEffects . end ( ) , sortMagicEffects ) ;
mAvailableEffectsList - > clear ( ) ;
2013-03-28 16:41:00 +00:00
int i = 0 ;
2012-09-22 22:36:20 +00:00
for ( std : : vector < short > : : const_iterator it = knownEffects . begin ( ) ; it ! = knownEffects . end ( ) ; + + it )
{
2012-11-05 19:41:26 +00:00
mAvailableEffectsList - > addItem ( MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : GameSetting > ( ) . find (
2012-10-01 21:33:07 +00:00
ESM : : MagicEffect : : effectIdToString ( * it ) ) - > getString ( ) ) ;
2013-03-28 16:41:00 +00:00
mButtonMapping [ i ] = * it ;
+ + i ;
2012-09-22 22:36:20 +00:00
}
mAvailableEffectsList - > adjustSize ( ) ;
2015-06-04 20:09:40 +00:00
mAvailableEffectsList - > scrollToTop ( ) ;
2012-09-22 22:36:20 +00:00
for ( std : : vector < short > : : const_iterator it = knownEffects . begin ( ) ; it ! = knownEffects . end ( ) ; + + it )
{
2012-11-05 19:41:26 +00:00
std : : string name = MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : GameSetting > ( ) . find (
2012-10-01 21:33:07 +00:00
ESM : : MagicEffect : : effectIdToString ( * it ) ) - > getString ( ) ;
2012-09-22 22:36:20 +00:00
MyGUI : : Widget * w = mAvailableEffectsList - > getItemWidget ( name ) ;
ToolTips : : createMagicEffectToolTip ( w , * it ) ;
}
2012-10-15 19:54:19 +00:00
mEffects . clear ( ) ;
updateEffectsView ( ) ;
2012-09-22 22:36:20 +00:00
}
2014-09-25 14:25:08 +00:00
void EffectEditorBase : : setWidgets ( Gui : : MWList * availableEffectsList , MyGUI : : ScrollView * usedEffectsView )
2012-09-22 22:36:20 +00:00
{
2012-10-03 13:36:10 +00:00
mAvailableEffectsList = availableEffectsList ;
mUsedEffectsView = usedEffectsView ;
2012-09-22 22:36:20 +00:00
2012-10-03 13:36:10 +00:00
mAvailableEffectsList - > eventWidgetSelected + = MyGUI : : newDelegate ( this , & EffectEditorBase : : onAvailableEffectClicked ) ;
2012-09-22 22:36:20 +00:00
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : onSelectAttribute ( )
2012-10-03 13:06:54 +00:00
{
2014-08-14 22:30:24 +00:00
const ESM : : MagicEffect * effect =
MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : MagicEffect > ( ) . find ( mSelectedKnownEffectId ) ;
mAddEffectDialog . newEffect ( effect ) ;
2012-10-03 13:06:54 +00:00
mAddEffectDialog . setAttribute ( mSelectAttributeDialog - > getAttributeId ( ) ) ;
2012-10-03 13:36:10 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeDialog ( mSelectAttributeDialog ) ;
2012-10-03 13:06:54 +00:00
mSelectAttributeDialog = 0 ;
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : onSelectSkill ( )
2012-10-03 13:06:54 +00:00
{
2014-08-14 22:30:24 +00:00
const ESM : : MagicEffect * effect =
MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : MagicEffect > ( ) . find ( mSelectedKnownEffectId ) ;
mAddEffectDialog . newEffect ( effect ) ;
mAddEffectDialog . setSkill ( mSelectSkillDialog - > getSkillId ( ) ) ;
2012-10-03 13:36:10 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeDialog ( mSelectSkillDialog ) ;
2012-10-03 13:06:54 +00:00
mSelectSkillDialog = 0 ;
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : onAttributeOrSkillCancel ( )
2012-10-03 13:06:54 +00:00
{
if ( mSelectSkillDialog )
2012-10-03 13:36:10 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeDialog ( mSelectSkillDialog ) ;
2012-10-03 13:06:54 +00:00
if ( mSelectAttributeDialog )
2012-10-03 13:36:10 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeDialog ( mSelectAttributeDialog ) ;
2012-10-03 13:06:54 +00:00
mSelectSkillDialog = 0 ;
mSelectAttributeDialog = 0 ;
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : onAvailableEffectClicked ( MyGUI : : Widget * sender )
2012-09-24 06:09:16 +00:00
{
2012-10-23 09:42:38 +00:00
if ( mEffects . size ( ) > = 8 )
{
2013-03-30 11:56:37 +00:00
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage28} " ) ;
2012-10-23 09:42:38 +00:00
return ;
}
2012-09-24 06:09:16 +00:00
2013-03-28 16:41:00 +00:00
int buttonId = * sender - > getUserData < int > ( ) ;
2014-08-14 22:30:24 +00:00
mSelectedKnownEffectId = mButtonMapping [ buttonId ] ;
2012-10-15 19:54:19 +00:00
2012-11-05 19:41:26 +00:00
const ESM : : MagicEffect * effect =
2014-08-14 22:30:24 +00:00
MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : MagicEffect > ( ) . find ( mSelectedKnownEffectId ) ;
2012-09-24 20:09:38 +00:00
2012-10-03 13:06:54 +00:00
if ( effect - > mData . mFlags & ESM : : MagicEffect : : TargetSkill )
{
delete mSelectSkillDialog ;
2013-04-10 18:46:21 +00:00
mSelectSkillDialog = new SelectSkillDialog ( ) ;
2012-10-03 13:06:54 +00:00
mSelectSkillDialog - > eventCancel + = MyGUI : : newDelegate ( this , & SpellCreationDialog : : onAttributeOrSkillCancel ) ;
mSelectSkillDialog - > eventItemSelected + = MyGUI : : newDelegate ( this , & SpellCreationDialog : : onSelectSkill ) ;
mSelectSkillDialog - > setVisible ( true ) ;
}
else if ( effect - > mData . mFlags & ESM : : MagicEffect : : TargetAttribute )
{
delete mSelectAttributeDialog ;
2013-04-10 18:46:21 +00:00
mSelectAttributeDialog = new SelectAttributeDialog ( ) ;
2012-10-03 13:06:54 +00:00
mSelectAttributeDialog - > eventCancel + = MyGUI : : newDelegate ( this , & SpellCreationDialog : : onAttributeOrSkillCancel ) ;
mSelectAttributeDialog - > eventItemSelected + = MyGUI : : newDelegate ( this , & SpellCreationDialog : : onSelectAttribute ) ;
mSelectAttributeDialog - > setVisible ( true ) ;
}
else
{
2014-12-22 00:54:24 +00:00
for ( std : : vector < ESM : : ENAMstruct > : : const_iterator it = mEffects . begin ( ) ; it ! = mEffects . end ( ) ; + + it )
{
if ( it - > mEffectID = = mSelectedKnownEffectId )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sOnetypeEffectMessage} " ) ;
return ;
}
}
2014-08-14 22:30:24 +00:00
mAddEffectDialog . newEffect ( effect ) ;
2012-10-03 13:06:54 +00:00
}
2012-09-24 06:09:16 +00:00
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : onEffectModified ( ESM : : ENAMstruct effect )
2012-10-03 13:06:54 +00:00
{
mEffects [ mSelectedEffect ] = effect ;
updateEffectsView ( ) ;
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : onEffectRemoved ( ESM : : ENAMstruct effect )
2012-10-03 13:06:54 +00:00
{
mEffects . erase ( mEffects . begin ( ) + mSelectedEffect ) ;
updateEffectsView ( ) ;
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : updateEffectsView ( )
2012-10-03 13:06:54 +00:00
{
MyGUI : : EnumeratorWidgetPtr oldWidgets = mUsedEffectsView - > getEnumerator ( ) ;
MyGUI : : Gui : : getInstance ( ) . destroyWidgets ( oldWidgets ) ;
MyGUI : : IntSize size ( 0 , 0 ) ;
int i = 0 ;
for ( std : : vector < ESM : : ENAMstruct > : : const_iterator it = mEffects . begin ( ) ; it ! = mEffects . end ( ) ; + + it )
{
Widgets : : SpellEffectParams params ;
params . mEffectID = it - > mEffectID ;
params . mSkill = it - > mSkill ;
params . mAttribute = it - > mAttribute ;
params . mDuration = it - > mDuration ;
params . mMagnMin = it - > mMagnMin ;
params . mMagnMax = it - > mMagnMax ;
params . mRange = it - > mRange ;
2012-10-11 16:26:29 +00:00
params . mArea = it - > mArea ;
2015-01-05 04:33:51 +00:00
params . mIsConstant = mConstantEffect ;
2012-10-03 13:06:54 +00:00
MyGUI : : Button * button = mUsedEffectsView - > createWidget < MyGUI : : Button > ( " " , MyGUI : : IntCoord ( 0 , size . height , 0 , 24 ) , MyGUI : : Align : : Default ) ;
button - > setUserData ( i ) ;
button - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & SpellCreationDialog : : onEditEffect ) ;
button - > setNeedMouseFocus ( true ) ;
Widgets : : MWSpellEffectPtr effect = button - > createWidget < Widgets : : MWSpellEffect > ( " MW_EffectImage " , MyGUI : : IntCoord ( 0 , 0 , 0 , 24 ) , MyGUI : : Align : : Default ) ;
effect - > setNeedMouseFocus ( false ) ;
effect - > setSpellEffect ( params ) ;
effect - > setSize ( effect - > getRequestedWidth ( ) , 24 ) ;
button - > setSize ( effect - > getRequestedWidth ( ) , 24 ) ;
size . width = std : : max ( size . width , effect - > getRequestedWidth ( ) ) ;
size . height + = 24 ;
+ + i ;
}
2014-07-26 00:23:42 +00:00
// Canvas size must be expressed with HScroll disabled, otherwise MyGUI would expand the scroll area when the scrollbar is hidden
mUsedEffectsView - > setVisibleHScroll ( false ) ;
2012-10-03 13:06:54 +00:00
mUsedEffectsView - > setCanvasSize ( size ) ;
2014-07-26 00:23:42 +00:00
mUsedEffectsView - > setVisibleHScroll ( true ) ;
2012-10-23 09:42:38 +00:00
notifyEffectsChanged ( ) ;
2012-10-03 13:06:54 +00:00
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : onEffectAdded ( ESM : : ENAMstruct effect )
2012-10-03 13:06:54 +00:00
{
mEffects . push_back ( effect ) ;
2013-07-31 11:33:30 +00:00
mSelectedEffect = mEffects . size ( ) - 1 ;
2012-10-03 13:06:54 +00:00
updateEffectsView ( ) ;
}
2012-10-03 13:36:10 +00:00
void EffectEditorBase : : onEditEffect ( MyGUI : : Widget * sender )
2012-10-03 13:06:54 +00:00
{
int id = * sender - > getUserData < int > ( ) ;
mSelectedEffect = id ;
mAddEffectDialog . editEffect ( mEffects [ id ] ) ;
mAddEffectDialog . setVisible ( true ) ;
}
2015-01-05 04:33:51 +00:00
void EffectEditorBase : : setConstantEffect ( bool constant )
{
mAddEffectDialog . setConstantEffect ( constant ) ;
mConstantEffect = constant ;
}
2012-09-22 22:36:20 +00:00
}