// MonsterCounterDlg.cpp : implementation file // #include "stdafx.h" #include "MonsterCounterDlg.h" #include "EtWorldSector.h" #include "EtWorldEventControl.h" #include "EtWorldEventArea.h" #include "TEtWorldEventArea.h" #include "DNTableFile.h" #include "Resource.h" #include "EtWorldGrid.h" extern DNTableFileFormat *s_pSox[5]; // CMonsterCounterDlg dialog const char *s_szMonsterRaceStr[] = { "ÇÏ¿îµå³ë¸»", "ÇÏ¿îµå¼³¿ø", "ÇÏ¿îµå»ç¸·", "ÇïÇÏ¿îµå", "ÇÏ¿îµå³ë¸»°­È­", "ÇÏ¿îµå¼³¿ø°­È­", "ÇÏ¿îµå»ç¸·°­È­", "ÇïÇÏ¿îµå°­È­", "¹ÚÁãºí·¢", "¹ÚÁã±×·¹ÀÌ", "¹ÚÁãºí·ç", "°íºí¸°½ºÄÌ·¹Åæ", "¿ÀÅ©½ºÄÌ·¹Åæ", "´ÙÅ©¿¤ÇÁ½ºÄÌ·¹Åæ", "Æ®·Ñ½ºÄÌ·¹Åæ", "½ºÆÄÀÌ´õ¿»·Î¿ì", "½ºÆÄÀÌ´õºí·¢", "½ºÆÄÀÌ´õºí·ç", "°íºí¸°±×¸°", "°íºí¸°ºí·ç", "°íºí¸°È­ÀÌÆ®", "°íºí¸°ºí·¢", "°íºí¸°·¹µå", "°íºí¸°±×·¹ÀÌ", "ÄÚº¼Æ®¿ö¸®¾î¿»·Î¿ì", "ÄÚº¼Æ®¿ö¸®¾î±×¸°", "ÄÚº¼Æ®¿ö¸®¾î±×·¹ÀÌ", "ÄÚº¼Æ®¿ö¸®¾îºí·ç", "ÄÚº¼Æ®¿ö¸®¾îºí·¢", "ÄÚº¼Æ®¿ö¸®¾î·¹µå", "ÄÚº¼Æ®¾ÆÃ³¿»·Î¿ì", "ÄÚº¼Æ®¾ÆÃ³±×¸°", "ÄÚº¼Æ®¾ÆÃ³ºí·ç", "ÄÚº¼Æ®¾ÆÃ³·¹µå", "ÄÚº¼Æ®¾ÆÃ³ºí·¢", "À§½Àºí·ç", "À§½À±×·¹ÀÌ", "À§½À±×¸°", "À§½À¿»·Î¿ì", "À§½Àºí·¢", "À§½À·¹µå", "½ºÄÌ·¹Åæ±×·¹ÀÌ", "½ºÄÌ·¹Åæºí·ç", "½ºÄÌ·¹ÅæÈ­ÀÌÆ®", "½ºÄÌ·¹Åæºí·¢", "½ºÄÌ·¹Åæ±×¸°", "½ºÄÌ·¹Åæ°ñµå", "½ºÄÌ·¹Åæ·¹µå", "±¸¿ï±×·¹ÀÌ", "±¸¿ï±×¸°", "±¸¿ïºí·ç", "±¸¿ï·¹µå", "±¸¿ïÈ­ÀÌÆ®", "±¸¿ï¸Ó¹Ì", "Ĭơ²É±×¸°", "Ĭơ²Éºí·ç", "Ĭơ²É·¹µå", "Ĭơ²ÉÈ­ÀÌÆ®", "¸®ºù¼Òµå±×·¹ÀÌ", "¸®ºù¼Òµåºí·ç", "¸®ºùºÏ·¹µå", "¸®ºùºÏºí·¢", "¸®ºùÇØ¸Ó±×·¹ÀÌ", "¸®ºùÇØ¸Ó·¹µå", "¸®ºù¿Ïµå¿»·Î¿ì", "¸®ºù¿Ïµåºí·ç", "ÇÁ·Î±×¸Ç¿ö¸®¾î±×¸°", "ÇÁ·Î±×¸Ç¿ö¸®¾îÆÛÇÃ", "ÇÁ·Î±×¸Ç¿ö¸®¾îºí·¢", "µå·¹ÀÌÅ©ÇØÃú¸µ±×¸°", "µå·¹ÀÌÅ©ÇØÃú¸µºí·ç", "µå·¹ÀÌÅ©ÇØÃú¸µ·¹µå", "Ä«º¡Å¬ÆÛÇÃ", "Ä«º¡Å¬È­ÀÌÆ®", "Ä«º¡Å¬ºí·¢", "Å¥ºê±×·¹ÀÌ", "Å¥ºêºí·¢", "¾Æ»çÀÌ¿ö¸®¾î·¹µå", "¾Æ»çÀÌ¿ö¸®¾î±×·¹ÀÌ", "¾Æ»çÀÌ¿ö¸®¾îºí·¢", "¾Æ»çÀÌ»þ¸Õ·¹µå", "¾Æ»çÀÌ»þ¸Õºí·ç", "¾Æ»çÀÌ»þ¸ÕÈ­ÀÌÆ®", "±×·¹ÀÌÆ®ºñƲ±×¸°", "±×·¹ÀÌÆ®ºñƲºí·ç", "±×·¹ÀÌÆ®ºñƲ·¹µå", "±×·¹ÀÌÆ®ºñƲºí·¢", "±×·¹ÀÌÆ®ºñƲÆÛÇÃ", "±×·¹ÀÌÆ®ºñƲ±×·¹ÀÌ", "±×·¹ÀÌÆ®ºñƲ°ñµå", "ÄÚº¼Æ®Æ÷º´", "´ÙÅ©¿¤ÇÁ±×·¹ÀÌ", "´ÙÅ©¿¤ÇÁºí·ç", "´ÙÅ©¿¤ÇÁ·¹µå", "´ÙÅ©¿¤ÇÁºí·¢", "¿ÀÅ©±×¸°", "¿ÀÅ©ºí·ç", "¿ÀÅ©·¹µå", "¿ÀÅ©ºí·¢", "¿ÀÅ©±×·¹ÀÌ", "¸®ÀÚµå¸Ç±×¸°", "¸®ÀÚµå¸Çºí·ç", "¸®ÀÚµå¸ÇÈ­ÀÌÆ®", "¸®ÀÚµå¸Çºí·¢", "¸®ÀÚµå¸Ç·¹µå", "ºê·ÎÈ­ÀÌÆ®", "ºê·Îºí·ç", "ºê·Î·¹µå", "ºê·Îºí·¢", "¹Ì¹Í³ë¸»", "¹Ì¹Í½Ç¹ö", "¹Ì¹Í°ñµå", "¹Ì¹Í·¹¾î", "Æ®·Ñºí·ç", "Æ®·Ñºí·¢", "Æ®·ÑÈ­ÀÌÆ®", "Æ®·Ñ·¹µå", "È©°íºí¸°±×¸°", "È©°íºí¸°¿»·Î¿ì", "È©°íºí¸°ºí·¢", "È©°íºí¸°È­ÀÌÆ®", "È©°íºí¸°·¹µå", "ÇÏÇÇÈ­ÀÌÆ®", "ÇÏÇÇ·¹µå", "ÇÏÇÇºí·¢", "ÇÏÇǺí·ç", "°¡°íÀϱ׷¹ÀÌ", "°¡°íÀϺí·ç", "°¡°íÀÏ·¹µå", "°¡°íÀÏºí·¢", "°¡°íÀϱ׸°", "¶ó¹Ì¾Æ±×¸°", "¶ó¹Ì¾Æ±×·¹ÀÌ", "¶ó¹Ì¾Æºí·ç", "¶ó¹Ì¾ÆÈ­ÀÌÆ®", "¶ó¹Ì¾Æ·¹µå", "ÇÁ·Î±×¸Ç¼Ò¼­·¯±×·¹ÀÌ", "ÇÁ·Î±×¸Ç¼Ò¼­·¯·¹µå", "ÇÁ·Î±×¸Ç¼Ò¼­·¯ºí·¢", "·éŸÀ̰źí·ç", "·éŸÀÌ°Åºí·¢", "·éŸÀ̰ÅÈ­ÀÌÆ®", "¹ÌƼ¾îÆä¾î¸®·¹µå", "¹ÌƼ¾îÆä¾î¸®ºí·¢", "¹ÌƼ¾îÆä¾î¸®È­ÀÌÆ®", "¿ëÃßÁ¾ÀÚ¸ÅÁö¼Çºí·ç", "¿ëÃßÁ¾ÀÚ¸ÅÁö¼Çºí·¢", "¿ëÃßÁ¾ÀÚÆÛ´Ï¼Å±×¸°", "¿ëÃßÁ¾ÀÚÆÛ´Ï¼Å·¹µå", "¿ëÃßÁ¾ÀÚ¾î½Ø½Å±×·¹ÀÌ", "¿ëÃßÁ¾ÀÚ¾î½Ø½Åºí·¢", "¿ëÃßÁ¾ÀÚŬ·¹¸¯È­ÀÌÆ®", "¿ëÃßÁ¾ÀÚŬ·¹¸¯ºí·¢", "¿¤ºì¹ê½¬±×·¹ÀÌ", "¿¤ºì¹ê½¬ºí·ç", "¿¤ºì¹ê½¬È­ÀÌÆ®", "·é¿¤ÇÁºí·ç", "·é¿¤ÇÁÈ­ÀÌÆ®", "·é¿¤ÇÁ·¹µå", "¿¤ºìµ¥½º³ªÀÌÆ®±×·¹ÀÌ", "¿¤ºìµ¥½º³ªÀÌÆ®ºí·ç", "¿¤ºìµ¥½º³ªÀÌÆ®ºí·¢", "¾ð½ºÅ×À̺íºí·¢", "¾ð½ºÅ×À̺íºí·ç", "¾ð½ºÅ×À̺íÈ­ÀÌÆ®", "¹Ì³ëŸ¿ì¸£½º¹ÙÀ̽¼", "¹Ì³ëŸ¿ì¸£½º¹ÙÀ̽¼°­È­", "¹Ì³ëŸ¿ì¸£½º³ë¸»", "¹Ì³ëŸ¿ì¸£½º³ë¸»°­È­", "¹Ì³ëŸ¿ì¸£½º·¹µå", "½¦µµ¿ì´ÙÅ©", "½¦µµ¿ìÆÄÀ̾î", "½¦µµ¿ì¾ÆÀ̽º", "½¦µµ¿ì¶óÀÌÆ®", "±×¸°ÇÏÇÁ°ñ·½", "½ºÅæÇÏÇÁ°ñ·½", "¾ÆÀ̾ðÇÏÇÁ°ñ·½", "¾ÆÀ̽ºÇÏÇÁ°ñ·½", "ÆÄÀ̾îÇÏÇÁ°ñ·½", "·¹À̽º·¹µå", "·¹À̽º±×·¹ÀÌ", "·¹À̽ººí·¢", "·¹À̽ººí·ç", "¿À¿ì°ÅÈ­ÀÌÆ®", "¿À¿ì°Åºí·¢", "¿À¿ì°Å·¹µå", "°Å´ë°Å¹Ì", "À§½ÀÀÚÀ̾ðÆ®", "¿ëÃßÁ¾ÀÚºñ¼óºí·ç", "¿ëÃßÁ¾ÀÚºñ¼óÈ­ÀÌÆ®", "¿ëÃßÁ¾ÀÚºñ¼óºí·¢", "Ű¸Þ¶óÈ­ÀÌÆ®", "Ű¸Þ¶óºí·ç", "Ű¸Þ¶ó·¹µå", "¿¤ºì¸®Ä¡·¹µå", "¿¤ºì¸®Ä¡ºí·ç", "¿¤ºì¸®Ä¡ºí·¢", "ÃÊ¿ø°ñ·½", "½ºÅæ°ñ·½", "¾ÆÀ̽º°ñ·½", "ÆÄÀ̾î°ñ·½", "¾ÆÀ̾ð°ñ·½", "¸¸Æ¼ÄÚ¾î³ë¸»", "¸¸Æ¼ÄھÀ̵å", "Ä̺£·Î½º", "¾¾µå·¹ÀÌÅ©", "ºñȦ´õ", "ºñȦ´õÃ˼ö", "¹Ù½Ç¸®½ºÅ©", "±×¸°µå·¡°ï", "ÇÏ¿îµåºí·¢°­È­", "¿ëÃßÁ¾Àڽŵµ", "¿À¿ì°Å±×·¹ÀÌ", "ºí·¡½ºÆ®µ¥¸ó·¹µå", "³î¿ö¸®¾î¿»·Î¿ì", "³î°Å³Ê¿»·Î¿ì", "º¸¾î¿ö¸®¾î±×·¹ÀÌ", "º¸¾î°Å³Ê±×·¹ÀÌ", "Å©·Î¿ì¾î½Ø½Å±×·¹ÀÌ", "Å©·Î¿ì´ÙÀ̹ö±×·¹ÀÌ", "»çÀÌŬ·Ó½º±×¸°", "¶óÀ̳ë¸Ç±×·¹ÀÌ", }; const char *s_szMonsterGradeStr[] = { "¹Ì´Ï¾ð", "³ë¸»", "èÇǾð", "¿¤¸®Æ®", "³×ÀÓµå", "º¸½º", "", "", "", "", "À̺¥Æ®", }; IMPLEMENT_DYNAMIC(CMonsterCounterDlg, CXTPDialog) CMonsterCounterDlg::CMonsterCounterDlg(CWnd* pParent /*=NULL*/) : CXTPDialog(CMonsterCounterDlg::IDD, pParent) { m_nLastEventAreaCount = 0; m_pSector = NULL; m_nEventAreaCommonParamCount = 1; } CMonsterCounterDlg::~CMonsterCounterDlg() { } void CMonsterCounterDlg::DoDataExchange(CDataExchange* pDX) { CXTPDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, m_Combo); DDX_Control(pDX, IDC_LIST1, m_ListCtrl); } BEGIN_MESSAGE_MAP(CMonsterCounterDlg, CXTPDialog) ON_BN_CLICKED(IDOK, &CMonsterCounterDlg::OnBnClickedOk) ON_BN_CLICKED(IDCANCEL, &CMonsterCounterDlg::OnBnClickedCancel) ON_CBN_SELCHANGE(IDC_COMBO1, &CMonsterCounterDlg::OnCbnSelchangeCombo1) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON2, &CMonsterCounterDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_BUTTON1, &CMonsterCounterDlg::OnBnClickedExport) END_MESSAGE_MAP() // CMonsterCounterDlg message handlers void CMonsterCounterDlg::OnBnClickedOk() { // TODO: Add your control notification handler code here // OnOK(); } void CMonsterCounterDlg::OnBnClickedCancel() { // TODO: Add your control notification handler code here // OnCancel(); } int GetAverageValue( int nMin, int nMax ) { if( nMin == nMax ) return nMin; return ( nMin + ( ( nMax - nMin ) / 2 ) ); } void CMonsterCounterDlg::CalcMonsterIDMinMax( CEtWorldEventArea *pArea, int nDifficulty, int &nMin, int &nMax ) { CTEtWorldEventArea *pEventArea = (CTEtWorldEventArea *)pArea; char szTemp[256]; int nMonsterID; sscanf_s( pArea->GetName(), "%s %d", szTemp, 256, &nMonsterID ); if( !s_pSox[0]->IsExistItem( nMonsterID ) ) return; EtVector2 vVec = pEventArea->GetProperty(0+m_nEventAreaCommonParamCount)->GetVariableVector2(); nMin = (int)vVec.x; nMax = (int)vVec.y; int nGenCount = ((CTEtWorldEventArea*)pArea)->GetProperty(1+m_nEventAreaCommonParamCount)->GetVariableInt(); InsertMonsterList( nMonsterID, GetAverageValue( nMin, nMax ), ( nGenCount == 10 ) ? 0 : nGenCount + 1 ); } void CMonsterCounterDlg::CalcMonsterGroupMinMax( CEtWorldEventArea *pArea, int nDifficulty, int &nMin, int &nMax ) { CTEtWorldEventArea *pEventArea = (CTEtWorldEventArea *)pArea; char szLabel[64]; char szTemp[256]; EtVector2 vVec = pEventArea->GetProperty(0+m_nEventAreaCommonParamCount)->GetVariableVector2(); int nCompoundIndex; sscanf_s( pArea->GetName(), "%s %d", szTemp, 256, &nCompoundIndex ); int nValueMin = (int)vVec.x; int nValueMax = (int)vVec.y; std::vector nVecList; bool bInsertMonsterList = true; if( !s_pSox[1]->IsExistItem( nCompoundIndex ) ) return; for( int i=0; i<15; i++ ) { sprintf_s( szLabel, "_MonsterTableID%d_%d", nDifficulty + 1, i + 1 ); int nMonsterID = s_pSox[1]->GetFieldFromLablePtr( nCompoundIndex, szLabel )->GetInteger(); if( nMonsterID < 1 ) continue; sprintf_s( szLabel, "_Ratio%d_%d", nDifficulty + 1, i + 1 ); float fRatio = s_pSox[1]->GetFieldFromLablePtr( nCompoundIndex, szLabel )->GetFloat(); if( fRatio <= 0.f ) continue; sprintf_s( szLabel, "_Value%d_%d", nDifficulty + 1, i + 1 ); int nValue = s_pSox[1]->GetFieldFromLablePtr( nCompoundIndex, szLabel )->GetInteger(); if( nValue < 1 ) nValue = 1; if( !s_pSox[0]->IsExistItem( nMonsterID ) ) { continue; } nVecList.push_back( nValue ); if( s_pSox[0]->GetFieldFromLablePtr( nMonsterID, "_HP" )->GetInteger() == 0 ) continue; if( bInsertMonsterList ) { int nGenCount = ((CTEtWorldEventArea*)pArea)->GetProperty(1+m_nEventAreaCommonParamCount)->GetVariableInt(); InsertMonsterList( nMonsterID, GetAverageValue( nValueMin/nValue, nValueMax/nValue ), ( nGenCount == 10 ) ? 0 : nGenCount + 1 ); bInsertMonsterList = false; } // nValue = s_pSox[0]->GetFieldFromLablePtr( nMonsterID, "_Level" )->GetInteger(); } if( !nVecList.empty() ) { std::sort( nVecList.begin(), nVecList.end() ); nMin = nValueMin / nVecList[0]; nMax = nValueMax / nVecList[nVecList.size()-1]; } } void CMonsterCounterDlg::CalcMonsterSetMinMax( CEtWorldEventArea *pArea, int nDifficulty, int &nMin, int &nMax ) { CTEtWorldEventArea *pEventArea = (CTEtWorldEventArea *)pArea; int nSetID = pEventArea->GetProperty(0+m_nEventAreaCommonParamCount)->GetVariableInt(); int nPosID = pEventArea->GetProperty(1+m_nEventAreaCommonParamCount)->GetVariableInt(); if( !s_pSox[3]->IsExistItem( nSetID ) ) return; std::vector nVecSetList; s_pSox[3]->GetItemIDListFromField( "_SetNo", nSetID, nVecSetList ); char szLabel[64]; int nCurMin = INT_MAX; int nCurMax = INT_MIN; for( DWORD i=0; iGetFieldFromLablePtr( nVecSetList[i], "_Difficulty" )->GetInteger(); if( nDifficulty != nDiff ) continue; for( int j=0; j<20; j++ ) { sprintf_s( szLabel, "_PosID%d", j + 1 ); int nPosition = s_pSox[3]->GetFieldFromLablePtr( nVecSetList[i], szLabel )->GetInteger(); sprintf_s( szLabel, "_GroupID%d", j + 1 ); int nGroup = s_pSox[3]->GetFieldFromLablePtr( nVecSetList[i], szLabel )->GetInteger(); sprintf_s( szLabel, "_Num%d", j + 1 ); int nCount = s_pSox[3]->GetFieldFromLablePtr( nVecSetList[i], szLabel )->GetInteger(); if( nPosition != nPosID || nPosition < 1 || nGroup < 1 || nCount < 1 ) continue; // È®·ü»ó 0¸¶¸®°¡ ³ª¿Ã¼öµµ ÀÕÀ¸¹Ç·Î ±×·ìÃ¼Å©ÇØÁà¾ßÇÑ´Ù. int nProb = 0; for( int k=0; k<20; k++ ) { sprintf_s( szLabel, "_Prob%d", k + 1 ); nProb += s_pSox[4]->GetFieldFromLablePtr( nGroup, szLabel )->GetInteger(); } if( nProb < 1000000000 ) nCount = 0; // if( nCount <= nCurMin ) nCurMin = nCount; if( nCount >= nCurMax ) nCurMax = nCount; } } nMin = nCurMin; nMax = nCurMax; } void CalcNpcIDMinMax( CEtWorldEventArea *pArea, int nDifficulty, int &nMin, int &nMax ) { CTEtWorldEventArea *pEventArea = (CTEtWorldEventArea *)pArea; char szTemp[256]; int nMonsterID; sscanf_s( pArea->GetName(), "%s %d", szTemp, 256, &nMonsterID ); if( !s_pSox[0]->IsExistItem( nMonsterID ) ) return; nMin++; nMax++; } bool CMonsterCounterDlg::CheckRefresh( CEtWorldSector *pSector ) { int nCurCount = 0; for( DWORD i=0; iGetControlCount(); i++ ) { CEtWorldEventControl *pControl = pSector->GetControlFromIndex(i); switch( pControl->GetUniqueID() ) { case 0: // ETE_UnitArea nCurCount += pControl->GetAreaCount(); break; case 5: nCurCount += pControl->GetAreaCount(); break; } } if( nCurCount != m_nLastEventAreaCount ) { m_nLastEventAreaCount = nCurCount; return true; } return false; } struct MonsterCountStruct { int nMonsterID; int nCount; }; void CMonsterCounterDlg::InsertMonsterList( int nMonsterID, int nCount, int nGenCount ) { MonsterCountStruct *pStruct = NULL; for( DWORD i=0; iGetFieldFromLablePtr( nMonsterID, "_MonsterRaceID" )->GetInteger(); NewStruct.nGrade = s_pSox[0]->GetFieldFromLablePtr( nMonsterID, "_MonsterGrade" )->GetInteger(); NewStruct.nLevel = s_pSox[0]->GetFieldFromLablePtr( nMonsterID, "_Level" )->GetInteger(); m_VecMonsterList.push_back( NewStruct ); pStruct = &m_VecMonsterList[m_VecMonsterList.size()-1]; } pStruct->nCount += ( nCount * nGenCount ); } void CMonsterCounterDlg::Refresh( CEtWorldSector *pSector, bool bForce ) { m_pSector = pSector; if( !bForce && !CheckRefresh( pSector ) ) return; int nMonsterTotal[2] = { 0, }; int nMonsterID[2] = { 0, }; int nMonsterGroup[2] = { 0, }; int nMonsterSet[2] = { 0, }; int nNpcTotal[2] = { 0, }; m_VecMonsterList.clear(); int nDifficulty = m_Combo.GetCurSel(); for( DWORD i=0; iGetControlCount(); i++ ) { CEtWorldEventControl *pControl = pSector->GetControlFromIndex(i); switch( pControl->GetUniqueID() ) { case 0: // ETE_UnitArea { for( DWORD j=0; jGetAreaCount(); j++ ) { CEtWorldEventArea *pArea = pControl->GetAreaFromIndex(j); char szHeadStr[256] = { 0, }; sscanf_s( pArea->GetName(), "%s", szHeadStr, 256 ); _strlwr_s( szHeadStr ); int nMin = 0, nMax = 0; if( strcmp( szHeadStr, "monster" ) == NULL ) { CalcMonsterIDMinMax( pArea, nDifficulty, nMin, nMax ); nMonsterID[0] += nMin; nMonsterID[1] += nMax; } else if( strcmp( szHeadStr, "monstergroup" ) == NULL ) { CalcMonsterGroupMinMax( pArea, nDifficulty, nMin, nMax ); nMonsterGroup[0] += nMin; nMonsterGroup[1] += nMax; } else if( strcmp( szHeadStr, "npc" ) == NULL ) { CalcNpcIDMinMax( pArea, nDifficulty, nMin, nMax ); nNpcTotal[0] += nMin; nNpcTotal[1] += nMax; } } } break; case 5: // ETE_MonsterSet { for( DWORD j=0; jGetAreaCount(); j++ ) { CEtWorldEventArea *pArea = pControl->GetAreaFromIndex(j); int nMin = 0, nMax = 0; CalcMonsterSetMinMax( pArea, nDifficulty, nMin, nMax ); nMonsterSet[0] += nMin; nMonsterSet[1] += nMax; } } break; } } nMonsterTotal[0] = nMonsterID[0] + nMonsterGroup[0] + nMonsterSet[0]; nMonsterTotal[1] = nMonsterID[1] + nMonsterGroup[1] + nMonsterSet[1]; char szTemp[256]; sprintf_s( szTemp, "%d~%d", nMonsterTotal[0], nMonsterTotal[1] ); SetDlgItemText( IDC_STATIC_MON_COUNTER, szTemp ); sprintf_s( szTemp, "%d~%d", nMonsterID[0], nMonsterID[1] ); SetDlgItemText( IDC_STATIC_ID_COUNTER, szTemp ); sprintf_s( szTemp, "%d~%d", nMonsterGroup[0], nMonsterGroup[1] ); SetDlgItemText( IDC_STATIC_GROUP_COUNTER, szTemp ); sprintf_s( szTemp, "%d~%d", nMonsterSet[0], nMonsterSet[1] ); SetDlgItemText( IDC_STATIC_SET_COUNTER, szTemp ); sprintf_s( szTemp, "%d~%d", nNpcTotal[0], nNpcTotal[1] ); SetDlgItemText( IDC_STATIC_NPC_COUNTER, szTemp ); for( DWORD i=0; i 0 && m_VecMonsterList[i].nRace <= sizeof(s_szMonsterRaceStr) / sizeof(char*) ) sprintf_s( szTemp, "%s", s_szMonsterRaceStr[m_VecMonsterList[i].nRace-1] ); else sprintf_s( szTemp, "¾Ë¼ö¾øÀ½" ); m_ListCtrl.SetItemText( i, 3, szTemp ); sprintf_s( szTemp, "%s", s_szMonsterGradeStr[m_VecMonsterList[i].nGrade] ); m_ListCtrl.SetItemText( i, 4, szTemp ); }; UpdateData( FALSE ); } BOOL CMonsterCounterDlg::OnInitDialog() { CXTPDialog::OnInitDialog(); // TODO: Add extra initialization here m_Combo.SetCurSel(0); m_ListCtrl.AddColumn( "MonsterID", 60 ); m_ListCtrl.AddColumn( "Count", 30, LVCFMT_RIGHT ); m_ListCtrl.AddColumn( "Level", 30, LVCFMT_RIGHT ); m_ListCtrl.AddColumn( "Type", 80, LVCFMT_RIGHT ); m_ListCtrl.AddColumn( "Grade", 40, LVCFMT_RIGHT ); // m_ListCtrl.AddColumn( "Area Type", 100, LVCFMT_RIGHT ); m_ListCtrl.SetExtendedStyle( LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_FLATSB ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CMonsterCounterDlg::OnCbnSelchangeCombo1() { // TODO: Add your control notification handler code here Refresh( m_pSector, true ); } void CMonsterCounterDlg::OnDestroy() { CXTPDialog::OnDestroy(); // TODO: Add your message handler code here } void CMonsterCounterDlg::OnBnClickedRefresh() { Refresh( m_pSector, true ); } CString s_szLastExportPath; void CMonsterCounterDlg::OnBnClickedExport() { TCHAR szFilter[] = _T( "Text File (*.txt)|*.txt|All Files (*.*)|*.*||" ); CFileDialog dlg( FALSE, _T("txt"), _T("*.txt"), OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_ENABLESIZING , szFilter, this ); dlg.m_ofn.lpstrTitle = "Export Text File"; CXTBrowseDialog Dlg; UpdateData(TRUE); Dlg.SetTitle(_T("Select Export Directory")); if( !s_szLastExportPath.IsEmpty() ) { Dlg.SetSelPath(s_szLastExportPath); } if( Dlg.DoModal() == IDOK ) { s_szLastExportPath = Dlg.GetSelPath(); CString szStr = Dlg.GetSelPath(); szStr += "\\"; szStr += m_pSector->GetParentGrid()->GetName(); szStr += ".txt"; FILE *fp; fopen_s( &fp, szStr.GetBuffer(), "wt" ); if( fp == NULL ) { MessageBox( "ÀúÀåÇÒ ¼ö ¾ø½À´Ï´Ù." ); return; } int nPrevCurSel = m_Combo.GetCurSel(); for( DWORD i=0; i<5; i++ ) { m_Combo.SetCurSel(i); Refresh( m_pSector, true ); ExportMonsterInfo( i, fp ); } fclose(fp); m_Combo.SetCurSel( nPrevCurSel ); } } void CMonsterCounterDlg::ExportMonsterInfo( int nDifficulty, FILE *fp ) { const char *szDifficultyStr[] = { "Easy", "Normal", "Hard", "VeryHard", "Abyss" }; fprintf_s( fp, "%s\n", szDifficultyStr[nDifficulty] ); for( DWORD i=0; i