#include "stdafx.h" #include "SGameLoad.h" #include "KSeqModel.h" #include "SGameMessage.h" #include "SGameViewport.h" #include #include #include "KRenderDeviceDX.h" #include "SGameManager.h" #include "SGameSound.h" #include "SGameOption.h" #include #include "SUIDefine.h" #include "SUITopConsoleWnd.h" //#include "QJTVObj.h" //#include "SGameQJTV.h" #include "SGameMilesSoundMgr.h" #include "KDeviceManager.h" #include #include "SGameSceneSeqPlayer.h" #include "SGameQjtvScene.h" #include "SGameSceneGroup.h" #include "SGameImageScene.h" #include "SGameSceneLifeActor.h" #include "SGameBGMScene.h" #include "SGameCutScene.h" #include "SDebug_Util.h" enum { STEP_COMPANY, STEP_COMPANY_WAIT, STEP_LOGO, STEP_LOGO_WAIT, STEP_ONETIME, STEP_LOAD, STEP_LOGO_LOBBY, STEP_LOGO_LOBBY_SWAP, STEP_LOGINFAILED, }; const int LOGO_VIEW_TIME = 2000; XCriticalSection g_LoadCS; SGameLoad::SGameLoad(SGameManager* pGameMng, int nGameType, K3DRenderDeviceDX *pRenderDevice, SSoundManager *pSoundMng, KTextureManager * pTextureMng, KNX3Manager * pNX3Mng, SGameMilesSoundMgr* pMSoundMgr ) : SGame( pGameMng, nGameType, pRenderDevice, pSoundMng, pTextureMng, pNX3Mng, pMSoundMgr ) , m_bStopLogoIntroRender(false) , m_pLoadGame( NULL ) , m_pSceneMgr( 0 ) { m_nGameType = GAME_TYPE_LOAD; //게임 타입 m_nNextGameType = GAME_TYPE_LOGIN; //다음 예약 게임 타입 // m_pLoaingTextOutWnd = NULL; m_nActGameCount = 0; Init(); } SGameLoad::~SGameLoad() { Destroy(); } void SGameLoad::Init() { m_dwGapTime = LOGO_VIEW_TIME; m_dwStartTime = 0; // m_nStep = STEP_COMPANY; // m_nStep = STEP_LOAD; m_fVisibiity = 1.f; //#ifndef _RELEASE m_nStep = STEP_LOGO; //#endif m_bFirstLoad = false; m_ThreadManager.StartThread( "SGameLoad", 1 ); m_bIntroStart = false; m_dwOldTime = 0; m_pGameQJTV = NULL; } rp::SGameScene *SGameLoad::LoadMovie(rp::SGameSceneSeqPlayer* pScenePlayer, const char *scenename, const char *filename, const char *bgmname, const char *drawmode) { //언젠간 SGameRenewalLobby LoadMovie 함수랑 통합하자.. 일단은 나중에. sfreer 2009.07.09 int ScreenWidth = KUIWndManager::GetResolution().cx; int ScreenHeight = KUIWndManager::GetResolution().cy; int adjustedWidth = ScreenHeight * 4 / 3; /// 2010.12.28 - prodongi if (adjustedWidth > ScreenWidth) adjustedWidth = ScreenWidth; bool bfullscreenmode = false; if( ::_stricmp(drawmode,"fullscreen") == 0) bfullscreenmode = true; if( strstr( filename, ".jtv" ) != NULL ) { rp::SGameQjtvScene* pQjtvScene = new rp::SGameQjtvScene( *m_pSceneMgr , pScenePlayer , scenename , filename , bgmname , bfullscreenmode ? K3DVector( ScreenWidth/2 - 1024/2, ScreenHeight/2 - 768/2, 1.0f ) : K3DVector( ScreenWidth/2 - adjustedWidth/2, 0.f, 1.0f ) , KColor( 0xff000000 ) , bfullscreenmode ? rp::SGameQjtvScene::FULL | rp::SGameQjtvScene::CENTER : 0 , 25 , true , 0 , bfullscreenmode ? K3DVector2(-1.f, -1.f) : K3DVector2(adjustedWidth, ScreenHeight) ); SDEBUGLOG("SGameLoad::LoadMovie JTV - %s, %s, %s", scenename,filename,drawmode); return pQjtvScene; } else if( strstr( filename, ".xml" ) != NULL ) { rp::SGameCutScene* pCutScene = new rp::SGameCutScene( *m_pSceneMgr , pScenePlayer , scenename , filename , bfullscreenmode ? K3DVector( 0.f, 0.f, 1.0f ) : K3DVector( ScreenWidth/2 - adjustedWidth/2, 0.f, 1.0f ) , bfullscreenmode ? K3DVector2(ScreenWidth, ScreenHeight) : K3DVector2(adjustedWidth, ScreenHeight) ); SDEBUGLOG("SGameLoad::LoadMovie XML - %s, %s, %s", scenename,filename,drawmode); return pCutScene; } else if( strstr( filename, ".png" ) != NULL || strstr( filename, ".jpg" ) != NULL || strstr( filename, ".dds" ) != NULL) { rp::SGameImageScene* pImageScene = new rp::SGameImageScene( *m_pSceneMgr , pScenePlayer , scenename , filename , bfullscreenmode ? K3DVector( 0.f, 0.f, 1.0f ) : K3DVector( ScreenWidth/2 - adjustedWidth/2, 0.f, 1.0f ) , true , 0 , bfullscreenmode ? K3DVector2(ScreenWidth, ScreenHeight) : K3DVector2(adjustedWidth, ScreenHeight) ); pImageScene->registerActor( *( new rp::SGameSceneLifeActor( 4000, 1500, 1500 ) ) ); SDEBUGLOG("SGameLoad::LoadMovie IMAGE - %s, %s, %s", scenename,filename,drawmode); return pImageScene; } SDEBUGLOG("SGameLoad::LoadMovie FAILED - %s, %s, %s", scenename,filename,drawmode); return NULL; } void SGameLoad::InitMovie() { // create scene manager m_pSceneMgr = new rp::SGameSceneManager( *m_pGameMng , *KDeviceManager::GetDeviceManager() , *m_pTextureMng , *m_pSoundMng , *m_pMSoundMgr , *m_pNX3Mng , KFileManager::Instance() ); rp::SGameSceneSeqPlayer* pScenePlayer = new rp::SGameSceneSeqPlayer( *m_pSceneMgr, 0, "seq_player" ); m_ScenePlayer = pScenePlayer; rp::SGameScene* pPublisherScene = LoadMovie( pScenePlayer, "publisher_scene", GetLocaleOption().GetValueString("PUBLISHER_LOGO",""), GetLocaleOption().GetValueString("PUBLISHER_LOGO_BGM",""), GetLocaleOption().GetValueString("PUBLISHER_LOGO_DRAWMODE","") ); rp::SGameScene* pCompanyScene = LoadMovie( pScenePlayer, "company_scene", GetLocaleOption().GetValueString("NFLAVOR_LOGO","company.jtv"), GetLocaleOption().GetValueString("NFLAVOR_LOGO_BGM","company.ogg"), GetLocaleOption().GetValueString("NFLAVOR_LOGO_DRAWMODE","") ); rp::SGameScene* pAddPublisherScene = LoadMovie( pScenePlayer, "additional_publisher_scene", GetLocaleOption().GetValueString("PUBLISHER2nd_LOGO",""), GetLocaleOption().GetValueString("PUBLISHER2nd_LOGO_BGM",""), GetLocaleOption().GetValueString("PUBLISHER2nd_LOGO_DRAWMODE","") ); rp::SGameScene* pCopyrightScene = LoadMovie( pScenePlayer, "copyright_scene", GetLocaleOption().GetValueString("COPYRIGHT",""), GetLocaleOption().GetValueString("COPYRIGHT_BGM",""), GetLocaleOption().GetValueString("COPYRIGHT_DRAWMODE","") ); /*if ( (ENV().GetString("country") == "CN")) // 중국 { rp::SGameImageScene* pSafetyNotieScene = new rp::SGameImageScene( *m_pSceneMgr , pScenePlayer , "chinese_safety_notice" , "chinese_safety_notice.jpg" , true ); pSafetyNotieScene->registerActor( *( new rp::SGameSceneLifeActor( 5000, 1500, 1500 ) ) ); pScenePlayer->addChild( pSafetyNotieScene ); }*/ if(pPublisherScene) pScenePlayer->addChild( pPublisherScene ); if(pCompanyScene) pScenePlayer->addChild( pCompanyScene ); if(pAddPublisherScene) pScenePlayer->addChild( pAddPublisherScene ); if(pCopyrightScene) pScenePlayer->addChild( pCopyrightScene ); m_pSceneMgr->addScene( *m_ScenePlayer ); m_ScenePlayer->activate(); m_bIntroStart = true; } void SGameLoad::DestroyMovie() { // SAFE_DELETE(m_pGameQJTV); SAFE_DELETE( m_pSceneMgr ); } void SGameLoad::SetResolution( int nWidth, int nHeight ) { int nHalfW = KUIWndManager::GetResolution().cx / 2; int nHalfH = KUIWndManager::GetResolution().cy * 3/4; // if( m_pLoaingTextOutWnd ) m_pLoaingTextOutWnd->rp::moPos( nHalfW - m_pLoaingTextOutWnd->GetRect().GetWidth()/2, nHalfH ); } void SGameLoad::Destroy() { DestroyMovie(); // SAFE_DELETE( m_pLoaingTextOutWnd ); m_ThreadManager.EndThread(); for( unsigned int i(0); m_vDelGameThreadList.size()>i; i++ ) delete m_vDelGameThreadList[i]; m_vDelGameThreadList.clear(); m_vGameThreadList.clear(); // SAFE_DELETE( m_pLogo ); // SAFE_DELETE( m_pModel1 ); } void SGameLoad::initLogoModel() { } void SGameLoad::destroyLogoModel() { } void SGameLoad::initLoadModel() { } void SGameLoad::destroyLoadModel() { } void SGameLoad::LoadGame( int nGameIndex ) { THREAD_SYNCRONIZE( &g_LoadCS ); _oprint( "SGameLoad::LoadGame\n" ); //쓰레드 버그 잡기 위함. // if( m_pLoaingTextOutWnd ) m_pLoaingTextOutWnd->Refresh(); //Thread Create SGameThread * pThread = new SGameThread( m_pGameMng, nGameIndex, m_pRenderDevice, m_pSoundMng, m_pTextureMng, m_pNX3Mng, m_pMSoundMgr ); m_bStopLogoIntroRender = false; m_vGameThreadList.push_back( pThread ); m_ThreadManager.Push( pThread ); // 스레드 시작s } bool SGameLoad::Render( KViewportObject *viewport ) { if( m_nStep == STEP_LOGO_LOBBY_SWAP ) { if( m_pSceneMgr ) { m_nStep = STEP_LOAD; m_ScenePlayer->activate( false ); return true; } } if (m_nStep == STEP_LOGINFAILED) { m_pViewPort->SetFillColor( KColor( 0, 0, 0, 255 ) ); return true; } if( GetActGameCount() > 0 ) { if( m_vGameThreadList.empty() ) return true; } if( m_nStep == STEP_COMPANY_WAIT || m_nStep == STEP_LOGO_WAIT || m_nStep == STEP_COMPANY || m_nStep == STEP_LOGO || m_nStep == STEP_ONETIME ) { m_pViewPort->SetFillColor( KColor( 0, 0, 0, 255 ) ); // if( m_pModel1 ) m_pModel1->Render( viewport ); } else if( m_nStep == STEP_LOAD ) { if( !m_bStopLogoIntroRender ) { // if( m_pModel1 ) m_pModel1->Render( viewport ); // if( m_pLoaingTextOutWnd ) m_pLoaingTextOutWnd->Render( viewport, true ); } } else if( m_nStep == STEP_LOGO_LOBBY ) { if( m_pSceneMgr ) { if( m_pMSoundMgr && m_bIntroStart ) { //m_pMSoundMgr->ForcePlayMusic( "logomaster.ogg" ); m_pViewPort->SetFillColor( KColor( 0, 0, 0, 255 ) ); m_bIntroStart = false; } m_pSceneMgr->render(viewport); } } return true; } void SGameLoad::ProcMsgAtStatic( SGameMessage* pGameMsg ) { switch( pGameMsg->nType ) { case IMSG_HOTKEY_EX: { SIMSG_HOTKEY_EX* pMsg = static_cast(pGameMsg); if( !pMsg->bUp ) { if( LOWORD(pMsg->wParam ) == VK_ESCAPE ) { if( m_pSceneMgr ) { rp::SGameSceneSeqPlayer* player = (rp::SGameSceneSeqPlayer* )m_ScenePlayer.get(); rp::SGameScene* publisherscene = player->getChildByName("publisher_scene"); if(publisherscene) { if(publisherscene->isActivated()) { publisherscene->activate(false); } } rp::SGameScene* companyscene = player->getChildByName("company_scene"); if(companyscene) { if(companyscene->isActivated()) { companyscene->activate(false); } } rp::SGameScene* additionalpublisherscene = player->getChildByName("additional_publisher_scene"); if(additionalpublisherscene) { if(additionalpublisherscene->isActivated()) { additionalpublisherscene->activate(false); } } rp::SGameScene* copyrightscene = player->getChildByName("copyright_scene"); if(copyrightscene) { if(copyrightscene->isActivated()) { copyrightscene->activate(false); } } rp::SGameScene* chinesesafetynotice = player->getChildByName("chinese_safety_notice"); if(chinesesafetynotice) { if(chinesesafetynotice->isActivated()) { chinesesafetynotice->activate(false); m_ScenePlayer->activate( false ); } } } } } } break; } } bool SGameLoad::IsActivated() { THREAD_SYNCRONIZE( &g_LoadCS ); //로딩중인 게임이 없으면 false return m_vGameThreadList.empty() ? false : true; } bool SGameLoad::IsOffJTVLogo() { return !m_ScenePlayer->isActivated(); }; bool SGameLoad::Process( DWORD time, unsigned long uProcessBitVector ) { THREAD_SYNCRONIZE( &g_LoadCS ); m_dwTime = time; if( m_nStep == STEP_LOGO_LOBBY_SWAP ) { if( m_bStopLogoIntroRender ) { m_nStep = STEP_LOAD; return false; } } //if (m_nStep == STEP_LOGINFAILED) // return false; if( m_vGameThreadList.empty() ) return false; if( m_nStep == STEP_COMPANY ) { // if ( m_pLogo == NULL ) initLogoModel(); if( m_dwStartTime == 0 ) { m_dwStartTime = time; } DWORD elapsed = time - m_dwStartTime; if ( elapsed > m_dwGapTime ) { //fade in 완료 m_dwStartTime = 0; m_nStep = STEP_COMPANY_WAIT; m_fVisibiity = 1.f; m_dwGapTime = LOGO_VIEW_TIME; return false; } else { m_fVisibiity = (float(elapsed) / m_dwGapTime); } // if( m_pLogo ) m_pLogo->SetVisibility(m_fVisibiity); } else if( m_nStep == STEP_COMPANY_WAIT ) { if( m_dwStartTime == 0 ) { m_dwStartTime = time; } else if( (time-m_dwStartTime)>=m_dwGapTime*2 ) { //대기 시간 완료 m_dwStartTime = 0; //m_nStep = STEP_LOGO; m_nStep = STEP_LOAD; // 바로 로드 m_fVisibiity = 1.f; m_dwGapTime = LOGO_VIEW_TIME; destroyLogoModel(); //if( m_pLogo ) m_pLogo->PlayAnimation( time, "logo_rapplercreer" ); return false; } DWORD elapsed = time - m_dwStartTime; if ( elapsed > m_dwGapTime ) { //fade Out m_fVisibiity = 1.f - (float(elapsed-m_dwGapTime) / m_dwGapTime); } // if( m_pLogo ) m_pLogo->SetVisibility(m_fVisibiity); } else if( m_nStep == STEP_LOGO ) { InitMovie(); m_nStep = STEP_LOGO_LOBBY; } else if( m_nStep == STEP_LOGO_WAIT ) { if( m_dwStartTime == 0 ) { m_dwStartTime = time; } else if( (time-m_dwStartTime)>=m_dwGapTime*2 ) { m_dwStartTime = 0; m_nStep = STEP_LOAD; m_fVisibiity = 1.f; m_dwGapTime = LOGO_VIEW_TIME; // destroyLoadModel(); return false; } DWORD elapsed = time - m_dwStartTime; if ( elapsed > m_dwGapTime ) { m_fVisibiity = 1.f - (float(elapsed-m_dwGapTime) / m_dwGapTime); } // if( m_pLogo ) m_pLogo->SetVisibility(m_fVisibiity); } else if( m_nStep == STEP_ONETIME ) { // if( m_pLogo ) m_pLogo->SetVisibility(m_fVisibiity); //Loading 끝났나 검사. if( !m_vGameThreadList.empty() ) { SGameThread * pThread = m_vGameThreadList[0]; if( pThread->IsFinished() ) { m_pLoadGame = pThread->GetLoadGame(); m_nStep = STEP_LOAD; return true; } } } else if( m_nStep == STEP_LOAD ) { //Loading 끝났나 검사. if( !m_vGameThreadList.empty() ) { SGameThread * pThread = m_vGameThreadList[0]; if( pThread->IsFinished() ) { m_bFirstLoad = false; destroyLoadModel(); m_pLoadGame = pThread->GetLoadGame(); if (m_pGameMng) //m_pGameMng->UpdateLoadingProgress(0.2f); m_pGameMng->UpdateAddLoadingProcess(0.2f); return true; } } } else if( m_nStep == STEP_LOGO_LOBBY ) { if( m_pSceneMgr ) m_pSceneMgr->tick( GetSafeTickCount() ); if( !m_vGameThreadList.empty() ) { SGameThread * pThread = m_vGameThreadList[0]; if( m_pSceneMgr && !m_ScenePlayer->isActivated() && pThread->IsFinished() ) { m_bFirstLoad = false; m_pLoadGame = pThread->GetLoadGame(); m_nStep = STEP_LOGO_LOBBY_SWAP; m_dwOldTime = 0; if( GetGameOption().GetAll_Mute() == 0 || GetGameOption().GetAll_Mute() == 1 ) { m_pMSoundMgr->SetSoundMute( GetGameOption().GetAll_Mute() ); if( !GetGameOption().GetAll_Mute() ) { m_pMSoundMgr->SetSfxMute( GetGameOption().GetSFX_Mute() ); m_pMSoundMgr->SetBgmMute( GetGameOption().GetBGM_Mute() ); m_pMSoundMgr->SetEnvMute( GetGameOption().GetENVS_Mute() ); } } return true; } } } return false; }