Files
Client/Engine/Zalla3D Scene Class/BgmManager.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

543 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// BgmManager.cpp: implementation of the CBgmManager class.
//
//////////////////////////////////////////////////////////////////////
#include "BaseGraphicsLayer.h"
#include "SceneManager.h"
#include "BgmManager.h"
#include "SoundMgr.h"
#include "GMMemory.h"
//#define VOLUME_GAP 0.005
CBgmManager* CBgmManager::ms_pInstance = NULL;
struct TESTSCREEN_VERTEX
{
float x, y, z, rhw;
float u, v;
};
CBgmManager::CBgmManager()
{
}
CBgmManager::~CBgmManager()
{
}
CBgmManager* CBgmManager::_GetInstance()
{
if( ms_pInstance == NULL ) { ms_pInstance = new CBgmManager; }
return ms_pInstance;
}
void CBgmManager::_Destroy()
{
if( ms_pInstance ) ms_pInstance->ReleaseAllData();
SAFE_DELETE( ms_pInstance );
}
void CBgmManager::Create( bool bTestMode )
{
m_bTestMode = bTestMode;
if( m_bTestMode )
{
m_pBGMTexture = NULL;
m_bTestShow = false;
}
m_Trigger.Create();
m_bInPlace = false;
m_fBgmVol = 0.0f;
m_fMasterVolume = 1.0f;
m_ePlaceStat = BS_ZERO;
m_eBgmStat = BS_ZERO;
memset( m_strCurBgm, 0, sizeof(m_strCurBgm) );
m_bBgmTurnEvent = false;
m_bActivate = true;
m_bActBGM = FALSE;
}
void CBgmManager::ReleaseAllData()
{
m_Trigger.Destroy();
if( m_bTestMode )
{
SAFE_RELEASE( m_pBGMTexture );
}
}
static char strOldFile[MAX_PATH];
static CStreamingSound* g_pSound = NULL;
void CBgmManager::Update( D3DXVECTOR3& Pos, float fSkip, bool bCharSel)
{
int SectorX, SectorY;
PerSectorTriggerInfo* pInfo=NULL;
GetSectorXYFromPos( SectorX, SectorY, Pos );
pInfo = m_Trigger.GetTrigger( SectorX, SectorY );
static int EventKey;
static DWORD EventColor;
static char* strFile;
static char* strESF;
bool bPossible=false;
m_EventTable.Update();
float fVolumeGap = 0.01f;
if(m_bActBGM && g_pSound)
g_pSound->SetVolume( m_fMasterVolume );
if( pInfo )
{
bPossible = GetBGMEventInfo( Pos, pInfo, strFile, EventKey, strESF, EventColor);
if( bPossible && !bCharSel && EventKey != EK_CAMP_UNCREATE)
{
if(strlen(strESF) > 0 && m_EventColor != EventColor)
{
m_EventColor = EventColor;
// edith 2008.01.26 <20><><EFBFBD><EFBFBD><EFBFBD>彺ũ<E5BDBA><C5A9>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CEffScript* test_script = new CEffScript;
test_script->GetScriptBinData(strESF);// "inter_interface-type-keyboard.esf"
test_script->m_InterfacePos[0] = (float)CSceneManager::m_ScreenWidth / 2.0f;
test_script->m_InterfacePos[1] = (float)CSceneManager::m_ScreenHeight / 5.0f;
CSceneManager::m_EffectManager.AddInterfaceScript(test_script);
}
bPossible = !CSceneManager::ms_pSceneEventMgr->m_bEventMusic;
}
else
m_EventColor = 0;
if( bPossible )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
if(EventKey == EK_NOTBGM_SAFE || EventKey >= EK_ESF_SAFE)
{
StopBGM();
return;
}
m_fBgmVol += fVolumeGap;
m_eBgmStat = BS_BGM_PLAY;
}
else
{
AGAIN:
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
if(EventKey == EK_NOTBGM_SAFE || EventKey >= EK_ESF_SAFE)
{
StopBGM();
return;
}
m_fBgmVol -= fVolumeGap;
if( m_fBgmVol <= 0.0f && m_eBgmStat == BS_BGM_PLAY )
{
m_EventColor = 0;
StopBGM();
}
}
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
if(EventKey == EK_NOTBGM_SAFE || EventKey >= EK_ESF_SAFE)
return;
if( m_fBgmVol > 1.0f ) m_fBgmVol = 1.0f;
if( m_fBgmVol < 0.0f ) m_fBgmVol = 0.0f;
if( m_eBgmStat == BS_BGM_PLAY )
{
PlayBGM( strFile, EventKey );
}
}
else if( m_fBgmVol > 0.0f )
{
goto AGAIN;
}
}
void CBgmManager::GetSectorXYFromPos( int& outX , int& outY, D3DXVECTOR3 inPos )
{
outX = (int)(inPos.x / SECTORSIZE);
outY = (int)(inPos.z / SECTORSIZE);
}
void CBgmManager::GetTextureLockPosFromPos( int& outX, int& outY, D3DXVECTOR3 inPos )
{
float Magnification = (float)SECTORSIZE / (float)BGM_TEXTURESIZE;
outX = (int)inPos.x % SECTORSIZE;
outY = (int)inPos.z % SECTORSIZE;
outX = (float)outX / Magnification;
outY = (float)outY / Magnification;
outY = BGM_TEXTURESIZE - outY -1; //Convert Texture LockPos
}
bool CBgmManager::GetBGMEventInfo( D3DXVECTOR3 inPos,
PerSectorTriggerInfo* pinInfo, char*& outStrFile, int& outEventKey, char*& outESFFile, DWORD& outEventColor)
{
int LockPosX, LockPosY;
GetTextureLockPosFromPos( LockPosX, LockPosY, inPos );
if( m_bTestMode ) LoadTexture( pinInfo );
vector<DWORD>::iterator iter;
int index = 0;
DWORD BgmColor = pinInfo->ColorTable[LockPosY][LockPosX] & 0x00ffffff;
m_EventTable.dwColor = pinInfo->ColorTable[LockPosY][LockPosX];
DWORD ColorT;
for( iter = pinInfo->BGMColorKeyList.begin(); iter != pinInfo->BGMColorKeyList.end(); iter++ )
{
ColorT = (*iter);
if( BgmColor == ColorT )
{
outStrFile = pinInfo->BGMFileList[index];
m_EventTable.nEvent = outEventKey = pinInfo->EventKeyList[index];
outEventColor = pinInfo->BGMColorKeyList[index];
outESFFile = pinInfo->ESFFileList[index];
return true;
}
index ++;
}
return false;
}
void CBgmManager::LoadTexture( PerSectorTriggerInfo* pInfo )
{
static PerSectorTriggerInfo* pOldInfo = pInfo;
static bool bOnce = false;
if( !bOnce )
{
D3DXCreateTextureFromFileEx( BaseGraphicsLayer::GetDevice(), pInfo->strTexFilename,
D3DX_DEFAULT,
D3DX_DEFAULT, 1, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE,
D3DX_FILTER_NONE, 0x00000000, NULL, NULL,
&m_pBGMTexture );
bOnce = true;
}
if( pOldInfo->iSectorX != pInfo->iSectorX || pOldInfo->iSectorY != pInfo->iSectorY )
{
pOldInfo = pInfo;
SAFE_RELEASE( m_pBGMTexture );
D3DXCreateTextureFromFileEx( BaseGraphicsLayer::GetDevice(), pInfo->strTexFilename,
D3DX_DEFAULT,
D3DX_DEFAULT, 1, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE,
D3DX_FILTER_NONE, 0x00000000, NULL, NULL,
&m_pBGMTexture );
}
}
void CBgmManager::StopBGM()
{
if(m_eBgmStat == BS_BGM_STOP)
return;
m_eBgmStat = BS_BGM_STOP;
m_ePlaceStat = BS_PLACE_OUT;
if(strlen(strOldFile) == 0)
return;
CStreamingSound* pSound;
CSoundMgr::_GetInstance()->GetStreamingSound( pSound, strOldFile );
if(pSound)
pSound->Stop();
m_bBgmTurnEvent = false;
strcpy( strOldFile, "" );
}
void CBgmManager::PlayBGM( char* strFilename, int EventKey, BOOL bAct )
{
static bool bOnce = false;
m_bActBGM = bAct;
if( !bOnce )
{
CSoundMgr::_GetInstance()->GetStreamingSound( g_pSound, strFilename );
if(!g_pSound)
return;
switch( EventKey )
{
case EK_BGM_ONCE_SAFE:
case EK_BGM_ONCE_UNSAFE:
{
g_pSound->SetLooping( false );
}
break;
case EK_BGM_TURN_AMB_SAFE:
case EK_BGM_TURN_AMB_UNSAFE:
{
g_pSound->SetLooping( false );
strcpy( m_strCurBgm, strFilename );
m_bBgmTurnEvent = true;
}
break;
case EK_BGM_LOOP_SAFE:
case EK_BGM_LOOP_UNSAFE:
{
g_pSound->SetLooping( true );
}
break;
}
strcpy( strOldFile, strFilename );
g_pSound->SetVolume( m_fBgmVol*m_fMasterVolume );
g_pSound->Play();
bOnce = true;
m_ePlaceStat = BS_PLACE_IN;
}
if( strcmp(strOldFile, strFilename) != 0 )
{
// strOldFile <20><> StopBGM <20><> ȣ<><C8A3><EFBFBD>Ǹ<EFBFBD> NULL <20>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. <20><><EFBFBD><20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
if(strlen(strOldFile) != 0)
{
CSoundMgr::_GetInstance()->GetStreamingSound( g_pSound, strOldFile );
if(!g_pSound)
return;
g_pSound->Stop();
m_bBgmTurnEvent = false;
}
CSoundMgr::_GetInstance()->GetStreamingSound( g_pSound, strFilename );
if(!g_pSound)
return;
switch( EventKey )
{
case EK_BGM_TURN_AMB_SAFE:
case EK_BGM_TURN_AMB_UNSAFE:
{
m_bBgmTurnEvent = true;
g_pSound->SetLooping( false );
strcpy( m_strCurBgm, strFilename );
}
break;
case EK_BGM_ONCE_SAFE:
case EK_BGM_ONCE_UNSAFE:
{
g_pSound->SetLooping( false );
}
break;
case EK_BGM_LOOP_SAFE:
case EK_BGM_LOOP_UNSAFE:
{
g_pSound->SetLooping( true );
}
break;
}
strcpy( strOldFile, strFilename );
g_pSound->SetVolume( m_fBgmVol*m_fMasterVolume );
g_pSound->Play();
m_ePlaceStat = BS_PLACE_IN;
}
if( strcmp(strOldFile, strFilename) == 0 && m_ePlaceStat == BS_PLACE_OUT )
{
m_ePlaceStat = BS_PLACE_IN;
CSoundMgr::_GetInstance()->GetStreamingSound( g_pSound, strFilename );
if(!g_pSound)
return;
switch( EventKey )
{
case EK_BGM_TURN_AMB_SAFE:
case EK_BGM_TURN_AMB_UNSAFE:
{
m_bBgmTurnEvent = true;
g_pSound->SetLooping( false );
strcpy( m_strCurBgm, strFilename );
}
break;
case EK_BGM_ONCE_SAFE:
case EK_BGM_ONCE_UNSAFE:
{
g_pSound->SetLooping( false );
}
break;
case EK_BGM_LOOP_SAFE:
case EK_BGM_LOOP_UNSAFE:
{
g_pSound->SetLooping( true );
}
break;
}
strcpy( strOldFile, strFilename );
g_pSound->SetVolume( m_fBgmVol*m_fMasterVolume );
g_pSound->Play();
}
if(!g_pSound)
return;
g_pSound->SetVolume( m_fBgmVol*m_fMasterVolume );
}
void CBgmManager::TestScreen( D3DXVECTOR3 Pos )
{
if( !m_bTestShow ) return;
LPDIRECT3DDEVICE8 pd3dDevice = BaseGraphicsLayer::GetDevice();
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
pd3dDevice->SetVertexShader( D3DFVF_XYZRHW | D3DFVF_TEX1 );
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
D3DVIEWPORT8 TempViewport;
pd3dDevice->GetViewport( &TempViewport );
float center = TempViewport.Width - 300;
TESTSCREEN_VERTEX pVertex[4];
pVertex[0].x = center;
pVertex[0].y = 0;
pVertex[0].z = 0.0f;
pVertex[0].rhw = 1.0f;
pVertex[0].u = 0.0f;
pVertex[0].v = 0.0f;
pVertex[1].x = 300.0f + center;
pVertex[1].y = 0;
pVertex[1].z = 0.0f;
pVertex[1].rhw = 1.0f;
pVertex[1].u = 1.0f;
pVertex[1].v = 0.0f;
pVertex[2].x = center;
pVertex[2].y = 300.0f;
pVertex[2].z = 0.0f;
pVertex[2].rhw = 1.0f;
pVertex[2].u = 0.0f;
pVertex[2].v = 1.0f;
pVertex[3].x = 300.0f + center;
pVertex[3].y = 300.0f;
pVertex[3].z = 0.0f;
pVertex[3].rhw = 1.0f;
pVertex[3].u = 1.0f;
pVertex[3].v = 1.0f;
pd3dDevice->SetTexture( 0, m_pBGMTexture );
pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertex, sizeof(TESTSCREEN_VERTEX) );
//Set things back to normal
pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
pd3dDevice->SetRenderState( D3DRS_FOGENABLE, TRUE );
}
void CBgmManager::AllStop()
{
m_bInPlace = false;
m_fBgmVol = 0.0f;
m_ePlaceStat = BS_ZERO;
m_eBgmStat = BS_ZERO;
CSoundMgr::_GetInstance()->AllStopStreamingSound();
}
bool CBgmManager::IsSafetyZone( D3DXVECTOR3& Pos )
{
int SectorX, SectorY;
PerSectorTriggerInfo* pInfo=NULL;
GetSectorXYFromPos( SectorX, SectorY, Pos );
pInfo = m_Trigger.GetTrigger( SectorX, SectorY );
if( pInfo )
{
// DWORD ColorKey;
int LockPosX, LockPosY;
GetTextureLockPosFromPos( LockPosX, LockPosY, Pos );
DWORD BgmColor = pInfo->ColorTable[LockPosY][LockPosX] & 0x00ffffff;
for( size_t i = 0; i < pInfo->BGMColorKeyList.size(); ++i )
{
// ColorKey = pInfo->BGMColorKeyList[i];
if( BgmColor == pInfo->BGMColorKeyList[i] )
{
switch( pInfo->EventKeyList[i] )
{
case EK_BGM_LOOP_SAFE:
case EK_BGM_ONCE_SAFE:
case EK_NOTBGM_SAFE:
case EK_BGM_TURN_AMB_SAFE:
case EK_ESF_SAFE:
return true;
default:
return false;
}
}
}
return false;
}
return false;
}
bool CBgmManager::IsCurBgmTurnAmbEvent()
{
if( m_bBgmTurnEvent )
{
CStreamingSound* pSound;
CSoundMgr::_GetInstance()->GetStreamingSound( pSound, m_strCurBgm );
return pSound->IsPlaying();
}
return false;
}
void CBgmManager::SetActivate( bool bAct )
{
m_bActivate = bAct;
if( bAct == false )
m_fMasterVolume = 0.0f;
}