2311 lines
74 KiB
C++
2311 lines
74 KiB
C++
#include "stdafx.h"
|
|
#include "SUIDecompositionWnd.h"
|
|
|
|
#include "SLog.h"
|
|
//#include "Util.h"
|
|
#include "CommonUtil.h"
|
|
|
|
#include "SGame.h"
|
|
#include "SItemDB.h"
|
|
#include "SStringDB.h"
|
|
#include "SCreatureDB.h"
|
|
|
|
#include "SUIDefine.h"
|
|
#include "KUIDefine.h"
|
|
|
|
#include "SGameManager.h"
|
|
//#include "SGameMessageUI.h"
|
|
#include "SGameInterface.h"
|
|
|
|
#include "SPetMgr.h"
|
|
#include "SInventoryMgr.h"
|
|
#include "SUIInventoryWnd.h"
|
|
|
|
#include "SPlayerInfoMgr.h"
|
|
#include "SSummonSlotMgr.h"
|
|
#include "SUILazyTooltip.h"
|
|
|
|
#include "SGameSystem.h"
|
|
extern SGameSystem * g_pCurrentGameSystem;
|
|
|
|
namespace nsDecomposeUI
|
|
{
|
|
static const WORD MAX_DECOMPOSITION_COUNT( 16 ); // 최대 분해 개수
|
|
static const WORD MAX_EACH_COUNT( 100 ); // 아이템별 최대 개수
|
|
static const WORD MAX_LINE_OF_PAGE( 8 ); // 한 화면에서 보여줄 아이템의 최대 줄 수
|
|
static const string BASE_ICON_CONTROL_NAME( "icon_item00" ); // 기본 아이템 아이콘 컨트롤 이름
|
|
static const string BASE_ITEMNAME_CONTROL_NAME( "item_name_text_00" ); // 기본 아이템 이름 컨트롤 이름
|
|
static const string BASE_ITEMDESC_CONTROL_NAME( "item_info_text_00" ); // 기본 아이템 이름 컨트롤 이름
|
|
static const string BASE_BACKGROUND_CONTROL_NAME( "inframe_line_00" ); // 기본 아이템 배경 컨트롤 이름
|
|
static const string BASE_SELECT_CONTROL_NAME( "select_list_red_00" ); // 선택 컨트롤 이름
|
|
static const string SCROLLBAR_CONTROL_NAME( "scrollbar_list_01" ); // 스크롤 바 컨트롤 이름
|
|
static const string ICONSLOT_CONTROL_NAME( "common_panel_titanium_slot_icon" ); // 아이템 슬롯 컨트롤 이름
|
|
static const string DO_EMPTY_CONTROL_NAME( "button_remove_01" ); // 비우기 버튼 컨트롤 이름
|
|
static const string DO_DECOMPOSITION_CONTROL_NAME( "all_decompose_01" ); // 전체 분해 버튼 컨트롤 이름
|
|
static const string ITEMCOUNT_CONTROL_NAME( "decompose_count_01" ); // 아이템 개수 컨트롤 이름
|
|
static const string RUPY_CONTROL_NAME( "text_rupy_num_01" ); // 루피 컨트롤 이름
|
|
static const string RUPY_OVER_COLOR_VALUE_CONTROL_NAME( "text_rupy_num_over_01" ); // 보유 루피보다 분해 필요 루피가 많을 시 출력 할 폰트 색상 컨트롤 이름
|
|
static const string MAX_ITEMCOUNT_COLOR_VALUE_CONTROL_NAME( "decompose_count_over_01" ); // 최대 분해 개수 만큼 아이템이 등록 瑛?시 출략 할 폰트 색상 컨트롤 이름
|
|
static const string DO_DECOMPOSITION_DISABLE_COLOR_VALUE_CONTROL_NAME( "all_decompose_disable_01" );// 전체 분해 버튼 컨트롤 비 활성화 시 출력 할 폰트 색상 컨트롤 이름
|
|
static const string SYSTEM_MESSAGE_RESULT_ITEMINFO_ITENNAME_TAG( "#@item_name@#" ); // #@item_name@#
|
|
static const string SYSTEM_MESSAGE_RESULT_ITEMINFO_ITENCOUNT_TAG( "#@item_num@#" ); // #@item_num@#
|
|
static const string NAME_ITEM_AMOUNT( "static_itemcount00" );
|
|
|
|
static const WORD INVALID_CONTROL_INDEX( -1 );
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 생성자
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
SUIDecompositionWnd::SUIDecompositionWnd( SGameManager * pGameManager, SUIDisplayInfo* pDisplayInfo )
|
|
: SUIWnd( pGameManager )
|
|
, m_pDisplayInfo( pDisplayInfo )
|
|
, m_pScrollBar( NULL )
|
|
, m_pRupyControl( NULL )
|
|
, m_pDoEmptyControl( NULL )
|
|
, m_pItemCountControl( NULL )
|
|
, m_pDoDecompositionControl( NULL )
|
|
, m_nCurrentScrollPosition( NULL )
|
|
, m_wCurrentSelectControlIndex( INVALID_CONTROL_INDEX )
|
|
, m_nBackgroundControlHeight( NULL )
|
|
, m_nBackgroundControlWidth( NULL )
|
|
, m_strRupyBasicColorValue( "" )
|
|
, m_strRupyNotEnoughColorValue( "" )
|
|
, m_strItemCountBasicColorValue( "" )
|
|
, m_strItemCountMaxColorValue( "" )
|
|
, m_strDoDecompositionEnableColorValue( "" )
|
|
, m_strDoDecompositionDisableColorValue( "" )
|
|
, m_strRupyPropertyTag( "" )
|
|
, m_strItemNamePropertyTag( "" )
|
|
, m_strItemDescPropertyTag( "" )
|
|
, m_strItemCountPropertyTag( "" )
|
|
, m_strDoDecompositionPropertyTag( "" )
|
|
, m_n64WaitForAppendItemUniqueID( NULL )
|
|
, m_n64NeedPriceTemporaryStorage( NULL )
|
|
, m_n64TotalNeedPrice( NULL )
|
|
, m_bIsNotEnoughMoney( true )
|
|
, m_bIsSendPacket( false )
|
|
, m_bIsOpenFinalCautionMessageBox( false )
|
|
, m_ntCountForWaiting( 0 )
|
|
{
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 파괴자
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
SUIDecompositionWnd::~SUIDecompositionWnd()
|
|
{
|
|
for( UINT nCount = 0; nCount < m_vecControlInfo.size(); nCount++ )
|
|
{
|
|
PCONTROL_INFO pControlInfo( m_vecControlInfo[nCount] );
|
|
SAFE_DELETE( pControlInfo );
|
|
}
|
|
|
|
m_vecControlInfo.clear();
|
|
m_mapUniqueID.clear();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 윈도우 생성
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
SUIWnd* SUIDecompositionWnd::CreateWnd( const char* szFile, KUIWndManager* pWndManager, KPoint kPos, int nWindowID )
|
|
{
|
|
SUIWnd::CreateWnd( szFile, pWndManager, kPos, nWindowID );
|
|
|
|
if( false == CreateBaseControlInfo() )
|
|
return NULL;
|
|
|
|
if( false == CreateCopyControlInfo() )
|
|
return NULL;
|
|
|
|
ResetControlInfo();
|
|
UpdateAppendedItemCount();
|
|
UpdateItemInfo();
|
|
UpdateRupy();
|
|
UpdateButton();
|
|
|
|
return this;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 기본 컨트롤 들의 정보를 생성한다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::CreateBaseControlInfo()
|
|
{
|
|
KUIControlMultiIcon* pBaseIconControl( dynamicCast<KUIControlMultiIcon*>( GetChild( BASE_ICON_CONTROL_NAME.c_str() ) ) );
|
|
if( NULL == pBaseIconControl )
|
|
return false;
|
|
else
|
|
pBaseIconControl->SetIconLayer( 8 );
|
|
|
|
//수량
|
|
KUIWnd* pBaseItemAmountControl ( GetChild( NAME_ITEM_AMOUNT.c_str() ) );
|
|
if( NULL == pBaseItemAmountControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", NAME_ITEM_AMOUNT.c_str() );
|
|
assert( pBaseItemAmountControl );
|
|
return false;
|
|
}
|
|
else
|
|
pBaseItemAmountControl->SetShow( false );
|
|
|
|
|
|
KUIWnd* pBaseItemNameControl( GetChild( BASE_ITEMNAME_CONTROL_NAME.c_str() ) );
|
|
if( NULL == pBaseItemNameControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", BASE_ITEMNAME_CONTROL_NAME.c_str() );
|
|
assert( pBaseItemNameControl );
|
|
return false;
|
|
}
|
|
|
|
KUIWnd* pBaseItemDescControl( GetChild( BASE_ITEMDESC_CONTROL_NAME.c_str() ) );
|
|
if( NULL == pBaseItemDescControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", BASE_ITEMDESC_CONTROL_NAME.c_str() );
|
|
assert( pBaseItemDescControl );
|
|
return false;
|
|
}
|
|
|
|
KUIWnd* pBassBackgroundControl( GetChild( BASE_BACKGROUND_CONTROL_NAME.c_str() ) );
|
|
if( NULL == pBassBackgroundControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", BASE_BACKGROUND_CONTROL_NAME.c_str() );
|
|
assert( pBassBackgroundControl );
|
|
return false;
|
|
}
|
|
|
|
KUIWnd* pBaseSelectControl( GetChild( BASE_SELECT_CONTROL_NAME.c_str() ) );
|
|
if( NULL == pBaseSelectControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", BASE_SELECT_CONTROL_NAME.c_str() );
|
|
assert( pBaseSelectControl );
|
|
return false;
|
|
}
|
|
|
|
PCONTROL_INFO pControlInfo( new CONTROL_INFO() );
|
|
if( NULL == pControlInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] alloc Failed" );
|
|
assert( pControlInfo );
|
|
return false;
|
|
}
|
|
|
|
pControlInfo->m_wIndex = 0; // 베이스 컨트롤이니깐 0번 이다.
|
|
pControlInfo->m_wLineNumber = 0; // 베이스 컨트롤이니깐 0번 라인에 존재한다. ( 한 라인에 2개 씩 존재 )
|
|
pControlInfo->m_strIconControl = BASE_ICON_CONTROL_NAME.c_str();
|
|
pControlInfo->m_strItemNameControl = BASE_ITEMNAME_CONTROL_NAME.c_str();
|
|
pControlInfo->m_strItemDescControl = BASE_ITEMDESC_CONTROL_NAME.c_str();
|
|
pControlInfo->m_strBackgroundControl = BASE_BACKGROUND_CONTROL_NAME.c_str();
|
|
pControlInfo->m_strSelectControl = BASE_SELECT_CONTROL_NAME.c_str();
|
|
pControlInfo->m_pIconControl = pBaseIconControl;
|
|
pControlInfo->m_pItemAmountControl = pBaseItemAmountControl;
|
|
pControlInfo->m_pItemNameControl = pBaseItemNameControl;
|
|
pControlInfo->m_pItemDescControl = pBaseItemDescControl;
|
|
pControlInfo->m_pBackgroundControl = pBassBackgroundControl;
|
|
pControlInfo->m_pSelectControl = pBaseSelectControl;
|
|
|
|
m_vecControlInfo.push_back( pControlInfo );
|
|
|
|
KRect rtBackground( pBassBackgroundControl->GetRect() );
|
|
m_nBackgroundControlHeight = rtBackground.GetHeight();
|
|
m_nBackgroundControlWidth = rtBackground.GetWidth();
|
|
|
|
GetTextDecoration( pBaseItemNameControl->GetCaption(), m_strItemNamePropertyTag );
|
|
GetTextDecoration( pBaseItemDescControl->GetCaption(), m_strItemDescPropertyTag );
|
|
|
|
pControlInfo->m_pItemNameControl->SetCaption( m_strItemNamePropertyTag.c_str() );
|
|
pControlInfo->m_pItemDescControl->SetCaption( m_strItemDescPropertyTag.c_str() );
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 최대 분해 아이템 개수만큼 기본 컨트롤로 부터 복사 컨트롤 들의 정보를 생성한다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::CreateCopyControlInfo()
|
|
{
|
|
RECT rtLeftSide;
|
|
::ZeroMemory( &rtLeftSide, sizeof( rtLeftSide ) );
|
|
|
|
RECT rtRightSide;
|
|
::ZeroMemory( &rtRightSide, sizeof( rtRightSide ) );
|
|
|
|
KUIWnd* pBassBackgroundControl( GetChild( BASE_BACKGROUND_CONTROL_NAME.c_str() ) );
|
|
if( NULL == pBassBackgroundControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", BASE_BACKGROUND_CONTROL_NAME.c_str() );
|
|
assert( pBassBackgroundControl );
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
rtLeftSide.top = m_nBackgroundControlHeight;
|
|
rtLeftSide.left = -( m_nBackgroundControlWidth );
|
|
rtLeftSide.bottom = m_nBackgroundControlHeight;
|
|
rtLeftSide.right = -( m_nBackgroundControlWidth );
|
|
|
|
rtRightSide.left = m_nBackgroundControlWidth;
|
|
rtRightSide.right = m_nBackgroundControlWidth;
|
|
}
|
|
|
|
// 컨트롤의 UI에서의 줄 번호 ( 첫 번째 줄은 0번 )
|
|
WORD wLineNumber = 0;
|
|
|
|
// 0번 왼쪽 컨트롤에 대한 정보는 이미 CreateBaseControlInfo 함수에서 생성 되었음.
|
|
for( WORD wCount = 1; wCount < MAX_DECOMPOSITION_COUNT; wCount++ )
|
|
{
|
|
RECT rtAddPosition;
|
|
::ZeroMemory( &rtAddPosition, sizeof( rtAddPosition ) );
|
|
|
|
if( 0 == (wCount % 2) ) // 왼쪽 컨트롤
|
|
{
|
|
rtAddPosition = rtLeftSide;
|
|
++wLineNumber;
|
|
}
|
|
else // 오른쪽 컨트롤
|
|
{
|
|
rtAddPosition = rtRightSide;
|
|
}
|
|
|
|
PCONTROL_INFO pControlInfo( new CONTROL_INFO() );
|
|
if( NULL == pControlInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] alloc Failed" );
|
|
assert( pControlInfo );
|
|
continue;
|
|
}
|
|
|
|
string strBackgroundControl_SrcName( StringFormat( "inframe_line_%02d", (wCount - 1) ).c_str() );
|
|
string strBackgroundControl_DestName( StringFormat( "inframe_line_%02d", wCount ).c_str() );
|
|
|
|
KUIWnd* pCopiedBackgroundControl( CopyControl( strBackgroundControl_SrcName.c_str(), strBackgroundControl_DestName.c_str(), rtAddPosition ) );
|
|
if( NULL == pCopiedBackgroundControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Background Control Copy Failded" );
|
|
assert( pCopiedBackgroundControl );
|
|
}
|
|
|
|
string strSelectControl_SrcName( StringFormat( "select_list_red_%02d", (wCount - 1) ).c_str() );
|
|
string strSelectControl_DestName( StringFormat( "select_list_red_%02d", wCount ).c_str() );
|
|
|
|
KUIWnd* pCopiedSelectControl( CopyControl( strSelectControl_SrcName.c_str(), strSelectControl_DestName.c_str(), rtAddPosition ) );
|
|
if( NULL == pCopiedSelectControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Select Control Copy Failded" );
|
|
assert( pCopiedSelectControl );
|
|
}
|
|
|
|
string strIconControl_SrcName( StringFormat( "icon_item%02d", (wCount - 1) ).c_str() );
|
|
string strIconControl_DestName( StringFormat( "icon_item%02d", wCount ).c_str() );
|
|
|
|
KUIControlMultiIcon* pCopiedIconControl( dynamicCast<KUIControlMultiIcon*>( CopyControl( strIconControl_SrcName.c_str(), strIconControl_DestName.c_str(), rtAddPosition ) ) );
|
|
if( NULL == pCopiedIconControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Icon Control Copy Failded" );
|
|
assert( pCopiedIconControl );
|
|
}
|
|
else
|
|
pCopiedIconControl->SetIconLayer( 8 );
|
|
|
|
string strItemNameControl_SrcName( StringFormat( "item_name_text_%02d", (wCount - 1) ).c_str() );
|
|
string strItemNameControl_DestName( StringFormat( "item_name_text_%02d", wCount ).c_str() );
|
|
|
|
KUIWnd* pCopiedItemNameControl( CopyControl( strItemNameControl_SrcName.c_str(), strItemNameControl_DestName.c_str(), rtAddPosition ) );
|
|
if( NULL == pCopiedItemNameControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Item Name Control Copy Failded" );
|
|
assert( pCopiedItemNameControl );
|
|
}
|
|
|
|
string strItemDescControl_SrcName( StringFormat( "item_info_text_%02d", (wCount - 1) ).c_str() );
|
|
string strItemDescControl_DestName( StringFormat( "item_info_text_%02d", wCount ).c_str() );
|
|
|
|
KUIWnd* pCopiedItemDescControl( CopyControl( strItemDescControl_SrcName.c_str(), strItemDescControl_DestName.c_str(), rtAddPosition ) );
|
|
if( NULL == pCopiedItemDescControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Item Desc Control Copy Failded" );
|
|
assert( pCopiedItemDescControl );
|
|
}
|
|
|
|
string strItemCountControl_SrcName( StringFormat( "static_itemcount%02d", (wCount-1) ).c_str() );
|
|
string strItemCountControl_DestName( StringFormat( "static_itemcount%02d", wCount ).c_str() );
|
|
|
|
KUIWnd* pCopiedItemCountCotrol( CopyControl( strItemCountControl_SrcName.c_str(), strItemCountControl_DestName.c_str(), rtAddPosition ) );
|
|
if( NULL == pCopiedItemCountCotrol )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Item Desc Control Copy Failded" );
|
|
assert( pCopiedItemCountCotrol );
|
|
}
|
|
|
|
pControlInfo->m_wIndex = wCount;
|
|
pControlInfo->m_wLineNumber = wLineNumber;
|
|
pControlInfo->m_strIconControl = strIconControl_DestName.c_str();
|
|
pControlInfo->m_strItemNameControl = strItemNameControl_DestName.c_str();
|
|
pControlInfo->m_strItemDescControl = strItemDescControl_DestName.c_str();
|
|
pControlInfo->m_strBackgroundControl = strBackgroundControl_DestName.c_str();
|
|
pControlInfo->m_strSelectControl = strSelectControl_DestName.c_str();
|
|
pControlInfo->m_pIconControl = pCopiedIconControl;
|
|
pControlInfo->m_pItemNameControl = pCopiedItemNameControl;
|
|
pControlInfo->m_pItemDescControl = pCopiedItemDescControl;
|
|
pControlInfo->m_pBackgroundControl = pCopiedBackgroundControl;
|
|
pControlInfo->m_pSelectControl = pCopiedSelectControl;
|
|
pControlInfo->m_pItemAmountControl = pCopiedItemCountCotrol;
|
|
|
|
m_vecControlInfo.push_back( pControlInfo );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 컨트롤 초기화
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::InitControls( KPoint kPos )
|
|
{
|
|
KUIWnd* pTitleBarWnd( GetChild( "titlebar" ) );
|
|
if( NULL == pTitleBarWnd )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Title bar UI Control" );
|
|
assert( pTitleBarWnd );
|
|
}
|
|
else
|
|
SetCustomMovingRect( pTitleBarWnd->GetRect() );
|
|
|
|
|
|
return SUIWnd::InitControls( kPos );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 데이터 초기화
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::InitData( bool bReload /*= false*/ )
|
|
{
|
|
m_pScrollBar = dynamicCast<KUIControlVScrollSmallEx*>( GetChild( SCROLLBAR_CONTROL_NAME.c_str() ) );
|
|
if( NULL == m_pScrollBar )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", SCROLLBAR_CONTROL_NAME.c_str() );
|
|
assert( m_pScrollBar );
|
|
}
|
|
else
|
|
{
|
|
// (두 줄이므로 최대 개수 / 2) - (한 페이지의 보여주는 컨트롤 개수 - 1)
|
|
DWORD dwMaxRange ( (MAX_DECOMPOSITION_COUNT * 0.5f) - (MAX_LINE_OF_PAGE - 1) );
|
|
m_pScrollBar->SetMaxRange( dwMaxRange );
|
|
}
|
|
|
|
m_pRupyControl = dynamicCast<KUIControlStatic*>( GetChild( RUPY_CONTROL_NAME.c_str() ) );
|
|
if( NULL == m_pRupyControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", RUPY_CONTROL_NAME.c_str() );
|
|
assert( m_pRupyControl );
|
|
}
|
|
else
|
|
{
|
|
string strCaption( m_pRupyControl->GetCaption() );
|
|
|
|
GetTextDecoration( strCaption.c_str(), m_strRupyPropertyTag );
|
|
GetTextColorValue( strCaption, m_strRupyBasicColorValue );
|
|
}
|
|
|
|
/*m_pItemCountControl = dynamicCast<KUIControlStatic*>( GetChild( ITEMCOUNT_CONTROL_NAME.c_str() ) );
|
|
if( NULL == m_pItemCountControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", ITEMCOUNT_CONTROL_NAME.c_str() );
|
|
assert( m_pItemCountControl );
|
|
}
|
|
else
|
|
{
|
|
string strCaption( m_pItemCountControl->GetCaption() );
|
|
|
|
GetTextDecoration( strCaption.c_str(), m_strItemCountPropertyTag );
|
|
GetTextColorValue( strCaption, m_strItemCountBasicColorValue );
|
|
}*/
|
|
|
|
m_pDoEmptyControl = dynamicCast<KUIControlButton*>( GetChild( DO_EMPTY_CONTROL_NAME.c_str() ) );
|
|
if( NULL == m_pDoEmptyControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", DO_EMPTY_CONTROL_NAME.c_str() );
|
|
assert( m_pDoEmptyControl );
|
|
}
|
|
|
|
KUIControlStatic* pDocompositionDisableColorValueControl = dynamicCast<KUIControlStatic*>( GetChild( DO_DECOMPOSITION_DISABLE_COLOR_VALUE_CONTROL_NAME.c_str() ) );
|
|
if( NULL == pDocompositionDisableColorValueControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", DO_DECOMPOSITION_DISABLE_COLOR_VALUE_CONTROL_NAME.c_str() );
|
|
assert( pDocompositionDisableColorValueControl );
|
|
}
|
|
else
|
|
{
|
|
string strCaption( pDocompositionDisableColorValueControl->GetCaption() );
|
|
|
|
GetTextDecoration( strCaption.c_str(), m_strDoDecompositionPropertyTag );
|
|
GetTextColorValue( strCaption, m_strDoDecompositionDisableColorValue );
|
|
}
|
|
|
|
m_pDoDecompositionControl = dynamicCast<KUIControlButton*>( GetChild( DO_DECOMPOSITION_CONTROL_NAME.c_str() ) );
|
|
if( NULL == m_pDoDecompositionControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", DO_DECOMPOSITION_CONTROL_NAME.c_str() );
|
|
assert( m_pDoDecompositionControl );
|
|
}
|
|
else
|
|
{
|
|
string strCaption( m_pDoDecompositionControl->GetCaption() );
|
|
GetTextColorValue( strCaption, m_strDoDecompositionEnableColorValue );
|
|
|
|
m_pDoDecompositionControl->SetEnableColor( StringFormat( "<#%s>", m_strDoDecompositionEnableColorValue.c_str() ).c_str() );
|
|
m_pDoDecompositionControl->SetDisableColor( StringFormat( "<#%s>", m_strDoDecompositionDisableColorValue.c_str() ).c_str() );
|
|
|
|
m_pDoDecompositionControl->Disable();
|
|
}
|
|
|
|
KUIControlStatic* pRupyOverColorValueControl = dynamicCast<KUIControlStatic*>( GetChild( RUPY_OVER_COLOR_VALUE_CONTROL_NAME.c_str() ) );
|
|
if( NULL == pRupyOverColorValueControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", RUPY_OVER_COLOR_VALUE_CONTROL_NAME.c_str() );
|
|
assert( pRupyOverColorValueControl );
|
|
}
|
|
else
|
|
{
|
|
string strCaption( pRupyOverColorValueControl->GetCaption() );
|
|
GetTextColorValue( strCaption, m_strRupyNotEnoughColorValue );
|
|
}
|
|
|
|
KUIControlStatic* pMaxItemCountColorValueControl = dynamicCast<KUIControlStatic*>( GetChild( MAX_ITEMCOUNT_COLOR_VALUE_CONTROL_NAME.c_str() ) );
|
|
if( NULL == pMaxItemCountColorValueControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get UI Control - Name[%s]", MAX_ITEMCOUNT_COLOR_VALUE_CONTROL_NAME.c_str() );
|
|
assert( pMaxItemCountColorValueControl );
|
|
}
|
|
else
|
|
{
|
|
string strCaption( pMaxItemCountColorValueControl->GetCaption() );
|
|
GetTextColorValue( strCaption, m_strItemCountMaxColorValue );
|
|
}
|
|
|
|
return SUIWnd::InitData(bReload);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 윈도우 열리고, 닫힐 때
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd )
|
|
{
|
|
if( bOpen )
|
|
{
|
|
if( IsOpenAnotherUIWindow() )
|
|
{
|
|
if( m_pGameManager )
|
|
m_pGameManager->ProcMsgAtStatic( &SIMSG_REQ_OPEN_MSGBOX( SIMSG_REQ_OPEN_MSGBOX::_MSGBOXID::MSGBOX_GENERAL, S(228) /* 지금은 할 수 없습니다.*/, true ) );
|
|
|
|
SetShow( false );
|
|
SUIWnd::OnNotifyUIWindowOpen( false );
|
|
return ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ResetControlInfo();
|
|
UpdateAppendedItemCount();
|
|
UpdateItemInfo();
|
|
UpdateRupy();
|
|
UpdateButton();
|
|
}
|
|
SUIWnd::OnNotifyUIWindowOpen( bOpen );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 메시지 처리
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
|
|
{
|
|
if( NULL == lpszControlID )
|
|
return;
|
|
|
|
string strControlID( lpszControlID );
|
|
|
|
switch( nMessage )
|
|
{
|
|
case KSCROLL_SELECT:
|
|
case KSCROLL_CHANGE:
|
|
case KSCROLL_REFRESH:
|
|
{
|
|
if( NULL == strControlID.compare( SCROLLBAR_CONTROL_NAME.c_str() ) )
|
|
{
|
|
UpdateScrollBar();
|
|
UpdateSelectControl();
|
|
}
|
|
}
|
|
break;
|
|
case KBUTTON_CLICK:
|
|
case KBUTTON_PRESSING:
|
|
{
|
|
if( NULL == strControlID.compare( "scroll_btn_up" ) || // 스크롤 위로 버튼 클릭
|
|
NULL == strControlID.compare( "scroll_btn_down" ) ) // 스크롤 아래로 버튼 클릭
|
|
{
|
|
UpdateScrollBar();
|
|
UpdateSelectControl();
|
|
}
|
|
|
|
if( NULL == strControlID.compare( DO_EMPTY_CONTROL_NAME.c_str() ) ) // 비우기 버튼 클릭
|
|
{
|
|
ResetControlInfo();
|
|
UpdateAppendedItemCount();
|
|
UpdateItemInfo();
|
|
UpdateRupy();
|
|
UpdateButton();
|
|
}
|
|
if( NULL == strControlID.compare( "button_close" ) ) // 닫기 버튼 클릭
|
|
{
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DECOMPOSITION, false ) );
|
|
}
|
|
|
|
if( NULL == strControlID.compare( DO_DECOMPOSITION_CONTROL_NAME.c_str() ) ) // 전체 분해 버튼 클릭
|
|
{
|
|
m_bIsOpenFinalCautionMessageBox = false;
|
|
for( ITER_ITEM_UNIQUE_ID_LIST Iter = m_mapUniqueID.begin(); Iter != m_mapUniqueID.end(); Iter++ )
|
|
{
|
|
const IN_DATA& kData = Iter->second;
|
|
if( IsNeedOpenCautionMessageBox( kData._id ) )
|
|
m_bIsOpenFinalCautionMessageBox = true;
|
|
}
|
|
|
|
if( m_bIsOpenFinalCautionMessageBox )
|
|
{
|
|
if( NULL == m_pGameManager )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] GameManager Pointer is NULL" );
|
|
assert( m_pGameManager );
|
|
return;
|
|
}
|
|
|
|
SGameInterface* pGameInterface( m_pGameManager->GetGameInterface() );
|
|
if( NULL == pGameInterface )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] GameInterface Pointer is NULL" );
|
|
assert( pGameInterface );
|
|
return;
|
|
}
|
|
|
|
pGameInterface->OpenMessageBox( SIMSG_REQ_OPEN_MSGBOX::MSGBOX_YESNO, SIMSG_REQ_OPEN_MSGBOX::MSGBOX_DECOMPOSITON_CONFIRM_DO, false, -1, S( 1265 ) );
|
|
}
|
|
else
|
|
{
|
|
OpenProgressiveBar();
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case KUI_MESSAGE::KGENWND_MOVE:
|
|
{
|
|
LimitMoveWnd(); // 게임 외부로 나가지 못하게 제한
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 프로그레스 바 윈도우 열기
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::OpenProgressiveBar()
|
|
{
|
|
if( NULL == m_pGameManager )
|
|
return;
|
|
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SYNTHETIC_ITEM( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MIX_PROGRESS, SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DECOMPOSITION ) );
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MIX_PROGRESS, true, true ) );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 전체 분해 패킷 전송
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::SendDoDecompsitionPacket()
|
|
{
|
|
if( m_bIsSendPacket )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Already Send Packet" );
|
|
assert( NULL );
|
|
return false;
|
|
}
|
|
|
|
SMSG_DECOMPOSE_DO stMsg;
|
|
|
|
for( ITER_ITEM_UNIQUE_ID_LIST Iter = m_mapUniqueID.begin(); Iter != m_mapUniqueID.end(); Iter++ )
|
|
{
|
|
const IN_DATA& kIterData = Iter->second;
|
|
ItemInstance::ItemUID n64UniqueID( kIterData._id );
|
|
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( n64UniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Slot Info By UniqueID - [ %u ]", n64UniqueID );
|
|
assert( pInventorySlot );
|
|
continue;
|
|
}
|
|
|
|
//stMsg.m_vecItemHandle.push_back( pInventorySlot->GetHandle() );
|
|
SMSG_DECOMPOSE_DO::IN_DATA kData;
|
|
kData._handle = pInventorySlot->GetHandle();
|
|
kData._count = (unsigned int)kIterData._count.getAmount();
|
|
stMsg.m_vecItemData.push_back( kData );
|
|
}
|
|
|
|
if( m_pGameManager )
|
|
{
|
|
m_pGameManager->ProcMsgAtStatic( &stMsg );
|
|
m_bIsSendPacket = true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 정적 메시지 처리
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::ProcMsgAtStatic( SGameMessage* pMsg )
|
|
{
|
|
if( NULL == pMsg )
|
|
return;
|
|
|
|
switch( pMsg->nType )
|
|
{
|
|
case IMSG_UI_INPUTNUMBER: //gmpbigsun: 수량입력기로부터 입력받음
|
|
{
|
|
SIMSG_UI_INPUTNUMBER* pInputNumberMsg = (SIMSG_UI_INPUTNUMBER*)pMsg;
|
|
if( pInputNumberMsg->m_nValue < 1 )
|
|
{
|
|
m_n64WaitForAppendItemUniqueID = 0;
|
|
m_ntCountForWaiting = count_t( 0 );
|
|
break;
|
|
}
|
|
else if( pInputNumberMsg->m_nValue > MAX_EACH_COUNT )
|
|
{
|
|
//최대수량
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( m_n64WaitForAppendItemUniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Slot Info By UniqueID - [ %u ]", m_n64WaitForAppendItemUniqueID );
|
|
assert( pInventorySlot );
|
|
|
|
m_n64WaitForAppendItemUniqueID = 0;
|
|
m_ntCountForWaiting = count_t( 0 );
|
|
return;
|
|
}
|
|
|
|
pInputNumberMsg->m_nValue = ( pInventorySlot->GetItemCount() > MAX_EACH_COUNT ? count_t( MAX_EACH_COUNT ): pInventorySlot->GetItemCount() );
|
|
}
|
|
|
|
if( IsNeedOpenCautionMessageBox( m_n64WaitForAppendItemUniqueID ) )
|
|
{
|
|
if( NULL == m_pGameManager )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] GameManager Pointer is NULL" );
|
|
assert( m_pGameManager );
|
|
return;
|
|
}
|
|
|
|
SGameInterface* pGameInterface( m_pGameManager->GetGameInterface() );
|
|
if( NULL == pGameInterface )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] GameInterface Pointer is NULL" );
|
|
assert( pGameInterface );
|
|
return;
|
|
}
|
|
|
|
m_ntCountForWaiting = pInputNumberMsg->m_nValue;
|
|
pGameInterface->OpenMessageBox( SIMSG_REQ_OPEN_MSGBOX::MSGBOX_YESNO, SIMSG_REQ_OPEN_MSGBOX::MSGBOX_DECOMPOSITON_CONFIRM_APPEND, false, -1, S( 1265 ) );
|
|
}
|
|
else
|
|
{
|
|
if( m_mapUniqueID.size() >= MAX_DECOMPOSITION_COUNT )
|
|
return;
|
|
|
|
if( IsExistItemUniqueID( m_n64WaitForAppendItemUniqueID ) )
|
|
return;
|
|
|
|
if( IsPossibleItemAppend( m_n64WaitForAppendItemUniqueID ) )
|
|
{
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( m_n64WaitForAppendItemUniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
return;
|
|
|
|
if( pInventorySlot->GetItemCount() >= pInputNumberMsg->m_nValue )
|
|
{
|
|
WORD wIndex( m_mapUniqueID.size() );
|
|
|
|
IN_DATA kData;
|
|
kData._id = m_n64WaitForAppendItemUniqueID;
|
|
kData._count = pInputNumberMsg->m_nValue;
|
|
|
|
m_mapUniqueID.insert( make_pair<WORD, IN_DATA>( wIndex, kData ) );
|
|
AutoScrollBarMoveWhenAppendItem( wIndex );
|
|
|
|
SetAppendedItemToInventorySlot( m_n64WaitForAppendItemUniqueID, true );
|
|
|
|
PCONTROL_INFO pFindControlInfo( FindControlInfo( wIndex ) );
|
|
if( pFindControlInfo )
|
|
pFindControlInfo->m_n64NeedPrice = m_n64NeedPriceTemporaryStorage;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IMSG_UI_SEND_DATA:
|
|
{
|
|
SIMSG_UI_SEND_DATA* pRMsg( static_cast<SIMSG_UI_SEND_DATA*>( pMsg ) );
|
|
if( NULL == pRMsg )
|
|
break;
|
|
|
|
if( NULL == pRMsg->m_strString.compare( "Append_Yes" ) )
|
|
{
|
|
if( m_mapUniqueID.size() >= MAX_DECOMPOSITION_COUNT )
|
|
return;
|
|
|
|
if( IsExistItemUniqueID( m_n64WaitForAppendItemUniqueID ) )
|
|
return;
|
|
|
|
if( IsPossibleItemAppend( m_n64WaitForAppendItemUniqueID ) )
|
|
{
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( m_n64WaitForAppendItemUniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
return;
|
|
|
|
if( pInventorySlot->GetItemCount() >= m_ntCountForWaiting )
|
|
{
|
|
WORD wIndex( m_mapUniqueID.size() );
|
|
|
|
IN_DATA kData;
|
|
kData._id = m_n64WaitForAppendItemUniqueID;
|
|
kData._count = m_ntCountForWaiting;
|
|
|
|
m_mapUniqueID.insert( make_pair<WORD, IN_DATA>( wIndex, kData ) );
|
|
|
|
SetAppendedItemToInventorySlot( m_n64WaitForAppendItemUniqueID, true );
|
|
m_n64WaitForAppendItemUniqueID = NULL;
|
|
m_ntCountForWaiting = count_t(0);
|
|
|
|
AutoScrollBarMoveWhenAppendItem( wIndex );
|
|
|
|
PCONTROL_INFO pFindControlInfo( FindControlInfo( wIndex ) );
|
|
if( pFindControlInfo )
|
|
pFindControlInfo->m_n64NeedPrice = m_n64NeedPriceTemporaryStorage;
|
|
}
|
|
}
|
|
|
|
}
|
|
if( NULL == pRMsg->m_strString.compare( "Append_No" ) )
|
|
{
|
|
m_n64WaitForAppendItemUniqueID = NULL;
|
|
m_ntCountForWaiting = count_t(0);
|
|
}
|
|
|
|
if( NULL == pRMsg->m_strString.compare( "Do_Decomposition" ) )
|
|
{
|
|
OpenProgressiveBar();
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IMSG_DECOMPOSE_RESULT:
|
|
{
|
|
SMSG_DECOMPOSE_RESULT* pRMsg( static_cast<SMSG_DECOMPOSE_RESULT*>( pMsg ) );
|
|
if( NULL == pRMsg )
|
|
break;
|
|
|
|
OutputResultSystemMessage( pRMsg );
|
|
m_bIsSendPacket = false;
|
|
}
|
|
break;
|
|
|
|
case MSG_RESULT:
|
|
{
|
|
m_bIsSendPacket = false;
|
|
}
|
|
break;
|
|
|
|
case IMSG_SYNTHETIC_ITEM:
|
|
{
|
|
SendDoDecompsitionPacket();
|
|
ResetControlInfo();
|
|
}
|
|
break;
|
|
|
|
case IMSG_UI_MOVE:
|
|
{
|
|
SIMSG_UI_MOVE* pRMsg( static_cast<SIMSG_UI_MOVE*>( pMsg ) );
|
|
if( NULL == pRMsg )
|
|
break;
|
|
|
|
MovePos( pRMsg->m_nX, pRMsg->m_nY );
|
|
LimitMoveWnd();
|
|
}
|
|
break;
|
|
case IMSG_HOTKEY_EX: //servantes 2010.10.19
|
|
{
|
|
SIMSG_HOTKEY_EX* pHotKey = dynamicCast<SIMSG_HOTKEY_EX*>(pMsg);
|
|
|
|
if( pHotKey->wParam == VK_SHIFT )
|
|
m_bShiftKey = (pHotKey->bUp == 0); //servantes 2010.10.15
|
|
if( pHotKey->wParam == VK_CONTROL ) //servantes 2010.10.15
|
|
m_bControlKey = (pHotKey->bUp == 0);
|
|
if( pHotKey->wParam == VK_MENU )
|
|
{
|
|
bool bPreState = m_bAltKey;
|
|
m_bAltKey = (pHotKey->bUp == 0);
|
|
|
|
if( bPreState != m_bAltKey && IsShow() )
|
|
{
|
|
// 밑에서 UpdateItemInfo(); 호출하네.
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
UpdateAppendedItemCount();
|
|
UpdateControlInfo();
|
|
UpdateItemInfo();
|
|
UpdateRupy();
|
|
UpdateButton();
|
|
|
|
pMsg->bUse = true;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 분해 결과를 시스템 메시지로 출력한다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::OutputResultSystemMessage( SMSG_DECOMPOSE_RESULT* const pRMsg )
|
|
{
|
|
if( NULL == pRMsg )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Result Message Pointer is NULL" );
|
|
assert( pRMsg );
|
|
return;
|
|
}
|
|
|
|
for( int nCount = 0; nCount < pRMsg->m_vecItemInfo.size(); nCount++ )
|
|
{
|
|
SMSG_DECOMPOSE_RESULT::DECOMPOSE_INFO& rItemInfo( pRMsg->m_vecItemInfo[nCount] );
|
|
|
|
string strResultItemInfoMessage( S( 1264 ) );
|
|
string strItemName( m_pDisplayInfo->GetItemName( rItemInfo.m_hItem ) );
|
|
string strItemCount( StringFormat( "%u", rItemInfo.m_nItemCount ) );
|
|
|
|
ReplacePhrase( strResultItemInfoMessage, SYSTEM_MESSAGE_RESULT_ITEMINFO_ITENNAME_TAG, strItemName );
|
|
ReplacePhrase( strResultItemInfoMessage, SYSTEM_MESSAGE_RESULT_ITEMINFO_ITENCOUNT_TAG, strItemCount );
|
|
|
|
if( m_pDisplayInfo )
|
|
m_pDisplayInfo->AddSystemMessage( strResultItemInfoMessage.c_str(), 99 );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 마우스 메시지 처리 : 선택 컨트롤
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::ProcessMouseMessage_SelectControl( const PCONTROL_INFO pControlInfo )
|
|
{
|
|
if( NULL == pControlInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Control Info Pointer is NULL" );
|
|
assert( pControlInfo );
|
|
return;
|
|
}
|
|
|
|
ITER_ITEM_UNIQUE_ID_LIST Iter( m_mapUniqueID.find( pControlInfo->m_wIndex ) );
|
|
if( Iter == m_mapUniqueID.end() )
|
|
return;
|
|
|
|
KUIWnd* pBackgroundControl( pControlInfo->m_pBackgroundControl );
|
|
if( pBackgroundControl->IsShow() )
|
|
{
|
|
if( INVALID_CONTROL_INDEX != m_wCurrentSelectControlIndex )
|
|
{
|
|
PCONTROL_INFO pPreSelectControlInfo( FindControlInfo( m_wCurrentSelectControlIndex ) );
|
|
if( pPreSelectControlInfo )
|
|
{
|
|
KUIWnd* pPreSelectControl( pPreSelectControlInfo->m_pSelectControl );
|
|
if( pPreSelectControl )
|
|
pPreSelectControl->SetShow( false );
|
|
}
|
|
}
|
|
|
|
KUIWnd* pSelectControl( pControlInfo->m_pSelectControl );
|
|
if( pSelectControl )
|
|
{
|
|
pSelectControl->SetShow( true );
|
|
m_wCurrentSelectControlIndex = pControlInfo->m_wIndex;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 마우스 메시지 처리 : 아이템 빼기
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::ProcessMouseMessage_RemoveItem( const PCONTROL_INFO pControlInfo )
|
|
{
|
|
if( NULL == pControlInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Control Info Pointer is NULL" );
|
|
assert( pControlInfo );
|
|
return;
|
|
}
|
|
|
|
DeleteItemUniqueID( pControlInfo->m_wIndex );
|
|
|
|
UpdateAppendedItemCount();
|
|
UpdateControlInfo();
|
|
UpdateItemInfo();
|
|
UpdateRupy();
|
|
UpdateButton();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 마우스 메시지 처리
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
DWORD SUIDecompositionWnd::OnMouseMessage(DWORD dwMessage, int x, int y)
|
|
{
|
|
PCONTROL_INFO pFindControlInfo( FindControlInfo( KPoint( x, y ) ) );
|
|
|
|
if ( KLBUTTON_DOWN == dwMessage )
|
|
ProcessMouseMessage_SelectControl( pFindControlInfo );
|
|
|
|
if ( KLBUTTON_DBLCLK == dwMessage )
|
|
ProcessMouseMessage_RemoveItem( pFindControlInfo );
|
|
|
|
return SUIWnd::OnMouseMessage(dwMessage, x, y);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 아이콘 드래그 이벤트 시작 시 처리
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::Process_UIBeginDrag( KUIBeginDragMessage* const pRecvMsg )
|
|
{
|
|
if( NULL == m_pDisplayInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] DisplayInfo Pointer is NULL" );
|
|
assert( m_pDisplayInfo );
|
|
return false;
|
|
}
|
|
|
|
if( NULL == m_pDragAndDropIcon )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Drag and Drop Icon Pointer is NULL" );
|
|
assert( m_pDisplayInfo );
|
|
return false;
|
|
}
|
|
|
|
string strControlID( pRecvMsg->sDragControlID );
|
|
|
|
for( UINT nCount = 0; nCount < m_vecControlInfo.size(); nCount++ )
|
|
{
|
|
PCONTROL_INFO pControlInfo( m_vecControlInfo[nCount] );
|
|
if( NULL == pControlInfo )
|
|
continue;
|
|
|
|
if( NULL == pControlInfo->m_strIconControl.compare( strControlID ) )
|
|
{
|
|
KUIControlMultiIcon* pIconControl( pControlInfo->m_pIconControl );
|
|
if( NULL == pIconControl )
|
|
return false;
|
|
|
|
ITER_ITEM_UNIQUE_ID_LIST Iter( m_mapUniqueID.find( pControlInfo->m_wIndex ) );
|
|
if( Iter == m_mapUniqueID.end() )
|
|
return false;
|
|
|
|
m_pDisplayInfo->SetUIDragInfo( new SUIDecompositionDragInfo( pControlInfo->m_wIndex ) );
|
|
|
|
const KUIControlMultiIcon::ICON_INFO& rIconInfo = pIconControl->GetIconInfoByLayer( 0 );
|
|
m_pDragAndDropIcon->SetStateIcon( pIconControl->GetSprName(), rIconInfo.sAniName.c_str(), rIconInfo.nFrameIndex, STATE_NORMAL );
|
|
|
|
pRecvMsg->pDragAndDropRenderer = m_pDragAndDropIcon;
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 아이콘 드롭 이벤트 메시지 받을 시 처리
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::Process_UIReceiveDrop( const KUISendRecvDropMessage* const pRecvMsg )
|
|
{
|
|
if( NULL == m_pDisplayInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] DisplayInfo Pointer is NULL" );
|
|
assert( m_pDisplayInfo );
|
|
return;
|
|
}
|
|
|
|
SUIDragInfo* pUIDragInfo( m_pDisplayInfo->GetUIDragInfo() );
|
|
if( NULL == pUIDragInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] DragInfo Pointer is NULL" );
|
|
assert( pUIDragInfo );
|
|
return;
|
|
}
|
|
|
|
if( pUIDragInfo->m_type == SUIDragInfo::DRAGTYPE_INVENITEM )
|
|
{
|
|
if( NULL == m_pManager )
|
|
return;
|
|
|
|
KUIWnd* pFindWnd( m_pManager->FindWnd( pRecvMsg->sSendDropParentID.c_str() ) );
|
|
if( NULL == pFindWnd )
|
|
return;
|
|
|
|
SUIInventoryWnd* pInventoryWnd( static_cast<SUIInventoryWnd*>( pFindWnd ) );
|
|
if( NULL == pInventoryWnd )
|
|
return;
|
|
|
|
int nSlotNumber( pInventoryWnd->GetSlotControlNum( pRecvMsg->sSendDropControlID.c_str() ) );
|
|
if( -1 == nSlotNumber )
|
|
return;
|
|
|
|
SInventorySlot* pSlot( pInventoryWnd->GetInvenItem( nSlotNumber ) );
|
|
if( NULL == pSlot )
|
|
return;
|
|
|
|
AppendItemUniqueID( pSlot->GetUID() );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 아이콘 드롭 이벤트 메시지 보낼 시 처리
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::Process_UISendDrop( const KUISendRecvDropMessage* const pRecvMsg )
|
|
{
|
|
if( NULL == m_pDisplayInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] DisplayInfo Pointer is NULL" );
|
|
assert( m_pDisplayInfo );
|
|
return;
|
|
}
|
|
|
|
SUIDecompositionDragInfo* pUIDragInfo( static_cast<SUIDecompositionDragInfo*>( m_pDisplayInfo->GetUIDragInfo() ) );
|
|
if( NULL == pUIDragInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] DragInfo Pointer is NULL" );
|
|
assert( pUIDragInfo );
|
|
return;
|
|
}
|
|
|
|
if( SUIDragInfo::DRAGTYPE_DECOMPOSITION != pUIDragInfo->m_type )
|
|
return;
|
|
|
|
if( NULL == pRecvMsg->sRecvDropParentID.compare( "window_sub_inventory_decompose" ) )
|
|
return;
|
|
|
|
DeleteItemUniqueID( pUIDragInfo->m_wIndex );
|
|
m_pDisplayInfo->SetUIDragInfo();
|
|
|
|
UpdateAppendedItemCount();
|
|
UpdateControlInfo();
|
|
UpdateItemInfo();
|
|
UpdateRupy();
|
|
UpdateButton();
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 윈도우 갱신
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void* SUIDecompositionWnd::Perform( KID id, KArg& msg )
|
|
{
|
|
_CID( UI_BEGIN_DRAG );
|
|
_CID( UI_SEND_DROP );
|
|
_CID( UI_RECV_DROP );
|
|
|
|
if ( id == id_UI_RECV_DROP )
|
|
{
|
|
KUISendRecvDropMessage* pRecvMsg( static_cast<KUISendRecvDropMessage*>( &msg ) );
|
|
if( pRecvMsg )
|
|
{
|
|
Process_UIReceiveDrop( pRecvMsg );
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
if ( id == id_UI_BEGIN_DRAG )
|
|
{
|
|
KUIBeginDragMessage* pBeginMsg( static_cast<KUIBeginDragMessage*>( &msg ) );
|
|
if( pBeginMsg )
|
|
{
|
|
Process_UIBeginDrag( pBeginMsg );
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
if ( id == id_UI_SEND_DROP )
|
|
{
|
|
KUISendRecvDropMessage* pSendMsg( static_cast<KUISendRecvDropMessage*>( &msg ) );
|
|
if( pSendMsg )
|
|
{
|
|
Process_UISendDrop( pSendMsg );
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
return SUIWnd::Perform( id, msg );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 인덱스로 부터 컨트롤 정보 얻기
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
PCONTROL_INFO SUIDecompositionWnd::FindControlInfo( const WORD wIndex )
|
|
{
|
|
for( UINT nCount = 0; nCount < m_vecControlInfo.size(); nCount++ )
|
|
{
|
|
PCONTROL_INFO pControlInfo( m_vecControlInfo[nCount] );
|
|
if( NULL == pControlInfo )
|
|
continue;
|
|
|
|
if( pControlInfo->m_wIndex == wIndex )
|
|
return pControlInfo;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 마우스 좌표로 부터 컨트롤 정보 얻기
|
|
// 설명 : 배경 컨트롤 기준으로 컨트롤을 찾는다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
PCONTROL_INFO SUIDecompositionWnd::FindControlInfo( const KPoint ptMouse )
|
|
{
|
|
for( UINT nCount = 0; nCount < m_vecControlInfo.size(); nCount++ )
|
|
{
|
|
PCONTROL_INFO pControlInfo( m_vecControlInfo[nCount] );
|
|
if( NULL == pControlInfo )
|
|
continue;
|
|
|
|
KUIWnd* pBackground( pControlInfo->m_pBackgroundControl );
|
|
if( NULL == pBackground )
|
|
continue;
|
|
|
|
if( pBackground->GetRect().IsInRect( ptMouse.x, ptMouse.y ) )
|
|
return pControlInfo;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 아이템 정보 갱신
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::UpdateItemInfo()
|
|
{
|
|
if( NULL == m_pDisplayInfo )
|
|
return;
|
|
|
|
for( ITER_ITEM_UNIQUE_ID_LIST Iter = m_mapUniqueID.begin(); Iter != m_mapUniqueID.end(); Iter++ )
|
|
{
|
|
WORD wIndex( Iter->first );
|
|
|
|
const IN_DATA& kData = Iter->second;
|
|
ItemInstance::ItemUID n64UniqueID( kData._id );
|
|
|
|
PCONTROL_INFO pControlInfo( FindControlInfo( wIndex ) );
|
|
if( NULL == pControlInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Control Info - Index [ %d ]", wIndex );
|
|
assert( pControlInfo );
|
|
continue;
|
|
}
|
|
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( n64UniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Slot Info By UniqueID - [ %u ]", n64UniqueID );
|
|
assert( pInventorySlot );
|
|
continue;
|
|
}
|
|
|
|
KUIWnd* pItemNameControlWnd( pControlInfo->m_pItemNameControl );
|
|
if( NULL == pItemNameControlWnd )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Item Name Control Pointer is NULL - Index [ %d ]", wIndex );
|
|
assert( pItemNameControlWnd );
|
|
continue;
|
|
}
|
|
|
|
// 이름 설정
|
|
string strItemName( m_strItemNamePropertyTag.c_str() );
|
|
strItemName.append( m_pDisplayInfo->GetItemName( pInventorySlot->GetItemCode(), true, pInventorySlot->GetEnhance(), pInventorySlot->GetLevel(), pInventorySlot->GetXFlag(), false, 0, false, pInventorySlot->GetRandomOption() ) );
|
|
|
|
pItemNameControlWnd->SetCaption( strItemName.c_str() );
|
|
|
|
KUIControlMultiIcon* pItemIconControl( pControlInfo ->m_pIconControl );
|
|
if( NULL == pItemIconControl )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Item Icon Control Pointer is NULL - Index [ %d ]", wIndex );
|
|
assert( pItemIconControl );
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
ResetMultiIcon( pItemIconControl, 0, 8 );
|
|
|
|
if( false == setSkillCardIcon( pItemIconControl, pInventorySlot->GetItemCode() ) && false == setSummonCardIcon( pItemIconControl, pInventorySlot ) )
|
|
{
|
|
string strIconName( "" );
|
|
getIconNameAtDurability( pInventorySlot, strIconName );
|
|
pItemIconControl->SetIcon( 0, c_szDEF_SPR_NAME, strIconName.c_str() );
|
|
}
|
|
|
|
pItemIconControl->SetIcon( 1, c_szDEF_SPR_NAME, pInventorySlot->GetXFlag().IsOn( ItemInstance::ITEM_FLAG_CARD ) ? "static_common_useunitcardicon" : NULL );
|
|
|
|
EquipItemAddtionalIconSetter icon_setter( pItemIconControl, pInventorySlot );
|
|
|
|
if( pInventorySlot->GetItemAppearance() )
|
|
pItemIconControl->SetIcon( 4, c_szDEF_SPR_NAME, g_strLookChangeIcon );
|
|
|
|
pItemIconControl->SetLazyTooltip( new rp::KLazyItemTooltip( *m_pDisplayInfo, pInventorySlot, true ) );
|
|
if( m_bAltKey )
|
|
{
|
|
m_pDisplayInfo->SetComparableEquipItemSubTooltip( pItemIconControl, pInventorySlot );
|
|
}
|
|
|
|
// 개수
|
|
count_t nCount( kData._count );
|
|
bool bRenderCount = false;
|
|
|
|
// 중복가능하다면 무조건 표기
|
|
if( GetItemDB().IsJoin( pInventorySlot->GetItemCode(), IsInstanceUnstackable( pInventorySlot ) ) )
|
|
bRenderCount = true;
|
|
|
|
SetChildShow( CStringUtil::StringFormat( "static_itemcount%02d", wIndex ).c_str(), bRenderCount );
|
|
|
|
if( bRenderCount )
|
|
SetChildCaption( CStringUtil::StringFormat( "static_itemcount%02d", wIndex ).c_str(), CStringUtil::StringFormat( "<hcenter><right><b><size:10>%I64d", nCount.getAmount() ).c_str() );
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 아이템 등록 시 스크롤 바 자동 이동
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::AutoScrollBarMoveWhenAppendItem( const WORD wIndex )
|
|
{
|
|
if( NULL == m_pScrollBar )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Scroll Bar Pointer is NULL" );
|
|
assert( m_pScrollBar );
|
|
return;
|
|
}
|
|
|
|
PCONTROL_INFO pControlInfo( FindControlInfo( wIndex ) );
|
|
if( NULL == pControlInfo )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Control Info Pointer is NULL" );
|
|
assert( pControlInfo );
|
|
return;
|
|
}
|
|
|
|
WORD wMinScrollPosition( m_nCurrentScrollPosition );
|
|
WORD wMaxScrollPosition( m_nCurrentScrollPosition + MAX_LINE_OF_PAGE - 1 );
|
|
|
|
if( pControlInfo->m_wLineNumber < wMinScrollPosition ||
|
|
pControlInfo->m_wLineNumber > wMaxScrollPosition )
|
|
{
|
|
int nCalcScrollBarPosition( pControlInfo->m_wLineNumber - ( MAX_LINE_OF_PAGE - 1 ) );
|
|
if( nCalcScrollBarPosition < 0 )
|
|
nCalcScrollBarPosition = 0;
|
|
|
|
m_pScrollBar->SetPosition( nCalcScrollBarPosition );
|
|
UpdateScrollBar();
|
|
UpdateSelectControl();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 선택 컨트롤 갱신
|
|
// 설명 : 스크를의 값에 따라 선택 컨트롤을 보이고 / 숨긴다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::UpdateSelectControl()
|
|
{
|
|
if( INVALID_CONTROL_INDEX == m_wCurrentSelectControlIndex )
|
|
return;
|
|
|
|
WORD wMinScrollPosition( m_nCurrentScrollPosition );
|
|
WORD wMaxScrollPosition( m_nCurrentScrollPosition + MAX_LINE_OF_PAGE - 1 );
|
|
|
|
PCONTROL_INFO pSelectControlInfo( FindControlInfo( m_wCurrentSelectControlIndex ) );
|
|
if( NULL == pSelectControlInfo )
|
|
return;
|
|
|
|
ITER_ITEM_UNIQUE_ID_LIST Iter( m_mapUniqueID.find( pSelectControlInfo->m_wIndex ) );
|
|
if( Iter == m_mapUniqueID.end() )
|
|
return;
|
|
|
|
KUIWnd* m_pBackgroundControl( pSelectControlInfo->m_pBackgroundControl );
|
|
if( NULL == m_pBackgroundControl )
|
|
return;
|
|
|
|
bool bParentShow( m_pBackgroundControl->IsShow() );
|
|
|
|
if( pSelectControlInfo->m_pSelectControl )
|
|
pSelectControlInfo->m_pSelectControl->SetShow( bParentShow );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 스크롤 바 갱신
|
|
// 설명 : 스크를의 값에 따라 컨트롤 들을 이동 시키며, 보이고 / 숨긴다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::UpdateScrollBar()
|
|
{
|
|
if( NULL == m_pScrollBar )
|
|
return ;
|
|
|
|
int nPreScrollPosition( m_nCurrentScrollPosition );
|
|
|
|
if( m_pScrollBar->GetPosition() < 0 )
|
|
m_nCurrentScrollPosition = 0;
|
|
else
|
|
m_nCurrentScrollPosition = m_pScrollBar->GetPosition();
|
|
|
|
int nGapScrollPosition( m_nCurrentScrollPosition - nPreScrollPosition );
|
|
|
|
WORD wMinScrollPosition( m_nCurrentScrollPosition );
|
|
WORD wMaxScrollPosition( m_nCurrentScrollPosition + MAX_LINE_OF_PAGE - 1 );
|
|
|
|
for( UINT nCount = 0; nCount < m_vecControlInfo.size(); nCount++ )
|
|
{
|
|
PCONTROL_INFO pControlInfo( m_vecControlInfo[nCount] );
|
|
if( NULL == pControlInfo )
|
|
{
|
|
assert( pControlInfo );
|
|
continue;
|
|
}
|
|
|
|
pControlInfo->MovePosOffset( 0, nGapScrollPosition * m_nBackgroundControlHeight );
|
|
pControlInfo->SetShow( false );
|
|
|
|
if( pControlInfo->m_wLineNumber >= wMinScrollPosition &&
|
|
pControlInfo->m_wLineNumber <= wMaxScrollPosition )
|
|
{
|
|
pControlInfo->SetShow( true );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 버튼 컨트롤 갱신
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::UpdateButton()
|
|
{
|
|
if( m_pDoDecompositionControl )
|
|
{
|
|
if( m_mapUniqueID.size() > 0 )
|
|
{
|
|
if( m_bIsNotEnoughMoney )
|
|
m_pDoDecompositionControl->Disable();
|
|
else
|
|
m_pDoDecompositionControl->Enable();
|
|
}
|
|
else
|
|
m_pDoDecompositionControl->Disable();
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 돈 (루피) 컨트롤 갱신
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::UpdateRupy()
|
|
{
|
|
if( m_pRupyControl )
|
|
{
|
|
money_t n64TotalPrice( GetTotalDecompositionPrice() );
|
|
money_t n64UserRupy( m_PlayerInfoMgr.GetGold() );
|
|
|
|
string strTotalPrice( "" );
|
|
string strRupyPropertyTag( m_strRupyPropertyTag );
|
|
|
|
if( n64UserRupy < n64TotalPrice )
|
|
{
|
|
ReplaceTextColorValue( strRupyPropertyTag, m_strRupyNotEnoughColorValue );
|
|
m_bIsNotEnoughMoney = true;
|
|
}
|
|
else
|
|
{
|
|
ReplaceTextColorValue( strRupyPropertyTag, m_strRupyBasicColorValue );
|
|
m_bIsNotEnoughMoney = false;
|
|
}
|
|
|
|
strTotalPrice.append( strRupyPropertyTag );
|
|
strTotalPrice.append( CStringUtil::GetCommaNumberString( n64TotalPrice.getAmount() ) );
|
|
|
|
m_pRupyControl->SetCaption( strTotalPrice.c_str() );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 컨트롤 정보 갱신
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::UpdateControlInfo()
|
|
{
|
|
for( UINT nCount = 0; nCount < m_vecControlInfo.size(); nCount++ )
|
|
{
|
|
PCONTROL_INFO pControlInfo( m_vecControlInfo[nCount] );
|
|
if( pControlInfo )
|
|
{
|
|
ITER_ITEM_UNIQUE_ID_LIST Iter( m_mapUniqueID.find( pControlInfo->m_wIndex ) );
|
|
if( Iter != m_mapUniqueID.end() )
|
|
continue;
|
|
|
|
if( pControlInfo->m_pIconControl )
|
|
{
|
|
ResetMultiIcon( pControlInfo->m_pIconControl, 0, 8 );
|
|
pControlInfo->m_pIconControl->SetIcon( NULL, c_szDEF_SPR_NAME, ICONSLOT_CONTROL_NAME.c_str() );
|
|
pControlInfo->m_pIconControl->SetTooltip();
|
|
}
|
|
|
|
if( pControlInfo->m_pItemNameControl )
|
|
pControlInfo->m_pItemNameControl->SetCaption( m_strItemNamePropertyTag.c_str() );
|
|
|
|
if( pControlInfo->m_pItemDescControl )
|
|
pControlInfo->m_pItemDescControl->SetCaption( m_strItemDescPropertyTag.c_str() );
|
|
|
|
if( pControlInfo->m_pSelectControl )
|
|
pControlInfo->m_pSelectControl->SetShow( false );
|
|
|
|
if( pControlInfo->m_pItemAmountControl )
|
|
pControlInfo->m_pItemAmountControl->SetShow( false );
|
|
|
|
pControlInfo->m_n64NeedPrice = money_t( NULL );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 등록 된 아이템 개수 갱신
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::UpdateAppendedItemCount()
|
|
{
|
|
/*if( m_pItemCountControl )
|
|
{
|
|
UINT nItemCount( m_mapUniqueID.size() );
|
|
string strItemCount( "" );
|
|
string strItemCountPropertyTag( m_strItemCountPropertyTag );
|
|
|
|
if( nItemCount >= MAX_DECOMPOSITION_COUNT )
|
|
{
|
|
ReplaceTextColorValue( strItemCountPropertyTag, m_strItemCountMaxColorValue );
|
|
strItemCount.append( strItemCountPropertyTag );
|
|
strItemCount.append( StringFormat( "%d", m_mapUniqueID.size() ) );
|
|
strItemCount.append( StringFormat( "<#%s> / %d", m_strItemCountBasicColorValue.c_str(), MAX_DECOMPOSITION_COUNT ) );
|
|
}
|
|
else
|
|
{
|
|
ReplaceTextColorValue( strItemCountPropertyTag, m_strItemCountBasicColorValue );
|
|
strItemCount.append( strItemCountPropertyTag );
|
|
strItemCount.append( StringFormat( "%d / %d", m_mapUniqueID.size(), MAX_DECOMPOSITION_COUNT ) );
|
|
}
|
|
|
|
m_pItemCountControl->SetCaption( strItemCount.c_str() );
|
|
}*/
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 분해하는데 드는 총 소모비용 얻기
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
money_t SUIDecompositionWnd::GetTotalDecompositionPrice()
|
|
{
|
|
money_t n64TotalPrice( NULL );
|
|
|
|
for( ITER_ITEM_UNIQUE_ID_LIST Iter = m_mapUniqueID.begin(); Iter != m_mapUniqueID.end(); Iter++ )
|
|
{
|
|
WORD wIndex( Iter->first );
|
|
const IN_DATA& kData = Iter->second;
|
|
ItemInstance::ItemUID n64UniqueID( kData._id );
|
|
|
|
PCONTROL_INFO pControlInfo( FindControlInfo( wIndex ) );
|
|
if( pControlInfo )
|
|
n64TotalPrice += pControlInfo->m_n64NeedPrice * kData._count;
|
|
}
|
|
|
|
return n64TotalPrice;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 컨트롤 정보 초기화
|
|
// 설명 : 생성 된 컨트롤의 위치, 아이콘, 아이템 이름, 스크롤 위치를 초기화 한다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::ResetControlInfo()
|
|
{
|
|
for( UINT nCount = 0; nCount < m_vecControlInfo.size(); nCount++ )
|
|
{
|
|
PCONTROL_INFO pControlInfo( m_vecControlInfo[nCount] );
|
|
if( pControlInfo )
|
|
{
|
|
// 소모 비용 초기화
|
|
pControlInfo->m_n64NeedPrice = money_t( NULL );
|
|
|
|
// 컨트롤 위치 초기화
|
|
pControlInfo->ReturnToOriginPos();
|
|
|
|
// 아이템 아이콘 초기화
|
|
if( pControlInfo->m_pIconControl )
|
|
{
|
|
ResetMultiIcon( pControlInfo->m_pIconControl, 0, 8 );
|
|
pControlInfo->m_pIconControl->SetIcon( NULL, c_szDEF_SPR_NAME, ICONSLOT_CONTROL_NAME.c_str() );
|
|
pControlInfo->m_pIconControl->SetTooltip();
|
|
}
|
|
// 아이템 이름 초기화
|
|
if( pControlInfo->m_pItemNameControl )
|
|
pControlInfo->m_pItemNameControl->SetCaption( m_strItemNamePropertyTag.c_str() );
|
|
|
|
// 아이템 설명 초기화
|
|
if( pControlInfo->m_pItemDescControl )
|
|
pControlInfo->m_pItemDescControl->SetCaption( m_strItemDescPropertyTag.c_str() );
|
|
|
|
if( pControlInfo->m_pSelectControl )
|
|
pControlInfo->m_pSelectControl->SetShow( false );
|
|
|
|
//아이템 갯수 초기화
|
|
if( pControlInfo->m_pItemAmountControl )
|
|
pControlInfo->m_pItemAmountControl->SetShow( false );
|
|
}
|
|
}
|
|
|
|
m_wCurrentSelectControlIndex = INVALID_CONTROL_INDEX;
|
|
|
|
// 스크롤 바 초기화
|
|
if( m_pScrollBar )
|
|
{
|
|
m_pScrollBar->SetPosition( NULL );
|
|
m_nCurrentScrollPosition = 0;
|
|
UpdateScrollBar();
|
|
}
|
|
|
|
// 분해 될 아이템 정보 초기화
|
|
for( ITER_ITEM_UNIQUE_ID_LIST Iter = m_mapUniqueID.begin(); Iter != m_mapUniqueID.end(); Iter++ )
|
|
{
|
|
const IN_DATA& kData = Iter->second;
|
|
SetAppendedItemToInventorySlot( kData._id, false );
|
|
}
|
|
|
|
m_mapUniqueID.clear();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// DB로 부터 유효한 조합식을 찾았는가 ? ( 이건 서버와 같은 로직을 쓴다 변경 시 서버와 상의 할 것 )
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::IsFindValidDecomositionFormula( const SInventorySlot* const pSlot, const ItemBaseEx_info* const pItemBase, DECOMPOSE_FORMULA_INFO* const pFormulaInfo )
|
|
{
|
|
vector<DECOMPOSE_IDENTITY_INFO>& vecIdentity( pFormulaInfo->m_vecIdentity );
|
|
|
|
for( UINT nCount = 0; nCount < vecIdentity.size(); nCount++ )
|
|
{
|
|
int nValue( vecIdentity[nCount].m_nValue );
|
|
switch( vecIdentity[nCount].m_nType )
|
|
{
|
|
case eCHECK_ITEM_GROUP:
|
|
{
|
|
if( pItemBase->nGroup != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_GROUP_NE:
|
|
{
|
|
if( pItemBase->nGroup == nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_CLASS:
|
|
{
|
|
if( pItemBase->nClass != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_ID:
|
|
{
|
|
if( pSlot->GetItemCode() != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_RANK:
|
|
{
|
|
if( pItemBase->nRank != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_LEVEL:
|
|
{
|
|
if( pSlot->GetLevel() != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_FLAG_ON:
|
|
{
|
|
if( false == pSlot->GetXFlag().IsOn( nValue ) )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_FLAG_OFF:
|
|
{
|
|
if( pSlot->GetXFlag().IsOn( nValue ) )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ENHANCE_MATCH:
|
|
{
|
|
if( pSlot->GetEnhance() != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ENHANCE_DISMATCH:
|
|
{
|
|
if( pSlot->GetEnhance() == nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_COUNT:
|
|
{
|
|
if( pSlot->GetItemCount() != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_COUNT_GE:
|
|
{
|
|
if( pSlot->GetItemCount() < nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_ETHEREAL_DURABILITY_E:
|
|
{
|
|
if( pSlot->GetEtherealDurability() != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_ETHEREAL_DURABILITY_NE:
|
|
{
|
|
if( pSlot->GetEtherealDurability() == nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ELEMENTAL_EFFECT_MATCH:
|
|
{
|
|
int nItemElementalEffectBitflag = static_cast< int >( pow( 2.0, pSlot->GetEET() ) ) >> 1;
|
|
|
|
if( !nItemElementalEffectBitflag )
|
|
{
|
|
if( nValue )
|
|
return false;
|
|
}
|
|
else if( ( nItemElementalEffectBitflag & nValue ) != nItemElementalEffectBitflag )
|
|
return false;
|
|
else
|
|
__noop;
|
|
}
|
|
break;
|
|
case eCHECK_ELEMENTAL_EFFECT_MISMATCH:
|
|
{
|
|
int nItemElementalEffectBitflag = static_cast< int >( pow( 2.0, pSlot->GetEET() ) ) >> 1;
|
|
|
|
if( !nItemElementalEffectBitflag )
|
|
{
|
|
if( !nValue )
|
|
return false;
|
|
}
|
|
else if( ( nItemElementalEffectBitflag & nValue ) == nItemElementalEffectBitflag )
|
|
return false;
|
|
else
|
|
__noop;
|
|
}
|
|
break;
|
|
|
|
case eCHECK_ITEM_WEAR_POSITION_MATCH:
|
|
{
|
|
if( pItemBase->WearType != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_WEAR_POSITION_MISMATCH:
|
|
{
|
|
if( pItemBase->WearType == nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
|
|
case eCHECK_ITEM_GRADE:
|
|
{
|
|
if( pItemBase->nGrade != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_EXPIRED_TIME_GE:
|
|
{
|
|
bool bExpire( false );
|
|
|
|
if( pItemBase->decrease_type == ItemBase::DECREASE_ON_GAME ||
|
|
pItemBase->decrease_type == ItemBase::DECREASE_ALWAYS )
|
|
bExpire = true;
|
|
else
|
|
bExpire = false;
|
|
|
|
if( nValue == -1 && bExpire )
|
|
return false;
|
|
|
|
if( nValue != -1 && bExpire && ( pItemBase->available_time < nValue ) )
|
|
return false;
|
|
|
|
}break;
|
|
case eCHECK_ITEM_EXPIRED_TIME_LE:
|
|
{
|
|
bool bExpire( false );
|
|
|
|
if( pItemBase->decrease_type == ItemBase::DECREASE_ON_GAME ||
|
|
pItemBase->decrease_type == ItemBase::DECREASE_ALWAYS )
|
|
bExpire = true;
|
|
else
|
|
bExpire = false;
|
|
|
|
if( nValue == -1 && bExpire )
|
|
return false;
|
|
|
|
if( nValue != -1 && bExpire && ( pItemBase->available_time > nValue ) )
|
|
return false;
|
|
}
|
|
break;
|
|
|
|
case eCHECK_ITEM_FIRST_SOCKET_CODE_MATCH:
|
|
{
|
|
const int nSocketCount( pItemBase->socket );
|
|
int const* pSocket( pSlot->GetSocketInfo() );
|
|
|
|
if( NULL < nSocketCount )
|
|
{
|
|
if( pSocket[0] != nValue )
|
|
return false;
|
|
}
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_MAX_ETHEREAL_DURABILITY_E:
|
|
{
|
|
if( pSlot->getMaxEtherealDurability() != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_MAX_ETHEREAL_DURABILITY_NE:
|
|
{
|
|
if( pSlot->getMaxEtherealDurability() == nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_ITEM_TYPE:
|
|
{
|
|
if( pItemBase->nType != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_MIX_CHECK_SAME_SUMMON_RATE:
|
|
{
|
|
if( ItemBase::GROUP_SUMMONCARD != pItemBase->nGroup )
|
|
return false;
|
|
|
|
if( GetCreatureDB().GetRate( pSlot->GetSummonID() ) != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_MIX_CHECK_ENHANCE_GE:
|
|
{
|
|
if( pSlot->GetEnhance() < nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_MIX_CHECK_ENHANCE_LE:
|
|
{
|
|
if( pSlot->GetEnhance() > nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
case eCHECK_MIX_CHECK_SAME_ITEM_GROUP:
|
|
{
|
|
if(pItemBase->nGroup != nValue )
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 분해가 가능한 아이템 인가? ( 분해 DB로 부터 검사한다 )
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::IsPossibleDecompositionFromDB( const SInventorySlot* const pSlot, const ItemBaseEx_info* const pItemBase )
|
|
{
|
|
if( NULL == pSlot )
|
|
return false;
|
|
|
|
if( NULL == pItemBase )
|
|
return false;
|
|
|
|
SDecomposeDB::DECOMPOSE_FORMULA_LIST* const pDecomposeFormulaList( GetDecomposeDB().GetDecomposeFormula() );
|
|
if( NULL == pDecomposeFormulaList )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Decompose Formula Data From DB" );
|
|
assert( pDecomposeFormulaList );
|
|
return false;
|
|
}
|
|
|
|
m_n64NeedPriceTemporaryStorage = money_t( NULL );
|
|
|
|
for( SDecomposeDB::DECOMPOSE_FORMULA_ITER Iter = pDecomposeFormulaList->begin(); Iter != pDecomposeFormulaList->end(); ++Iter )
|
|
{
|
|
PDECOMPOSE_FORMULA_INFO pDecompositionFormula( Iter->second );
|
|
if( NULL == pDecompositionFormula )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Decompose Formula Pointer is Invalid" );
|
|
assert( pDecomposeFormulaList );
|
|
continue;
|
|
}
|
|
|
|
if( IsFindValidDecomositionFormula( pSlot, pItemBase, pDecompositionFormula ) )
|
|
{
|
|
m_n64NeedPriceTemporaryStorage = money_t( pDecompositionFormula->m_nNeedPrice );
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 등록 가능 한 아이템 인가 ?
|
|
// 반환 값 : 예(true) / 아니요(false)
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::IsPossibleItemAppend( const ItemInstance::ItemUID n64UniqueID )
|
|
{
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( n64UniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Slot Info By UniqueID - [ %u ]", n64UniqueID );
|
|
assert( pInventorySlot );
|
|
return false;
|
|
}
|
|
|
|
if( pInventorySlot )
|
|
{
|
|
const ItemBaseEx_info* pItemBase( GetItemDB().GetItemData( pInventorySlot->GetItemCode() ) );
|
|
|
|
if( NULL == pItemBase )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get ItemInfo - ItemCode [ %n ]", pInventorySlot->GetItemCode() );
|
|
assert( pItemBase );
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
// 분해 불가 Flag 체크
|
|
if( pItemBase->CheckFlag( ItemBase::FLAG_CANT_DECOMPOSE ) )
|
|
return false;
|
|
|
|
// 장비 중인 아이템인가?
|
|
if( pInventorySlot->IsEquipItem() )
|
|
return false;
|
|
|
|
// 소환수가 장비 중인 아이템 인가?
|
|
if( pInventorySlot->IsSummonEquip() )
|
|
return false;
|
|
|
|
// 강화 실패 아이템 인가?
|
|
if( pInventorySlot->GetXFlag().IsOn( ItemInstance::ITEM_FLAG_FAILED ) )
|
|
return false;
|
|
|
|
// 내구도가 0인 아이템 인가 ?
|
|
if( pInventorySlot->getMaxEtherealDurability() > 0 )
|
|
{
|
|
float fEthereal( pInventorySlot->GetEtherealDurability() );
|
|
if( fEthereal <= 0.0f )
|
|
return false;
|
|
}
|
|
|
|
int nGroup( pItemBase->nGroup );
|
|
|
|
// 장비 중인 스킬 카드 인가 ?
|
|
if( ItemBase::GROUP_SKILLCARD == nGroup )
|
|
{
|
|
if( m_InventoryMgr.IsEquipCard( pInventorySlot->GetHandle() ) )
|
|
return false;
|
|
}
|
|
|
|
// 소환되어 있는 펫 인가 ?
|
|
if( ItemBase::GROUP_PETCAGE == nGroup )
|
|
{
|
|
if( pInventorySlot->GetXFlag().IsOn( ItemInstance::ITEM_FLAG_CAGE_HAS_PET ) )
|
|
{
|
|
SGame* pGame( m_pGameManager->GetActiveGame() );
|
|
if( NULL == pGame )
|
|
return false;
|
|
|
|
DATA_PET* pPetData( pGame->IsLocalPetCage( pInventorySlot->GetHandle() ) );
|
|
if( NULL == pPetData )
|
|
return false;
|
|
|
|
if( pGame->IsSummonPet( pPetData->pet_handle ) )
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// 크리쳐 카드인데 편성 되었거나 벨트에 장착되어 있나?
|
|
if( ItemBase::GROUP_SUMMONCARD == nGroup )
|
|
{
|
|
if( m_InventoryMgr.IsBeltSlotCard( pInventorySlot->GetHandle() ) )
|
|
return false;
|
|
|
|
if( m_CreatureSlotMgr.IsExistCreatureCard( pInventorySlot->GetHandle() ) )
|
|
return false;
|
|
}
|
|
|
|
if( false == IsPossibleDecompositionFromDB( pInventorySlot, pItemBase ) )
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 열려 있으면 안되는 다른 UI가 열려 있는가 ?
|
|
// 설명 : 특정 UI가 열려 있을 경우 분해 UI가 열리면 안되기 때문에 여기서 체크한다.
|
|
// 반환 값 : 예(true) / 아니요(false)
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::IsOpenAnotherUIWindow()
|
|
{
|
|
if( NULL == m_pGameManager )
|
|
return true;
|
|
|
|
if( m_pGameManager->IsShow( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TRADE ) )
|
|
return true;
|
|
|
|
if( m_pGameManager->IsShow( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_AUCTION ) )
|
|
return true;
|
|
|
|
if( m_pGameManager->IsShow( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_STORE_HOST ) )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 경고 메시지 박스를 열어야 필요가 있는가 ?
|
|
// 반환 값 : 예(true) / 아니요(false)
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::IsNeedOpenCautionMessageBox( const ItemInstance::ItemUID n64UniqueID )
|
|
{
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( n64UniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Slot Info By UniqueID - [ %u ]", n64UniqueID );
|
|
assert( pInventorySlot );
|
|
return false;
|
|
}
|
|
|
|
if( pInventorySlot )
|
|
{
|
|
const ItemBaseEx_info* pItemBase( GetItemDB().GetItemData( pInventorySlot->GetItemCode() ) );
|
|
|
|
if( NULL == pItemBase )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get ItemInfo - ItemCode [ %n ]", pInventorySlot->GetItemCode() );
|
|
assert( pItemBase );
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
if( NULL == m_pDisplayInfo )
|
|
return false;
|
|
|
|
// 강화
|
|
if( m_pDisplayInfo->IsEnhanceableItem( pInventorySlot->GetItemCode(), pItemBase ) )
|
|
{
|
|
int nEnhance( pInventorySlot->GetEnhance() );
|
|
|
|
// 스킬카드 강화
|
|
if( pItemBase->nGroup == ItemBase::GROUP_SKILLCARD )
|
|
{
|
|
if( 1 < nEnhance )
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
// 큐브 강화
|
|
if( NULL < pInventorySlot->GetEnhance() )
|
|
return true;
|
|
|
|
// 대장장이 강화
|
|
if( 1 < pInventorySlot->GetLevel() )
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// 소울스톤
|
|
int nSocketCount( pInventorySlot->GetJewelSlotCount() );
|
|
int const* pSocket( pInventorySlot->GetSocketInfo() );
|
|
|
|
for( int nCount = 0; nCount < nSocketCount; nCount++ )
|
|
{
|
|
if( NULL == pSocket )
|
|
break;
|
|
|
|
int nJewelID( pSocket[nCount] );
|
|
if( nJewelID )
|
|
{
|
|
for( int nOptionCount = 0; nOptionCount < ItemBase::MAX_OPTION_NUMBER; nOptionCount++ )
|
|
{
|
|
int nType( NULL );
|
|
double dVar1( 0.0 ), dVar2( 0.0 );
|
|
|
|
if( GetItemDB().GetOptionVar( nJewelID, nOptionCount, nType, dVar1, dVar2 ) )
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 부여석 ( 0은 무속성 )
|
|
if( NULL != pInventorySlot->GetEET() )
|
|
return true;
|
|
|
|
// 봉인 된 크리쳐 카드
|
|
if( pInventorySlot->GetXFlag().IsOn( ItemInstance::ITEM_FLAG_SUMMON ) )
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 동일한 유일한 아이템 아이디가 존재하는가 ?
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::IsExistItemUniqueID( const ItemInstance::ItemUID n64UniqueID )
|
|
{
|
|
for( ITER_ITEM_UNIQUE_ID_LIST Iter = m_mapUniqueID.begin(); Iter != m_mapUniqueID.end(); Iter++ )
|
|
{
|
|
const IN_DATA& kData = Iter->second;
|
|
ItemInstance::ItemUID nSaved64UniqueID( kData._id );
|
|
if( nSaved64UniqueID == n64UniqueID )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 분해 할 아이템의 유니크 한 아아디를 등록한다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
bool SUIDecompositionWnd::SetAppendedItemToInventorySlot( const ItemInstance::ItemUID n64UniqueID, bool bAppend )
|
|
{
|
|
if( NULL == m_pGameManager )
|
|
return false;
|
|
|
|
if( NULL == n64UniqueID )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Item Unique ID is NULL" );
|
|
assert( n64UniqueID );
|
|
return false;
|
|
}
|
|
|
|
SUIInventoryWnd* pInventoryWnd( dynamicCast<SUIInventoryWnd*>( m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_INVENTORY) ) );
|
|
if( NULL == pInventoryWnd )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Inventory Window" );
|
|
assert( n64UniqueID );
|
|
return false;
|
|
}
|
|
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( n64UniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Can't Get Slot Info By UniqueID - [ %u ]", n64UniqueID );
|
|
assert( pInventorySlot );
|
|
return false;
|
|
}
|
|
|
|
pInventorySlot->SetAppendDecomposeWnd( bAppend );
|
|
pInventoryWnd->RefreshInvenSlots();
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 분해 할 아이템의 유니크 한 아아디를 등록한다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::AppendItemUniqueID( const ItemInstance::ItemUID n64UniqueID )
|
|
{
|
|
if( NULL == n64UniqueID )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] Item Unique ID is NULL" );
|
|
assert( n64UniqueID );
|
|
return ;
|
|
}
|
|
else
|
|
{
|
|
if( m_mapUniqueID.size() >= MAX_DECOMPOSITION_COUNT )
|
|
return;
|
|
|
|
if( IsExistItemUniqueID( n64UniqueID ) )
|
|
return;
|
|
|
|
if( IsPossibleItemAppend( n64UniqueID ) )
|
|
{
|
|
SInventorySlot* pInventorySlot( m_InventoryMgr.GetItemInfo( n64UniqueID ) );
|
|
if( NULL == pInventorySlot )
|
|
return;
|
|
|
|
|
|
|
|
if( pInventorySlot->GetItemCount() > 1 && m_bShiftKey ) // AziaMafia ADD KEY
|
|
{
|
|
m_n64WaitForAppendItemUniqueID = n64UniqueID;
|
|
count_t tMaxCount = ( pInventorySlot->GetItemCount() > MAX_EACH_COUNT ? count_t(MAX_EACH_COUNT) : pInventorySlot->GetItemCount() );
|
|
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_REQ_INPUTNUMBER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DECOMPOSITION, tMaxCount, SIMSG_UI_REQ_INPUTNUMBER::TYPE_NUMBER ) );
|
|
}
|
|
else
|
|
{
|
|
if( IsNeedOpenCautionMessageBox( n64UniqueID ) )
|
|
{
|
|
if( NULL == m_pGameManager )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] GameManager Pointer is NULL" );
|
|
assert( m_pGameManager );
|
|
return;
|
|
}
|
|
|
|
SGameInterface* pGameInterface( m_pGameManager->GetGameInterface() );
|
|
if( NULL == pGameInterface )
|
|
{
|
|
SDEBUGLOG( "[SUIDecompositionWnd] GameInterface Pointer is NULL" );
|
|
assert( pGameInterface );
|
|
return;
|
|
}
|
|
|
|
pGameInterface->OpenMessageBox( SIMSG_REQ_OPEN_MSGBOX::MSGBOX_YESNO, SIMSG_REQ_OPEN_MSGBOX::MSGBOX_DECOMPOSITON_CONFIRM_APPEND, false, -1, S( 1265 ) );
|
|
m_n64WaitForAppendItemUniqueID = n64UniqueID;
|
|
m_ntCountForWaiting = count_t(1); //gmpbigsun( 20130820, #27057 ) : 강화된 아이템 분해실패
|
|
}
|
|
else
|
|
{
|
|
WORD wIndex( m_mapUniqueID.size() );
|
|
|
|
IN_DATA kData;
|
|
kData._id = n64UniqueID;
|
|
kData._count = count_t(1);
|
|
|
|
if (m_bControlKey)
|
|
{
|
|
if ( pInventorySlot->GetItemCount() > 10 )
|
|
kData._count = count_t(10);
|
|
if (pInventorySlot->GetItemCount() < 10 && pInventorySlot->GetItemCount() > 1 )
|
|
kData._count = count_t(pInventorySlot->GetItemCount());
|
|
|
|
}
|
|
if (m_bAltKey)
|
|
{
|
|
kData._count = count_t(pInventorySlot->GetItemCount());
|
|
}
|
|
|
|
m_mapUniqueID.insert( make_pair<WORD, IN_DATA>( wIndex, kData ) );
|
|
AutoScrollBarMoveWhenAppendItem( wIndex );
|
|
|
|
SetAppendedItemToInventorySlot( n64UniqueID, true );
|
|
|
|
PCONTROL_INFO pFindControlInfo( FindControlInfo( wIndex ) );
|
|
if( pFindControlInfo )
|
|
pFindControlInfo->m_n64NeedPrice = m_n64NeedPriceTemporaryStorage;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( m_pDisplayInfo ) m_pDisplayInfo->AddSystemMessage( S( 1263 ), 99 );
|
|
}
|
|
}
|
|
|
|
UpdateAppendedItemCount();
|
|
UpdateControlInfo();
|
|
UpdateItemInfo();
|
|
UpdateRupy();
|
|
UpdateButton();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
// 아이템의 고유한 아이디를 삭제한다.
|
|
//-----------------------------------------------------------------------------------------------------------------
|
|
void SUIDecompositionWnd::DeleteItemUniqueID( const WORD wIndex )
|
|
{
|
|
ITER_ITEM_UNIQUE_ID_LIST FindIter = m_mapUniqueID.find( wIndex );
|
|
if( FindIter == m_mapUniqueID.end() )
|
|
return ;
|
|
|
|
IN_DATA kData = FindIter->second;
|
|
SetAppendedItemToInventorySlot( kData._id, false );
|
|
|
|
m_mapUniqueID.erase( wIndex );
|
|
|
|
vector<ItemInstance::ItemUID> vecTemp;
|
|
for( ITER_ITEM_UNIQUE_ID_LIST Iter = m_mapUniqueID.begin(); Iter != m_mapUniqueID.end(); Iter++ )
|
|
{
|
|
kData = Iter->second;
|
|
vecTemp.push_back( kData._id );
|
|
}
|
|
|
|
m_mapUniqueID.clear();
|
|
|
|
for( WORD wIndex = 0; wIndex < vecTemp.size(); wIndex++ )
|
|
{
|
|
IN_DATA kNewData;
|
|
kNewData._id = vecTemp[wIndex];
|
|
m_mapUniqueID.insert( make_pair<WORD, IN_DATA>( wIndex, kNewData ) );
|
|
}
|
|
} |