Files
Client/Engine/Zalla3D Scene Class/AmbienceManager.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

515 lines
13 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.
// AmbienceManager.cpp: implementation of the CAmbienceManager class.
//
//////////////////////////////////////////////////////////////////////
#include "BaseGraphicsLayer.h"
#include "SceneManager.h"
#include "SoundMgr.h"
#include "AmbienceManager.h"
#include "BgmManager.h"
#include "GMMemory.h"
//#define AMB_GAP 0.005
CAmbienceManager* CAmbienceManager::ms_pInstance = NULL;
struct TESTSCREEN_VERTEX
{
float x, y, z, rhw;
float u, v;
};
CAmbienceManager* CAmbienceManager::_GetInstance()
{
if( ms_pInstance == NULL )
{ ms_pInstance = new CAmbienceManager; }
return ms_pInstance;
}
CAmbienceManager::CAmbienceManager()
{
}
CAmbienceManager::~CAmbienceManager()
{
}
void CAmbienceManager::_Destroy()
{
if( ms_pInstance ) ms_pInstance->ReleaseAllData();
SAFE_DELETE( ms_pInstance );
}
void CAmbienceManager::Create( bool bTestMode )
{
m_bTestMode = bTestMode;
if( m_bTestMode )
{
m_pAmbTexture = NULL;
m_bTestShow = false;
m_ptFont= new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD );
m_ptFont->InitDeviceObjects( BaseGraphicsLayer::GetDevice() );
m_ptFont->RestoreDeviceObjects();
D3DXCreateSprite( BaseGraphicsLayer::GetDevice(), &m_pMouseArrow );
D3DXCreateTextureFromFileEx( BaseGraphicsLayer::GetDevice(), "MouseArrow.bmp",
D3DX_DEFAULT,
D3DX_DEFAULT, 1, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE,
D3DX_FILTER_NONE, 0xff000000, NULL, NULL,
&m_pArrowTexture );
}
m_pSectorAmbMap = new CSectorAmbienceMap;
m_bFadeIn = false;
m_bFadeOut = false;
m_fFadeInVolume = 0.0f;
m_fFadeOutVolume = 0.0f;
strcpy( m_strFadeInFileName, "" );
strcpy( m_strFadeOutFileName, "" );
strcpy( m_strOldFile, "" );
m_bAmbPlay = false;
strcpy( m_strAmbPlayFile, "" );
m_fAmbVolume =0.0f;
m_fMasterVolume = 1.0f;
m_pCurSchedule = NULL;
}
void CAmbienceManager::ReleaseAllData()
{
SAFE_DELETE( m_pSectorAmbMap );
if( m_bTestMode )
{
SAFE_RELEASE( m_pAmbTexture );
SAFE_RELEASE( m_pMouseArrow );
SAFE_RELEASE( m_pArrowTexture );
delete m_ptFont;
}
}
void CAmbienceManager::Update( D3DXVECTOR3& Pos, float fSkip, bool bCharSel )
{
int SectorX, SectorY;
SectorAmbience* pInfo=NULL;
float fVolume;
D3DVECTOR vPoint;
DWORD dwMode;
char* strPlayFile;
float fVolumeGap = 0.01f;
SectorX = (int)(Pos.x / SECTORSIZE);
SectorY = (int)(Pos.z / SECTORSIZE);
pInfo = m_pSectorAmbMap->GetSectorAmbience( SectorX, SectorY );
if( pInfo && !bCharSel)
{
bool bPlay = GetAmbienceInfo( pInfo, Pos, strPlayFile, vPoint, fVolume, dwMode );
if( CBgmManager::_GetInstance()->IsCurBgmTurnAmbEvent() ||
CSceneManager::ms_pSceneEventMgr->m_bEventMusic )
{
bPlay = false;
}
/*
if( m_bTestMode )
{
if( bPlay )
{
m_ptFont->DrawText( 2, 175, D3DCOLOR_ARGB(255,255,255,0), "AmbienceOn" );
if( strPlayFile ) m_ptFont->DrawText( 2, 200, D3DCOLOR_ARGB(255,255,255,0), strPlayFile );
char buf[MAX_PATH];
sprintf( buf, "%f, %f, %f", vPoint.x, vPoint.y, vPoint.z );
m_ptFont->DrawText( 2, 225, D3DCOLOR_ARGB(255,255,255,0), buf );
sprintf( buf, "VOLUME:%f", fVolume );
m_ptFont->DrawText( 2, 250, D3DCOLOR_ARGB(255,255,255,0), buf );
}
}
*/
CStreamingSound3D* pSound3D;
if( bPlay )
{
PlayAmbience( strPlayFile, vPoint, fVolume, dwMode );
RandomPlaySound();
}
if( m_bFadeIn )
{
m_fFadeInVolume += fVolumeGap;
if( m_fFadeInVolume >= fVolume )
{
m_bFadeIn = false;
}
CSoundMgr::_GetInstance()->GetStreamingSound3D( pSound3D, m_strFadeInFileName );
pSound3D->SetVolume( m_fFadeInVolume*m_fMasterVolume );
}
else if( bPlay )
{
CSoundMgr::_GetInstance()->GetStreamingSound3D( pSound3D, m_strFadeInFileName );
pSound3D->SetVolume( fVolume*m_fMasterVolume );
m_fAmbVolume = fVolume;
}
if( m_bFadeOut )
{
m_fFadeOutVolume -= fVolumeGap;
CSoundMgr::_GetInstance()->GetStreamingSound3D( pSound3D, m_strFadeOutFileName );
if( m_fFadeOutVolume >= 0.0f ) pSound3D->SetVolume( m_fFadeOutVolume*m_fMasterVolume );
if( m_fFadeOutVolume <= 0.0f )
{
m_bFadeOut = false;
pSound3D->Stop();
}
}
static float fAmbVolume=0.0f;
static bool bInit = false;
if( !bPlay && m_bAmbPlay )
{
if( !bInit )
{
fAmbVolume = m_fAmbVolume;
bInit = true;
}
fAmbVolume -= fVolumeGap;
CSoundMgr::_GetInstance()->GetStreamingSound3D( pSound3D, m_strAmbPlayFile );
if( fAmbVolume <= 0.0f )
{
pSound3D->Stop();
m_bAmbPlay = false;
bInit = false;
strcpy( m_strOldFile, "" );
}
else pSound3D->SetVolume( fAmbVolume*m_fMasterVolume );
}
//if( m_bTestMode ) TestScreen( Pos );
}
}
void CAmbienceManager::LoadTexture( SectorAmbience* pInfo )
{
static SectorAmbience* pOldInfo = pInfo;
static bool bOnce = false;
if( !bOnce )
{
SAFE_RELEASE(m_pAmbTexture);
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_pAmbTexture );
bOnce = true;
}
if( pOldInfo->iSectorX != pInfo->iSectorX || pOldInfo->iSectorY != pInfo->iSectorY )
{
pOldInfo = pInfo;
SAFE_RELEASE(m_pAmbTexture);
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_pAmbTexture );
}
}
void CAmbienceManager::PlayAmbience( char* strFile, D3DVECTOR vPos, float fVol, DWORD dwMode )
{
static CStreamingSound3D* pSound3D;
if( strcmp(m_strOldFile, strFile) != 0 )
{
m_bFadeIn = true;
strcpy( m_strFadeInFileName, strFile );
m_fFadeInVolume = 0.0f;
m_bAmbPlay = true;
strcpy( m_strAmbPlayFile, strFile );
if( strlen(m_strOldFile) )
{
m_bFadeOut = true;
strcpy( m_strFadeOutFileName, m_strOldFile );
CSoundMgr::_GetInstance()->GetStreamingSound3D( pSound3D, m_strOldFile );
pSound3D->GetVolume( m_fFadeOutVolume );
}
CSoundMgr::_GetInstance()->GetStreamingSound3D( pSound3D, strFile );
strcpy( m_strOldFile, strFile );
pSound3D->SetPosition( vPos );
pSound3D->SetVolume( 0.0f );
pSound3D->SetMode( dwMode );
pSound3D->SetLooping( true );
pSound3D->Play();
}
}
bool CAmbienceManager::GetAmbienceInfo( SectorAmbience* pinInfo, D3DXVECTOR3& inPos, char*& outStrFile,
D3DVECTOR& outPos, float& outVol, DWORD& outMode )
{
int LockPosX, LockPosY;
GetTextureLockPos( LockPosX, LockPosY, inPos );
if( m_bTestMode ) LoadTexture( pinInfo );
vector<AmbienceInfo*>::iterator iter;
for( iter = pinInfo->AmbInfoList.begin(); iter != pinInfo->AmbInfoList.end(); iter++ )
{
DWORD AmbColor = pinInfo->ColorTable[LockPosY][LockPosX] & 0x00ffffff;
if( AmbColor == (*iter)->dwColor || AmbColor == (*iter)->dwPointColor )
{
//1.ã<><C3A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><E5B0A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>´<EFBFBD>.
int PointNum = (*iter)->AmbPointList.size();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD>
if( PointNum == 0 )
{
outMode = MODE_DISABLE;
}
else
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>´<EFBFBD>. HeadPoint<6E><74> <20><><EFBFBD><EFBFBD>
D3DXVECTOR3 HeadPoint;
float OldLength;
D3DXVECTOR3 Point;
D3DXVECTOR3 Dist;
float length;
for( int i = 0; i < PointNum; i++ )
{
Point = *((*iter)->AmbPointList[i]);
Dist = inPos - Point;
length = D3DXVec3Length( &Dist );
if(!i)
{
OldLength = length;
HeadPoint = Point;
}
if( OldLength >= length && i )
{
OldLength = length;
HeadPoint = Point;
}
}
outPos = HeadPoint; // HeadPoint <20>̰<EFBFBD><CCB0><EFBFBD> <20><><EFBFBD><EFBFBD><E5B0A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ǥ
outMode = MODE_NORMAL;
}
//2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
float fCurTime = CSceneManager::m_WeatherManager.m_fWeatherTime;
outStrFile = NULL;
// edith 2009.05.05 AMB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( fCurTime >= 6.0f && fCurTime < 18.0f )
{
m_pCurSchedule = (*iter)->ScheduleList[0];
outStrFile = m_pCurSchedule->strFilename;
}
else if( (*iter)->ScheduleList.size() > 1 )
{
m_pCurSchedule = (*iter)->ScheduleList[1];
outStrFile = m_pCurSchedule->strFilename;
}
/*
for( int i = 0; i < (int)((*iter)->ScheduleList.size()); i++ )
{
pSchedule = (*iter)->ScheduleList[i];
m_pCurSchedule = pSchedule;
if( fCurTime >= pSchedule->fStartTime && fCurTime <= pSchedule->fEndTime )
{
outStrFile = pSchedule->strFilename;
break;
}
else
{
outStrFile = NULL;
}
}
*/
if( outStrFile == NULL ) return false;
//3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>İ<EFBFBD><C4B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
DWORD Volume = pinInfo->ColorTable[LockPosY][LockPosX];
Volume = Volume>>24;
outVol = (float)Volume;
outVol = outVol/255.0f; //<2F>ּ<EFBFBD><D6BC><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 ~ 1
if( outVol > 1.0f ) outVol = 1.0f;
if( outVol < 0.0f ) outVol = 0.0f;
return true;
}
}
return false;
}
void CAmbienceManager::GetTextureLockPos( int& outX, int& outY, D3DXVECTOR3 inPos )
{
float Magnification = (float)SECTORSIZE / (float)AMB_TEXTURESIZE;
outX = (int)inPos.x % SECTORSIZE;
outY = (int)inPos.z % SECTORSIZE;
outX = (float)outX / Magnification;
outY = (float)outY / Magnification;
outY = AMB_TEXTURESIZE - outY -1; //Convert Texture LockPos
}
void CAmbienceManager::TestScreen( D3DXVECTOR3 Pos )
{
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 );
pd3dDevice->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
pd3dDevice->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
D3DVIEWPORT8 TempViewport;
pd3dDevice->GetViewport( &TempViewport );
float center = TempViewport.Width - 128;
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 = 128.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 = 128.0f;
pVertex[2].z = 0.0f;
pVertex[2].rhw = 1.0f;
pVertex[2].u = 0.0f;
pVertex[2].v = 1.0f;
pVertex[3].x = 128.0f + center;
pVertex[3].y = 128.0f;
pVertex[3].z = 0.0f;
pVertex[3].rhw = 1.0f;
pVertex[3].u = 1.0f;
pVertex[3].v = 1.0f;
int LockPosX, LockPosY;
GetTextureLockPos( LockPosX, LockPosY, Pos );
pd3dDevice->SetTexture( 0, m_pAmbTexture );
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 );
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȭ<><C8AD>ǥ<EFBFBD>׸<EFBFBD><D7B8><EFBFBD><E2A4BE><EFBFBD><EFBFBD>
RECT rect__;
SetRect( &rect__, 0, 0, 16, 16 );
D3DXMATRIX mat;
D3DXMatrixTranslation( &mat, LockPosX+center, LockPosY, 0 );
m_pMouseArrow->DrawTransform( m_pArrowTexture, &rect__, &mat, 0xffffffff );
}
void CAmbienceManager::AllStop()
{
m_bFadeIn = false;
m_bFadeOut = false;
m_fFadeInVolume = 0.0f;
m_fFadeOutVolume = 0.0f;
strcpy( m_strFadeInFileName, "" );
strcpy( m_strFadeOutFileName, "" );
strcpy( m_strOldFile, "" );
m_bAmbPlay = false;
strcpy( m_strAmbPlayFile, "" );
m_fAmbVolume =0.0f;
m_fMasterVolume = 1.0f;
CSoundMgr::_GetInstance()->AllStopStreamingSound3D();
}
void CAmbienceManager::RandomPlaySound()
{
if( m_pCurSchedule->iRandSndCycle < 0 ) return;
static DWORD dwOldTime;
static DWORD dwCurTime;
dwCurTime = GetTickCount();
if( dwCurTime - dwOldTime > (DWORD) m_pCurSchedule->iRandSndCycle * 1000 )
{
if(m_pCurSchedule->RandomSndList.empty())
return;
char* strRndSndFile = m_pCurSchedule->RandomSndList[rand()%m_pCurSchedule->RandomSndList.size()];
char ext[_MAX_EXT];
_splitpath( strRndSndFile, NULL, NULL, NULL, ext );
dwOldTime = dwCurTime;
char tempBuf[256];
sprintf( tempBuf, "%s%s", AMBIENCEPATH, strRndSndFile );
if( !strcmp(ext, ".ogg") )
{
CStreamingSound* pStream;
CSoundMgr::_GetInstance()->GetStreamingSound( pStream, tempBuf );
pStream->Play();
pStream->SetVolume( m_fMasterVolume );
}
else
{
CSound* pSound;
CSoundMgr::_GetInstance()->GetSound( pSound, tempBuf, 1 );
pSound->Play();
pSound->SetVolume( m_fMasterVolume );
}
}
}