// CharSkillPage.cpp : ±¸Çö ÆÄÀÏÀÔ´Ï´Ù. // #include "stdafx.h" #include "AdminToolClient.h" #include "CharSkillPage.h" #include "CharSkillEditDlg.h" #include "PacketManager.h" #include "GlobalFunctions.h" #include "ListCtrlSortClass.h" #include #include #include #include // CCharSkillPage ´ëÈ­ »óÀÚÀÔ´Ï´Ù. IMPLEMENT_DYNAMIC(CCharSkillPage, CPropertyPage) CCharSkillPage::CCharSkillPage() : CPropertyPage(CCharSkillPage::IDD) , m_dwSkillMaxNum(0) , m_dwSkillUseNum(0) , m_dwDocKey(0) , m_ContextType(CONTEXT_MENU_TYPE::NONE) , m_EditMode(SKILL_EDIT_MODE::MODE_EMPTY) , m_bSortListAsc(false) { } CCharSkillPage::~CCharSkillPage() { } void CCharSkillPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); DDX_Control(pDX, IDC_CHARSKILLLIST, m_ctrlCharSkillList); DDX_Control(pDX, IDC_SKILL_LIST, m_ctrlWantSkillList); DDX_Text(pDX, IDC_SKILL_MAXNUM, m_dwSkillMaxNum); DDX_Text(pDX, IDC_SKILL_USENUM, m_dwSkillUseNum); } BEGIN_MESSAGE_MAP(CCharSkillPage, CPropertyPage) ON_WM_CONTEXTMENU() ON_COMMAND(ID_SKILL_INSERT, OnSkillAddCM) ON_COMMAND(ID_CHARSKILLEDITCM, OnSkillEditCM) ON_COMMAND(ID_CHARSKILLDELCM, OnSkillDelCM) ON_NOTIFY(NM_DBLCLK, IDC_CHARSKILLLIST, OnNMDblclkCharskilllist) ON_LBN_DBLCLK(IDC_SKILL_LIST, OnLbnDblclkSkillList) ON_BN_CLICKED(IDC_SKILLPAGE_CLIPSKILL_BTN, OnBnClickedSkillpageClipskillBtn) ON_NOTIFY(LVN_COLUMNCLICK, IDC_CHARSKILLLIST, OnLvnColumnclickCharskilllist) END_MESSAGE_MAP() // CCharSkillPage ¸Þ½ÃÁö 󸮱âÀÔ´Ï´Ù. BOOL CCharSkillPage::OnInitDialog() { CPropertyPage::OnInitDialog(); m_ctrlCharSkillList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB); m_ctrlCharSkillList.InsertColumn(0, GetLocalString("SLOT_NUM"), LVCFMT_LEFT, 40); m_ctrlCharSkillList.InsertColumn(1, GetLocalString("SKILL_ID"), LVCFMT_LEFT, 75); m_ctrlCharSkillList.InsertColumn(2, GetLocalString("SKILL_NAME"), LVCFMT_LEFT, 140); m_ctrlCharSkillList.InsertColumn(3, GetLocalString("SKILL_TYPE"), LVCFMT_LEFT, 80); m_ctrlCharSkillList.InsertColumn(4, _T("LV"), LVCFMT_LEFT, 65); SetUIString(this->m_hWnd, IDC_SKILLPAGE_01, "IDC_SKILLPAGE_01"); SetUIString(this->m_hWnd, IDC_SKILLPAGE_02, "IDC_SKILLPAGE_02"); SetUIString(this->m_hWnd, IDC_SKILLPAGE_03, "IDC_SKILLPAGE_03"); SetUIString(this->m_hWnd, IDC_SKILLPAGE_04, "IDC_SKILLPAGE_04"); SetUIString(this->m_hWnd, IDC_SKILLPAGE_CLIPSKILL_BTN, "IDC_SKILLPAGE_CLIPSKILL_BTN"); return TRUE; } bool CCharSkillPage::SetSkillPageData(unsigned int dwDocKey, CModifyCharacter* lpModifyCharacter) { if((0 != dwDocKey) && (NULL != lpModifyCharacter)) { m_lpSkillPageInfo = lpModifyCharacter; m_dwDocKey = dwDocKey; lpModifyCharacter->SetClientKey(dwDocKey); return true; } return false; } void CCharSkillPage::SetSkillPage(CModifyCharacter* lpModifyCharacter) { m_ctrlCharSkillList.DeleteAllItems(); m_ctrlWantSkillList.ResetContent(); if(NULL == lpModifyCharacter) { return; } SetSkill(lpModifyCharacter->GetSkill()); SetAcquirableSkillList(); m_dwSkillMaxNum = lpModifyCharacter->GetMaxSkillPoint(); m_dwSkillUseNum = lpModifyCharacter->GetSkillPoint(); UpdateData(false); } void CCharSkillPage::SetSkill(SKILL& Skill) { for(int nSlotIndex = 0; nSlotIndex < Skill.wSlotNum; ++nSlotIndex) { SKILLSLOT& Slot = Skill.SSlot[nSlotIndex]; const Skill::ProtoType* lpPrototype = CSkillMgr::GetInstance().GetSkillProtoType(Slot.SKILLINFO.wSkill); if(NULL != lpPrototype) // ¹ö±×·Î ÀÎÇØ ºó ½½·ÔÀÌ ÀÖÀ» ¼ö ÀÖÀ½; { unsigned char cSkillLockCount = Slot.SKILLINFO.cLockCount; const Skill::ProtoType ProtoType = lpPrototype[cSkillLockCount]; CString strForFormat; int nRow = m_ctrlCharSkillList.GetItemCount(); strForFormat.Format(_T("%d"), nSlotIndex); // ½½·Ô ¹øÈ£ m_ctrlCharSkillList.InsertItem(nRow, strForFormat); strForFormat.Format(_T("0x%x %d"), ProtoType.m_usSkill_ID, cSkillLockCount); // ½ºÅ³ ID, ¶ô Ä«¿îÆ® m_ctrlCharSkillList.SetItemText(nRow, 1, strForFormat); m_ctrlCharSkillList.SetItemText(nRow, 2, CONV_CLISTR(ProtoType.m_SpriteInfo.m_szName)); // ½ºÅ³ ¸í m_ctrlCharSkillList.SetItemText(nRow, 3, GetSkillTypeString(ProtoType.m_eSkillType)); // ½ºÅ³ ŸÀÔ strForFormat.Format(_T("%d"), ((int) Slot.SKILLINFO.cSkillLevel)); // ½ºÅ³ ·¹º§ m_ctrlCharSkillList.SetItemText(nRow, 4, strForFormat); } else { /* ERRLOG3(g_Log, "½ºÅ³ÀÇ ÇÁ·ÎÅäŸÀÔÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. CID: %u, ½ºÅ³ID: 0x%x, ½½·Ô: %d", m_lpSkillPageInfo->GetCID(), Slot.SKILLINFO.wSkill, nSlotIndex); */ } } } void CCharSkillPage::OnContextMenu(CWnd* pWnd, CPoint point) { m_ContextType = CONTEXT_MENU_TYPE::NONE; if((pWnd->GetSafeHwnd() == m_ctrlCharSkillList.GetSafeHwnd()) && (1 == m_ctrlCharSkillList.GetSelectedCount())) { m_ContextType = IN_SKILL_LIST; } else if((pWnd->GetSafeHwnd() == m_ctrlWantSkillList.GetSafeHwnd()) && (LB_ERR != m_ctrlWantSkillList.GetCurSel())) { m_ContextType = IN_WANTSKILL_LIST; } if(NONE != m_ContextType) { CMenu muTemp, *pContextMenu; muTemp.LoadMenu(IDR_CONTEXTMENU); pContextMenu = muTemp.GetSubMenu(3); pContextMenu->ModifyMenu(0, MF_STRING | MF_BYPOSITION, ID_CHARSKILLEDITCM, GetLocalString("MENU_020")); pContextMenu->ModifyMenu(1, MF_STRING | MF_BYPOSITION, ID_CHARSKILLDELCM, GetLocalString("MENU_021")); pContextMenu->ModifyMenu(2, MF_STRING | MF_BYPOSITION, ID_SKILL_INSERT, GetLocalString("MENU_022")); if(IN_SKILL_LIST == m_ContextType) { pContextMenu->DeleteMenu(ID_SKILL_INSERT, MF_POPUP | MF_BYCOMMAND); } else if(IN_WANTSKILL_LIST == m_ContextType) { pContextMenu->DeleteMenu(ID_CHARSKILLDELCM, MF_POPUP | MF_BYCOMMAND); pContextMenu->DeleteMenu(ID_CHARSKILLEDITCM, MF_POPUP | MF_BYCOMMAND); } pContextMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this); } } bool CCharSkillPage::SetManageSkillInfo() { ZeroMemory(&m_ManageSkill, sizeof(SKILLSLOT)); TCHAR szSkillID[32]; TCHAR cSkillLockCount = 0; int nSelIndex = -1; TCHAR szGetString[256]; if(IN_WANTSKILL_LIST == m_ContextType) // ½ºÅ³ Ãß°¡ { nSelIndex = m_ctrlWantSkillList.GetCurSel(); if(-1 != nSelIndex) m_ctrlWantSkillList.GetText(nSelIndex, szGetString); } else if(IN_SKILL_LIST == m_ContextType) // ½ºÅ³ ¼öÁ¤ { nSelIndex = m_ctrlCharSkillList.GetNextItem(-1, LVIS_SELECTED); if(-1 != nSelIndex) m_ctrlCharSkillList.GetItemText(nSelIndex, 1, szGetString, sizeof(szGetString)); } if((NULL != szGetString) && (-1 != nSelIndex)) { _stscanf(szGetString, _T("%s %c"), szSkillID, &cSkillLockCount); m_ManageSkill.SKILLINFO.wSkill = Math::Convert::Atos(szSkillID); m_ManageSkill.SKILLINFO.cLockCount = cSkillLockCount - 48; // ASCII ÄÚµå 48 = 0 -_ -? return true; } return false; } // ½ºÅ³ Ãß°¡ void CCharSkillPage::OnSkillAddCM() { if(LB_ERR != m_ctrlWantSkillList.GetCurSel()) { if(SetManageSkillInfo()) { m_EditMode = SKILL_EDIT_MODE::MODE_CREATE; CCharSkillEditDlg Dlg(CCharSkillEditDlg::SKILL_ADD, this); Dlg.DoModal(); } } } void CCharSkillPage::OnLbnDblclkSkillList() { m_ContextType = IN_WANTSKILL_LIST; // SetManageSkillInfo¿¡¼­ ÂüÁ¶ÇÔ; OnSkillAddCM(); } // ½ºÅ³ ¼öÁ¤ void CCharSkillPage::OnSkillEditCM() { if(1 == m_ctrlCharSkillList.GetSelectedCount()) { if(SetManageSkillInfo()) { m_EditMode = SKILL_EDIT_MODE::MODE_EDIT; CCharSkillEditDlg Dlg(CCharSkillEditDlg::SKILL_EDIT, this); Dlg.DoModal(); } } } void CCharSkillPage::OnNMDblclkCharskilllist(NMHDR *pNMHDR, LRESULT *pResult) { m_ContextType = IN_SKILL_LIST; // SetManageSkillInfo¿¡¼­ ÂüÁ¶ÇÔ; OnSkillEditCM(); *pResult = 0; } // ½ºÅ³ »èÁ¦ void CCharSkillPage::OnSkillDelCM() { if(1 == m_ctrlCharSkillList.GetSelectedCount()) { if(SetManageSkillInfo()) { m_EditMode = SKILL_EDIT_MODE::MODE_DELETE; CPacketMgr::GetInstance()->SendPktSkillEdit(m_lpSkillPageInfo->GetUID(), m_lpSkillPageInfo->GetCID(), m_lpSkillPageInfo->GetServerGroup(), m_lpSkillPageInfo->GetClientKey(), m_ManageSkill.SKILLINFO.wSkill, 0, 0, m_EditMode); } } } // ¹è¿ï ¼ö ÀÖ´Â ½ºÅ³ ¸ñ·Ï Ç¥½Ã void CCharSkillPage::SetAcquirableSkillList() { m_ctrlWantSkillList.ResetContent(); const unsigned short MAX_SKILL = 255; // ¹è¿ï¼ö ÀÖ´Â ½ºÅ³¼ö (ÀÓÀÇ ¼±¾ð;) CSkillID::isListSkillPos itrPos = CSkillID::GetInstance().begin(); CSkillID::isListSkillPos itrEnd = CSkillID::GetInstance().end(); while(itrEnd != itrPos) { const Skill::ProtoType* lpPrototype = CSkillMgr::GetInstance().GetSkillProtoType(*itrPos); if(NULL != lpPrototype) { SKILLSLOT Slot; Slot.dwSkillSlot = 0; Slot.SKILLINFO.cSkillLevel = 0; Slot.SKILLINFO.wSkill = lpPrototype->m_usSkill_ID; unsigned char cSkillClass = static_cast ((((lpPrototype->m_usSkill_ID - Skill::SKILL_MASK) & 0xFF00) >> 8) & 0x00FF); // µ¿ÀÏ Á¾Á·ÀÇ ½ºÅ³ÀÎÁö ÆÇº° bool bIsLearnSkill = (CClass::GetRace(cSkillClass) == m_lpSkillPageInfo->GetRace()) && (!lpPrototype->m_bIsClassSkill); if(bIsLearnSkill) { for(int nLockCount = 0; nLockCount < CSkillMgr::MAX_SKILL_LOCKCOUNT; ++nLockCount) { const Skill::ProtoType& Prototype = lpPrototype[nLockCount]; Slot.SKILLINFO.cLockCount = nLockCount; if(Prototype.m_usSkill_ID != lpPrototype->m_usSkill_ID) { break; } if(PktBase::NO_SERVER_ERR == m_lpSkillPageInfo->ReadSkill(Slot, Slot.SKILLINFO.wSkill, nLockCount)) { CString strFormat; strFormat.Format( _T("0x%x %d [%s]"), Prototype.m_usSkill_ID, nLockCount, Prototype.m_SpriteInfo.m_szName); // ¾óÅÍ³ÊÆ¼ºê ½ºÅ³ÀÎ °æ¿ìÀÇ Ã³¸® if(0 != Prototype.m_usChildSkill) { const Skill::ProtoType* lpChildSkill = CSkillMgr::GetInstance().GetSkillProtoType(Prototype.m_usChildSkill); if(NULL != lpChildSkill) { strFormat.AppendFormat(_T("><[%s]"), lpChildSkill->m_SpriteInfo.m_szName); } } else if(0 != Prototype.m_usParentSkill) { const Skill::ProtoType* lpParentSkill = CSkillMgr::GetInstance().GetSkillProtoType(Prototype.m_usParentSkill); if(NULL != lpParentSkill) { strFormat.AppendFormat(_T("><[%s]"), lpParentSkill->m_SpriteInfo.m_szName); } } m_ctrlWantSkillList.AddString(strFormat); } } } } else { ERRLOG1(g_Log, "¹è¿ï ¼ö ÀÖ´Â ½ºÅ³ ¸ñ·ÏÀ» ±¸¼ºÇÏ´Â Áß ¾Ë¼ö¾ø´Â ½ºÅ³ ID ¹ß»ý. ½ºÅ³ID: %s", *itrPos); } ++itrPos; } } SKILLSLOT& CCharSkillPage::GetLastSkill() { return m_ManageSkill; } void CCharSkillPage::OnBnClickedSkillpageClipskillBtn() { ClippingListCtrl(m_ctrlCharSkillList, 5, true); } void CCharSkillPage::OnLvnColumnclickCharskilllist(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); if(pNMLV->iSubItem == m_iSortListItem) { m_bSortListAsc = !m_bSortListAsc; } else { m_iSortListItem = pNMLV->iSubItem; m_bSortListAsc = true; } SortListWndItem(&m_ctrlCharSkillList, m_iSortListItem); *pResult = 0; } void CCharSkillPage::SortListWndItem(CListCtrl* lpListCtrl, int iCol) { CListCtrlSortClass SortClass(lpListCtrl,iCol); switch(m_iSortListItem) { case SORT_TYPE::SLOT_NUM: SortClass.Sort(m_bSortListAsc, CListCtrlSortClass::SortDataType::dtINT); break; case SORT_TYPE::SKILL_ID: SortClass.Sort(m_bSortListAsc, CListCtrlSortClass::SortDataType::dtSTRINGNOCASE); break; case SORT_TYPE::SKILL_NAME: SortClass.Sort(m_bSortListAsc, CListCtrlSortClass::SortDataType::dtSTRING); break; case SORT_TYPE::SKILL_TYPE: SortClass.Sort(m_bSortListAsc, CListCtrlSortClass::SortDataType::dtSTRINGNOCASE); break; case SORT_TYPE::SKILL_LEVEL: SortClass.Sort(m_bSortListAsc, CListCtrlSortClass::SortDataType::dtINT); break; } }