# include "enchantingdialog.hpp"
# include <iomanip>
# include <MyGUI_Button.h>
# include <MyGUI_ScrollView.h>
# include <MyGUI_EditBox.h>
# include <components/widgets/list.hpp>
# include <components/settings/settings.hpp>
# include "../mwbase/mechanicsmanager.hpp"
# include "../mwworld/class.hpp"
# include "../mwworld/containerstore.hpp"
# include "../mwworld/esmstore.hpp"
# include "../mwmechanics/actorutil.hpp"
# include "itemselection.hpp"
# include "itemwidget.hpp"
# include "sortfilteritemmodel.hpp"
namespace MWGui
{
EnchantingDialog : : EnchantingDialog ( )
: WindowBase ( " openmw_enchanting_dialog.layout " )
, EffectEditorBase ( EffectEditorBase : : Enchanting )
, mItemSelectionDialog ( NULL )
{
getWidget ( mName , " NameEdit " ) ;
getWidget ( mCancelButton , " CancelButton " ) ;
getWidget ( mAvailableEffectsList , " AvailableEffects " ) ;
getWidget ( mUsedEffectsView , " UsedEffects " ) ;
getWidget ( mItemBox , " ItemBox " ) ;
getWidget ( mSoulBox , " SoulBox " ) ;
getWidget ( mEnchantmentPoints , " Enchantment " ) ;
getWidget ( mCastCost , " CastCost " ) ;
getWidget ( mCharge , " Charge " ) ;
getWidget ( mSuccessChance , " SuccessChance " ) ;
getWidget ( mChanceLayout , " ChanceLayout " ) ;
getWidget ( mTypeButton , " TypeButton " ) ;
getWidget ( mBuyButton , " BuyButton " ) ;
getWidget ( mPrice , " PriceLabel " ) ;
getWidget ( mPriceText , " PriceTextLabel " ) ;
setWidgets ( mAvailableEffectsList , mUsedEffectsView ) ;
mCancelButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onCancelButtonClicked ) ;
mItemBox - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onSelectItem ) ;
mSoulBox - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onSelectSoul ) ;
mBuyButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onBuyButtonClicked ) ;
mTypeButton - > eventMouseButtonClick + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onTypeButtonClicked ) ;
mName - > eventEditSelectAccept + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onAccept ) ;
}
EnchantingDialog : : ~ EnchantingDialog ( )
{
delete mItemSelectionDialog ;
}
void EnchantingDialog : : onOpen ( )
{
center ( ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > setKeyFocusWidget ( mName ) ;
}
void EnchantingDialog : : setSoulGem ( const MWWorld : : Ptr & gem )
{
if ( gem . isEmpty ( ) )
{
mSoulBox - > setItem ( MWWorld : : Ptr ( ) ) ;
mSoulBox - > clearUserStrings ( ) ;
mEnchanting . setSoulGem ( MWWorld : : Ptr ( ) ) ;
}
else
{
mSoulBox - > setItem ( gem ) ;
mSoulBox - > setUserString ( " ToolTipType " , " ItemPtr " ) ;
mSoulBox - > setUserData ( MWWorld : : Ptr ( gem ) ) ;
mEnchanting . setSoulGem ( gem ) ;
}
}
void EnchantingDialog : : setItem ( const MWWorld : : Ptr & item )
{
if ( item . isEmpty ( ) )
{
mItemBox - > setItem ( MWWorld : : Ptr ( ) ) ;
mItemBox - > clearUserStrings ( ) ;
mEnchanting . setOldItem ( MWWorld : : Ptr ( ) ) ;
}
else
{
mName - > setCaption ( item . getClass ( ) . getName ( item ) ) ;
mItemBox - > setItem ( item ) ;
mItemBox - > setUserString ( " ToolTipType " , " ItemPtr " ) ;
mItemBox - > setUserData ( MWWorld : : Ptr ( item ) ) ;
mEnchanting . setOldItem ( item ) ;
}
}
void EnchantingDialog : : updateLabels ( )
{
std : : stringstream enchantCost ;
enchantCost < < std : : setprecision ( 1 ) < < std : : fixed < < mEnchanting . getEnchantPoints ( ) ;
mEnchantmentPoints - > setCaption ( enchantCost . str ( ) + " / " + MyGUI : : utility : : toString ( mEnchanting . getMaxEnchantValue ( ) ) ) ;
mCharge - > setCaption ( MyGUI : : utility : : toString ( mEnchanting . getGemCharge ( ) ) ) ;
int successChance = int ( mEnchanting . getEnchantChance ( ) ) ;
mSuccessChance - > setCaption ( MyGUI : : utility : : toString ( std : : max ( 0 , successChance ) ) ) ;
std : : stringstream castCost ;
castCost < < mEnchanting . getEffectiveCastCost ( ) ;
mCastCost - > setCaption ( castCost . str ( ) ) ;
mPrice - > setCaption ( MyGUI : : utility : : toString ( mEnchanting . getEnchantPrice ( ) ) ) ;
switch ( mEnchanting . getCastStyle ( ) )
{
case ESM : : Enchantment : : CastOnce :
mTypeButton - > setCaption ( MWBase : : Environment : : get ( ) . getWindowManager ( ) - > getGameSettingString ( " sItemCastOnce " , " Cast Once " ) ) ;
setConstantEffect ( false ) ;
break ;
case ESM : : Enchantment : : WhenStrikes :
mTypeButton - > setCaption ( MWBase : : Environment : : get ( ) . getWindowManager ( ) - > getGameSettingString ( " sItemCastWhenStrikes " , " When Strikes " ) ) ;
setConstantEffect ( false ) ;
break ;
case ESM : : Enchantment : : WhenUsed :
mTypeButton - > setCaption ( MWBase : : Environment : : get ( ) . getWindowManager ( ) - > getGameSettingString ( " sItemCastWhenUsed " , " When Used " ) ) ;
setConstantEffect ( false ) ;
break ;
case ESM : : Enchantment : : ConstantEffect :
mTypeButton - > setCaption ( MWBase : : Environment : : get ( ) . getWindowManager ( ) - > getGameSettingString ( " sItemCastConstant " , " Cast Constant " ) ) ;
setConstantEffect ( true ) ;
break ;
}
}
void EnchantingDialog : : setPtr ( const MWWorld : : Ptr & ptr )
{
mName - > setCaption ( " " ) ;
if ( ptr . getClass ( ) . isActor ( ) )
{
mEnchanting . setSelfEnchanting ( false ) ;
mEnchanting . setEnchanter ( ptr ) ;
mBuyButton - > setCaptionWithReplacing ( " #{sBuy} " ) ;
mChanceLayout - > setVisible ( false ) ;
mPtr = ptr ;
setSoulGem ( MWWorld : : Ptr ( ) ) ;
mPrice - > setVisible ( true ) ;
mPriceText - > setVisible ( true ) ;
}
else
{
mEnchanting . setSelfEnchanting ( true ) ;
mEnchanting . setEnchanter ( MWMechanics : : getPlayer ( ) ) ;
mBuyButton - > setCaptionWithReplacing ( " #{sCreate} " ) ;
bool enabled = Settings : : Manager : : getBool ( " show enchant chance " , " Game " ) ;
mChanceLayout - > setVisible ( enabled ) ;
mPtr = MWMechanics : : getPlayer ( ) ;
setSoulGem ( ptr ) ;
mPrice - > setVisible ( false ) ;
mPriceText - > setVisible ( false ) ;
}
setItem ( MWWorld : : Ptr ( ) ) ;
startEditing ( ) ;
updateLabels ( ) ;
}
void EnchantingDialog : : onReferenceUnavailable ( )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeGuiMode ( GM_Enchanting ) ;
resetReference ( ) ;
}
void EnchantingDialog : : resetReference ( )
{
ReferenceInterface : : resetReference ( ) ;
setItem ( MWWorld : : Ptr ( ) ) ;
setSoulGem ( MWWorld : : Ptr ( ) ) ;
mPtr = MWWorld : : Ptr ( ) ;
mEnchanting . setEnchanter ( MWWorld : : Ptr ( ) ) ;
}
void EnchantingDialog : : onCancelButtonClicked ( MyGUI : : Widget * sender )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeGuiMode ( GM_Enchanting ) ;
}
void EnchantingDialog : : onSelectItem ( MyGUI : : Widget * sender )
{
if ( mEnchanting . getOldItem ( ) . isEmpty ( ) )
{
delete mItemSelectionDialog ;
mItemSelectionDialog = new ItemSelectionDialog ( " #{sEnchantItems} " ) ;
mItemSelectionDialog - > eventItemSelected + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onItemSelected ) ;
mItemSelectionDialog - > eventDialogCanceled + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onItemCancel ) ;
mItemSelectionDialog - > setVisible ( true ) ;
mItemSelectionDialog - > openContainer ( MWMechanics : : getPlayer ( ) ) ;
mItemSelectionDialog - > setFilter ( SortFilterItemModel : : Filter_OnlyEnchantable ) ;
}
else
{
setItem ( MWWorld : : Ptr ( ) ) ;
updateLabels ( ) ;
}
}
void EnchantingDialog : : onItemSelected ( MWWorld : : Ptr item )
{
mItemSelectionDialog - > setVisible ( false ) ;
setItem ( item ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > playSound ( item . getClass ( ) . getDownSoundId ( item ) ) ;
mEnchanting . nextCastStyle ( ) ;
updateLabels ( ) ;
}
void EnchantingDialog : : onItemCancel ( )
{
mItemSelectionDialog - > setVisible ( false ) ;
}
void EnchantingDialog : : onSoulSelected ( MWWorld : : Ptr item )
{
mItemSelectionDialog - > setVisible ( false ) ;
mEnchanting . setSoulGem ( item ) ;
if ( mEnchanting . getGemCharge ( ) = = 0 )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage32} " ) ;
return ;
}
setSoulGem ( item ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > playSound ( item . getClass ( ) . getDownSoundId ( item ) ) ;
updateLabels ( ) ;
}
void EnchantingDialog : : onSoulCancel ( )
{
mItemSelectionDialog - > setVisible ( false ) ;
}
void EnchantingDialog : : onSelectSoul ( MyGUI : : Widget * sender )
{
if ( mEnchanting . getGem ( ) . isEmpty ( ) )
{
delete mItemSelectionDialog ;
mItemSelectionDialog = new ItemSelectionDialog ( " #{sSoulGemsWithSouls} " ) ;
mItemSelectionDialog - > eventItemSelected + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onSoulSelected ) ;
mItemSelectionDialog - > eventDialogCanceled + = MyGUI : : newDelegate ( this , & EnchantingDialog : : onSoulCancel ) ;
mItemSelectionDialog - > setVisible ( true ) ;
mItemSelectionDialog - > openContainer ( MWMechanics : : getPlayer ( ) ) ;
mItemSelectionDialog - > setFilter ( SortFilterItemModel : : Filter_OnlyChargedSoulstones ) ;
//MWBase::Environment::get().getWindowManager()->messageBox("#{sInventorySelectNoSoul}");
}
else
{
setSoulGem ( MWWorld : : Ptr ( ) ) ;
mEnchanting . nextCastStyle ( ) ;
updateLabels ( ) ;
updateEffectsView ( ) ;
}
}
void EnchantingDialog : : notifyEffectsChanged ( )
{
mEffectList . mList = mEffects ;
mEnchanting . setEffect ( mEffectList ) ;
updateLabels ( ) ;
}
void EnchantingDialog : : onTypeButtonClicked ( MyGUI : : Widget * sender )
{
mEnchanting . nextCastStyle ( ) ;
updateLabels ( ) ;
updateEffectsView ( ) ;
}
void EnchantingDialog : : onAccept ( MyGUI : : EditBox * sender )
{
onBuyButtonClicked ( sender ) ;
}
void EnchantingDialog : : onBuyButtonClicked ( MyGUI : : Widget * sender )
{
if ( mEffects . size ( ) < = 0 )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sEnchantmentMenu11} " ) ;
return ;
}
if ( mName - > getCaption ( ) . empty ( ) )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage10} " ) ;
return ;
}
if ( mEnchanting . soulEmpty ( ) )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage52} " ) ;
return ;
}
if ( mEnchanting . itemEmpty ( ) )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage11} " ) ;
return ;
}
if ( mEnchanting . getEnchantPoints ( ) > mEnchanting . getMaxEnchantValue ( ) )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage29} " ) ;
return ;
}
mEnchanting . setNewItemName ( mName - > getCaption ( ) ) ;
mEnchanting . setEffect ( mEffectList ) ;
MWWorld : : Ptr player = MWMechanics : : getPlayer ( ) ;
int playerGold = player . getClass ( ) . getContainerStore ( player ) . count ( MWWorld : : ContainerStore : : sGoldId ) ;
if ( mPtr ! = player & & mEnchanting . getEnchantPrice ( ) > playerGold )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage18} " ) ;
return ;
}
// check if the player is attempting to use a soulstone or item that was stolen from this actor
if ( mPtr ! = player )
{
for ( int i = 0 ; i < 2 ; + + i )
{
MWWorld : : Ptr item = ( i = = 0 ) ? mEnchanting . getOldItem ( ) : mEnchanting . getGem ( ) ;
if ( MWBase : : Environment : : get ( ) . getMechanicsManager ( ) - > isItemStolenFrom ( item . getCellRef ( ) . getRefId ( ) , mPtr ) )
{
std : : string msg = MWBase : : Environment : : get ( ) . getWorld ( ) - > getStore ( ) . get < ESM : : GameSetting > ( ) . find ( " sNotifyMessage49 " ) - > getString ( ) ;
if ( msg . find ( " %s " ) ! = std : : string : : npos )
msg . replace ( msg . find ( " %s " ) , 2 , item . getClass ( ) . getName ( item ) ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( msg ) ;
MWBase : : Environment : : get ( ) . getMechanicsManager ( ) - > confiscateStolenItemToOwner ( player , item , mPtr , 1 ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeGuiMode ( GM_Enchanting ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > exitCurrentGuiMode ( ) ;
return ;
}
}
}
int result = mEnchanting . create ( ) ;
if ( result = = 1 )
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > playSound ( " enchant success " ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sEnchantmentMenu12} " ) ;
/*
Start of tes3mp addition
Include a messagebox notifying players that player - made enchantments are not synced yet
*/
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " Player-made enchantments are not synchronized in multiplayer yet and they will not show up for other players. " ) ;
/*
End of tes3mp addition
*/
}
else
{
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > playSound ( " enchant fail " ) ;
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > messageBox ( " #{sNotifyMessage34} " ) ;
}
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > removeGuiMode ( GM_Enchanting ) ;
}
}