#include "stdafx.h" #include "PatcherDlg.h" #include "Patcher.h" #include "skin/SkinResource.h" //#include "HSUpChk.h" //#define HS_GAMECODE 5831 //#define HS_LICENSE "CBC1EE5976E5748C02F7AF5D" //#define szTitle "IRIS ONLINE" // ÇÙ½Çµå ½º¸¶Æ® ¾÷µ¥ÀÌÆ® // Ex ÇÔ¼ö¸¦ »ç¿ëÇÒ¶§´Â ¹Ýµå½Ã HSUpSetEvn.exe ¼³Á¤ Åø·Î env ÆÄÀÏ¿¡ °ÔÀÓÄڵ带 ÀÔ·ÂÇØ¾ß ÇÑ´Ù! BOOL UpdateHackShield() { /* DWORD ret = 0; TCHAR szMsg[255] = {0,}; TCHAR szFullFilePath[MAX_PATH] = {0,}; // ÇÙ½Çµå Æú´õ À§Ä¡ ÁöÁ¤ GetCurrentDirectory( MAX_PATH, szFullFilePath ); lstrcat( szFullFilePath, _T( "\\HackShield" ) ); AHNHS_EXT_ERRORINFO error; ZeroMemory( &error, sizeof(AHNHS_EXT_ERRORINFO) ); // ¸ð´ÏÅ͸µ Á¤º¸¸¦ ÁöÁ¤ÇÕ´Ï´Ù. strcpy( error.szServer, "127.0.0.1" ); strcpy( error.szUserId, "Test" ); strcpy( error.szGameVersion, "0.9" ); // Update ÇÔ¼ö È£Ãâ ret = _AhnHS_HSUpdateEx( szFullFilePath, 1000 * 600, // ¾÷µ¥ÀÌÆ® Àüü ŸÀÓ ¾Æ¿ô HS_GAMECODE, AHNHSUPDATE_CHKOPT_HOSTFILE | AHNHSUPDATE_CHKOPT_GAMECODE, error, 1000 * 20 ); // ¼­¹ö ¿¬°á ŸÀÓ ¾Æ¿ô if( ret != ERROR_SUCCESS ) { //_stprintf(szMsg, _T("ÇØÅ·¹æÁö ±â´É¿¡ ¹®Á¦°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù.(Error Code = %x)\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), ret ); _stprintf(szMsg, _T("Fail to run HackShield.(Error Code = %x)\nProgram will be close."), ret ); MessageBox(NULL, szMsg, szTitle, MB_OK); return FALSE; } */ return TRUE; } BEGIN_MESSAGE_MAP( cPatcherDlg, cSkinDialog ) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CTLCOLOR() ON_BN_CLICKED( CID_OK, OnOkButton ) ON_BN_CLICKED( CID_CLOSE, OnCloseButton ) ON_BN_CLICKED( CID_HOME, OnHomeButton ) ON_BN_CLICKED( CID_JOIN, OnJoinButton ) ON_BN_CLICKED( CID_FULL, OnScreenModeButton ) ON_CBN_SELCHANGE( CID_LANGUAGE, OnSelChangeLanguage ) ON_CBN_SELCHANGE( CID_RESOLUTION, OnSelChangeResolution ) ON_MESSAGE(WM_USER_MESSAGE, OnUserMessage) END_MESSAGE_MAP() cPatcher* cPatcherDlg::mPatcher = 0; cPatcherDlg::cPatcherDlg( const cString& path, const cString& authCode, CWnd* parent ) : cSkinDialog( parent ) , mPath( path ) , mAuthCode( authCode ) , mThread( 0 ) , mProgressTotalNum( 0 ) , mProgressProcessCnt ( 0 ) , mExecuteMode( eCLIENT_EXECUTE_IDC ) { mIcon = AfxGetApp()->LoadIcon( IDI_PATCHER_ICON ); mBoardView = 0; mStatus = PATCH_SEARCHING; mSaveOption = false; mPatchMode = ePATCH_MODE_DOWNLOAD; } cPatcherDlg::~cPatcherDlg() { if( mPatcher ) { delete mPatcher; mPatcher = 0; } for(unsigned int i = 0; i < mLanguageArr.GetSize(); i++) { sLangauge* p = (sLangauge*)(mLanguageArr[i]); if( p ) { delete p; p = 0; } } mLanguageArr.Clear(); for(unsigned int i = 0; i < mResolutionArr.GetSize(); i++) { sResolution* p = (sResolution*)(mResolutionArr[i]); if( p ) { delete p; p = 0; } } mResolutionArr.Clear(); if( mSaveOption == true ) { SaveOption( "./option/option.txt" ); } } int cPatcherDlg::OnCreate( LPCREATESTRUCT lpCreateStruct ) { lpCreateStruct->style |= WS_CLIPCHILDREN; if( cSkinDialog::OnCreate( lpCreateStruct ) == -1 ) return -1; /// À©µµ¿ì ŸÀÌÆ² SetWindowText( "IrisPatcher" ); /// Url Á¤º¸ ·Îµù if( LoadUrl() == false ) { MessageBox( "Failed to load url info", PATCHER ); return -1; } /// load config if( LoadPatchConfig( "./launcher/patchconfig.txt" ) == false ) { MessageBox( "Failed to load config file", PATCHER, MB_OK ); return -1; } /// option.txt ·Îµù if( LoadOption("./Option/option.txt") == false ) { /// default set mOptionData.mWindowed = false; mOptionData.mWidth = 1024; mOptionData.mHeight = 768; mOptionData.mBpp = 32; mOptionData.mGamma = 0.5f; mOptionData.mEnvVolume = 0.5f; ///0.0f ~ 1.0f mOptionData.mEffVolume = 0.5f; ///0.0f ~ 1.0f mOptionData.mVideoMode = 20; mOptionData.mLanguage = 81; mSaveOption = true; } /// Áö¿ø°¡´ÉÇÑ ÇØ»óµµ ·Îµù EnumResolution(); /// °ÔÀÓ ½ÇÇà ¹öư mStartButton.Create( mResource->GetChild( "start" ), this, CID_OK ); mStartButton.EnableWindow( 0 ); /// Á¾·á ¹öư mCloseButton.Create( mResource->GetChild( "close" ), this, CID_CLOSE ); /// ȨÆäÀÌÁö ¹öư mHomeButton.Create( mResource->GetChild( "home" ), this, CID_HOME ); /// ȸ¿ø°¡ÀÔ ¹öư mJoinButton.Create( mResource->GetChild( "join" ), this, CID_JOIN ); /// ÁøÇà¹Ù mProgressBar.Create( mResource->GetChild( "probar" ), this, CID_PROGRESS ); mProgressBar.SetValue( 0.0f ); /// °Ô½Ã¹° ºä mBoardView = new cSkinHtmlView; mBoardView->Create( mResource->GetChild( "board" ), this, CID_BOARD ); mBoardView->Go(); ////////////////////////////////////////////////////////////////////////// /// Á¤º¸ ¼ÂÆÃ { mLanguageCombo.Create( mResource->GetChild( "language" ), this, CID_LANGUAGE ); mLanguageCombo.SetFont( &mFont ); if( mLanguageArr.GetSize() == 0 ) { /// Default ¾ð¾î¸¦ Á¦°ø sLangauge* p = new sLangauge; p->str = "japan"; p->code = 81; mLanguageArr.PushBack( p ); mSaveOption = true; } unsigned int curSel = 0; for( unsigned int i = 0; istr.Cstr() ); mLanguageCombo.SetItemDataPtr(r, (void*)p ); if( p->code == mOptionData.mLanguage ) curSel = r; } } mLanguageCombo.SetCurSel( curSel ); } if( mLanguageArr.GetSize() == 1 ) { mLanguageCombo.EnableWindow( FALSE ); mLanguageCombo.ShowWindow( SW_HIDE ); } ////////////////////////////////////////////////////////////////////////// mScreenCheck.Create( mResource->GetChild("full"), this, CID_FULL ); mScreenCheck.SetFont( &mFont ); mScreenCheck.SetChecked( mOptionData.mWindowed ); ////////////////////////////////////////////////////////////////////////// /// Á¤º¸ ¼ÂÆÃ { mResolutionCombo.Create( mResource->GetChild( "resolution" ), this, CID_RESOLUTION ); mResolutionCombo.SetFont( &mFont ); unsigned int curSel = 0; unsigned int screenWidth = GetSystemMetrics(SM_CXSCREEN); unsigned int screenHeight = GetSystemMetrics(SM_CYSCREEN); for( unsigned int i = 0; iwidth > screenWidth || p->height > screenHeight ) continue; } int r= mResolutionCombo.AddString( p->strResolution.Cstr() ); mResolutionCombo.SetItemDataPtr(r, (void*)p ); if( p->width == mOptionData.mWidth && p->height == mOptionData.mHeight && p->bpp == mOptionData.mBpp ) curSel = r; } } mResolutionCombo.SetCurSel(curSel); } ////////////////////////////////////////////////////////////////////////// RECT rc; rc.left = 21; rc.right = 128; rc.top = 394; rc.bottom = 408; mStatusStatic.Create( "", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, rc, this, CID_STATUS ); mStatusStatic.SetFont( &mFont ); return 0; } BOOL cPatcherDlg::OnInitDialog() { cSkinDialog::OnInitDialog(); /// ¾ÆÀÌÄÜÀ» ¼³Á¤ SetIcon( mIcon, 1 ); SetIcon( mIcon, 0 ); mLanguageCombo.InitShow(); mResolutionCombo.InitShow(); mPatchMode = ePATCH_MODE_DOWNLOAD; /// ½º·¹µå¸¦ ½ÃÀÛ mPatcher = new cPatcher( this ); mPatcher->Init( GetSafeHwnd(), AfxGetInstanceHandle() ); mPatcher->SetExcuteMode( mExecuteMode ) ; BeginThread(); return 1; } void cPatcherDlg::OnDestroy() { // °øÁö »çÇ× ºä if( mBoardView ) { mBoardView->DestroyWindow(); } SetPatchMode( ePATCH_MODE_EXIT ); cSkinDialog::OnDestroy(); } void cPatcherDlg::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, mIcon ); } else { cSkinDialog::OnPaint(); } } HCURSOR cPatcherDlg::OnQueryDragIcon() { return static_cast( mIcon ); } void cPatcherDlg::OnOK() { static bool first = true; if( first == false ) return; else first = false; if( mStartButton.IsWindowEnabled() ) { // mPatchMode = ePATCH_MODE_PATCH_CHECK; // °ÔÀÓ ½ÇÇà RunGame(); EndDialog( 0 ); } } void cPatcherDlg::OnCancel() { // SetPatchMode( ePATCH_MODE_EXIT ); if( mThread ) { mPatcher->StopWorking(); ::Sleep( 1 ); /// IO ÀÛ¾÷ÀÌ ³¡³¯ ¶§ ±îÁö ±â´Ù¸°´Ù. while( mPatcher->IsEndIO() != true ) { ::Sleep( 1 ); /// wait for IO END... } /// ½º·¹µå°¡ Á¾·áµÉ ¶§±îÁö ´ë±â if( ::WaitForSingleObject( mThread, INFINITE ) != WAIT_OBJECT_0 ) { DWORD exitCode; ::GetExitCodeThread( mThread, &exitCode ); // if ( exitCode == STILL_ACTIVE ) // { // ::TerminateThread( mThread, 0 ); // } } ::CloseHandle( mThread ); mThread = 0; } //if( mPatchStep == eSTEP_PATCH_COMPLETED ) { cSkinDialog::OnCancel(); } PostMessage( WM_CLOSE, 0, 0 ); } void cPatcherDlg::OnOkButton() { OnOK(); } void cPatcherDlg::OnCloseButton() { OnCancel(); } void cPatcherDlg::OnHomeButton() { ShellExecute( 0, 0, "Iexplore.exe", mUrlArray[URL_HOME].Cstr(), 0, SW_SHOWNORMAL ); } void cPatcherDlg::OnJoinButton() { ShellExecute( 0, 0, "Iexplore.exe", mUrlArray[URL_JOIN].Cstr(), 0, SW_SHOWNORMAL ); } void cPatcherDlg::OnScreenModeButton() { mOptionData.mWindowed = !mOptionData.mWindowed; ////////////////////////////////////////////////////////////////////////// /// Á¤º¸ ¼ÂÆÃ mResolutionCombo.ResetContent(); unsigned int curSel = 0; unsigned int screenWidth = GetSystemMetrics(SM_CXSCREEN); unsigned int screenHeight = GetSystemMetrics(SM_CYSCREEN); for( unsigned int i = 0; iwidth > screenWidth || p->height > screenHeight ) continue; } int r= mResolutionCombo.AddString( p->strResolution.Cstr() ); mResolutionCombo.SetItemDataPtr(r, (void*)p ); if( p->width == mOptionData.mWidth && p->height == mOptionData.mHeight && p->bpp == mOptionData.mBpp ) curSel = r; } } mResolutionCombo.SetCurSel(curSel); ////////////////////////////////////////////////////////////////////////// mSaveOption = true; } void cPatcherDlg::OnSelChangeLanguage() { if( mLanguageArr.GetSize() == 0 ) return; int curSel = mLanguageCombo.GetCurSel(); if( curSel == -1 ) return; sLangauge* p = (sLangauge*)mLanguageCombo.GetItemDataPtr( curSel ); if( p ) { mOptionData.mLanguage = p->code; mSaveOption = true; } } void cPatcherDlg::OnSelChangeResolution() { if( mResolutionArr.GetSize() == 0 ) return; int curSel = mResolutionCombo.GetCurSel(); if( curSel == -1 ) return; sResolution* p = (sResolution*)mResolutionCombo.GetItemDataPtr( curSel ); if( p ) { if( mOptionData.mWidth == p->width && mOptionData.mHeight == p->height && mOptionData.mBpp == p->bpp ) return; mOptionData.mWidth = p->width; mOptionData.mHeight = p->height; mOptionData.mBpp = p->bpp; mSaveOption = true; } } void cPatcherDlg::BeginThread() { /// ÀÌ¹Ì ÀÛ¾÷ÁßÀÎ ½º·¹µå°¡ ÀÖ´ÂÁö¸¦ °Ë»ç if( mThread != 0 ) { MessageBox( "Thread is working.", PATCHER ); return; } /// ½º·¹µå¸¦ »ý¼º unsigned int threadId = 0; mThread = (HANDLE)_beginthreadex( NULL, 0, ThreadProc, 0, 0, &threadId ); // mThread = ::CreateThread( 0, 0, ThreadProc, 0, 0, &threadId ); if( mThread == 0 ) { MessageBox( "Failed to create thread.", PATCHER ); return; } } void cPatcherDlg::GameReady( bool result ) { /* if( mPatchMode == ePATCH_MODE_DOWNLOAD_END || mPatchMode == ePATCH_MODE_GAME_RUN ) { mProgressBar.SetValue( 1.0f ); mProgressBar.Invalidate( 0 ); } */ if( result ) { /// °ÔÀÓ ½ÇÇà Áغñ mStartButton.EnableWindow( 1 ); mProgressBar.SetValue( 1.0f ); mProgressBar.Invalidate( 0 ); // mStatus = PATCH_COMPLETE; } /* else { mStartButton.EnableWindow( 0 ); } */ } unsigned int cPatcherDlg::ThreadProc( LPVOID /*param*/ ) { assert( mPatcher ); return mPatcher->ThreadProc(); } bool cPatcherDlg::LoadUrl() { cString fileName = mPath; fileName += URLINFO_FILENAME; cFileLoader loader; if( loader.Open( fileName, true ) == false ) { return false; } char temp[256]; for( int i = 0; i < URL_COUNT; ++i ) { int readLen = loader.ReadLine( temp, 256 ); if( readLen == 0 || readLen > 256 ) break; temp[readLen-1] = 0; mUrlArray[i].Format("%s", temp ); memset( temp, 0, sizeof(temp) ); } return true; } bool cPatcherDlg::RunGame() { char *pCurrentPath = 0; if ( mPatcher ) { pCurrentPath = mPatcher->GetWorkDirectory(); SetCurrentDirectoryA( pCurrentPath ); } /* // °³¼±ÇÊ¿ä : ȨÆäÀÌÁö ÁÖ¼Ò ¾²´Â°÷ °Ë»öÇØ¼­ ½ºÅ©¸³Æ®·Î ·ÎµåÇØ¼­ Àû¿ëÇÏ´Â °ÍÀ¸·Î.. // client¿¡ ³Ñ±æ command line setting cString cmdLine; if ( strcmp( mAuthCode.Cstr(), "-1" ) == 0 ) { // ÀÌÀü ·±Ã³ ½ÇÇà½Ã(-1) ȨÆäÀÌÁö open #ifdef _TEST_SRV ShellExecute( 0, 0, "Iexplore.exe", WEB_LAUNCHER_URL, 0, SW_SHOWNORMAL ); #else ShellExecute( 0, 0, "Iexplore.exe", WEB_LAUNCHER_URL, 0, SW_SHOWNORMAL ); #endif PostMessage( WM_CLOSE, 0 ); return true; } else if ( strcmp( mAuthCode.Cstr(), "-2" ) == 0 ) { // Á÷Á¢ ½ÇÇà cmdLine.Format( "%u", mPatcher->GetLoginIP() ); } else { // À¥·±Ã³ ½ÇÇà [ip_ÀÎÁõÄÚµå] cmdLine.Format( "%u|%s", mPatcher->GetLoginIP(), mAuthCode.Cstr() ); } /// Çٽǵå Àû¿ë if( mExecuteMode == eCLIENT_EXECUTE_IDC || mExecuteMode == eCLIENT_EXECUTE_TEST || mExecuteMode == eCLIENT_EXECUTE_DEV ) { // ¾÷µ¥ÀÌÆ® if( UpdateHackShield() == FALSE ) { MessageBox( "Failed to update HackShield", PATCHER ); return 0; } } */ cString cmdLine; cmdLine.Format( "%u", mPatcher->GetLoginIP() ); /// otion ÀúÀå if( mSaveOption ) { cString str; str.Format( "%s\\%s", pCurrentPath, "option/option.txt"); SaveOption( str.Cstr() ); } cString path; if( mExecuteMode == eCLIENT_EXECUTE_GMTOOL_IDC || mExecuteMode == eCLIENT_EXECUTE_GMTOOL_TEST || mExecuteMode == eCLIENT_EXECUTE_GMTOOL_DEV ) { path.Format( "%s\\%s", pCurrentPath, GAMEEXE_FILENAME_GM ); } else path.Format( "%s\\%s", pCurrentPath, GAMEEXE_FILENAME ); int ret = (int)::ShellExecute( 0, "open", path.Cstr(), cmdLine.Cstr(), 0, SW_SHOWNORMAL ); if( ret >= 0 && ret <= 32 ) { char szMsg[255] = {0,}; sprintf_s(szMsg, "ERROR(%d) : Failed to run [%s]", ret, path.Cstr() ); MessageBoxA(szMsg, PATCHER ); PostMessage( WM_CLOSE, 0 ); return false; } PostMessage( WM_CLOSE, 0 ); return true; } void cPatcherDlg::SetProgressMax( ePatchStatus status, unsigned int max ) { mProgressTotalNum = max; mProgressBar.SetValue( 0.f ); mProgressBar.Invalidate( 0 ); SetStatus( status ); } void cPatcherDlg::SetProgressPos( const char* /*fileName*/, unsigned int pos ) { mProgressProcessCnt = pos; float r = float(pos) / float(mProgressTotalNum); mProgressBar.SetValue( r ); mProgressBar.Invalidate( 0 ); SetStatus( PATCH_PATCHING ); } void cPatcherDlg::InitStatus( ) { mStatusStatic.SetWindowText( "" ); RECT rc; rc.left = 21; rc.right = 128; rc.top = 394; rc.bottom = 408; InvalidateRect( &rc, 0 ); } void cPatcherDlg::SetStatus( ePatchStatus status ) { mStatus = status; cString out; switch( mStatus ) { case PATCH_SEARCHING: out = mResource->GetText( 0 ); break; case PATCH_PATCHING: { float v = mProgressBar.GetValue() * 100.0f; out.Format( mResource->GetText(1).Cstr(), v); } break; case PATCH_COMPLETE: out = mResource->GetText( 2 ); break; case PATCH_LIST_CHECKING: out = mResource->GetText( 3 ); break; case PATCH_LIST_CHECK_END: out = mResource->GetText( 4 ); break; } mStatusStatic.SetWindowText( out.Cstr() ); RECT rc; rc.left = 21; rc.right = 128; rc.top = 394; rc.bottom = 408; InvalidateRect( &rc, 0 ); } HBRUSH cPatcherDlg::OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); switch(nCtlColor) { case CTLCOLOR_STATIC: { pDC->SetTextColor(RGB(255, 255, 255)); pDC->SetBkMode(TRANSPARENT); return hbr; } } return hbr; } LRESULT cPatcherDlg::OnUserMessage(WPARAM wParam, LPARAM lParam) { if(mPatcher->IsWorking() == false) return 1; switch( wParam ) { case _UMT_ERROR_INIT_ : MessageBox("Initialize Error.", PATCHER, MB_OK ); break; case _UMT_ERROR_SAVE_ : // MessageBox("Fail to save file.", PATCHER, MB_OK ); break; case _UMT_ERROR_CONNECT_: MessageBox("Fail to connect to patch server.", PATCHER, MB_OK ); break; case _UMT_ERROR_DOWNLOAD_: // MessageBox("Fail to download patch file.", PATCHER, MB_OK ); break; case _UMT_ERROR_DOWNLOAD_PATCHLIST_: MessageBox("Fail to download patchlist file.", PATCHER, MB_OK ); break; case _UMT_ERROR_NOT_EXIST_PATCHLIST_: MessageBox("Fail to download. Patchlist file is not exist.", PATCHER, MB_OK ); break; case _UMT_ERROR_MEMORY_ALLOC_: MessageBox( "Fail to allocation memory.", PATCHER, MB_OK ); break; case _UMT_ERROR_MEMORY_FREE_: MessageBox( "Fail to free memory.", PATCHER, MB_OK ); break; case _UMT_ERROR_UPDATE_PACK_FILE: // MessageBox( "Fail to Update Pack file.", PATCHER, MB_OK ); break; case _UMT_ERROR_UPDATE_NOPACK_FILE: // MessageBox( "Fail to Update UnPack file.", PATCHER, MB_OK ); break; case _UMT_ERROR_UPDATE_OPEN_PACK_FILE_: MessageBox( "Fail to open pack file.", PATCHER, MB_OK ); break; case _UMT_ERROR_UPDATE_ACCESS_PACK_FILE_: MessageBox( "Fail to access pack file.", PATCHER, MB_OK ); break; case _UMT_ERROR_SEARCH_: MessageBox( "Failed to search client files.", PATCHER, MB_OK ); break; case _UMT_ERROR_CREATE_PACK_FILE_: MessageBox( "Fail to create pack file.", PATCHER, MB_OK ); break; case _UMT_ERROR_CREATE_FOLDER_: MessageBox( "Fail to create client folder.", PATCHER, MB_OK ); break; case _UMT_ERROR_MAKELIST_WRONG_HEADER: MessageBox("Fail to parse server patch list header file.", PATCHER, MB_OK ); break; case _UMT_ERROR_MAKELIST_WRONG_EXECUTE: MessageBox("Fail to wrong execute mode.", PATCHER, MB_OK ); break; case _UMT_ERROR_MAKELIST_DIFF_PATCHLIST: MessageBox("Fail. execute mode different server patch list file.", PATCHER, MB_OK ); break; case _UMT_ERROR_MAKELIST_PARSE: MessageBox("Fail to parse server patch list file.", PATCHER, MB_OK ); break; case _UMT_ERROR_MAKELIST_END_APP: break; case _UMT_ERROR_PATCH_CHECK_FAIL: MessageBox("Patch differance Last File.", PATCHER, MB_OK ); break; default : MessageBox("Unknown Error"); break; } PostMessage( WM_CLOSE, 0, 0 ); return 1; } bool cPatcherDlg::LoadPatchConfig( const char* pathName ) { /// ÆÄÀÏ ¿­±â cFileLoader loader; if( loader.Open( pathName, true ) == false ) { return false; } if( loader.IsEmpty() ) return false; for(unsigned int i = 0; i < mLanguageArr.GetSize(); i++) { sLangauge* p = (sLangauge*)(mLanguageArr[i]); if( p ) { delete p; p = 0; } } mLanguageArr.Clear(); cToken token; cPatchLexer lexer( loader.GetBufferPtr(), loader.GetSize() ); cParser parser( &lexer, pathName ); while( lexer.IsEnd() == false ) { lexer.GetNextToken( &token ); switch( token.mType ) { case eTOKEN_ERROR: return false; case eTOKEN_NULL: continue; case eTOKEN_LOCAL: { cString str = parser.ParseString(); sLangauge* p = new sLangauge; p->str = str; p->code = GetLocalCode( p->str.Cstr() ); mLanguageArr.PushBack( p ); } break; default: assert( 0 && "invalid token" ); return false; } } return true; } bool cPatcherDlg::LoadOption( const char* pathName ) { cFileLoader loader; if( loader.Open( pathName, true ) == false ) return false; cToken token; cOptionLexer lexer( loader.GetBufferPtr(), loader.GetSize() ); cParser parser( &lexer, pathName ); while( lexer.IsEnd() == false ) { lexer.GetNextToken( &token ); switch( token.mType ) { case eTOKEN_ERROR: return false; case eTOKEN_NULL: continue; case eTOKEN_WINMODE: { mOptionData.mWindowed = parser.ParseInt()? true:false; } break; case eTOKEN_RESOLUTION: { mOptionData.mWidth = (unsigned int)parser.ParseInt(); mOptionData.mHeight = (unsigned int)parser.ParseInt(); mOptionData.mBpp = (unsigned char)parser.ParseInt(); } break; case eTOKEN_RAMP: { mOptionData.mGamma = parser.ParseFloat(); if( mOptionData.mGamma < 0.0f || mOptionData.mGamma > 1.0f ) mOptionData.mGamma = 0.5f; } break; case eTOKEN_ENVVOLUME: { mOptionData.mEnvVolume = parser.ParseFloat(); if( mOptionData.mEnvVolume < 0.0f || mOptionData.mEnvVolume > 1.0f ) mOptionData.mEnvVolume = 0.5f; } break; case eTOKEN_EFFVOLUME: { mOptionData.mEffVolume = parser.ParseFloat(); if( mOptionData.mEffVolume < 0.0f || mOptionData.mEffVolume > 1.0f ) mOptionData.mEffVolume = 0.5f; } break; case eTOKEN_VIDEOMODE: { mOptionData.mVideoMode = parser.ParseInt(); } break; case eTOKEN_LANGUAGE: { mOptionData.mLanguage = parser.ParseInt(); } break; default: assert( 0 && "invalid token" ); return false; } } return true; } bool cPatcherDlg::SaveOption( const char* pathName ) { /// if( ::FileExist( "Option" ) == false ) ::CreateDirectory( "Option", 0 ); cFileSaver saver; if( saver.Open( pathName ) == false ) { return false; } char buf[256] = {0,}; /// window mode ::sprintf_s( buf, "windowed %d\r\n", mOptionData.mWindowed? 1:0 ); saver.Write( buf, strlen(buf) ); /// resolution ::sprintf_s( buf, "resolution %d %d %d\r\n", mOptionData.mWidth, mOptionData.mHeight, mOptionData.mBpp ); saver.Write( buf, strlen(buf) ); /// ramp ::sprintf_s( buf, "ramp %f\r\n", mOptionData.mGamma ); saver.Write( buf, strlen(buf) ); /// back sound volume ::sprintf_s( buf, "envvolume %f\r\n", mOptionData.mEnvVolume ); saver.Write( buf, strlen(buf) ); /// effect sound volume ::sprintf_s( buf, "effvolume %f\r\n", mOptionData.mEffVolume ); saver.Write( buf, strlen(buf) ); /// video capture mode ::sprintf_s( buf, "video %d ", mOptionData.mVideoMode ); saver.Write( buf, strlen(buf) ); ::sprintf_s( buf, "language %d ", mOptionData.mLanguage ); saver.Write( buf, strlen(buf) ); mSaveOption = false; return true; } void cPatcherDlg::EnumResolution( ) { /// for(unsigned int i = 0; i < mResolutionArr.GetSize(); i++) { sResolution* p = (sResolution*)(mResolutionArr[i]); if( p ) { delete p; p = 0; } } mResolutionArr.Clear(); /// /// ±×·¡ÇÈ Ä«µå ÇØ»óµµ DEVMODE dm; ZeroMemory(&dm, sizeof(dm)); dm.dmSize = sizeof(dm); EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &dm ); int i = 0; while( EnumDisplaySettings(NULL, i++, &dm) ) { /// ºÒÇÊ¿äÇÑ ¸ðµå Á¦¿Ü if( dm.dmPelsWidth <= 800 || dm.dmPelsHeight <= 600 || dm.dmBitsPerPel < 16 || dm.dmDisplayFrequency != 60 ) continue; sResolution* p = new sResolution; p->width = dm.dmPelsWidth; p->height = dm.dmPelsHeight; p->bpp = (unsigned char)dm.dmBitsPerPel; p->strResolution.Format( "%dx%dx%d", dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel ); mResolutionArr.PushBack( p ); } /// sorting } WORD cPatcherDlg::GetLocalCode( const char* local ) { if( strcmp( local, "Corea" ) == 0 ) return 82; else if( strcmp( local, "japan" ) == 0 ) return 81; else if( strcmp( local, "hongkong" ) == 0 ) return 852; /// default return 0; }