// ItemViewerDlg.cpp : ±¸Çö ÆÄÀÏ // #include "stdafx.h" #include "ItemViewer.h" #include "ItemViewerDlg.h" #include ".\itemviewerdlg.h" #include #include #ifdef _DEBUG #define new DEBUG_NEW #endif // ÀÀ¿ë ÇÁ·Î±×·¥ Á¤º¸¿¡ »ç¿ëµÇ´Â CAboutDlg ´ëÈ­ »óÀÚÀÔ´Ï´Ù. class CAboutDlg : public CDialog { public: CAboutDlg(); // ´ëÈ­ »óÀÚ µ¥ÀÌÅÍ enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Áö¿ø // ±¸Çö protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CItemViewerDlg ´ëÈ­ »óÀÚ CItemViewerDlg::CItemViewerDlg(CWnd* pParent /*=NULL*/) : CDialog(CItemViewerDlg::IDD, pParent) , m_szItemScriptName(_T("")) , m_szSpriteFolderName(_T("")) , m_lpD3D(0), m_lpd3dDevice(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CItemViewerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_ITEMSCRIPT_PATH, m_szItemScriptName); DDX_Text(pDX, IDC_SPRITE_PATH, m_szSpriteFolderName); DDX_Control(pDX, IDC_VIEWER_LOG, m_messageDlg); } BEGIN_MESSAGE_MAP(CItemViewerDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_LOAD_ITEMSCRIPT, OnBnClickedLoadItemscript) ON_BN_CLICKED(IDC_SET_SPRITE_FOLDER, OnBnClickedSetSpriteFolder) ON_BN_CLICKED(IDC_SAVE_ALL_ITEM, OnBnClickedSaveAllItem) END_MESSAGE_MAP() // CItemViewerDlg ¸Þ½ÃÁö 󸮱â BOOL CItemViewerDlg::OnInitDialog() { CDialog::OnInitDialog(); // ½Ã½ºÅÛ ¸Þ´º¿¡ "Á¤º¸..." ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÕ´Ï´Ù. // IDM_ABOUTBOX´Â ½Ã½ºÅÛ ¸í·É ¹üÀ§¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // ÀÌ ´ëÈ­ »óÀÚÀÇ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ Ã¢ÀÌ ´ëÈ­ »óÀÚ°¡ ¾Æ´Ò °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©°¡ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. SetIcon(m_hIcon, TRUE); // Å« ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. SetIcon(m_hIcon, FALSE); // ÀÛÀº ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. // TODO: ¿©±â¿¡ Ãß°¡ ÃʱâÈ­ ÀÛ¾÷À» Ãß°¡ÇÕ´Ï´Ù. if(NULL == (m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION))) { return FALSE; } D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; if(FAILED(m_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetSafeHwnd(), D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_lpd3dDevice))) { if(m_lpD3D != 0) { m_lpD3D->Release(); m_lpD3D = 0; } return FALSE; } char szFileName[MAX_PATH]; char szDir[MAX_PATH]; char szPath[MAX_PATH]; char szName[MAX_PATH]; char szExtension[MAX_PATH]; GetModuleFileName(NULL, szFileName, MAX_PATH); _splitpath(szFileName, szDir, szPath, szName, szExtension); _snprintf(m_szRegFileName, MAX_PATH - 1, "%s%sItemViewer.ini", szDir, szPath); _snprintf(m_szCurrentFolderName, MAX_PATH - 1, "%s%s", szDir, szPath); char szItemScriptName[MAX_PATH]; char szDDSFilePath[MAX_PATH]; GetPrivateProfileString("Ryl_ItemViewer", "LastItemScriptName", "", szItemScriptName, MAX_PATH, m_szRegFileName); GetPrivateProfileString("Ryl_ItemViewer", "LastDDSFilePath", "", szDDSFilePath, MAX_PATH, m_szRegFileName); m_szItemScriptName = szItemScriptName; m_szSpriteFolderName = szDDSFilePath; int nFind = m_szItemScriptName.ReverseFind('.'); if(0 < nFind) { bool bResult = false; if(0 == strcmp(m_szItemScriptName.GetBuffer() + nFind + 1, "gsf")) { bResult = Item::CItemMgr::GetInstance().LoadItemProtoTypeBinary(m_szItemScriptName); } else if(0 == strcmp(m_szItemScriptName.GetBuffer() + nFind + 1, "txt")) { bResult = Item::CItemMgr::GetInstance().LoadItemProtoType(m_szItemScriptName); } if(!bResult) { m_szItemScriptName = ""; } else { LoadSurfaces(); } m_messageDlg.SetTopIndex( m_messageDlg.AddString(bResult ? "ItemScript load success" : "ItemScript load failed.")); } else { m_szItemScriptName.Empty(); } UpdateData(false); return TRUE; // ÄÁÆ®·Ñ¿¡ ´ëÇÑ Æ÷Ä¿½º¸¦ ¼³Á¤ÇÏÁö ¾ÊÀ» °æ¿ì TRUE¸¦ ¹ÝȯÇÕ´Ï´Ù. } void CItemViewerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // ´ëÈ­ »óÀÚ¿¡ ÃÖ¼ÒÈ­ ´ÜÃ߸¦ Ãß°¡ÇÒ °æ¿ì ¾ÆÀÌÄÜÀ» ±×¸®·Á¸é // ¾Æ·¡ Äڵ尡 ÇÊ¿äÇÕ´Ï´Ù. ¹®¼­/ºä ¸ðµ¨À» »ç¿ëÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. void CItemViewerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // ±×¸®±â¸¦ À§ÇÑ µð¹ÙÀ̽º ÄÁÅØ½ºÆ® SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // Ŭ¶óÀÌ¾ðÆ® »ç°¢Çü¿¡¼­ ¾ÆÀÌÄÜÀ» °¡¿îµ¥¿¡ ¸ÂÃä´Ï´Ù. int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // ¾ÆÀÌÄÜÀ» ±×¸³´Ï´Ù. dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // »ç¿ëÀÚ°¡ ÃÖ¼ÒÈ­µÈ âÀ» ²ô´Â µ¿¾È¿¡ Ä¿¼­°¡ Ç¥½ÃµÇµµ·Ï ½Ã½ºÅÛ¿¡¼­ // ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. HCURSOR CItemViewerDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CItemViewerDlg::OnOK() { // TODO: ¿©±â¿¡ Ư¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Ŭ·¡½º¸¦ È£ÃâÇÕ´Ï´Ù. // CDialog::OnOK(); } void CItemViewerDlg::OnBnClickedLoadItemscript() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. OPENFILENAME openFileName; memset(&openFileName, 0, sizeof(OPENFILENAME)); char szFileName[MAX_PATH]; char szFilePathName[MAX_PATH]; memset(szFileName, 0, sizeof(char) * MAX_PATH); memset(szFilePathName, 0, sizeof(char) * MAX_PATH); openFileName.lStructSize = sizeof(OPENFILENAME); openFileName.hwndOwner = GetSafeHwnd(); openFileName.lpstrFilter = "ItemScript file\0*.gsf;*.txt"; openFileName.nMaxFile = MAX_PATH; openFileName.nMaxFileTitle = MAX_PATH; openFileName.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER; openFileName.lpstrFile = szFileName; openFileName.lpstrFileTitle = szFilePathName; if(GetOpenFileName(&openFileName)) { UpdateData(true); m_szItemScriptName = szFileName; // ¾ÆÀÌÅÛ ½ºÅ©¸³Æ®¸¦ ·ÎµùÇÑ´Ù. int nFind = m_szItemScriptName.ReverseFind('.'); if(0 < nFind) { bool bResult = false; if(0 == strcmp(m_szItemScriptName.GetBuffer() + nFind + 1, "gsf")) { bResult = Item::CItemMgr::GetInstance().LoadItemProtoTypeBinary(m_szItemScriptName); } else if(0 == strcmp(m_szItemScriptName.GetBuffer() + nFind + 1, "txt")) { bResult = Item::CItemMgr::GetInstance().LoadItemProtoType(m_szItemScriptName); } if(!bResult) { m_szItemScriptName = ""; } else { LoadSurfaces(); } m_messageDlg.SetTopIndex(m_messageDlg.AddString( bResult ? "ItemScript load success" : "ItemScript load failed.")); } else { m_szItemScriptName.Empty(); } WritePrivateProfileString("Ryl_ItemViewer", "LastItemScriptName", m_szItemScriptName, m_szRegFileName); UpdateData(false); } } void CItemViewerDlg::OnBnClickedSetSpriteFolder() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. OPENFILENAME openFileName; memset(&openFileName, 0, sizeof(OPENFILENAME)); char szFileName[MAX_PATH]; char szFilePathName[MAX_PATH]; memset(szFileName, 0, sizeof(char) * MAX_PATH); memset(szFilePathName, 0, sizeof(char) * MAX_PATH); openFileName.lStructSize = sizeof(OPENFILENAME); openFileName.hwndOwner = GetSafeHwnd(); openFileName.lpstrFilter = "\0"; openFileName.nMaxFile = MAX_PATH; openFileName.nMaxFileTitle = MAX_PATH; openFileName.Flags = OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER; openFileName.lpstrFile = szFileName; openFileName.lpstrFileTitle = szFilePathName; if(GetOpenFileName(&openFileName)) { UpdateData(true); m_szSpriteFolderName = szFileName; int nFind = m_szSpriteFolderName.ReverseFind('\\'); if(0 < nFind) { m_szSpriteFolderName.GetBuffer()[nFind + 1] = 0; LoadSurfaces(); } else { m_szSpriteFolderName.Empty(); } WritePrivateProfileString("Ryl_ItemViewer", "LastDDSFilePath", m_szSpriteFolderName, m_szRegFileName); UpdateData(false); } } void CItemViewerDlg::PostNcDestroy() { // TODO: ¿©±â¿¡ Ư¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Ŭ·¡½º¸¦ È£ÃâÇÕ´Ï´Ù. ClearSurfaces(); if(m_lpd3dDevice != 0) { m_lpd3dDevice->Release(); m_lpd3dDevice = 0; } if(m_lpD3D != 0) { m_lpD3D->Release(); m_lpD3D = 0; } CDialog::PostNcDestroy(); } bool CItemViewerDlg::LoadSurfaces() { ClearSurfaces(); if(m_szItemScriptName.IsEmpty() || m_szSpriteFolderName.IsEmpty()) { return false; } DWORD nBufferSize = 512 * 1024; char* szBuffer = new char[nBufferSize]; if(0 == szBuffer) { m_messageDlg.SetTopIndex(m_messageDlg.AddString("Insufficient memory")); return false; } CString szDDSFileName; CString szErrorMessage; std::string spriteName; for(unsigned short usID = 0; usID < USHRT_MAX; ++usID) { const Item::ItemInfo* lpItemInfo = Item::CItemMgr::GetInstance().GetItemInfo(usID); if(0 != lpItemInfo) { spriteName.assign(lpItemInfo->m_SpriteData.m_szSpriteName); szDDSFileName.Format("%s%s.dds", m_szSpriteFolderName, lpItemInfo->m_SpriteData.m_szSpriteName); LPDIRECT3DSURFACE9 lpItemSprite = 0; SurfaceMap::iterator pos = m_surfaceMap.find(spriteName); if(pos == m_surfaceMap.end()) { // Surface»ý¼º ¹× Load const char* szErrorReason = 0; // ÆÄÀÏ ¿­±â HANDLE hFile = CreateFile(szDDSFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if(INVALID_HANDLE_VALUE != hFile) { DWORD dwHighSize = 0; DWORD dwLowSize = GetFileSize(hFile, &dwHighSize); if(0 == dwHighSize) { if(nBufferSize < dwLowSize) { nBufferSize = dwLowSize; delete [] szBuffer; szBuffer = new char[nBufferSize]; } if(0 != szBuffer) { DWORD dwTotalReadSize = 0; do { DWORD dwReadSize = 0; if(ReadFile(hFile, szBuffer, dwLowSize - dwTotalReadSize, &dwReadSize, 0)) { dwTotalReadSize += dwReadSize; } } while(dwTotalReadSize < dwLowSize); szBuffer[0] = 'D'; szBuffer[1] = 'D'; szBuffer[2] = 'S'; szBuffer[3] = ' '; D3DXIMAGE_INFO imageInfo; memset(&imageInfo, 0, sizeof(D3DXIMAGE_INFO)); HRESULT hr = D3DXGetImageInfoFromFileInMemory(szBuffer, dwLowSize, &imageInfo); if(SUCCEEDED(hr)) { hr = m_lpd3dDevice->CreateOffscreenPlainSurface(imageInfo.Width, imageInfo.Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpItemSprite, NULL); if(SUCCEEDED(hr)) { RECT srcRect; SetRect(&srcRect, 0, 0, imageInfo.Width, imageInfo.Height); // ÆÄÀÏ ·Îµå°¡ ³¡³µ¼ö. hr = D3DXLoadSurfaceFromFileInMemory(lpItemSprite, NULL, NULL, szBuffer, dwLowSize, &srcRect, D3DX_DEFAULT, 0xFF000000, NULL); if(SUCCEEDED(hr)) { m_surfaceMap.insert(std::make_pair(spriteName, lpItemSprite)); } else { lpItemSprite->Release(); lpItemSprite = 0; szErrorReason = "LoadSurface failed"; } } else { szErrorReason = "Create offscreenBuffer failed"; } } else { szErrorReason = "Get imageInfo failed"; } } else { szErrorReason = "Buffer is NULL"; } } else { szErrorReason = "Too large sprite file"; } CloseHandle(hFile); } else { szErrorReason = "File open failed"; } if(0 != szErrorReason) { szErrorMessage.Format("%s : %s.dds (%6d : %s)", szErrorReason, lpItemInfo->m_SpriteData.m_szSpriteName, usID, lpItemInfo->m_SpriteData.m_szName); m_messageDlg.SetTopIndex(m_messageDlg.AddString(szErrorMessage)); } } } } delete [] szBuffer; return true; } void CItemViewerDlg::ClearSurfaces() { SurfaceMap::iterator pos = m_surfaceMap.begin(); SurfaceMap::iterator end = m_surfaceMap.end(); for(; pos != end; ++pos) { pos->second->Release(); } m_surfaceMap.clear(); } void CItemViewerDlg::OnBnClickedSaveAllItem() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if(0 == m_lpd3dDevice) { m_messageDlg.SetTopIndex(m_messageDlg.AddString("Invalid D3D Device")); return; } // Æú´õ »ý¼º CString szCurrentFolderName; szCurrentFolderName.Format("%sSavedItems\\", m_szCurrentFolderName); if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(szCurrentFolderName)) { if (!CreateDirectory(szCurrentFolderName, 0)) { m_messageDlg.SetTopIndex(m_messageDlg.AddString("Folder create failed")); return; } } CString szBMPFileName; CString szDDSFileName; CString szErrorMessage; std::string spriteName; for(unsigned short usID = 0; usID < USHRT_MAX; ++usID) { const Item::ItemInfo* lpItemInfo = Item::CItemMgr::GetInstance().GetItemInfo(usID); if(0 != lpItemInfo) { spriteName.assign(lpItemInfo->m_SpriteData.m_szSpriteName); szBMPFileName.Format("%s%6d - %s.bmp", szCurrentFolderName, usID, lpItemInfo->m_SpriteData.m_szName); SurfaceMap::iterator pos = m_surfaceMap.find(spriteName); if(pos != m_surfaceMap.end()) { LPDIRECT3DSURFACE9 lpItemSprite = pos->second; if(0 != lpItemSprite) { RECT srcRect; SetRect(&srcRect, lpItemInfo->m_SpriteData.m_nSpriteMinX, lpItemInfo->m_SpriteData.m_nSpriteMinY, lpItemInfo->m_SpriteData.m_nSpriteMaxX, lpItemInfo->m_SpriteData.m_nSpriteMaxY); HRESULT hr = D3DXSaveSurfaceToFile(szBMPFileName, D3DXIFF_BMP, lpItemSprite, 0, &srcRect); if(FAILED(hr)) { szErrorMessage.Format("Save sprite failed : failed to save %6d:%s", usID, lpItemInfo->m_SpriteData.m_szName); m_messageDlg.SetTopIndex(m_messageDlg.AddString(szErrorMessage)); } } } else { szErrorMessage.Format("Save sprite failed : failed to find %6d:%s", usID, lpItemInfo->m_SpriteData.m_szName); m_messageDlg.SetTopIndex(m_messageDlg.AddString(szErrorMessage)); } } } m_messageDlg.SetTopIndex(m_messageDlg.AddString("Save sprite complete.")); }