#include "stdafx.h" #include "SWorldLocationDB.h" #include #include "KTypes.h" #include #include #include #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; }