1728 lines
50 KiB
C++
1728 lines
50 KiB
C++
#include "SunClientPrecompiledHeader.h"
|
|
#include "EnchantDialog3.h"
|
|
|
|
#ifdef _NA_003966_20111227_ADD_ENCHANT
|
|
|
|
#include "ItemUnitRenderer.h"
|
|
#include "Mouse.h"
|
|
#include "MouseHandler.h"
|
|
#include "slotkeygenerator.h"
|
|
#include "SCItemSlot.h"
|
|
#include "ItemManager.h"
|
|
#include "SoundEffect.h"
|
|
#include "CursorChangeTransact.h"
|
|
#include "hero.h"
|
|
#include "Application.h"
|
|
#include "globalfunc.h"
|
|
#include "interfacemanager.h"
|
|
#include "uiToolTipMan/uiToolTipMan.h"
|
|
#include "HeroActionInput.h"
|
|
#ifdef _NA_20100307_BETAKEY_SYSTEM
|
|
#include "uiLoginMan/uiLoginMan.h"
|
|
#include "BetaKeyImpl.h"
|
|
#endif//_NA_20100307_BETAKEY_SYSTEM
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
WzID EnchantDialog::m_wzId[] =
|
|
{
|
|
StrToWzID("B000"),//ENCHANT_BTN_SLOT_TARGET = 0,
|
|
StrToWzID("B001"),//ENCHANT_BTN_SLOT_2,
|
|
StrToWzID("B002"),//ENCHANT_BTN_SLOT_3,
|
|
StrToWzID("B003"),//ENCHANT_BTN_SLOT_4,
|
|
StrToWzID("B004"),//ENCHANT_BTN_SLOT_5,
|
|
|
|
|
|
|
|
StrToWzID("B999"),//ENCHANT_BTN_EXIT
|
|
StrToWzID("B998"),//ENCHANT_BTN_ENCHANT,
|
|
StrToWzID("B005"),//ENCHANT_BTN_RETRY,
|
|
StrToWzID("B006"),//ENCHANT_BTN_CANCEL,
|
|
|
|
StrToWzID("C001"),//ENCHANT_CHK_25_PER,
|
|
StrToWzID("C002"),//ENCHANT_CHK_50_PER,
|
|
StrToWzID("C003"),//ENCHANT_CHK_75_PER,
|
|
StrToWzID("C004"),//ENCHANT_CHK_100_PER,
|
|
|
|
StrToWzID("T999"),//ENCHANT_TXT_TITLE,
|
|
StrToWzID("T004"),//ENCHANT_TXT_KIND,
|
|
StrToWzID("T011"),//ENCHANT_TXT_ITEM_NAME,
|
|
|
|
StrToWzID("T005"),//ENCHANT_TXT_MAIN_SUB_MAT1,
|
|
StrToWzID("T006"),//ENCHANT_TXT_MAIN_SUB_MAT2,
|
|
StrToWzID("T007"),//ENCHANT_TXT_MAIN_SUB_MAT3,
|
|
|
|
StrToWzID("T008"),//ENCHANT_TXT_MAIN_SUB_OPTION,
|
|
|
|
StrToWzID("T012"),//ENCHANT_TXT_MAIN_SUB_MAT1_NUM,
|
|
StrToWzID("T013"),//ENCHANT_TXT_MAIN_SUB_MAT2_NUM,
|
|
StrToWzID("T014"),//ENCHANT_TXT_MAIN_SUB_MAT3_NUM,
|
|
|
|
StrToWzID("T009"),//ENCHANT_TXT_REQUIRE_MONEY,
|
|
StrToWzID("VS02"),//ENCHANT_VSCR_SUB,
|
|
|
|
StrToWzID("T002"),//ENCHANT_TXT_TITLE2,
|
|
StrToWzID("S000"),//ENCHANT_TXT_EXTRA_TITLE,
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
EnchantDialog::EnchantDialog( void )
|
|
: m_itemRenderer( NULL )
|
|
, m_targetPos(INVALID_SLOT_POS)
|
|
, m_extraItemPos( INVALID_SLOT_POS )
|
|
, m_pendingTargetPos( -1 )
|
|
, m_matsForLv( NULL )
|
|
, m_enchantLevel( ENCHANT_LOW )
|
|
, m_enchantCost( 0 )
|
|
, m_enchantOpt( eENCHANT_NOT_OPT )
|
|
, m_probabilityIdx( 4 )
|
|
, m_DialogKey(0)
|
|
{
|
|
//// 슬롯 5개(아이템1 + 재료3)
|
|
//m_EnchantSlotContainer.Init( 4, SI_ENCHANT );
|
|
//m_EnchantOptionItemContainer.Init( 1, SI_ENCHANT_OPTION );
|
|
|
|
m_lockInfoMap.clear();
|
|
m_matList.clear();
|
|
|
|
m_packetStatus = PACKET_STATUS_NONE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
EnchantDialog::~EnchantDialog( void )
|
|
{
|
|
//m_EnchantSlotContainer.Release();
|
|
//m_EnchantOptionItemContainer.Release();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::Init( CDrawBase* /*pDrawBase*/ )
|
|
{
|
|
InitUiControls();
|
|
|
|
m_SlotContainer[0].Initialize( 1, SI_ENCHANT );
|
|
m_SlotContainer[1].Initialize( 3, SI_ENCHANT_MATERIAL );
|
|
m_SlotContainer[2].Initialize( 1, SI_ENCHANT_OPTION );
|
|
|
|
enchant_popup_dialog_key_ = 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::Release( void )
|
|
{
|
|
m_SlotContainer[0].Release();
|
|
m_SlotContainer[1].Release();
|
|
m_SlotContainer[2].Release();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnUpdateSolarDialog()
|
|
{
|
|
m_SlotContainer[0].Update();
|
|
m_SlotContainer[1].Update();
|
|
m_SlotContainer[2].Update();
|
|
|
|
UpdateMouseOverObj();
|
|
|
|
UpdateTooltip();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnRenderSolarDialog()
|
|
{
|
|
m_SlotContainer[0].Render();
|
|
m_SlotContainer[1].Render();
|
|
m_SlotContainer[2].Render();
|
|
}
|
|
|
|
SCItemSlot* EnchantDialog::GetTargetItem()
|
|
{
|
|
return m_SlotContainer[0].GetSlotItem(0);
|
|
}
|
|
|
|
SCItemSlot* EnchantDialog::GetExteraItem()
|
|
{
|
|
return m_SlotContainer[2].GetSlotItem(0);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::NetworkProc( MSG_BASE* pMsg )
|
|
{
|
|
if( pMsg->m_byCategory == CG_ITEM )
|
|
{
|
|
switch( pMsg->m_byProtocol )
|
|
{
|
|
case CG_ITEM_ENCHANT_SUCCESS_ACK: // 인첸트 성공
|
|
OnEnchantSuccessAck( pMsg );
|
|
break;
|
|
|
|
case CG_ITEM_ENCHANT_FAILED_ACK: // 인첸트 실패
|
|
OnEnchantFailedAck( pMsg );
|
|
break;
|
|
|
|
case CG_ITEM_ENCHANT_NAK: // 인첸트 시도 실패
|
|
OnItemEnchantNak( pMsg );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::MessageProc( SI_MESSAGE* pMsg )
|
|
{
|
|
switch( pMsg->eResultMsg )
|
|
{
|
|
case RT_MSG_LBUTTONCLICK:
|
|
OnLButtonClick( pMsg );
|
|
break;
|
|
case RT_MSG_RBUTTONCLICK:
|
|
OnRButtonClick( pMsg );
|
|
break;
|
|
|
|
case RT_MSG_SB_PAGETOP: // 윗쪽 몸통을 눌렀다.
|
|
case RT_MSG_SB_LINETOP: // 윗쪽 화살표를 눌렀다.
|
|
{
|
|
if( pMsg->dwCtrlID == m_wzId[ENCHANT_VSCR_SUB] )
|
|
{
|
|
assert( m_ctlMatListScroll );
|
|
|
|
int pos = m_ctlMatListScroll->GetScrollPosWZ();
|
|
|
|
int mmin = 0, mmax = 0;
|
|
m_ctlMatListScroll->GetScrollRangeWZ( &mmin, &mmax );
|
|
|
|
if( pos > mmin )
|
|
{
|
|
m_ctlMatListScroll->SetScrollPosWZ( --pos );
|
|
|
|
RefreshEnchantMatList();
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case RT_MSG_SB_PAGEBOTTOM: // 윗쪽 몸통을 눌렀다.
|
|
case RT_MSG_SB_LINEBOTTOM: // 아랫쪽 화살표를 눌렀다
|
|
{
|
|
if( pMsg->dwCtrlID == m_wzId[ENCHANT_VSCR_SUB] )
|
|
{
|
|
assert( m_ctlMatListScroll );
|
|
|
|
int pos = m_ctlMatListScroll->GetScrollPosWZ();
|
|
|
|
int mmin = 0, mmax = 0;
|
|
m_ctlMatListScroll->GetScrollRangeWZ( &mmin, &mmax );
|
|
|
|
if( pos < mmax )
|
|
{
|
|
m_ctlMatListScroll->SetScrollPosWZ( ++pos );
|
|
|
|
RefreshEnchantMatList();
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case RT_MSG_SB_THUMBTRACK: // 썸을 드래그 하고 있다.
|
|
case RT_MSG_SB_THUMBPOSITION: // 썸을 드래그한후 마우스를 놓았다.
|
|
case RT_MSG_SB_ENDSCROLL: // 스크롤이 종료 되었다.
|
|
{
|
|
if( pMsg->dwCtrlID == m_wzId[ENCHANT_VSCR_SUB] )
|
|
{
|
|
assert( m_ctlMatListScroll );
|
|
|
|
RefreshEnchantMatList();
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
SolarDialog::MessageProc( pMsg );
|
|
break;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::Enchant( void )
|
|
{
|
|
if (enchant_popup_dialog_key_ != 0)
|
|
{
|
|
// 팝업창이 열려있으면 리턴
|
|
return;
|
|
}
|
|
|
|
// 유효한 인챈트인가?
|
|
if( !IsValidEnchant() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// 필요한 재료는 있나?
|
|
if( !HaveEnchantMaterials() )
|
|
{
|
|
TCHAR buf[INTERFACE_STRING_LENGTH];
|
|
g_InterfaceManager.GetInterfaceString( eST_ITEM_NOT_EXIST_COMPOSITE_MATERIALS, buf, sizeof( buf ) );
|
|
|
|
GlobalFunc::OutputMsg_Error( eOUTPUT_MSG_CHAT, buf );
|
|
return;
|
|
}
|
|
|
|
// 돈은 충분히 있는가?
|
|
if( !HaveEnchantCost() )
|
|
{
|
|
TCHAR buf[INTERFACE_STRING_LENGTH];
|
|
g_InterfaceManager.GetInterfaceString( eST_NOT_ENOUGH_MONEY, buf, sizeof( buf ) );
|
|
|
|
GlobalFunc::OutputMsg_Error( eOUTPUT_MSG_CHAT, buf );
|
|
return;
|
|
}
|
|
|
|
// 적색시약 등급이고 적색시약이 없으면 안내 팝업창을 띄움
|
|
const MATERIALS_FOR_LEVEL* const enchant_material_info = GetCurrentEnchantInfo();
|
|
if (enchant_material_info == NULL)
|
|
{
|
|
return;
|
|
}
|
|
if ((enchant_material_info->GetDownGradeType() == 2) &&
|
|
(m_extraItemPos == INVALID_SLOT_POS))
|
|
{
|
|
// 2193 적색시약이 첨가되지 않았습니다. 인챈트 실패 시 아이템이 소멸될 수 있습니다. 계속 하시겠습니까?
|
|
enchant_popup_dialog_key_ = GlobalFunc::ConfirmMessage(2193, 0, Callback_SendPacketItemEnchantSyn);
|
|
return;
|
|
}
|
|
|
|
// 아직 패킷을 날리지 않았으면
|
|
if (!BIT_CHECK(m_packetStatus, PACKET_STATUS_ENCHANT))
|
|
{
|
|
BYTE rateIdx = (BYTE)( m_enchantOpt | ProbabilityIdxToOpt( m_probabilityIdx ) );
|
|
|
|
MSG_CG_ITEM_ENCHANT_SYN packet;
|
|
packet.Init();
|
|
packet.m_SuccessRateIndex = rateIdx;
|
|
packet.m_TargetPos = m_targetPos;
|
|
packet.m_NPCCode = g_HeroInput.GetClickedNpcCode();
|
|
packet.down_guard_item_pos = m_extraItemPos;
|
|
|
|
BOOL ret = GlobalFunc::SendPacket( CI_GAMESERVERIDX, &packet, sizeof( packet ) );
|
|
|
|
if( ret )
|
|
{
|
|
BIT_ADD( m_packetStatus, PACKET_STATUS_ENCHANT );
|
|
|
|
m_pendingTargetPos = m_targetPos;
|
|
|
|
EnableDialog( FALSE );
|
|
}
|
|
}
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/** 인첸트패킷을 보내서 기다리는중인지여부 묻기
|
|
*/
|
|
BOOL EnchantDialog::IsPendingEnchant(POSTYPE pSlotPos)
|
|
{
|
|
if(BIT_CHECK( m_packetStatus, PACKET_STATUS_ENCHANT ) && pSlotPos==m_pendingTargetPos)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::ReTry( void )
|
|
{
|
|
if( BIT_CHECK( m_packetStatus, PACKET_STATUS_ENCHANT ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
InitDialog();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::Exit( void )
|
|
{
|
|
if( BIT_CHECK( m_packetStatus, PACKET_STATUS_ENCHANT ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (enchant_popup_dialog_key_ != 0)
|
|
{
|
|
// 팝업창이 있으면 팝업창 끔
|
|
uiSystemMan* system_manager = GET_DIALOG_MANAGER(uiSystemMan, UIMAN_SYSTEM);
|
|
if (system_manager != NULL)
|
|
{
|
|
system_manager->Destroy_Sys_Confirm(enchant_popup_dialog_key_);
|
|
}
|
|
enchant_popup_dialog_key_ = 0;
|
|
}
|
|
|
|
ShowDialog( FALSE );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
CControlWZ* EnchantDialog::getControl( POSTYPE atPos )
|
|
{
|
|
assert( atPos >= 0 && atPos < Dialog_Max );
|
|
|
|
return GetControlWZ( m_wzId[atPos] );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
POSTYPE EnchantDialog::getCtrlIDToPos( WzID wzId )
|
|
{
|
|
for( POSTYPE i = 0; i < Dialog_Max; ++i )
|
|
{
|
|
if( m_wzId[i] == wzId )
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return Dialog_Max;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::InitUiControls( void )
|
|
{
|
|
// 인챈트 레벨(상/중/하)
|
|
m_ctlEnchantLvl = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_KIND );
|
|
assert( m_ctlEnchantLvl );
|
|
|
|
// 아이템 이름
|
|
m_ctlItemName = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_ITEM_NAME );
|
|
assert( m_ctlItemName );
|
|
|
|
// 필요 돈(하임)
|
|
m_ctlEnchantCost = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_REQUIRE_MONEY );
|
|
assert( m_ctlEnchantCost );
|
|
|
|
// 재료 목록 스크롤 바
|
|
m_ctlMatListScroll = (CCtrlVScrollWZ*)getControl( ENCHANT_VSCR_SUB );
|
|
assert( m_ctlMatListScroll );
|
|
|
|
// 재료 이름/수
|
|
for( int i = 0; i < MAX_VISIBLE_MATERIAL_COUNT; ++i )
|
|
{
|
|
m_ctlMatName[i] = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_MAIN_SUB_MAT1 + i );
|
|
m_ctlMatNum[i] = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_MAIN_SUB_MAT1_NUM + i );
|
|
|
|
// mjk_080903 - 기획에서 재료 수는 숨겨달라고 요청
|
|
m_ctlMatNum[i]->ShowWindowWZ( WZ_HIDE );
|
|
}
|
|
|
|
|
|
m_ctlTargetTitle = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_TITLE2 );
|
|
m_ctlExtraMatTitle = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_EXTRA_TITLE );
|
|
m_ctlExtraMatName = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_MAIN_SUB_OPTION );
|
|
|
|
m_ctlOptionMatName = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_MAIN_SUB_OPTION);
|
|
|
|
|
|
// 확률(25%, 50%, 70%, 100%)
|
|
for( i = 0; i < ENCHANT_TAB_MAX; ++i )
|
|
{
|
|
m_ctlProbability[i] = (CCtrlButtonCheckWZ*)getControl( ENCHANT_CHK_25_PER + i );
|
|
}
|
|
|
|
m_DefaultTextColor = m_ctlExtraMatName->GetTextColor();
|
|
m_InvalidTextColor = RGBA(141,141,141,255);
|
|
|
|
m_TitleDefaultColor = m_ctlTargetTitle->GetTextColor();
|
|
m_TitleTextColor1 = RGBA(0,156,255,255);
|
|
m_TitleTextColor2 = RGBA(237,28,36,255);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnShowWindow( BOOL show )
|
|
{
|
|
if( show )
|
|
{
|
|
InitDialog();
|
|
|
|
g_InterfaceManager.ShowWindow( InterfaceManager::DIALOG_EQUIP, TRUE );
|
|
|
|
keyMsg msg;
|
|
ZeroMemory( &msg, sizeof( msg ) );
|
|
msg.dwType = eDoType_dialog_new_enchant;
|
|
msg.wParam = InterfaceManager::DIALOG_ENCHANT;
|
|
msg.DoSomething = GlobalFunc::DoShowWindow;
|
|
g_KeyQueueManager.PushBack( msg );
|
|
}
|
|
else
|
|
{
|
|
g_InterfaceManager.ShowWindow( InterfaceManager::DIALOG_EQUIP, FALSE );
|
|
|
|
g_KeyQueueManager.DeleteMsg( eDoType_dialog_new_enchant );
|
|
|
|
m_SlotContainer[0].Clear();
|
|
m_SlotContainer[1].Clear();
|
|
m_SlotContainer[2].Clear();
|
|
|
|
TargetItemRock(false);
|
|
ExtraItemRock(false);
|
|
m_targetPos = INVALID_SLOT_POS;
|
|
m_extraItemPos = INVALID_SLOT_POS;
|
|
|
|
if (enchant_popup_dialog_key_ != 0)
|
|
{
|
|
// 팝업창이 있으면 팝업창 끔
|
|
uiSystemMan* system_manager = GET_DIALOG_MANAGER(uiSystemMan, UIMAN_SYSTEM);
|
|
if (system_manager != NULL)
|
|
{
|
|
system_manager->Destroy_Sys_Confirm(enchant_popup_dialog_key_);
|
|
}
|
|
enchant_popup_dialog_key_ = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::InitAllInfos( void )
|
|
{
|
|
m_SlotContainer[0].Clear();
|
|
m_SlotContainer[1].Clear();
|
|
m_SlotContainer[2].Clear();
|
|
|
|
|
|
m_packetStatus = PACKET_STATUS_NONE;
|
|
|
|
m_matsForLv = NULL;
|
|
|
|
m_enchantLevel = ENCHANT_LOW;
|
|
m_enchantCost = 0;
|
|
|
|
// 인벤토리 락 해제
|
|
TargetItemRock(false);
|
|
ExtraItemRock(false);
|
|
m_targetPos = INVALID_SLOT_POS;
|
|
m_extraItemPos = INVALID_SLOT_POS;
|
|
m_pendingTargetPos = -1;
|
|
|
|
m_lockInfoMap.clear();
|
|
m_matList.clear();
|
|
|
|
if (enchant_popup_dialog_key_ != 0)
|
|
{
|
|
// 팝업창이 있으면 팝업창 끔
|
|
uiSystemMan* system_manager = GET_DIALOG_MANAGER(uiSystemMan, UIMAN_SYSTEM);
|
|
if (system_manager != NULL)
|
|
{
|
|
system_manager->Destroy_Sys_Confirm(enchant_popup_dialog_key_);
|
|
}
|
|
enchant_popup_dialog_key_ = 0;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::InitDialog( void )
|
|
{
|
|
// 모든 정보 초기화
|
|
InitAllInfos();
|
|
|
|
TCHAR buf[INTERFACE_STRING_LENGTH];
|
|
|
|
// 타이틀1
|
|
if( CCtrlStaticWZ* text = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_TITLE ) )
|
|
{
|
|
g_InterfaceManager.GetInterfaceString( eST_ENCHANT_TEXT, buf, sizeof( buf ) );
|
|
GlobalFunc::SetCaption( text, buf );
|
|
}
|
|
|
|
// 타이틀2
|
|
if( CCtrlStaticWZ* text = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_TITLE2 ) )
|
|
{
|
|
// 721 : 인챈트할 아이템을 선택하세요
|
|
g_InterfaceManager.GetInterfaceString( 2194, buf, sizeof( buf ) );
|
|
GlobalFunc::SetCaption( text, buf );
|
|
}
|
|
|
|
// 타이틀3
|
|
if( CCtrlStaticWZ* text = (CCtrlStaticWZ*)getControl( ENCHANT_TXT_EXTRA_TITLE ) )
|
|
{
|
|
// 721 : 인챈트할 아이템을 선택하세요
|
|
g_InterfaceManager.GetInterfaceString( 2197, buf, sizeof( buf ) );
|
|
GlobalFunc::SetCaption( text, buf );
|
|
}
|
|
|
|
// 인챈트 레벨(상/중/하)
|
|
GlobalFunc::SetCaption( m_ctlEnchantLvl, _T( "" ) );
|
|
|
|
// 아이템 이름
|
|
GlobalFunc::SetCaption( m_ctlItemName, _T( "" ) );
|
|
|
|
// 필요 돈(하임)
|
|
GlobalFunc::SetCaption( m_ctlEnchantCost, _T( "0" ) );
|
|
m_ctlEnchantCost->SetTextColor( m_DefaultTextColor );
|
|
|
|
// 재료 목록 스크롤 범위/위치
|
|
m_ctlMatListScroll->SetScrollRangeWZ( 0, 0 );
|
|
m_ctlMatListScroll->SetScrollPosWZ( 0 );
|
|
|
|
// 재료 이름/수
|
|
for( int i = 0; i < MAX_VISIBLE_MATERIAL_COUNT; ++i )
|
|
{
|
|
GlobalFunc::SetCaption( m_ctlMatName[i], _T( "" ) );
|
|
GlobalFunc::SetCaption( m_ctlMatNum[i], _T( "" ) );
|
|
}
|
|
|
|
GlobalFunc::SetCaption( m_ctlOptionMatName, _T( "" ) );
|
|
|
|
|
|
// 확률(25%, 50%, 75%, 100%)
|
|
for( i = 0; i < ENCHANT_TAB_MAX; ++i )
|
|
{
|
|
m_ctlProbability[i]->SetCheckState( ( i == m_probabilityIdx ) );
|
|
}
|
|
|
|
m_ctlTargetTitle->SetTextColor( m_TitleDefaultColor );
|
|
m_ctlExtraMatTitle->SetTextColor( m_TitleDefaultColor );
|
|
m_ctlExtraMatName->SetTextColor( m_DefaultTextColor );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::EnableDialog( BOOL enable )
|
|
{
|
|
for( POSTYPE pos = ENCHANT_BTN_SLOT_TARGET; pos <= ENCHANT_CHK_100_PER; ++pos )
|
|
{
|
|
if( CControlWZ* ctl = getControl( pos ) )
|
|
{
|
|
ctl->EnableWindowWZ( enable == TRUE );
|
|
}
|
|
}
|
|
}
|
|
|
|
void EnchantDialog::SetTargetItem( int inventory_slot_index )
|
|
{
|
|
if( SCItemSlot* item = ItemManager::Instance()->GetInventoryItem( inventory_slot_index ) )
|
|
{
|
|
TargetItemRock(false);
|
|
m_targetPos = inventory_slot_index;
|
|
TargetItemRock(true);
|
|
|
|
m_SlotContainer[0].SetSlotItem(0, *item, getControl(ENCHANT_BTN_SLOT_TARGET));
|
|
m_SlotContainer[0].GetSlotItem(0)->SetLock(false);
|
|
}
|
|
else
|
|
{
|
|
m_targetPos = INVALID_SLOT_POS;
|
|
m_SlotContainer[0].RemoveSlot(0);
|
|
}
|
|
|
|
OnChangedEnchantItem();
|
|
}
|
|
|
|
void EnchantDialog::SetExtraItem( int inventory_slot_index )
|
|
{
|
|
if( SCItemSlot* item = ItemManager::Instance()->GetInventoryItem( inventory_slot_index ) )
|
|
{
|
|
ExtraItemRock(false);
|
|
m_extraItemPos = inventory_slot_index;
|
|
ExtraItemRock(true);
|
|
|
|
SCItemSlot copy_item = *item;
|
|
copy_item.SetNum(1);
|
|
copy_item.SetLock(false);
|
|
|
|
m_SlotContainer[2].SetSlotItem( 0, copy_item, getControl( ENCHANT_BTN_SLOT_5 ) );
|
|
}
|
|
else
|
|
{
|
|
ExtraItemRock(false);
|
|
m_extraItemPos = INVALID_SLOT_POS;
|
|
m_SlotContainer[2].RemoveSlot(0);
|
|
}
|
|
|
|
OnChangedExtraItem();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::UpdateMouseOverObj( void )
|
|
{
|
|
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX;
|
|
|
|
int mx = Mouse::Instance()->GetMouseX();
|
|
int my = Mouse::Instance()->GetMouseY();
|
|
|
|
for( POSTYPE pos = ENCHANT_BTN_SLOT_TARGET; pos <= ENCHANT_BTN_SLOT_5; ++pos )
|
|
{
|
|
if( CControlWZ * ctl = getControl( pos ) )
|
|
{
|
|
|
|
RECT rc = ctl->GetSizeRect();
|
|
|
|
if( rc.left <= mx && rc.right >= mx && rc.top <= my && rc.bottom >= my)
|
|
{
|
|
int slotPos = ( pos - ENCHANT_BTN_SLOT_TARGET );
|
|
|
|
if( pos == ENCHANT_BTN_SLOT_TARGET )
|
|
{
|
|
if( SCItemSlot* item = m_SlotContainer[0].GetSlotItem(0) )
|
|
{
|
|
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_SLOT;
|
|
m_MouseOverObject.pSlot = item;
|
|
}
|
|
}
|
|
else if( pos == ENCHANT_BTN_SLOT_5 )
|
|
{
|
|
if( SCItemSlot* item = m_SlotContainer[2].GetSlotItem(0) )
|
|
{
|
|
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_SLOT;
|
|
m_MouseOverObject.pSlot = item;
|
|
}
|
|
}
|
|
else if( pos < ENCHANT_BTN_SLOT_5 && pos >= ENCHANT_BTN_SLOT_2 )
|
|
{
|
|
if( SCItemSlot* item = m_SlotContainer[1].GetSlotItem(pos - ENCHANT_BTN_SLOT_2 ) )
|
|
{
|
|
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_SLOT;
|
|
m_MouseOverObject.pSlot = item;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::UpdateTooltip( void )
|
|
{
|
|
uiToolTipMan* uiMan = (uiToolTipMan*)g_InterfaceManager.GetUserInterfaceManager( UIMAN_TOOLTIP );
|
|
if (m_MouseOverObject.eMouseOverType == eMOUSE_OVER_SLOT)
|
|
{
|
|
if (uiMan)
|
|
{
|
|
assert( m_MouseOverObject.pSlot );
|
|
uiMan->RegisterTooltipItem( m_MouseOverObject.pSlot, FALSE, kLimitStatCompositeEnchant );
|
|
uiMan->SetTooltipDialogID(GetDialogKey());
|
|
}
|
|
|
|
CursorChangeTransact::Instance()->ChangeTranaction( MouseCursor::eMouseCursor_Cursor_Cancle );
|
|
}
|
|
#if defined(_GLOBAL) || defined(_RUSSIA)
|
|
else if (m_ctlExtraMatTitle && uiMan)
|
|
{
|
|
RECT static_text_rect = m_ctlExtraMatTitle->GetSizeRect();
|
|
int mouse_x = Mouse::Instance()->GetMouseX();
|
|
int mouse_y = Mouse::Instance()->GetMouseY();
|
|
if (mouse_x > static_text_rect.left && mouse_x < static_text_rect.right
|
|
&& mouse_y > static_text_rect.top && mouse_y < static_text_rect.bottom)
|
|
{
|
|
TCHAR string_buffer[INTERFACE_STRING_LENGTH] = {0,};
|
|
m_ctlExtraMatTitle->GetTextWZ(string_buffer, INTERFACE_STRING_LENGTH);
|
|
uiMan->RegisterTooltip(string_buffer);
|
|
uiMan->SetTooltipDialogID( GetDialogKey() );
|
|
}
|
|
}
|
|
#endif//_GLOBAL
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::RefreshDefEnchantInfo( void )
|
|
{
|
|
assert( IsValidEnchant() );
|
|
assert( m_enchantLevel >= ENCHANT_LOW && m_enchantLevel <= ENCHANT_HIGHEST );
|
|
|
|
TCHAR buf[256];
|
|
|
|
if( SCItemSlot* item = m_SlotContainer[0].GetSlotItem(0) )
|
|
{
|
|
// 아이템 이름
|
|
g_InterfaceManager.GetItemName( item->GetCode(), buf, sizeof( buf ) );
|
|
GlobalFunc::SetCaption( m_ctlItemName, buf );
|
|
|
|
// 인챈트 종류(상/중/하)
|
|
const int strId[4] = { eST_LOW_ENCHANT_TEXT, eST_MID_ENCHANT_TEXT, eST_HIGH_ENCHANT_TEXT, eST_HIGHEST_ENCHANT_TEXT };
|
|
int idx = m_enchantLevel - ENCHANT_LOW;
|
|
|
|
g_InterfaceManager.GetInterfaceString( strId[idx], buf, sizeof( buf ) );
|
|
GlobalFunc::SetCaption( m_ctlEnchantLvl, buf );
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::RefreshEnchantMatInfo( void )
|
|
{
|
|
assert( IsValidEnchant() );
|
|
|
|
// 스크롤 범위/위치 (3는 슬롯수)
|
|
int size = m_matList.size() - MAX_VISIBLE_MATERIAL_COUNT;
|
|
int rangeMax = max( 0, size );
|
|
|
|
m_ctlMatListScroll->SetScrollRangeWZ( 0, rangeMax );
|
|
m_ctlMatListScroll->SetScrollPosWZ( 0 );
|
|
|
|
// 재료 목록 갱신
|
|
RefreshEnchantMatList();
|
|
|
|
// 인챈트 비용 표시
|
|
TCHAR buf[256], buf2[256];
|
|
Sprintf( buf, _T("%I64u"), m_enchantCost );
|
|
|
|
NUMBERFMT nFmt = { 0, 0, 3, _T("."), _T(","), 1 };
|
|
::GetNumberFormat( LOCALE_SYSTEM_DEFAULT, NULL, buf, &nFmt, buf2, sizeof( buf2 ) );
|
|
|
|
GlobalFunc::SetCaption( m_ctlEnchantCost, buf2 );
|
|
|
|
if( HaveEnchantCost() )
|
|
{
|
|
m_ctlEnchantCost->SetTextColor( m_DefaultTextColor );
|
|
}
|
|
else
|
|
{
|
|
m_ctlEnchantCost->SetTextColor( m_InvalidTextColor );
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::RefreshEnchantMatList( void )
|
|
{
|
|
// 재료 목록 제거
|
|
m_SlotContainer[1].RemoveSlot(0);
|
|
m_SlotContainer[1].RemoveSlot(1);
|
|
m_SlotContainer[1].RemoveSlot(2);
|
|
|
|
// 재료 이름/수 리셋
|
|
for( int i = 0; i < MAX_VISIBLE_MATERIAL_COUNT; ++i )
|
|
{
|
|
GlobalFunc::SetCaption( m_ctlMatName[i], _T( "" ) );
|
|
GlobalFunc::SetCaption( m_ctlMatNum[i], _T( "" ) );
|
|
}
|
|
|
|
|
|
|
|
// 스크롤 위치
|
|
assert( m_ctlMatListScroll );
|
|
int scrollPos = m_ctlMatListScroll->GetScrollPosWZ();
|
|
|
|
// 재료 목록 수
|
|
int listSize = m_matList.size();
|
|
|
|
// 재료 슬롯 수만큼 반복
|
|
for( int i = 0; i < MAX_VISIBLE_MATERIAL_COUNT; ++i )
|
|
{
|
|
int idx = scrollPos + i;
|
|
if( idx >= listSize )
|
|
{
|
|
break;
|
|
}
|
|
|
|
// 재료
|
|
const sMATERIALS& mats = m_matList[idx];
|
|
|
|
// 아이템 코드/수
|
|
SLOTCODE itemCode = mats.m_MaterialItemCode;
|
|
int itemNum = mats.m_MaterialItemNum;
|
|
|
|
assert( itemCode != 0 );
|
|
|
|
|
|
// 임시 슬롯을 만들고
|
|
SCItemSlot tempSlot;
|
|
tempSlot.SetCode( (SLOTCODE)itemCode );
|
|
tempSlot.SetNum( itemNum );
|
|
|
|
// 재료 슬롯에 추가(복사)
|
|
m_SlotContainer[1].SetSlotItem( i, tempSlot, getControl(ENCHANT_BTN_SLOT_2+i) );
|
|
|
|
// 재료 이름
|
|
TCHAR buf[256];
|
|
g_InterfaceManager.GetItemName( itemCode, buf, sizeof( buf ) );
|
|
GlobalFunc::SetCaption( m_ctlMatName[i], buf );
|
|
|
|
// 재료 수
|
|
Sprintf( buf, _T( "%d" ), itemNum );
|
|
GlobalFunc::SetCaption( m_ctlMatNum[i], buf );
|
|
|
|
|
|
// 필요 아이템이 인벤에 있는지 검사
|
|
if( ItemManager::Instance()->IsExistItem( SI_INVENTORY, itemCode, itemNum ) )
|
|
{
|
|
m_SlotContainer[1].SetSlotRenderState_Active( i );
|
|
m_ctlMatName[i]->SetTextColor( m_DefaultTextColor );
|
|
m_ctlMatNum[i]->SetTextColor( m_DefaultTextColor );
|
|
}
|
|
else
|
|
{
|
|
m_SlotContainer[1].SetSlotRenderState_DeActive( i );
|
|
m_ctlMatName[i]->SetTextColor( m_InvalidTextColor );
|
|
m_ctlMatNum[i]->SetTextColor( m_InvalidTextColor );
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
BOOL EnchantDialog::HaveEnchantMaterials( void )
|
|
{
|
|
MaterialList::iterator it = m_matList.begin();
|
|
for( ; it != m_matList.end(); ++it )
|
|
{
|
|
if( !ItemManager::Instance()->IsExistItem( SI_INVENTORY, it->m_MaterialItemCode, it->m_MaterialItemNum ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
BOOL EnchantDialog::HaveEnchantCost( void )
|
|
{
|
|
return ( g_pHero->GetMoney() >= m_enchantCost );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::RemoveEnchantMatsFromInven( void )
|
|
{
|
|
// 하임 소비
|
|
MONEY money = g_pHero->GetMoney() - m_enchantCost;
|
|
assert( money >= 0 );
|
|
|
|
g_pHero->SetMoney( money );
|
|
|
|
// 재료 소비
|
|
MaterialList::iterator it = m_matList.begin();
|
|
for( ; it != m_matList.end(); ++it )
|
|
{
|
|
BOOL ret = ItemManager::Instance()->SpendItem(
|
|
SI_INVENTORY, it->m_MaterialItemCode, it->m_MaterialItemNum );
|
|
|
|
assert( ret );
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::ActivateProbabilityTab( int index )
|
|
{
|
|
assert( index >= 0 && index < ENCHANT_TAB_MAX );
|
|
|
|
for( int i = 0; i < ENCHANT_TAB_MAX; ++i )
|
|
{
|
|
m_ctlProbability[i]->SetCheckState( ( i == index ) );
|
|
}
|
|
|
|
m_probabilityIdx = index;
|
|
|
|
if( IsValidEnchant() )
|
|
{
|
|
// 인챈트 재료 재설정
|
|
ResetEnchantMatList();
|
|
|
|
// 인챈트 비용 재계산
|
|
RecalcEnchantCost();
|
|
|
|
// 인챈트 재료 정보 갱신
|
|
RefreshEnchantMatInfo();
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
int EnchantDialog::GetValidProbabilityIdx( int defIdx )
|
|
{
|
|
assert( defIdx >= 0 && defIdx < 4 );
|
|
|
|
if( SCItemSlot* item = GetTargetItem() )
|
|
{
|
|
if( const BASE_ITEMINFO* itemInfo = item->GetItemInfo() )
|
|
{
|
|
|
|
// 아이템 타입별 처리
|
|
switch( (eITEMSUBTYPE)itemInfo->m_wSubType )
|
|
{
|
|
case eITEMSUBTYPE_ELITE_SSQ:
|
|
case eITEMSUBTYPE_ELITE: // 엘리트 아이템이면 무조건 50%
|
|
return 1;
|
|
|
|
case eITEMSUBTYPE_UNIQUE: // 유니크 아이템이면 무조건 25%
|
|
return 0;
|
|
}
|
|
|
|
// 인챈트 차수별 처리
|
|
int newEnchant = item->GetEnchant() +1;
|
|
assert( newEnchant <= MAX_ENCHANT_GRADE );
|
|
|
|
// 6인챈까지는 무조건 100%
|
|
if( newEnchant <= 6 )
|
|
{
|
|
return 3;
|
|
}
|
|
|
|
// 캐시 인챈이 아닌 경우
|
|
if( !IsCashEnchant() )
|
|
{
|
|
int maxIdx = 3;
|
|
|
|
if( newEnchant >= 7 && newEnchant < 10 )
|
|
{
|
|
// 7 ~ 9는 최대 75%
|
|
maxIdx = 2;
|
|
}
|
|
else if( newEnchant >= 10 )
|
|
{
|
|
// 10인챈 이상은 최대 50%
|
|
maxIdx = 1;
|
|
}
|
|
|
|
// 디폴트 값이 최대값보다 큰 경우
|
|
if( defIdx > maxIdx )
|
|
{
|
|
// 기존 값과 최대값 중 작은 값으로 선택
|
|
return max( 0, min( maxIdx, m_probabilityIdx ) );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return defIdx;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
eENCHANT_OPTION EnchantDialog::ProbabilityIdxToOpt( int idx )
|
|
{
|
|
assert( idx >= 0 && idx < 4 );
|
|
|
|
switch( idx )
|
|
{
|
|
case 0: return eENCHANT_25PER;
|
|
case 1: return eENCHANT_50PER;
|
|
case 2: return eENCHANT_75PER;
|
|
case 3: return eENCHANT_100PER;
|
|
default: return eENCHANT_NOT_OPT;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::ResetEnchantLevel( void )
|
|
{
|
|
if( SCItemSlot* item = GetTargetItem() )
|
|
{
|
|
int newEnchant = item->GetEnchant() + 1;
|
|
assert( newEnchant <= MAX_ENCHANT_GRADE );
|
|
|
|
switch( newEnchant )
|
|
{
|
|
case 7: case 8: case 9:
|
|
m_enchantLevel = ENCHANT_MIDDLE;
|
|
break;
|
|
|
|
case 10: case 11: case 12:
|
|
m_enchantLevel = ENCHANT_HIGH;
|
|
break;
|
|
|
|
case 13: case 14: case 15:
|
|
m_enchantLevel = ENCHANT_HIGHEST;
|
|
break;
|
|
|
|
default:
|
|
m_enchantLevel = ENCHANT_LOW;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void EnchantDialog::ResetEnchantMatsForLv( void )
|
|
{
|
|
if( SCItemSlot* item = GetTargetItem() )
|
|
{
|
|
// 아이템 정보를 얻고
|
|
if( const BASE_ITEMINFO* itemInfo = item->GetItemInfo() )
|
|
{
|
|
// 인챈트 재료 정보를 얻고
|
|
m_matsForLv = EnchantParser::Instance()->GetEnchantMatInfo(
|
|
itemInfo->m_LV, item->GetEnchant(), itemInfo->IsWeapon(), item->IsLimited(), m_enchantOpt);
|
|
|
|
WzAssert( m_matsForLv );
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void EnchantDialog::ResetEnchantMatList( void )
|
|
{
|
|
assert( IsValidEnchant() );
|
|
assert( m_matsForLv );
|
|
|
|
// 재료 리스트 초기화
|
|
m_matList.clear();
|
|
|
|
// 재료 할인 비율
|
|
eENCHANT_OPTION opt = ProbabilityIdxToOpt( m_probabilityIdx );
|
|
|
|
//safecode
|
|
if(!m_matsForLv) return;
|
|
|
|
const sFARE_RATIO* ratio = m_matsForLv->GetFareRatio( opt );
|
|
assert( ratio );
|
|
|
|
// 최대 재료 수만큼 반복
|
|
for( int i = 0; i < MATERIALS_FOR_LEVEL::kMaxMaterialNumber; ++i )
|
|
{
|
|
// 재료
|
|
const sMATERIALS* mats = m_matsForLv->GetMaterials( i );
|
|
if( mats )
|
|
{
|
|
WORD matNum = (WORD)( mats->m_MaterialItemNum * ratio->m_MaterialFare );
|
|
|
|
// 재료 리스트에 추가
|
|
sMATERIALS mat;
|
|
mat.m_MaterialItemCode = mats->m_MaterialItemCode;
|
|
mat.m_MaterialItemNum = max( 1, matNum );
|
|
|
|
m_matList.push_back( mat );
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
void EnchantDialog::ResetEnchantExtraMaterialSlot()
|
|
{
|
|
if( SCItemSlot* item = GetTargetItem() )
|
|
{
|
|
if( const MATERIALS_FOR_LEVEL* const enchant_material_info = GetCurrentEnchantInfo() )
|
|
{
|
|
if( enchant_material_info->GetDownGradeType() == 0 )
|
|
{
|
|
m_SlotContainer[2].RemoveSlot(0);
|
|
GlobalFunc::SetCaption( m_ctlExtraMatTitle, g_InterfaceManager.GetInterfaceString(2197));
|
|
GlobalFunc::SetCaption( m_ctlTargetTitle, g_InterfaceManager.GetInterfaceString(2194));
|
|
|
|
m_ctlTargetTitle->SetTextColor( m_TitleDefaultColor );
|
|
m_ctlExtraMatTitle->SetTextColor( m_TitleDefaultColor );
|
|
m_ctlExtraMatName->SetTextColor( m_DefaultTextColor );
|
|
}
|
|
else if( enchant_material_info->GetDownGradeType() == 1 )
|
|
{
|
|
GlobalFunc::SetCaption( m_ctlExtraMatTitle, g_InterfaceManager.GetInterfaceString(2198));
|
|
|
|
SCItemSlot tempSlot;
|
|
tempSlot.SetCode( (SLOTCODE)63191 );
|
|
tempSlot.SetNum( 1 );
|
|
m_SlotContainer[2].SetSlotItem(0, tempSlot, getControl(ENCHANT_BTN_SLOT_5) );
|
|
m_SlotContainer[2].SetSlotRenderState_DeActive(0);
|
|
|
|
GlobalFunc::SetCaption( m_ctlExtraMatName, g_InterfaceManager.GetItemName(63191) );
|
|
GlobalFunc::SetCaption( m_ctlTargetTitle, g_InterfaceManager.GetInterfaceString(2127));
|
|
|
|
m_ctlTargetTitle->SetTextColor( m_TitleTextColor1 );
|
|
m_ctlExtraMatTitle->SetTextColor( m_TitleTextColor1 );
|
|
m_ctlExtraMatName->SetTextColor( m_InvalidTextColor );
|
|
}
|
|
else if( enchant_material_info->GetDownGradeType() == 2 )
|
|
{
|
|
GlobalFunc::SetCaption( m_ctlExtraMatTitle, g_InterfaceManager.GetInterfaceString(2199));
|
|
|
|
SCItemSlot tempSlot;
|
|
tempSlot.SetCode( (SLOTCODE)63192 );
|
|
tempSlot.SetNum( 1 );
|
|
m_SlotContainer[2].SetSlotItem(0, tempSlot, getControl(ENCHANT_BTN_SLOT_5) );
|
|
m_SlotContainer[2].SetSlotRenderState_DeActive(0);
|
|
|
|
GlobalFunc::SetCaption( m_ctlExtraMatName, g_InterfaceManager.GetItemName(63192) );
|
|
GlobalFunc::SetCaption( m_ctlTargetTitle, g_InterfaceManager.GetInterfaceString(2128));
|
|
|
|
m_ctlTargetTitle->SetTextColor( m_TitleTextColor2 );
|
|
m_ctlExtraMatTitle->SetTextColor( m_TitleTextColor2 );
|
|
m_ctlExtraMatName->SetTextColor( m_InvalidTextColor );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_SlotContainer[2].RemoveSlot(0);
|
|
GlobalFunc::SetCaption( m_ctlExtraMatTitle, g_InterfaceManager.GetInterfaceString(2197));
|
|
GlobalFunc::SetCaption( m_ctlExtraMatName, "" );
|
|
|
|
m_ctlTargetTitle->SetTextColor( m_TitleDefaultColor );
|
|
m_ctlExtraMatTitle->SetTextColor( m_TitleDefaultColor );
|
|
m_ctlExtraMatName->SetTextColor( m_DefaultTextColor );
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void EnchantDialog::RecalcEnchantCost( void )
|
|
{
|
|
if( m_matsForLv == NULL )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( SCItemSlot* item = GetTargetItem() )
|
|
{
|
|
if( const BASE_ITEMINFO* item_info = item->GetItemInfo() )
|
|
{
|
|
eENCHANT_OPTION opt = ProbabilityIdxToOpt( m_probabilityIdx );
|
|
if( const sFARE_RATIO* ratio = m_matsForLv->GetFareRatio( opt ) )
|
|
{
|
|
// 하임 계산
|
|
{
|
|
// *비율 변환 방법만 암시적에서 명시적으로 변경
|
|
const double temp_haim_fare = ratio->m_HaimFare * 100.f;
|
|
|
|
const int new_haim_fare = util::LL_Round(temp_haim_fare);
|
|
|
|
#ifdef _NA_006589_20120415_ENCHANT_PRICE_MODIFY
|
|
// 하임 계산
|
|
LEVELTYPE touch_item_level = item_info->m_LV;
|
|
if (touch_item_level > 22) {
|
|
touch_item_level = 23;
|
|
}
|
|
else if (touch_item_level > 12) {
|
|
touch_item_level = 13;
|
|
}
|
|
else {
|
|
touch_item_level = 3;
|
|
}
|
|
int64_t calc_fare = item->GetPriceForUpGradeFare() * touch_item_level * new_haim_fare;
|
|
#else
|
|
int64_t calc_fare = item->GetPriceForUpGradeFare() * item_info->m_LV * new_haim_fare;
|
|
#endif //_NA_006589_20120415_ENCHANT_PRICE_MODIFY
|
|
m_enchantCost = calc_fare / 100;
|
|
|
|
// 반올림
|
|
calc_fare = calc_fare % 100;
|
|
if( calc_fare >= 50 )
|
|
m_enchantCost = m_enchantCost + 1;
|
|
|
|
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
|
|
if (g_pHero->GetPlayerAttribute()->GetAttrValue(eATTR_ENCHANT_COST_RATIO) != 0)
|
|
{
|
|
int ratio = g_pHero->GetPlayerAttribute()->GetAttrValue(eATTR_ENCHANT_COST_RATIO);
|
|
MONEY ratio_result_value = m_enchantCost * abs(ratio) / 100;
|
|
ratio > 0 ? m_enchantCost += ratio_result_value : m_enchantCost -= ratio_result_value;
|
|
}
|
|
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
|
|
}
|
|
|
|
#ifdef _NA_20100307_BETAKEY_SYSTEM
|
|
if( uiLoginMan* login_manager = static_cast<uiLoginMan*>(g_InterfaceManager.GetUserInterfaceManager(UIMAN_LOGIN)) )
|
|
{
|
|
if (m_matsForLv->GetBetaKeyInfo())
|
|
{
|
|
m_enchantCost = BetaKeyImpl::GetEnchantMoney(login_manager->GetBetaKeyInfo(), m_matsForLv->GetBetaKeyInfo(), m_enchantCost);
|
|
}
|
|
}
|
|
#endif//_NA_20100307_BETAKEY_SYSTEM
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnLButtonClick( SI_MESSAGE* pMsg )
|
|
{
|
|
POSTYPE pos = getCtrlIDToPos( pMsg->dwCtrlID );
|
|
|
|
if( pos == ENCHANT_BTN_SLOT_TARGET || pos == ENCHANT_BTN_SLOT_5 )
|
|
{
|
|
OnEnchantItemSlotClick();
|
|
}
|
|
else if( pos >= ENCHANT_BTN_EXIT && pos <= ENCHANT_BTN_CANCEL )
|
|
{
|
|
OnBtnClick( pos );
|
|
}
|
|
else if( pos >= ENCHANT_CHK_25_PER && pos <= ENCHANT_CHK_100_PER )
|
|
{
|
|
OnProbabilityTabClick( pos );
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnRButtonClick( SI_MESSAGE* pMsg )
|
|
{
|
|
if (enchant_popup_dialog_key_ != 0)
|
|
{
|
|
// 팝업창이 열려있으면 아이템을 내리지 않음
|
|
return;
|
|
}
|
|
|
|
POSTYPE pos = getCtrlIDToPos( pMsg->dwCtrlID );
|
|
|
|
if( pos == ENCHANT_BTN_SLOT_TARGET )
|
|
{
|
|
ReTry();
|
|
}
|
|
else if( pos == ENCHANT_BTN_SLOT_5 )
|
|
{
|
|
SetExtraItem( INVALID_SLOT_POS );
|
|
}
|
|
}
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnEnchantItemSlotClick( void )
|
|
{
|
|
if( MouseHandler::Instance()->IsExistItemAtHand() )
|
|
{
|
|
MouseHandler::MouseItem* mouse_item = MouseHandler::Instance()->GetMouseItem();
|
|
|
|
OnEnchantItem_InventoryRightClick( mouse_item->m_fromSlotIdx, mouse_item->m_fromPos );
|
|
|
|
MouseHandler::Instance()->RollbackItemAtHand();
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void EnchantDialog::OnChangedEnchantItem(void)
|
|
{
|
|
if (IsValidEnchant() == FALSE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
// 인챈트 레벨 재설정
|
|
ResetEnchantLevel();
|
|
|
|
// 인챈트 재료 재설정
|
|
ResetEnchantMatsForLv();
|
|
|
|
// 기본 정보 갱신
|
|
RefreshDefEnchantInfo();
|
|
|
|
// 확률탭 활성
|
|
#ifdef RESERVE_PREV_PROBABILITY_IDX
|
|
// nothing to do
|
|
#else
|
|
m_probabilityIdx = 3;
|
|
#endif
|
|
|
|
ActivateProbabilityTab( GetValidProbabilityIdx(m_probabilityIdx) );
|
|
|
|
ResetEnchantExtraMaterialSlot();
|
|
}
|
|
|
|
void EnchantDialog::OnChangedExtraItem(void)
|
|
{
|
|
if( SCItemSlot* item = GetExteraItem() )
|
|
{
|
|
// 아이템 이름
|
|
TCHAR buf[256];
|
|
g_InterfaceManager.GetItemName( item->GetCode(), buf, sizeof( buf ) );
|
|
GlobalFunc::SetCaption( m_ctlExtraMatName, buf );
|
|
|
|
// 아이템 이름의 색상을 기본 색상으로
|
|
m_ctlExtraMatName->SetTextColor( m_DefaultTextColor );
|
|
}
|
|
else
|
|
{
|
|
// 아이템 이름의 색상을 기본 색상으로
|
|
m_ctlExtraMatName->SetTextColor( m_InvalidTextColor );
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void EnchantDialog::OnEnchantItem_InventoryRightClick(const SLOTIDX from_container_index,
|
|
const POSTYPE from_container_position)
|
|
{
|
|
if (enchant_popup_dialog_key_ != 0)
|
|
{
|
|
// 팝업창이 열려있으면 아이템을 올리지 않음
|
|
return;
|
|
}
|
|
|
|
if( MouseHandler::Instance()->ItemCompositeNewEnchant_InventoryRightClick(
|
|
from_container_index, SI_ENCHANT, from_container_position, 0) )
|
|
{
|
|
SetTargetItem( from_container_position );
|
|
}
|
|
else if( MouseHandler::Instance()->ItemCompositeNewEnchant_InventoryRightClick(from_container_index,
|
|
SI_ENCHANT_OPTION, from_container_position, 0 ) )
|
|
{
|
|
SetExtraItem( from_container_position );
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnProbabilityTabClick( POSTYPE pos )
|
|
{
|
|
assert( pos >= ENCHANT_CHK_25_PER && pos <= ENCHANT_CHK_100_PER );
|
|
|
|
int idx = ( pos - ENCHANT_CHK_25_PER );
|
|
|
|
if( IsValidEnchant() )
|
|
{
|
|
idx = GetValidProbabilityIdx( idx );
|
|
}
|
|
|
|
ActivateProbabilityTab( idx );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnBtnClick( POSTYPE pos )
|
|
{
|
|
switch( pos )
|
|
{
|
|
case ENCHANT_BTN_ENCHANT:
|
|
Enchant();
|
|
break;
|
|
|
|
case ENCHANT_BTN_RETRY:
|
|
ReTry();
|
|
break;
|
|
|
|
case ENCHANT_BTN_EXIT:
|
|
case ENCHANT_BTN_CANCEL:
|
|
Exit();
|
|
break;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnEnchantSuccessAck( MSG_BASE* pMsg )
|
|
{
|
|
assert( pMsg );
|
|
|
|
MSG_CG_ITEM_ENCHANT_SUCCESS_ACK* pRecvMsg = (MSG_CG_ITEM_ENCHANT_SUCCESS_ACK*)pMsg;
|
|
|
|
BIT_REMOVE( m_packetStatus, PACKET_STATUS_ENCHANT );
|
|
|
|
// 인벤에서 인챈트 재료 제거
|
|
RemoveEnchantMatsFromInven();
|
|
|
|
// 인챈트 창 아이템
|
|
if( SCItemSlot* target_item = GetTargetItem() )
|
|
{
|
|
target_item->SetEnchant( target_item->GetEnchant() + 1 );
|
|
}
|
|
|
|
// 실제 주 아이템
|
|
if( SCSlotContainer* oriContainer = ItemManager::Instance()->GetContainer( SI_INVENTORY ) )
|
|
{
|
|
SCItemSlot& oriSlot = (SCItemSlot&)oriContainer->GetSlot( m_pendingTargetPos );
|
|
|
|
if( const BASE_ITEMINFO* itemInfo = oriSlot.GetItemInfo() )
|
|
{
|
|
// 메시지 출력
|
|
TCHAR itemName[128];
|
|
TCHAR szMessage[MAX_MESSAGE_LENGTH];
|
|
|
|
GameFunc::GetItemName(&oriSlot, itemInfo, itemName, 128);
|
|
|
|
// [%s] 아이템의 인첸트가 성공 하였습니다.
|
|
g_InterfaceManager.GetInterfaceString( eST_SUCCESS_ITEM_ENCHANT, szMessage, sizeof( szMessage ) );
|
|
|
|
GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_CHAT, szMessage, itemName );
|
|
|
|
// 화면 위/중앙 표시
|
|
GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_TOP_SHOW, szMessage, itemName );
|
|
}
|
|
}
|
|
|
|
// 사운드 출력
|
|
g_SoundEffect.PlayUI( UI_SOUND_COMPOSE_ENCHANT_SUCCESS );
|
|
|
|
// 대화상자 활성/초기화
|
|
EnableDialog( TRUE );
|
|
|
|
InitDialog();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnEnchantFailedAck( MSG_BASE* pMsg )
|
|
{
|
|
assert( pMsg );
|
|
|
|
MSG_CG_ITEM_ENCHANT_FAILED_ACK* pRecvMsg = (MSG_CG_ITEM_ENCHANT_FAILED_ACK*)pMsg;
|
|
|
|
BIT_REMOVE( m_packetStatus, PACKET_STATUS_ENCHANT );
|
|
|
|
// 인벤에서 인챈트 재료 제거
|
|
RemoveEnchantMatsFromInven();
|
|
|
|
TCHAR szMessage[MAX_MESSAGE_LENGTH];
|
|
|
|
// 결과 코드별 처리
|
|
if( pRecvMsg->m_byErrorCode == RC_ITEM_ENCHANT_FAILED_AND_ENCHNAT_DOWN )
|
|
{
|
|
// 인챈트 실패 다운 레벨
|
|
int enchant_fail_down_level = 1;
|
|
if (m_matsForLv)
|
|
{
|
|
enchant_fail_down_level = m_matsForLv->GetDownLV();
|
|
}
|
|
|
|
// 인챈트 창 아이템
|
|
if( SCItemSlot* target_item = GetTargetItem() )
|
|
{
|
|
target_item->SetEnchant( target_item->GetEnchant() - enchant_fail_down_level );
|
|
}
|
|
|
|
// 실제 주 아이템
|
|
if( SCSlotContainer* oriContainer = ItemManager::Instance()->GetContainer( SI_INVENTORY ) )
|
|
{
|
|
SCItemSlot& oriSlot = (SCItemSlot&)oriContainer->GetSlot( m_pendingTargetPos );
|
|
//oriSlot.SetEnchant( oriSlot.GetEnchant() - enchant_fail_down_level );
|
|
|
|
if( const BASE_ITEMINFO* itemInfo = oriSlot.GetItemInfo() )
|
|
{
|
|
// 메시지 출력
|
|
TCHAR szItemName[128], szItemName2[128], buf1[64], buf2[64];
|
|
TCHAR szTempMessage[MAX_MESSAGE_LENGTH] = {0,};
|
|
|
|
g_InterfaceManager.GetInterfaceString( itemInfo->m_NCode, buf1, sizeof( buf1 ) );
|
|
g_InterfaceManager.GetInterfaceString( itemInfo->m_SCNCode, buf2, sizeof( buf2 ) );
|
|
|
|
Sprintf( szItemName, "%s %s %+d", buf1, buf2, oriSlot.GetEnchant() + enchant_fail_down_level );
|
|
Sprintf( szItemName2, "%s %s %+d", buf1, buf2, oriSlot.GetEnchant());
|
|
|
|
// 5318 인챈트에 실패하여, %s가 %s로 다운되었습니다.
|
|
g_InterfaceManager.GetInterfaceString( 5318, szTempMessage );
|
|
Sprintf( szMessage, szTempMessage, szItemName, szItemName2 );
|
|
}
|
|
}
|
|
}
|
|
else if (pRecvMsg->m_byErrorCode == RC_ITEM_ENCHANT_FAILED_AND_DESTROY)
|
|
{
|
|
if( SCSlotContainer* oriContainer = ItemManager::Instance()->GetContainer(SI_INVENTORY) )
|
|
{
|
|
SCItemSlot& oriSlot = (SCItemSlot&)oriContainer->GetSlot(m_pendingTargetPos);
|
|
|
|
TCHAR szTemp1[64] = {0,};
|
|
TCHAR szTemp2[64] = {0,};
|
|
TCHAR szItemName[256] = {0,};
|
|
g_InterfaceManager.GetInterfaceString(oriSlot.GetItemInfo()->m_NCode, szTemp1, 63);
|
|
g_InterfaceManager.GetInterfaceString(oriSlot.GetItemInfo()->m_SCNCode, szTemp2, 63);
|
|
Snprintf(szItemName, 255, "%s %s +%d", szTemp1, szTemp2, oriSlot.GetEnchant());
|
|
|
|
oriContainer->DeleteSlot(m_pendingTargetPos, NULL);
|
|
|
|
// 5319 인챈트에 실패 하여, %s가 소멸 되었습니다.
|
|
TCHAR szTempMessage[MAX_MESSAGE_LENGTH] = { '\0', };
|
|
g_InterfaceManager.GetInterfaceString(5319, szTempMessage);
|
|
Snprintf(szMessage, INTERFACE_STRING_LENGTH - 1, szTempMessage, szItemName);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 인첸트에 실패 하였습니다.
|
|
g_InterfaceManager.GetInterfaceString(eST_FAILED_ITEM_ENCHANT, szMessage);
|
|
}
|
|
|
|
// 메시지 출력
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage);
|
|
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
|
|
if (pRecvMsg->m_byErrorCode == RC_ITEM_ENCHANT_FAILED_AND_PREVENT)
|
|
{
|
|
TCHAR guild_facility_message[INTERFACE_STRING_LENGTH] = {0, };
|
|
// 7100 : 길드시설 효과가 발동되어 인챈트 다운(소멸)이 발생되지 않았습니다.
|
|
g_InterfaceManager.GetInterfaceString(7100, guild_facility_message, INTERFACE_STRING_LENGTH);
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, guild_facility_message);
|
|
}
|
|
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
|
|
|
|
// 화면 위/중앙 표시
|
|
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_TOP_SHOW, szMessage);
|
|
|
|
// 사운드 출력
|
|
g_SoundEffect.PlayUI(UI_SOUND_COMPOSE_ENCHANT_FAIL);
|
|
|
|
// 대화상자 활성/초기화
|
|
EnableDialog(TRUE);
|
|
|
|
InitDialog();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::OnItemEnchantNak( MSG_BASE* pMsg )
|
|
{
|
|
assert( pMsg );
|
|
|
|
MSG_CG_ITEM_ENCHANT_NAK* pRecvMsg = (MSG_CG_ITEM_ENCHANT_NAK*)pMsg;
|
|
|
|
BIT_REMOVE( m_packetStatus, PACKET_STATUS_ENCHANT );
|
|
|
|
ItemManager::Instance()->NoticeReasonItemErrorCode( pRecvMsg->m_byErrorCode );
|
|
|
|
EnableDialog( TRUE );
|
|
|
|
InitDialog();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::TargetItemRock(bool is_rock)
|
|
{
|
|
if (m_targetPos == INVALID_SLOT_POS)
|
|
{
|
|
return;
|
|
}
|
|
|
|
SCItemSlot* item_slot = ItemManager::Instance()->GetInventoryItem(m_targetPos);
|
|
if (item_slot != NULL)
|
|
{
|
|
item_slot->SetLock(is_rock);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
void EnchantDialog::ExtraItemRock(bool is_rock)
|
|
{
|
|
if (m_extraItemPos == INVALID_SLOT_POS)
|
|
{
|
|
return;
|
|
}
|
|
|
|
SCItemSlot* item_slot = ItemManager::Instance()->GetInventoryItem(m_extraItemPos);
|
|
if (item_slot != NULL)
|
|
{
|
|
item_slot->SetLock(is_rock);
|
|
m_SlotContainer[2].SetSlotRenderState_Active(0);
|
|
}
|
|
}
|
|
|
|
void EnchantDialog::Callback_SendPacketItemEnchantSyn(uiSystemMessage::ButtonIndex button_index)
|
|
{
|
|
EnchantDialog* enchant_dialog =
|
|
static_cast<EnchantDialog*>(g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_ENCHANT));
|
|
|
|
if (enchant_dialog)
|
|
{
|
|
enchant_dialog->SendPacketItemEnchantSyn(button_index == uiSystemMessage::kConfirm_Button);
|
|
}
|
|
}
|
|
|
|
void EnchantDialog::SendPacketItemEnchantSyn(bool is_send_packet)
|
|
{
|
|
// 팝업 창은 정상 닫힘
|
|
enchant_popup_dialog_key_ = 0;
|
|
|
|
if (is_send_packet == false)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// 아래는 인챈트 체크 내용 재확인 및 패킷 전송
|
|
|
|
// 유효한 인챈트인가?
|
|
if( !IsValidEnchant() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// 필요한 재료는 있나?
|
|
if( !HaveEnchantMaterials() )
|
|
{
|
|
TCHAR buf[INTERFACE_STRING_LENGTH];
|
|
g_InterfaceManager.GetInterfaceString( eST_ITEM_NOT_EXIST_COMPOSITE_MATERIALS, buf, sizeof( buf ) );
|
|
|
|
GlobalFunc::OutputMsg_Error( eOUTPUT_MSG_CHAT, buf );
|
|
return;
|
|
}
|
|
|
|
// 돈은 충분히 있는가?
|
|
if( !HaveEnchantCost() )
|
|
{
|
|
TCHAR buf[INTERFACE_STRING_LENGTH];
|
|
g_InterfaceManager.GetInterfaceString( eST_NOT_ENOUGH_MONEY, buf, sizeof( buf ) );
|
|
|
|
GlobalFunc::OutputMsg_Error( eOUTPUT_MSG_CHAT, buf );
|
|
return;
|
|
}
|
|
|
|
// 아직 패킷을 날리지 않았으면
|
|
if (!BIT_CHECK(m_packetStatus, PACKET_STATUS_ENCHANT))
|
|
{
|
|
BYTE rateIdx = (BYTE)( m_enchantOpt | ProbabilityIdxToOpt( m_probabilityIdx ) );
|
|
|
|
MSG_CG_ITEM_ENCHANT_SYN packet;
|
|
packet.Init();
|
|
packet.m_SuccessRateIndex = rateIdx;
|
|
packet.m_TargetPos = m_targetPos;
|
|
packet.m_NPCCode = g_HeroInput.GetClickedNpcCode();
|
|
packet.down_guard_item_pos = m_extraItemPos;
|
|
|
|
BOOL ret = GlobalFunc::SendPacket( CI_GAMESERVERIDX, &packet, sizeof( packet ) );
|
|
|
|
if( ret )
|
|
{
|
|
BIT_ADD( m_packetStatus, PACKET_STATUS_ENCHANT );
|
|
|
|
m_pendingTargetPos = m_targetPos;
|
|
|
|
EnableDialog( FALSE );
|
|
}
|
|
}
|
|
}
|
|
#endif // _NA_003966_20111227_ADD_ENCHANT
|