#include "SunClientPrecompiledHeader.h" #include "resourcemanager.h" #include "ItemUnitCacher.h" #include "MapUnitCacher.h" #include "MapInfoParser.h" #include "ItemInfoParser.h" #include "NPCInfoParser.h" #include "skillinfoparser.h" #include "styleinfoparser.h" #include "HeroVariationInfoParser.h" #include "GraphicResourceList.h" #include "GameFrameWork.h" #include "LoadScene.h" #include "GlobalFunc.h" #include "AppearanceResourceCode.h" #include "LimitedItemInfoParser.h" const DWORD ENGINE_RESOURCE_ID_OFFSET = 100000; const DWORD SCRIPT_RESOURCE_ID_OFFSET = 8000000; ResourceManager::ResourceManager() { m_pResourceCacher = NULL; } ResourceManager::~ResourceManager() { assert( NULL == m_pResourceCacher ); } VOID ResourceManager::Init() { assert( NULL == m_pResourceCacher ); m_pResourceCacher = new ResourceCacher; m_pResourceCacher->Init(); } void ResourceManager::LastFree() { } VOID ResourceManager::Release() { SAFE_DELETE( m_pResourceCacher ); } void ResourceManager::IncreaseResourceRefCount(RESOURCECODE code) { if( RESOURCE_INFO *pInfo = GraphicResourceList::Instance()->GetItemInfo((CODETYPE)(code - ENGINE_RESOURCE_ID_OFFSET)) ) { pInfo->dwTotalRefCount++; } } CWzUnitDraw * ResourceManager::AllocResourceUnitDraw( RESOURCECODE code ,float fRequestRateResizeTexture, bool bFreeAll /*=true*/, bool is_npc) { assert(code >= ENGINE_RESOURCE_ID_OFFSET); IncreaseResourceRefCount(code); CWzUnit *pUnit = m_pResourceCacher->GetResourceWzUnit( code ,fRequestRateResizeTexture, false, bFreeAll, is_npc); if (pUnit) { if( CWzUnitDraw* pUnitDraw = (CWzUnitDraw *)Func_ContactWzd( CW_NEW_WZUNITDRAW, 0 ) ) { pUnitDraw->SetWzUnit( pUnit , FALSE); return pUnitDraw; } } return NULL; } CWzUnit * ResourceManager::AllocResourceUnit( RESOURCECODE code) { assert(code >= ENGINE_RESOURCE_ID_OFFSET); IncreaseResourceRefCount(code); if( CWzUnit* pUnit = m_pResourceCacher->GetResourceWzUnit( code ,-1.0f, false, true) ) { return pUnit; } return NULL; } VOID ResourceManager::FreeResourceUnit( RESOURCECODE code) { m_pResourceCacher->ReleaseResourceWzUnit(code); } VOID ResourceManager::PreLoadResource( RESOURCECODE code ,float fRequestRateResizeTexture) { if( RESOURCE_INFO* pInfo = GraphicResourceList::Instance()->GetItemInfo((CODETYPE)(code - ENGINE_RESOURCE_ID_OFFSET)) ) { if(0 == pInfo->dwTotalRefCount) pInfo->dwTotalRefCount = 1; } m_pResourceCacher->GetResourceWzUnit( code ,fRequestRateResizeTexture, true); } VOID ResourceManager::FreeResourceUnitDraw( CWzUnitDraw * pUnitDraw ) { if (pUnitDraw && pUnitDraw->GetWzUnit()) { RESOURCECODE code = pUnitDraw->GetWzUnit()->GetType(); g_pSunRenderer->DestroyResourceForWzUnitDraw(pUnitDraw); Func_ContactWzd( CW_DELETE_WZUNITDRAW, pUnitDraw ); m_pResourceCacher->ReleaseResourceWzUnit(code); } } VOID ResourceManager::FreeResourceUnitDrawVer2( CWzUnitDraw * pUnitDraw, bool bForceRemove/* =false */) { if (pUnitDraw && pUnitDraw->GetWzUnit()) { RESOURCECODE code = pUnitDraw->GetWzUnit()->GetType(); g_pSunRenderer->DestroyResourceForWzUnitDraw(pUnitDraw); Func_ContactWzd( CW_DELETE_WZUNITDRAW, pUnitDraw ); //-ck- LRU Á¤Ã¥µîÀº ¹«½ÃµÇ¸ç ¹«Á¶°Ç Áï½Ã »èÁ¦µÈ´Ù. if (bForceRemove) { m_pResourceCacher->SetUnitForceRemove(code); } m_pResourceCacher->ReleaseResourceWzUnit(code); } } RESOURCECODE ResourceManager::GetItemSkinResourceCode(CODETYPE itemcode) { // ½ÇÁ¦ÄÚµå BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(itemcode); assert(item_info); if (item_info == NULL) { return 0; } return (RESOURCECODE)(item_info->m_wWICode + ENGINE_RESOURCE_ID_OFFSET); } RESOURCECODE ResourceManager::GetItemSlotImageResourceCode(CODETYPE itemcode, BOOL bIsLimited/* = FALSE*/) { RESOURCECODE rtCode = 0xFFFFFFFF; if(bIsLimited) { sLIMITED_ITEM_INFO *pInfo = LimitedItemInfoParser::Instance()->GetLimitedItemInfo(itemcode); assert(pInfo); if (!pInfo) return 0xFFFFFFFF; rtCode = (RESOURCECODE)pInfo->m_dwInvenImage; } else { BASE_ITEMINFO *pInfo = ItemInfoParser::Instance()->GetItemInfo(itemcode); assert(pInfo); if (!pInfo) return 0xFFFFFFFF; rtCode = (RESOURCECODE)pInfo->m_wVICode; } return rtCode; } RESOURCECODE ResourceManager::GetItemSkillSlotImageResourceCode(CODETYPE skillcode) { ROOT_SKILLINFO * pInfo = SkillInfoParser::Instance()->GetInfo((SLOTCODE)skillcode); if (pInfo) { if (pInfo->IsSkill()) { SkillScriptInfo *pSkillInfo = (SkillScriptInfo *)pInfo; return pSkillInfo->m_dwSkillIconcode; } else { BASE_STYLEINFO *pStyleInfo = (BASE_STYLEINFO *)pInfo; return (RESOURCECODE)pStyleInfo->m_dwStyleImage; } } else { return (RESOURCECODE)0xFFFFFFFF; } } RESOURCECODE ResourceManager::GetSkillTransFormImageResourceCode(CODETYPE skillcode) { SkillScriptInfo *pInfo = SkillInfoParser::Instance()->GetSkillInfo((SLOTCODE)skillcode); if(pInfo) { BASE_ABILITYINFO * pAbility =pInfo->GetAbilityInfo( eABILITY_DRAGON_TRANSFORMATION1 ); if(pAbility) { return pAbility->m_iOption1; } } return 0; } RESOURCECODE ResourceManager::GetNPCSkinResourceCode(CODETYPE monstercode) { // ½ÇÁ¦ÄÚµå BASE_NPCINFO *pInfo = NPCInfoParser::Instance()->GetNPCInfo(monstercode); assert(pInfo); // ÀÓ½ÃÄÚµå // À̹ÌÁö¾ø´Â³ðÀ» Çϱ޺¸ÃÊ·Î ¸¸µé¾î¹ö¸°´Ù. if ( !pInfo || !pInfo->m_dwICode) { return 41001 + ENGINE_RESOURCE_ID_OFFSET; } return pInfo->m_dwICode + ENGINE_RESOURCE_ID_OFFSET; } RESOURCECODE ResourceManager::GetTempResourceCode(CODETYPE itemcode) { return (itemcode | RESOURCE_TEMP); } void ResourceManager::Process(DWORD dwTick) { if (m_pResourceCacher) { m_pResourceCacher->Process(dwTick); } } int ResourceManager::GetLoadedResourceCount() { if (m_pResourceCacher) { return m_pResourceCacher->GetLoadedResourceCount(); } return 0; } int ResourceManager::GetWaitForFreeResourceCount() { if (m_pResourceCacher) { return m_pResourceCacher->GetWaitForFreeResourceCount(); } return 0; } void ResourceManager::FreeAllCachedData() { if (m_pResourceCacher) { m_pResourceCacher->ReleaseAllCachedUnit(); } } void ResourceManager::FreeMostData() { if (m_pResourceCacher) { m_pResourceCacher->ReleaseMostUnit(); } } RESOURCECODE ResourceManager::GetItemSkinResourceCode(CODETYPE item_code, eCHAR_TYPE class_type, int body_part, GenderType::Value class_gender) { BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(item_code); assert(item_info); if (item_info == NULL) { return 0; } // Á¤È®ÇÑ ¼ºº°ÀÌ ¾Æ´Ï¸é °¢ Ŭ·¡½ºÀÇ ±âº» ¼ºº°·Î ¼³Á¤ class_gender = ResourceCode::CheckValidGender(class_type, class_gender); RESOURCECODE resource_code = 0; if (GlobalFunc::IsSSQScene()) { if (item_info->IsWeapon()) { eWEAPONTYPE weapon_type = static_cast(item_info->m_wType); resource_code = ResourceCode::GetWeaponCodeForTemple(weapon_type); } else { resource_code = ResourceCode::GetPartCodeForTemple( class_type, class_gender, static_cast(body_part)); } if (resource_code == 0) { return 0; } } else { resource_code = ResourceCode::GetItemSkinImageCodeByGender(item_info, class_gender); } return (resource_code + ENGINE_RESOURCE_ID_OFFSET); } RESOURCECODE ResourceManager::GetItemSkinResourceCode(CODETYPE item_code, GenderType::Value class_gender) { BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(item_code); assert(item_info); if (item_info == NULL) { return 0; } RESOURCECODE resource_code = ResourceCode::GetItemSkinImageCodeByGender(item_info, class_gender); return (resource_code + ENGINE_RESOURCE_ID_OFFSET); } // ij¸¯ÅÍ »À´ë ¸®¼Ò½º Äڵ带 ¾ò¾î¿É´Ï´Ù. RESOURCECODE ResourceManager::GetCharacterBoneResourceCode(eCHAR_TYPE class_type, GenderType::Value class_gender) { RESOURCECODE bone_resource_code = ResourceCode::GetBaseSkinOfClass(class_type, class_gender); return (bone_resource_code + ENGINE_RESOURCE_ID_OFFSET); } // ij¸¯ÅÍ ±âº» ½ºÅ² Äڵ带 ¾ò¾î¿É´Ï´Ù. RESOURCECODE ResourceManager::GetDefaultSkinCode(eCHAR_TYPE class_type, BodyPart body_part, GenderType::Value class_gender) { // Á¤È®ÇÑ ¼ºº°ÀÌ ¾Æ´Ï¸é °¢ Ŭ·¡½ºÀÇ ±âº» ¼ºº°·Î ¼³Á¤ class_gender = ResourceCode::CheckValidGender(class_type, class_gender); RESOURCECODE skin_resource_code = 0; if (GlobalFunc::IsSSQScene()) { skin_resource_code = ResourceCode::GetPartCodeForTemple(class_type, class_gender, body_part); if (skin_resource_code == 0) { return 0; } return skin_resource_code + ENGINE_RESOURCE_ID_OFFSET; } int offset_code = 0; switch (body_part) { case BP_ARMOR: offset_code = 1; break; case BP_PANTS: offset_code = 3; break; case BP_BOOTS: offset_code = 4; break; case BP_GLOVE: offset_code = 5; break; default: return 0; break; } skin_resource_code = ResourceCode::GetBasePartCodeOfClass(class_type, class_gender); return (skin_resource_code + offset_code + ENGINE_RESOURCE_ID_OFFSET); } // Çì¾î ¹× ÆäÀ̽º ½ºÅ²Äڵ带 ¾ò¾î¿É´Ï´Ù. RESOURCECODE ResourceManager::GetCharacterPartSkinResourceCode(eCHAR_TYPE class_type, BodyPart body_part, int variation_code, int variation_set, GenderType::Value class_gender) { // Á¤È®ÇÑ ¼ºº°ÀÌ ¾Æ´Ï¸é °¢ Ŭ·¡½ºÀÇ ±âº» ¼ºº°·Î ¼³Á¤ class_gender = ResourceCode::CheckValidGender(class_type, class_gender); eCHAR_TYPE image_class_type = ResourceCode::GetImageClassType(class_type, class_gender); HERO_VARIATION_PART variation_id; variation_id.byClass = image_class_type; variation_id.byPart = body_part; variation_id.wPartID = variation_code; BASE_HeroVariationInfo* variation_info = HeroVariationInfoParser::Instance()->GetHeroVariationInfo(variation_id.dwID); if (variation_info != NULL) { RESOURCECODE part_resource_code = variation_info->m_dResourceID[variation_set]; return part_resource_code + ENGINE_RESOURCE_ID_OFFSET; } else { return 0; } } float ResourceManager::GetWeaponScale(eCHAR_TYPE class_type, GenderType::Value class_gender) { float weapon_scale = 1.0f; class_gender = ResourceCode::CheckValidGender(class_type, class_gender); // Ãß°¡ ¼ºº° Ŭ·¡½º ¹«±â »çÀÌÁî if ((class_type == eCHAR_BERSERKER) && (class_gender == GenderType::kFemale)) { // ¹ö¼­Ä¿Å¬·¡½ºÀÌ¸ç ¼ºº°ÀÌ ¿©¼ºÀÌ¸é ¹«±âÅ©±â¸¦ Á¶Á¤ weapon_scale = 0.9f; } else if ((class_type == eCHAR_VALKYRIE) && (class_gender == GenderType::kMale)) { // ¹ß۸®Å¬·¡½ºÀÌ¸ç ¼ºº°ÀÌ ³²¼ºÀÌ¸é ¹«±âÅ©±â¸¦ Á¶Á¤ weapon_scale = 1.2f; } return weapon_scale; }