Files
Leviathan/Client/Game/game/Main/SGameLoad.cpp
T
2026-06-01 12:46:52 +02:00

634 lines
15 KiB
C++

#include "stdafx.h"
#include "SGameLoad.h"
#include "KSeqModel.h"
#include "SGameMessage.h"
#include "SGameViewport.h"
#include <toolkit/XStringUtil.h>
#include <toolkit/ILock.h>
#include "KRenderDeviceDX.h"
#include "SGameManager.h"
#include "SGameSound.h"
#include "SGameOption.h"
#include <toolkit/XEnv.h>
#include "SUIDefine.h"
#include "SUITopConsoleWnd.h"
//#include "QJTVObj.h"
//#include "SGameQJTV.h"
#include "SGameMilesSoundMgr.h"
#include "KDeviceManager.h"
#include <kfile/KFileManager.h>
#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<SIMSG_HOTKEY_EX*>(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;
}