client/GameLib/RaceData.cpp

598 lines
16 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.

#include "StdAfx.h"
#include "../eterLib/ResourceManager.h"
#include "../eterLib/AttributeInstance.h"
#include "../eterBase/Utils.h"
#include "RaceData.h"
#include "RaceMotionData.h"
#include "../eterBase/Filename.h"
CDynamicPool<CRaceData> CRaceData::ms_kPool;
CDynamicPool<CRaceData::TMotionModeData> CRaceData::ms_MotionModeDataPool;
const std::string& CRaceData::GetSmokeBone()
{
return m_strSmokeBoneName;
}
DWORD CRaceData::GetSmokeEffectID(UINT eSmoke)
{
if(eSmoke>=SMOKE_NUM)
{
TraceError("CRaceData::GetSmokeEffectID(eSmoke=%d)", eSmoke);
return 0;
}
return m_adwSmokeEffectID[eSmoke];
}
CRaceData::SHair* CRaceData::FindHair(UINT eHair)
{
std::map<DWORD, SHair>::iterator f=m_kMap_dwHairKey_kHair.find(eHair);
if (m_kMap_dwHairKey_kHair.end()==f)
{
if (eHair != 0)
TraceError("Hair number %d is not exist.",eHair);
return NULL;
}
return &f->second;
}
void CRaceData::SetHairSkin(UINT eHair, UINT ePart, const char * c_szModelFileName, const char* c_szSrcFileName, const char* c_szDstFileName)
{
SSkin kSkin;
kSkin.m_ePart=ePart;
kSkin.m_stSrcFileName=c_szSrcFileName;
kSkin.m_stDstFileName=c_szDstFileName;
CFileNameHelper::ChangeDosPath(kSkin.m_stSrcFileName);
m_kMap_dwHairKey_kHair[eHair].m_kVct_kSkin.push_back(kSkin);
m_kMap_dwHairKey_kHair[eHair].m_stModelFileName = c_szModelFileName;
}
CRaceData::SShape* CRaceData::FindShape(UINT eShape)
{
std::map<DWORD, SShape>::iterator f=m_kMap_dwShapeKey_kShape.find(eShape);
if (m_kMap_dwShapeKey_kShape.end()==f)
return NULL;
return &f->second;
}
void CRaceData::SetShapeModel(UINT eShape, const char* c_szModelFileName)
{
m_kMap_dwShapeKey_kShape[eShape].m_stModelFileName=c_szModelFileName;
}
void CRaceData::AppendShapeSkin(UINT eShape, UINT ePart, const char* c_szSrcFileName, const char* c_szDstFileName)
{
SSkin kSkin;
kSkin.m_ePart=ePart;
kSkin.m_stSrcFileName=c_szSrcFileName;
kSkin.m_stDstFileName=c_szDstFileName;
CFileNameHelper::ChangeDosPath(kSkin.m_stSrcFileName);
m_kMap_dwShapeKey_kShape[eShape].m_kVct_kSkin.push_back(kSkin);
}
CRaceData* CRaceData::New()
{
return ms_kPool.Alloc();
}
void CRaceData::Delete(CRaceData* pkRaceData)
{
pkRaceData->Destroy();
ms_kPool.Free(pkRaceData);
}
void CRaceData::CreateSystem(UINT uCapacity, UINT uMotModeCapacity)
{
ms_MotionModeDataPool.Create(uMotModeCapacity);
ms_kPool.Create(uCapacity);
}
void CRaceData::DestroySystem()
{
ms_kPool.Destroy();
ms_MotionModeDataPool.Destroy();
}
BOOL CRaceData::CreateMotionModeIterator(TMotionModeDataIterator & itor)
{
if (m_pMotionModeDataMap.empty())
return FALSE;
itor = m_pMotionModeDataMap.begin();
return TRUE;
}
BOOL CRaceData::NextMotionModeIterator(TMotionModeDataIterator & itor)
{
++itor;
return m_pMotionModeDataMap.end() != itor;
}
BOOL CRaceData::GetMotionKey(WORD wMotionModeIndex, WORD wMotionIndex, MOTION_KEY * pMotionKey)
{
TMotionModeData * pMotionModeData;
if (!GetMotionModeDataPointer(wMotionModeIndex, &pMotionModeData))
return FALSE;
if (pMotionModeData->MotionVectorMap.end() == pMotionModeData->MotionVectorMap.find(wMotionIndex))
{
WORD wGeneralMode=CRaceMotionData::MODE_GENERAL;
switch(wMotionModeIndex)
{
case CRaceMotionData::MODE_HORSE_ONEHAND_SWORD:
case CRaceMotionData::MODE_HORSE_TWOHAND_SWORD:
case CRaceMotionData::MODE_HORSE_DUALHAND_SWORD:
case CRaceMotionData::MODE_HORSE_FAN:
case CRaceMotionData::MODE_HORSE_BELL:
case CRaceMotionData::MODE_HORSE_BOW:
wGeneralMode=CRaceMotionData::MODE_HORSE;
break;
default:
wGeneralMode=CRaceMotionData::MODE_GENERAL;
break;
}
TMotionModeData * pMotionModeGeneralData;
if (!GetMotionModeDataPointer(wGeneralMode, &pMotionModeGeneralData))
return FALSE;
if (pMotionModeGeneralData->MotionVectorMap.end() == pMotionModeGeneralData->MotionVectorMap.find(wMotionIndex))
return FALSE;
*pMotionKey = MAKE_MOTION_KEY(wGeneralMode, wMotionIndex);
}
else
{
*pMotionKey = MAKE_MOTION_KEY(wMotionModeIndex, wMotionIndex);
}
return TRUE;
}
BOOL CRaceData::GetMotionModeDataPointer(WORD wMotionMode, TMotionModeData ** ppMotionModeData)
{
TMotionModeDataIterator itor = m_pMotionModeDataMap.find(wMotionMode);
if (itor == m_pMotionModeDataMap.end())
return FALSE;
*ppMotionModeData = itor->second;
return TRUE;
}
BOOL CRaceData::GetModelDataPointer(DWORD dwModelIndex, const TModelData ** c_ppModelData)
{
TModelDataMapIterator itor = m_ModelDataMap.find(dwModelIndex);
if (m_ModelDataMap.end() == itor)
return false;
*c_ppModelData = &itor->second;
return true;
}
BOOL CRaceData::GetMotionVectorPointer(WORD wMotionMode, WORD wMotionIndex, TMotionVector ** ppMotionVector)
{
TMotionModeData * pMotionModeData;
if (!GetMotionModeDataPointer(wMotionMode, &pMotionModeData))
return FALSE;
TMotionVectorMap::iterator itor = pMotionModeData->MotionVectorMap.find(wMotionIndex);
if (pMotionModeData->MotionVectorMap.end() == itor)
return FALSE;
*ppMotionVector = &itor->second;
return TRUE;
}
BOOL CRaceData::GetMotionDataPointer(WORD wMotionMode, WORD wMotionIndex, WORD wMotionSubIndex, CRaceMotionData ** c_ppMotionData)
{
const TMotionVector * c_pMotionVector;
if (!GetMotionVectorPointer(wMotionMode, wMotionIndex, &c_pMotionVector))
return FALSE;
if (wMotionSubIndex >= c_pMotionVector->size())
return FALSE;
const TMotion & c_rMotion = c_pMotionVector->at(wMotionSubIndex);
if (!c_rMotion.pMotionData)
return FALSE;
*c_ppMotionData = c_rMotion.pMotionData;
return TRUE;
}
BOOL CRaceData::GetMotionDataPointer(DWORD dwMotionKey, CRaceMotionData ** c_ppMotionData)
{
return GetMotionDataPointer(GET_MOTION_MODE(dwMotionKey), GET_MOTION_INDEX(dwMotionKey), GET_MOTION_SUB_INDEX(dwMotionKey), c_ppMotionData);
}
BOOL CRaceData::GetMotionVectorPointer(WORD wMotionMode, WORD wMotionIndex, const TMotionVector ** c_ppMotionVector)
{
TMotionVector * pMotionVector;
if (!GetMotionVectorPointer(wMotionMode, wMotionIndex, &pMotionVector))
return FALSE;
*c_ppMotionVector = pMotionVector;
return TRUE;
}
DWORD CRaceData::GetAttachingDataCount()
{
return m_AttachingDataVector.size();
}
BOOL CRaceData::GetAttachingDataPointer(DWORD dwIndex, const NRaceData::TAttachingData ** c_ppAttachingData)
{
if (dwIndex >= GetAttachingDataCount())
return FALSE;
*c_ppAttachingData = &m_AttachingDataVector[dwIndex];
return TRUE;
}
BOOL CRaceData::GetCollisionDataPointer(DWORD dwIndex, const NRaceData::TAttachingData ** c_ppAttachingData)
{
if (dwIndex >= GetAttachingDataCount())
return FALSE;
if (NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA != m_AttachingDataVector[dwIndex].dwType)
return FALSE;
*c_ppAttachingData = &m_AttachingDataVector[dwIndex];
return TRUE;
}
BOOL CRaceData::GetBodyCollisionDataPointer(const NRaceData::TAttachingData ** c_ppAttachingData)
{
for (DWORD i = 0; i < m_AttachingDataVector.size(); ++i)
{
const NRaceData::TAttachingData * pAttachingData = &m_AttachingDataVector[i];
if (NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA == pAttachingData->dwType)
if (NRaceData::COLLISION_TYPE_BODY == pAttachingData->pCollisionData->iCollisionType)
{
*c_ppAttachingData = pAttachingData;
return true;
}
}
return FALSE;
}
void CRaceData::SetRace(DWORD dwRaceIndex)
{
m_dwRaceIndex = dwRaceIndex;
}
void CRaceData::RegisterAttachingBoneName(DWORD dwPartIndex, const char * c_szBoneName)
{
m_AttachingBoneNameMap.insert(TAttachingBoneNameMap::value_type(dwPartIndex, c_szBoneName));
}
void CRaceData::RegisterMotionMode(WORD wMotionModeIndex)
{
TMotionModeData * pMotionModeData = ms_MotionModeDataPool.Alloc();
pMotionModeData->wMotionModeIndex = wMotionModeIndex;
pMotionModeData->MotionVectorMap.clear();
m_pMotionModeDataMap.insert(TMotionModeDataMap::value_type(wMotionModeIndex, pMotionModeData));
}
CGraphicThing* CRaceData::NEW_RegisterMotion(CRaceMotionData* pkMotionData, WORD wMotionModeIndex, WORD wMotionIndex, const char * c_szFileName, BYTE byPercentage)
{
CGraphicThing * pMotionThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(c_szFileName);
TMotionModeData * pMotionModeData;
if (!GetMotionModeDataPointer(wMotionModeIndex, &pMotionModeData))
{
AssertLog("Failed getting motion mode data!");
return NULL;
}
TMotion kMotion;
kMotion.byPercentage = byPercentage;
kMotion.pMotion = pMotionThing;
kMotion.pMotionData = pkMotionData;
pMotionModeData->MotionVectorMap[wMotionIndex].push_back(kMotion);
return pMotionThing;
}
CGraphicThing* CRaceData::RegisterMotionData(WORD wMotionMode, WORD wMotionIndex, const char * c_szFileName, BYTE byPercentage)
{
CRaceMotionData * pRaceMotionData = CRaceMotionData::New();
if (!pRaceMotionData->LoadMotionData(c_szFileName))
{
TraceError("CRaceData::RegisterMotionData - LoadMotionData(c_szFileName=%s) ERROR", c_szFileName);
CRaceMotionData::Delete(pRaceMotionData);
pRaceMotionData = NULL;
return NULL;
}
// 2004. 3. 15. myevan. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>dz<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>.
pRaceMotionData->SetName(wMotionIndex);
/////
// FIXME : <20>̹<EFBFBD> GR2<52><32> <20>ε<EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><EFBFBD><EEB6BB> <20>ؾ<EFBFBD> <20>ϴ°<CFB4>?
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ȱ<EFBFBD><C8B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20><> <20>߰<EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. - [levites]
return NEW_RegisterMotion(pRaceMotionData, wMotionMode, wMotionIndex, pRaceMotionData->GetMotionFileName(), byPercentage);
// 2004.09.03.myevan.<2E><><EFBFBD>ο<EFBFBD><CEBF>Լ<EFBFBD><D4BC><EFBFBD> <20><>ó
//TMotion Motion;
//Motion.byPercentage = byPercentage;
//Motion.pMotion = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(pRaceMotionData->GetMotionFileName());
//Motion.pMotionData = pRaceMotionData;
//__OLD_RegisterMotion(wMotionMode, wMotionIndex, Motion);
//return true;
}
void CRaceData::OLD_RegisterMotion(WORD wMotionModeIndex, WORD wMotionIndex, const char * c_szFileName, BYTE byPercentage)
{
CGraphicThing * pThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(c_szFileName);
TMotion Motion;
Motion.byPercentage = byPercentage;
Motion.pMotion = pThing;
Motion.pMotionData = NULL;
__OLD_RegisterMotion(wMotionModeIndex, wMotionIndex, Motion);
}
void CRaceData::__OLD_RegisterMotion(WORD wMotionMode, WORD wMotionIndex, const TMotion & rMotion)
{
TMotionModeData * pMotionModeData;
if (!GetMotionModeDataPointer(wMotionMode, &pMotionModeData))
{
AssertLog("Failed getting motion mode data!");
return;
}
TMotionVectorMap::iterator itor = pMotionModeData->MotionVectorMap.find(wMotionIndex);
if (pMotionModeData->MotionVectorMap.end() == itor)
{
TMotionVector MotionVector;
MotionVector.push_back(rMotion);
pMotionModeData->MotionVectorMap.insert(TMotionVectorMap::value_type(wMotionIndex, MotionVector));
}
else
{
TMotionVector & rMotionVector = itor->second;
rMotionVector.push_back(rMotion);
}
}
bool CRaceData::SetMotionRandomWeight(WORD wMotionModeIndex, WORD wMotionIndex, WORD wMotionSubIndex, BYTE byPercentage)
{
TMotionModeData * pMotionModeData;
if (!GetMotionModeDataPointer(wMotionModeIndex, &pMotionModeData))
{
//AssertLog("Failed getting motion mode data!");
return false;
}
TMotionVectorMap::iterator itor = pMotionModeData->MotionVectorMap.find(wMotionIndex);
if (pMotionModeData->MotionVectorMap.end() != itor)
{
TMotionVector & rMotionVector = itor->second;
if (wMotionSubIndex < rMotionVector.size())
{
rMotionVector[wMotionSubIndex].byPercentage = byPercentage;
}
else
{
return false;
}
}
else
{
TraceError("CRaceData::SetMotionRandomWeight(wMotionModeIndex=%d, wMotionIndex=%d, wMotionSubIndex=%d, byPercentage=%d) - Find Motion(wMotionIndex=%d) FAILED",
wMotionModeIndex, wMotionIndex, wMotionSubIndex, byPercentage, wMotionModeIndex);
return false;
}
return true;
}
void CRaceData::RegisterNormalAttack(WORD wMotionModeIndex, WORD wMotionIndex)
{
m_NormalAttackIndexMap.insert(TNormalAttackIndexMap::value_type(wMotionModeIndex, wMotionIndex));
}
BOOL CRaceData::GetNormalAttackIndex(WORD wMotionModeIndex, WORD * pwMotionIndex)
{
TNormalAttackIndexMap::iterator itor = m_NormalAttackIndexMap.find(wMotionModeIndex);
if (m_NormalAttackIndexMap.end() == itor)
return FALSE;
*pwMotionIndex = itor->second;
return TRUE;
}
void CRaceData::ReserveComboAttack(WORD wMotionModeIndex, WORD wComboType, DWORD dwComboCount)
{
TComboData ComboData;
ComboData.ComboIndexVector.clear();
ComboData.ComboIndexVector.resize(dwComboCount);
m_ComboAttackDataMap.insert(TComboAttackDataMap::value_type(MAKE_COMBO_KEY(wMotionModeIndex, wComboType), ComboData));
}
void CRaceData::RegisterComboAttack(WORD wMotionModeIndex, WORD wComboType, DWORD dwComboIndex, WORD wMotionIndex)
{
TComboAttackDataIterator itor = m_ComboAttackDataMap.find(MAKE_COMBO_KEY(wMotionModeIndex, wComboType));
if (m_ComboAttackDataMap.end() == itor)
return;
TComboIndexVector & rComboIndexVector = itor->second.ComboIndexVector;
if (dwComboIndex >= rComboIndexVector.size())
{
AssertLog("CRaceData::RegisterCombo - Strange combo index!");
return;
}
rComboIndexVector[dwComboIndex] = wMotionIndex;
}
BOOL CRaceData::GetComboDataPointer(WORD wMotionModeIndex, WORD wComboType, TComboData ** ppComboData)
{
TComboAttackDataIterator itor = m_ComboAttackDataMap.find(MAKE_COMBO_KEY(wMotionModeIndex, wComboType));
if (m_ComboAttackDataMap.end() == itor)
return FALSE;
*ppComboData = &itor->second;
return TRUE;
}
const char * CRaceData::GetBaseModelFileName() const
{
return m_strBaseModelFileName.c_str();
}
const char * CRaceData::GetAttributeFileName() const
{
return m_strAttributeFileName.c_str();
}
const char* CRaceData::GetMotionListFileName() const
{
return m_strMotionListFileName.c_str();
}
CGraphicThing * CRaceData::GetBaseModelThing()
{
if (!m_pBaseModelThing)
{
m_pBaseModelThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(m_strBaseModelFileName.c_str());
}
return m_pBaseModelThing;
}
CGraphicThing * CRaceData::GetLODModelThing()
{
if (!m_pLODModelThing)
{
std::string strLODFileName = CFileNameHelper::NoExtension(m_strBaseModelFileName) + "_lod_01.gr2";
if (CResourceManager::Instance().IsFileExist(strLODFileName.c_str()))
{
m_pLODModelThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(strLODFileName.c_str());
}
}
return m_pLODModelThing;
}
CAttributeData * CRaceData::GetAttributeDataPtr()
{
if (m_strAttributeFileName.empty())
return NULL;
if (!CResourceManager::Instance().IsFileExist(m_strAttributeFileName.c_str()))
return NULL;
return (CAttributeData *)CResourceManager::Instance().GetResourcePointer(m_strAttributeFileName.c_str());
}
BOOL CRaceData::GetAttachingBoneName(DWORD dwPartIndex, const char ** c_pszBoneName)
{
TAttachingBoneNameMap::iterator itor = m_AttachingBoneNameMap.find(dwPartIndex);
if (itor == m_AttachingBoneNameMap.end())
return FALSE;
const std::string & c_rstrBoneName = itor->second;
*c_pszBoneName = c_rstrBoneName.c_str();
return TRUE;
}
BOOL CRaceData::IsTree()
{
return !m_strTreeFileName.empty();
}
const char * CRaceData::GetTreeFileName()
{
return m_strTreeFileName.c_str();
}
void CRaceData::Destroy()
{
m_kMap_dwHairKey_kHair.clear();
m_kMap_dwShapeKey_kShape.clear();
m_strBaseModelFileName = "";
m_strTreeFileName = "";
m_strAttributeFileName = "";
m_strMotionListFileName = "motlist.txt";
m_AttachingBoneNameMap.clear();
m_ModelDataMap.clear();
m_NormalAttackIndexMap.clear();
m_ComboAttackDataMap.clear();
TMotionModeDataMap::iterator itorMode = m_pMotionModeDataMap.begin();
for (; itorMode != m_pMotionModeDataMap.end(); ++itorMode)
{
TMotionModeData * pMotionModeData = itorMode->second;
TMotionVectorMap::iterator itorMotion = pMotionModeData->MotionVectorMap.begin();
for (; itorMotion != pMotionModeData->MotionVectorMap.end(); ++itorMotion)
{
TMotionVector & rMotionVector = itorMotion->second;
for (DWORD i = 0; i < rMotionVector.size(); ++i)
{
CRaceMotionData::Delete(rMotionVector[i].pMotionData);
}
}
ms_MotionModeDataPool.Free(pMotionModeData);
}
m_pMotionModeDataMap.clear();
__Initialize();
}
void CRaceData::__Initialize()
{
m_strMotionListFileName = "motlist.txt";
m_pBaseModelThing = NULL;
m_pLODModelThing = NULL;
m_dwRaceIndex = 0;
memset(m_adwSmokeEffectID, 0, sizeof(m_adwSmokeEffectID));
}
CRaceData::CRaceData()
{
__Initialize();
}
CRaceData::~CRaceData()
{
Destroy();
}