#include "SunClientPrecompiledHeader.h" #include "ItemETCCompositeDlg.h" #include #include "InterfaceManager.h" #include "ItemUnitRenderer.h" #include "MouseHandler.h" #include "ItemManager.h" #include "ItemInfoParser.h" #include "Mouse.h" #include "dummyitemSlot.h" #include "ObjectManager.h" #include "ChatDialog.h" #include "ItemCompositeParser.h" #include "SlotKeyGenerator.h" #include "hero.h" #include "globalfunc.h" #include "uiToolTipMan/uiToolTipMan.h" #define ACTIVE_COLOR RGBA(0,255,0,255) #define DEACTIVE_COLOR RGBA(255,0,0,255) WzID ItemETCCompositeDlg::m_wzId[] = { StrToWzID("B000"), // eITEMENCHANT_BT_SLOT_1 = 0, StrToWzID("B001"), // eITEMENCHANT_BT_SLOT_2, StrToWzID("B002"), // eITEMENCHANT_BT_SLOT_3, StrToWzID("B003"), // eITEMENCHANT_BT_SLOT_4, StrToWzID("B004"), // eITEMENCHANT_BT_SLOT_5, StrToWzID("B005"), // eITEMENCHANT_BT_SLOT_6, StrToWzID("TI01"), // eITEMENCHANT_TI_ENCHANT, StrToWzID("TI02"), // eITEMENCHANT_TI_RETRY, StrToWzID("TI03"), // eITEMENCHANT_TI_EXIT, StrToWzID("T009"), // eITEMENCHANT_VALUE_MONEY StrToWzID("T002"), // eITEMENCHANT_VALUE_KINDOFENCHANT, StrToWzID("T005"), // eITEMENCHANT_VALUE_SUB_1_MATERIAL, StrToWzID("T006"), // eITEMENCHANT_VALUE_SUB_2_MATERIAL, StrToWzID("T007"), // eITEMENCHANT_VALUE_SUB_3_MATERIAL, StrToWzID("T008"), // eITEMENCHANT_VALUE_SUB_4_MATERIAL, StrToWzID("T010"), // eITEMENCHANT_VALUE_SUB_5_MATERIAL, StrToWzID("B999"), // ITEMENCHANT_BUTTON_EXIT }; //------------------------------------------------------------------------------ /** */ ItemETCCompositeDlg::ItemETCCompositeDlg(void) : m_pItemUnitRenderer(0) , m_DialogKey(0) { SCItemSlotContainer::Init(eITEMENCHANT_MAX_SLOT, SI_ITEM_ETC_COMPOSE ); } //------------------------------------------------------------------------------ /** */ ItemETCCompositeDlg::~ItemETCCompositeDlg(void) { } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::Init( CDrawBase * pDrawBase ) { m_eCurCompositeType = eITEMCOMPOSITE_NONE; RECT rcDlg; GetDialogWZ()->GetDlgSize(&rcDlg); int iDeltaX = (rcDlg.right) / 2; int iDeltaY = (rcDlg.bottom) / 2; int x, y; x = g_InterfaceManager.GetWindowRC()->right / 2 - iDeltaX; y = g_InterfaceManager.GetWindowRC()->bottom / 2 - iDeltaY; MoveWindowWZ(x, y); InitContainer(); // control ¹ÞÀ½ m_CtrlKindOfCompositeStatic = (CCtrlStaticWZ *)getControl(eITEMENCHANT_VALUE_KINDOFENCHANT); assert(m_CtrlKindOfCompositeStatic); int i = 0; for (; i < eITEMENCHANT_MAX_SUB_SLOT; ++i) { m_CtrlSubMaterialStatic[i] = (CCtrlStaticWZ *)getControl(eITEMENCHANT_VALUE_SUB_1_MATERIAL+i); assert(m_CtrlSubMaterialStatic[i]); } m_CtrlMoneyStatic = (CCtrlStaticWZ *)getControl(eITEMENCHANT_VALUE_MONEY); assert(m_CtrlMoneyStatic); } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::Release() { ReleaseContainer(); } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::OnShowWindow(BOOL val) { if (val) { initEnchantInfo(); initEnchantInfoText(); showEnchantTitleText(); fillEnchantExtraInfo(); ItemManager::Instance()->AutoRegisterCompositeMaterials( m_eCurCompositeType ); activateMaterials(FALSE); g_InterfaceManager.ShowWindow(InterfaceManager::DIALOG_SELECT_COMPOSITE_MENU, FALSE); g_InterfaceManager.ShowWindow(InterfaceManager::DIALOG_EQUIP, TRUE); keyMsg msg; ZeroMemory(&msg,sizeof(msg)); msg.dwType=eDoType_dialog_enchant; msg.wParam=InterfaceManager::DIALOG_ENCHANT; msg.DoSomething=GlobalFunc::DoShowWindow; g_KeyQueueManager.PushBack(msg); } else { FlushUnitDraw(); g_KeyQueueManager.DeleteMsg(eDoType_dialog_enchant); this->m_packetStatus = PACKET_STATUS_NONE; } } //------------------------------------------------------------------------------ /** */ void ItemETCCompositeDlg::initEnchantInfo() { m_bValidEnchant = FALSE; this->m_FromTargetPos = 0; this->m_FromTargetSlotIdx = SI_MAX; } //------------------------------------------------------------------------------ /** */ void ItemETCCompositeDlg::initEnchantInfoText() { int i = 0; for (; i< 4; ++i) { if (m_CtrlSubMaterialStatic[i]) m_CtrlSubMaterialStatic[i]->SetTextWZ(_T("")); } if (m_CtrlMoneyStatic) m_CtrlMoneyStatic->SetTextWZ(_T("0")); } //------------------------------------------------------------------------------ /** */ void ItemETCCompositeDlg::showEnchantTitleText() { int iCodeTitleString = 0; TCHAR szTemp[512]; TCHAR szTemp2[512]; switch (this->m_eCurCompositeType) { case eITEMCOMPOSITE_LOW_ENCHANT: case eITEMCOMPOSITE_MEDIUM_ENCHANT: case eITEMCOMPOSITE_NONE: { assert(0); } break; case eITEMCOMPOSITE_HIGH_ENCHANT: { iCodeTitleString = 862; g_InterfaceManager.GetInterfaceString(iCodeTitleString, m_szBuf, 512); } break; case eITEMCOMPOSITE_RANK_DOWN: { iCodeTitleString = 864; g_InterfaceManager.GetInterfaceString(iCodeTitleString, m_szBuf, 512); } break; case eITEMCOMPOSITE_ADD_SOCKET: { iCodeTitleString = 865; g_InterfaceManager.GetInterfaceString(iCodeTitleString, m_szBuf, 512); } break; case eITEMCOMPOSITE_EXTRACT_SOCKET: { iCodeTitleString = 866; g_InterfaceManager.GetInterfaceString(iCodeTitleString, m_szBuf, 512); } break; case eITEMCOMPOSITE_LOW_RING: { g_InterfaceManager.GetInterfaceString(eST_RANKMENU_INFO_LOW, szTemp, 512); g_InterfaceManager.GetInterfaceString(eST_RANKMENU_INFO_RING, szTemp2, 512); Sprintf(m_szBuf, _T("%s %s"), szTemp, szTemp2); } break; case eITEMCOMPOSITE_HIGH_RING: { g_InterfaceManager.GetInterfaceString(eST_RANKMENU_INFO_HIGH, szTemp, 512); g_InterfaceManager.GetInterfaceString(eST_RANKMENU_INFO_RING, szTemp2, 512); Sprintf(m_szBuf, _T("%s %s"), szTemp, szTemp2); } break; case eITEMCOMPOSITE_LOW_NECKLACE: { g_InterfaceManager.GetInterfaceString(eST_RANKMENU_INFO_LOW, szTemp, 512); g_InterfaceManager.GetInterfaceString(eST_RANKMENU_INFO_NECKLACE, szTemp2, 512); Sprintf(m_szBuf, _T("%s %s"), szTemp, szTemp2); } break; case eITEMCOMPOSITE_HIGH_NECKLACE: { // ¾Ç¼¼¼­¸® »ý¼º g_InterfaceManager.GetInterfaceString(eST_RANKMENU_INFO_HIGH, szTemp, 512); g_InterfaceManager.GetInterfaceString(eST_RANKMENU_INFO_NECKLACE, szTemp2, 512); Sprintf(m_szBuf, _T("%s %s"), szTemp, szTemp2); } break; } if (m_CtrlKindOfCompositeStatic) { GlobalFunc::SetCaption( m_CtrlKindOfCompositeStatic, m_szBuf ); } } //------------------------------------------------------------------------------ /** */ void ItemETCCompositeDlg::fillEnchantExtraInfo() { // TODO: À̰÷¿¡ º¸¿©Áà¾ßÇÒ Á¤º¸¸¦ ä¿ö¶ó. // ÁÖ Àç·á Á¤º¸ int iMainMaterialStringIndex = 0; int iMainMaterialStringIndex2 = 0; switch (this->m_eCurCompositeType) { case eITEMCOMPOSITE_LOW_ENCHANT: case eITEMCOMPOSITE_MEDIUM_ENCHANT: case eITEMCOMPOSITE_HIGH_ENCHANT: { iMainMaterialStringIndex = 749; // ¹«±â/ ¹æ¾î±¸ } break; case eITEMCOMPOSITE_RANK_DOWN: { iMainMaterialStringIndex = 749; // ¹«±â/ ¹æ¾î±¸ iMainMaterialStringIndex2 = 750; // ¾Ç¼¼¼­¸® } break; case eITEMCOMPOSITE_EXTRACT_SOCKET: { // ¿É¼ÇÁ¦°Å iMainMaterialStringIndex = 749; // ¹«±â / ¹æ¾î±¸ iMainMaterialStringIndex2 = 750; // ¾Ç¼¼¼­¸® } break; case eITEMCOMPOSITE_ADD_SOCKET: { iMainMaterialStringIndex = 749; } break; case eITEMCOMPOSITE_LOW_RING: case eITEMCOMPOSITE_LOW_NECKLACE: { iMainMaterialStringIndex = 40001; // ÇϱÞÀðµå } break; case eITEMCOMPOSITE_HIGH_RING: case eITEMCOMPOSITE_HIGH_NECKLACE: { iMainMaterialStringIndex = 40002; // »ó±ÞÀðµå } break; default: break; } if (iMainMaterialStringIndex) { g_InterfaceManager.GetInterfaceString( iMainMaterialStringIndex, m_szBuf, 512); Sprintf(m_szResult, _T("%s"), m_szBuf); } if (iMainMaterialStringIndex2) { g_InterfaceManager.GetInterfaceString( iMainMaterialStringIndex, m_szBuf2, 512); Sprintf(m_szResult, _T("%s | %s"), m_szBuf, m_szBuf2); } sITEMCOMPOSITE * pInfo = ItemCompositeParser::Instance()->GetCompositeInfo(this->m_eCurCompositeType); CODETYPE code = 0; if (pInfo) { for (int i = 0; i < pInfo->m_byMatCount; ++i) { if (m_CtrlSubMaterialStatic[i]) { code = pInfo->m_sCompositeMaterials[i].m_dwCompositeMaterialCode; BASE_ITEMINFO * pBaseItemInfo = (BASE_ITEMINFO *)ItemInfoParser::Instance()->GetItemInfo(code); if (pBaseItemInfo) { g_InterfaceManager.GetItemName(code, this->m_szBuf, 512); GlobalFunc::SetCaption( m_CtrlSubMaterialStatic[i], this->m_szBuf ); } } } } SetRequiredMoney(pInfo->m_Money); } //------------------------------------------------------------------------------------------- /** */ void ItemETCCompositeDlg::updateMaterial() { sITEMCOMPOSITE * pInfo = ItemCompositeParser::Instance()->GetCompositeInfo(this->GetCurrentCompositeType()); if ( !pInfo ) { return; } for ( int i = 0; i < pInfo->m_byMatCount; ++i ) { BOOL bRet = ItemManager::Instance()->IsExistItem( SI_INVENTORY, pInfo->m_sCompositeMaterials[i].m_dwCompositeMaterialCode, pInfo->m_sCompositeMaterials[i].m_bySpendMaterialNum); eSLOT_RENDER_STATE eState = (bRet)? SLOT_RENDER_STATE_ACTIVATED : SLOT_RENDER_STATE_WARNING; DWORD dwColor = (bRet)? ACTIVE_COLOR : DEACTIVE_COLOR; POSTYPE SubMatPos = i+1; if ( !IsEmpty(SubMatPos) ) { SCItemSlot & rItemSlot = (SCItemSlot &)GetSlot(SubMatPos); if(!m_pItemUnitRenderer) continue; ItemUnitRenderer::RenderUnit * pRedner = this->m_pItemUnitRenderer->GetItemUnit( rItemSlot.GetSerial() ); if (pRedner) { pRedner->SetState( eState ); } if ( m_CtrlSubMaterialStatic[i] ) { this->m_CtrlSubMaterialStatic[i]->SetTextColor(dwColor); } } } if (g_pHero) { DWORD dwColor = ( g_pHero->GetMoney() >= this->m_RequireMoney )? ACTIVE_COLOR : DEACTIVE_COLOR; this->m_CtrlMoneyStatic->SetTextColor(dwColor); } } //------------------------------------------------------------------------------ /** */ void ItemETCCompositeDlg::activateMaterials(BOOL bActivate) { } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::Enchant() { switch (this->m_eCurCompositeType) { case eITEMCOMPOSITE_RANK_DOWN: { } break; case eITEMCOMPOSITE_ADD_SOCKET: { } break; case eITEMCOMPOSITE_EXTRACT_SOCKET: { if (PACKET_STATUS_NONE != this->m_packetStatus ) { return; } BIT_ADD(this->m_packetStatus, PACKET_STATUS_EXTRACT); MSG_CG_ITEM_SOCKET_EXTRACT_SYN SendPacket; SendPacket.m_TargetPos = m_FromTargetPos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket)); } break; } } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::ReTry() { if ( this->m_packetStatus != PACKET_STATUS_NONE ) { return; } initEnchantInfo(); FlushUnitDraw(); ItemManager::Instance()->AutoRegisterCompositeMaterials( m_eCurCompositeType ); } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::Exit() { if ( this->m_packetStatus != PACKET_STATUS_NONE ) { return; } initEnchantInfo(); initEnchantInfoText(); g_InterfaceManager.ShowWindow(InterfaceManager::DIALOG_ITEM_ETC_COMPOSE, FALSE); } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::SetRequiredMoney(MONEY Money) { if (m_CtrlMoneyStatic) { TCHAR szMoney[0xff]; _ui64tot(Money, szMoney, 10); GlobalFunc::SetCaption( m_CtrlMoneyStatic, szMoney ); m_RequireMoney = Money; } } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::SetTargetInfo(SLOTIDX fromSlotIdx, POSTYPE fromPos) { m_FromTargetSlotIdx = SI_INVENTORY; m_FromTargetPos = fromPos; } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::MessageProc( SI_MESSAGE * pMessage ) { switch( pMessage->eResultMsg ) { case RT_MSG_LBUTTONCLICK: { POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID ); CControlWZ * pControl = getControl(pos); if (!pControl) { return; } if ( eITEMENCHANT_MAIN_MATERIAL <= pos && eITEMENCHANT_MAX_SLOT > pos) { if (eITEMENCHANT_MAIN_MATERIAL != pos ) { if (MouseHandler::Instance()->IsExistItemAtHand()) { MouseHandler::Instance()->RollbackItemAtHand(); return; } return; } RECT rcSlot = pControl->GetSizeRect(); BOOL bRet = MouseHandler::Instance()->ItemCompositeEnchants(SI_ITEM_ETC_COMPOSE, pos, &rcSlot); MouseHandler::Instance()->RollbackItemAtHand(); if (bRet) { m_bValidEnchant = TRUE; activateMaterials(TRUE); } else { m_bValidEnchant = FALSE; } } else { switch (pos) { case eITEMENCHANT_TI_ENCHANT: Enchant(); break; case eITEMENCHANT_TI_RETRY: ReTry(); break; case eITEMENCHANT_TI_EXIT: Exit(); break; case eITEMENCHANT_BT_EXIT: Exit(); break; default: break; } } } break; default: { SolarDialog::MessageProc( pMessage ); } break; } } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::OnUpdateSolarDialog() { if( m_pItemUnitRenderer ) { m_pItemUnitRenderer->Update(); this->updateMaterial(); } } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::OnRenderSolarDialog() { if (m_pItemUnitRenderer) m_pItemUnitRenderer->Render(); int iMouseX = Mouse::Instance()->GetMouseX(); int iMouseY = Mouse::Instance()->GetMouseY(); for (POSTYPE a = 0; a < eITEMENCHANT_MAX_SLOT; a++) { CControlWZ *pControl = getControl(a); RECT rc = pControl->GetSizeRect(); if (rc.left <= iMouseX && rc.right >= iMouseX) { if (rc.top <= iMouseY && rc.bottom >= iMouseY) { POSTYPE slotpos = a; SCSlot & rSlot = (SCSlot &)GetSlot( slotpos ); if (rSlot.GetCode() != 0) { uiToolTipMan* pUIMan = (uiToolTipMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_TOOLTIP); if(pUIMan) { pUIMan->RegisterSlotInfoTooltip(&rSlot); pUIMan->SetTooltipDialogID(GetDialogKey()); } } } } } } //------------------------------------------------------------------------------ /** */ CControlWZ * ItemETCCompositeDlg::getControl( POSTYPE AtPos ) { if( AtPos < Dialog_Max ) { return GetControlWZ( m_wzId[AtPos] ); } else { return NULL; } } //------------------------------------------------------------------------------ /** */ POSTYPE ItemETCCompositeDlg::getCtrlIDToPos( WzID wzId ) { for( POSTYPE i = 0 ; i < Dialog_Max; ++i ) { if( m_wzId[i] == wzId ) { return i; } } return Dialog_Max; } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::InitContainer() { InitRenderer(); } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::ReleaseContainer() { FlushUnitDraw(); SAFE_RELEASENDELETE( m_pItemUnitRenderer ); } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::InitRenderer() { assert( !m_pItemUnitRenderer ); m_pItemUnitRenderer = new ItemUnitRenderer; m_pItemUnitRenderer->Init( g_pSunRenderer, SCSlotContainer::GetMaxSlotNum() ); } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::FlushUnitDraw() { if (!m_pItemUnitRenderer) { return; } for (int i = 0; i < GetMaxSlotNum(); ++i) { DeleteSlot(i, NULL); } } //------------------------------------------------------------------------------ /** */ RC::eSLOT_INSERT_RESULT ItemETCCompositeDlg::InsertSlot( POSTYPE AtPos, SCSlot & rSlot ) { /// ½½·Ô¿¡ ³ÖÀ½ RC::eSLOT_INSERT_RESULT eInsertSlotResult = SCSlotContainer::InsertSlot( AtPos, rSlot ); DBSERIAL dwSerial = g_SlotKeyGenerator.GetKey(); SCSlot & rSetSlot = GetSlot(AtPos); rSetSlot.SetSerial(dwSerial); //// ¶ôÅ· ¿Â. if ( eITEMENCHANT_MAIN_MATERIAL == AtPos ) { SCItemSlot & rFromItemSlot = (SCItemSlot &)rSlot; rFromItemSlot.SetLock( TRUE ); m_LockingInfoMap.insert( LOCKING_INFO_PAIR(AtPos, rSlot.GetPos() ) ); } /// Àκ¥Å丮 CControlWZ * pCtrl = getControl( AtPos ); RECT rect = pCtrl->GetSizeRect(); if(m_pItemUnitRenderer) { m_pItemUnitRenderer->AddItemUnit( rSetSlot.GetSerial(), rSetSlot.GetCode(), &rect, &rSetSlot ,pCtrl); } else { assert(m_pItemUnitRenderer); } return eInsertSlotResult; } //------------------------------------------------------------------------------ /** */ BOOL ItemETCCompositeDlg::DeleteSlot( POSTYPE AtPos, SCSlot * pSlotOut ) { SCSlot & rSlot = GetSlot(AtPos); if(m_pItemUnitRenderer) { m_pItemUnitRenderer->RemoveItemUnit( rSlot.GetSerial() ); } else { assert(m_pItemUnitRenderer); } LOCKING_INFO_ITR itr = m_LockingInfoMap.find( AtPos ); if ( itr != m_LockingInfoMap.end() ) { POSTYPE FromPos = itr->second; // ÇöÀç´Â ¹«Á¶°Ç Àκ¥Å丮¿¡¼­ ¿Ã¼ö ÀÖ´Ù. SCSlotContainer * pFromContainer = ItemManager::Instance()->GetContainer( SI_INVENTORY ); if ( pFromContainer ) { if ( FromPos < pFromContainer->GetMaxSlotNum() && FromPos >= 0) { SCItemSlot & rItemSlot = (SCItemSlot & )pFromContainer->GetSlot(FromPos); rItemSlot.SetLock(FALSE); } else { assert( !"À߸øµÈ ¾ÆÀÌÅÛ À§Ä¡ ÀÌ´Ù.!!!"); } } m_LockingInfoMap.erase(itr); } return SCSlotContainer::DeleteSlot(AtPos, pSlotOut); } //------------------------------------------------------------------------------ /** */ ItemUnitRenderer * ItemETCCompositeDlg::GetItemUnitRender() const { return m_pItemUnitRenderer; } //------------------------------------------------------------------------------ /** */ VOID ItemETCCompositeDlg::SetCurrentCompositeType(eITEMCOMPOSITECODE eCompositeType) { this->m_eCurCompositeType = eCompositeType; } eITEMCOMPOSITECODE ItemETCCompositeDlg::GetCurrentCompositeType(void) { return this->m_eCurCompositeType; }