Files
2026-06-01 12:46:52 +02:00

270 lines
7.1 KiB
C++

#include "stdafx.h"
#include "SWorldLocationDB.h"
#include <Windows.h>
#include "KTypes.h"
#include <kfile/KStream.h>
#include <kfile/KFileManager.h>
#include <toolkit/XStringUtil.h>
#include "SkillBaseFile.h"
#include "ContentStruct.h"
#include "SDebug_Util.h"
WORLD_LOCATION_INFO::WORLD_LOCATION_INFO()
{
nWLocID = 0;
}
WORLD_LOCATION_INFO::~WORLD_LOCATION_INFO()
{
std::vector< WorldLocationBase* >::iterator iter = vWLocInfo.begin();
for( ; iter != vWLocInfo.end(); )
{
SAFE_DELETE( (*iter) );
iter = vWLocInfo.erase(iter);
}
}
WorldLocationBase* WORLD_LOCATION_INFO::GetFirst()
{
std::vector< WorldLocationBase* >::iterator iter = vWLocInfo.begin();
for( ; iter != vWLocInfo.end(); iter++ )
{
WorldLocationBase* pData = (*iter);
return pData;
}
return NULL;
}
WorldLocationBase* WORLD_LOCATION_INFO::Find( int nTimeID, int nWeatherID )
{
std::vector< WorldLocationBase* >::iterator iter = vWLocInfo.begin();
for( ; iter != vWLocInfo.end(); iter++ )
{
WorldLocationBase* pData = (*iter);
if( pData->time_id == nTimeID && pData->weather_id == nWeatherID )
return pData;
}
return NULL;
}
/// 2011.11.09 - prodongi
bool WORLD_LOCATION_INFO::getPreloadingDistance(int mapX, int mapY, int& preloadingDistance)
{
std::vector< WorldLocationBase* >::iterator iter = vWLocInfo.begin();
for( ; iter != vWLocInfo.end(); iter++ )
{
WorldLocationBase* pData = (*iter);
if (pData->x == mapX && pData->y == mapY)
{
preloadingDistance = pData->preloading_distance;
return true;
}
}
return false;
}
SWorldLocationDB* SWorldLocationDB::m_pThis = NULL;
SWorldLocationDB & GetWorldLocationDB()
{
if( NULL == SWorldLocationDB::m_pThis )
SWorldLocationDB::m_pThis = new SWorldLocationDB;
return *SWorldLocationDB::m_pThis;
// static SWorldLocationDB WorldLocationDB;
// return WorldLocationDB;
}
SWorldLocationDB::SWorldLocationDB()
{
Init();
}
SWorldLocationDB::~SWorldLocationDB()
{
Destroy();
}
void SWorldLocationDB::Init()
{
Load();
}
void SWorldLocationDB::Destroy()
{
WORLD_LOCATION_INFO* pWorldLocation = NULL;
bool res;
res = m_hashWorldLocation.get_first_value( pWorldLocation );
while ( res )
{
if ( pWorldLocation != NULL )
{
delete pWorldLocation;
}
res = m_hashWorldLocation.get_next_value( pWorldLocation );
}
m_hashWorldLocation.clear();
}
extern HWND g_hWnd;
void SWorldLocationDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_WorldLocation.rdb" );
if( !pRes ) return;
GAME_DB db_hdr;
pRes->Read( &db_hdr, sizeof(db_hdr) );
#ifdef _DEV_RDB_
// RDB 와 Header의 사이즈 비교.
int fileSize = pRes->Size() - ( STR_DATE_BUFFER + sizeof( int ) );
int headerSize = sizeof(WorldLocationBase) * db_hdr.nCount;
if( fileSize != headerSize )
{
char str[512] = { NULL, };
sprintf( str, "*** RDB Error !!! ***\n\n생성날짜%s\n파일:%s\n파일사이즈:%d\n헤더사이즈:%d\n ",
db_hdr.szDate,
__FILE__,
fileSize,
headerSize
);
::MessageBox( g_hWnd, str, "Error", MB_OK );
if( ::MessageBox( g_hWnd, "RDB와 클라이언트가 맞지않습니다. 강제종료하시겠습니까?", "Error", MB_YESNO ) == IDYES )
{
exit( 1 );
}
}
#endif
for( int i(0); db_hdr.nCount>i; i++ )
{
WorldLocationBase * pItem = new WorldLocationBase;
memset( pItem, 0, sizeof(WorldLocationBase) );
pRes->Read( pItem, sizeof(WorldLocationBase) );
WORLD_LOCATION_INFO* pFindItem = NULL;
if( m_hashWorldLocation.lookup( pItem->id, pFindItem ) == false )
{
pFindItem = new WORLD_LOCATION_INFO;
pFindItem->nWLocID = pItem->id;
pFindItem->vWLocInfo.push_back( pItem );
m_hashWorldLocation.add( pItem->id, pFindItem );
}
else
{
pFindItem->vWLocInfo.push_back( pItem );
}
}
KFileManager::Instance().DeleteStream( pRes );
}
const WorldLocationBase* SWorldLocationDB::GetWLData( int nID, int nTimeID, int nWeatherID )
{
WORLD_LOCATION_INFO* pFindItem = NULL;
if( m_hashWorldLocation.lookup( nID, pFindItem ) )
{
return pFindItem->Find( nTimeID, nWeatherID );
}
return NULL;
}
int SWorldLocationDB::GetWLTextID( int nID, bool bCheckApplyLocationName /*= true*/ )
{
WORLD_LOCATION_INFO* pFindItem = NULL;
if( m_hashWorldLocation.lookup( nID, pFindItem ) )
{
const WorldLocationBase* pWLB = pFindItem->GetFirst();
if( bCheckApplyLocationName )
{
if( pWLB && pWLB->apply_location_name ) //지역명 적용 여부
return pWLB->text_id;
}
else
{
if( pWLB )
return pWLB->text_id;
}
}
return -1;
}
void SWorldLocationDB::GetSkyColor( K3DColor& color_s, K3DColor& color_m, K3DColor& color_e, const WorldLocationBase* pData )
{
color_s.r = pData->sky_start_r; color_s.g = pData->sky_start_g; color_s.b = pData->sky_start_b; color_s.a = 255.0f;
color_m.r = pData->sky_mid_r; color_m.g = pData->sky_mid_g; color_m.b = pData->sky_mid_b; color_m.a = 255.0f;
color_e.r = pData->sky_end_r; color_e.g = pData->sky_end_g; color_e.b = pData->sky_end_b; color_e.a = 255.0f;
color_s /= 255.0f;
color_m /= 255.0f;
color_e /= 255.0f;
}
void SWorldLocationDB::GetFogColor( K3DColor& color, const WorldLocationBase* pData )
{
color.r = pData->fog_r; color.g = pData->fog_g; color.b = pData->fog_b; color.a = 255.0f;
color /= 255.0f;
}
void SWorldLocationDB::GetHeightLinear( K3DVector& vHeight, K3DVector& vLinear, const WorldLocationBase* pData )
{
vHeight.x = pData->v_start; vHeight.y = pData->v_end; vHeight.z = 0.0f;
vLinear.x = pData->h_start; vLinear.y = pData->h_end; vLinear.z = 0.0f;
}
void SWorldLocationDB::GetLightColor( K3DColor& color_s, K3DColor& color_a, K3DColor& color_d, const WorldLocationBase* pData )
{
color_s.r = pData->specular_r; color_s.g = pData->specular_g; color_s.b = pData->specular_b; color_s.a = 255.0f;
color_a.r = pData->ambient_r; color_a.g = pData->ambient_g; color_a.b = pData->ambient_b; color_a.a = 255.0f;
color_d.r = pData->diffuse_r; color_d.g = pData->diffuse_g; color_d.b = pData->diffuse_b; color_d.a = 255.0f;
color_s /= 255.0f;
color_a /= 255.0f;
color_d /= 255.0f;
}
void SWorldLocationDB::GetCloudColor( K3DColor& color, const WorldLocationBase* pData )
{
// color.r = pData->cloud_r; color.g = pData->cloud_g; color.b = pData->cloud_b; color.a = 255.0f;
// floyd 2009.3.26 구름 색깔중 알파값을 무조건 255로 세팅하던것을 제대로 반영되도록 수정
color.r = pData->cloud_r; color.g = pData->cloud_g; color.b = pData->cloud_b; color.a = pData->cloud_a;
color /= 255.0f;
}
// Aurora. bintitle.
void SWorldLocationDB::GetAurora( float & fAuroraTrans, float & fAuroraScale, float & fAuroraAngle, float & fAuroraHeight, const WorldLocationBase* pData )
{
if( pData )
{
fAuroraTrans = pData->aurora_t;
fAuroraScale = pData->aurora_s;
fAuroraAngle = pData->aurora_a;
fAuroraHeight = pData->aurora_h;
}
}
int SWorldLocationDB::getPreloadingDistance(int mapX, int mapY)
{
int preloadingDistance = 0;
WORLD_LOCATION_INFO* worldLocation = NULL;
bool res;
res = m_hashWorldLocation.get_first_value( worldLocation );
while ( res )
{
if (worldLocation)
{
if (worldLocation->getPreloadingDistance(mapX, mapY, preloadingDistance))
{
return preloadingDistance;
}
}
res = m_hashWorldLocation.get_next_value( worldLocation );
}
return 0;
}