363 lines
12 KiB
C++
363 lines
12 KiB
C++
#include "StdAfx.h"
|
||
#include "GameType.h"
|
||
#include "../effectLib/EffectManager.h"
|
||
|
||
extern float g_fGameFPS = 60.0f;
|
||
|
||
CDynamicPool<NRaceData::TCollisionData> NRaceData::g_CollisionDataPool;
|
||
CDynamicPool<NRaceData::TAttachingEffectData> NRaceData::g_EffectDataPool;
|
||
CDynamicPool<NRaceData::TAttachingObjectData> NRaceData::g_ObjectDataPool;
|
||
|
||
void NRaceData::DestroySystem()
|
||
{
|
||
g_CollisionDataPool.Destroy();
|
||
g_EffectDataPool.Destroy();
|
||
g_ObjectDataPool.Destroy();
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////
|
||
// Character Attaching Collision Data
|
||
BOOL NRaceData::LoadAttackData(CTextFileLoader & rTextFileLoader, TAttackData * pData)
|
||
{
|
||
if (!rTextFileLoader.GetTokenInteger("attacktype", &pData->iAttackType))
|
||
{
|
||
pData->iAttackType = ATTACK_TYPE_SPLASH;
|
||
}
|
||
if (!rTextFileLoader.GetTokenInteger("hittingtype", &pData->iHittingType))
|
||
return false;
|
||
if (!rTextFileLoader.GetTokenFloat("stiffentime", &pData->fStiffenTime))
|
||
return false;
|
||
if (!rTextFileLoader.GetTokenFloat("invisibletime", &pData->fInvisibleTime))
|
||
return false;
|
||
if (!rTextFileLoader.GetTokenFloat("externalforce", &pData->fExternalForce))
|
||
return false;
|
||
if (!rTextFileLoader.GetTokenInteger("hitlimitcount", &pData->iHitLimitCount))
|
||
{
|
||
pData->iHitLimitCount = 0;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool NRaceData::THitData::Load(CTextFileLoader & rTextFileLoader)
|
||
{
|
||
if (!rTextFileLoader.GetTokenFloat("attackingstarttime", &fAttackStartTime))
|
||
return false;
|
||
if (!rTextFileLoader.GetTokenFloat("attackingendtime", &fAttackEndTime))
|
||
return false;
|
||
|
||
if (!rTextFileLoader.GetTokenString("attackingbone", &strBoneName))
|
||
strBoneName = "";
|
||
if (!rTextFileLoader.GetTokenFloat("weaponlength",&fWeaponLength))
|
||
fWeaponLength = 0.0f;
|
||
|
||
mapHitPosition.clear();
|
||
|
||
CTokenVector * tv;
|
||
if (rTextFileLoader.GetTokenVector("hitposition",&tv))
|
||
{
|
||
CTokenVector::iterator it=tv->begin();
|
||
|
||
while(it!=tv->end())
|
||
{
|
||
float time;
|
||
NRaceData::THitTimePosition hp;
|
||
time = atof(it++->c_str());
|
||
hp.v3LastPosition.x = atof(it++->c_str());
|
||
hp.v3LastPosition.y = atof(it++->c_str());
|
||
hp.v3LastPosition.z = atof(it++->c_str());
|
||
hp.v3Position.x = atof(it++->c_str());
|
||
hp.v3Position.y = atof(it++->c_str());
|
||
hp.v3Position.z = atof(it++->c_str());
|
||
|
||
mapHitPosition[time] = hp;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
BOOL NRaceData::LoadMotionAttackData(CTextFileLoader & rTextFileLoader, TMotionAttackData * pData)
|
||
{
|
||
if (!LoadAttackData(rTextFileLoader, pData))
|
||
return FALSE;
|
||
|
||
// NOTE : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AttackingType<70><65> MotionType<70><65><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD>
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>аԲ<D0B0>..
|
||
if (!rTextFileLoader.GetTokenInteger("motiontype", &pData->iMotionType))
|
||
{
|
||
if (!rTextFileLoader.GetTokenInteger("attackingtype", &pData->iMotionType))
|
||
return FALSE;
|
||
}
|
||
|
||
pData->HitDataContainer.clear();
|
||
|
||
DWORD dwHitDataCount;
|
||
if (!rTextFileLoader.GetTokenDoubleWord("hitdatacount", &dwHitDataCount))
|
||
{
|
||
pData->HitDataContainer.push_back(SHitData());
|
||
THitData & rHitData = *(pData->HitDataContainer.rbegin());
|
||
if (!rHitData.Load(rTextFileLoader))
|
||
return FALSE;
|
||
}
|
||
else
|
||
{
|
||
for (DWORD i = 0; i < dwHitDataCount; ++i)
|
||
{
|
||
if (!rTextFileLoader.SetChildNode(i))
|
||
return FALSE;
|
||
|
||
pData->HitDataContainer.push_back(SHitData());
|
||
THitData & rHitData = *(pData->HitDataContainer.rbegin());
|
||
if (!rHitData.Load(rTextFileLoader))
|
||
return FALSE;
|
||
|
||
rTextFileLoader.SetParentNode();
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL NRaceData::LoadCollisionData(CTextFileLoader & rTextFileLoader, TCollisionData * pCollisionData)
|
||
{
|
||
if (!rTextFileLoader.GetTokenInteger("collisiontype", &pCollisionData->iCollisionType))
|
||
return false;
|
||
|
||
DWORD dwSphereDataCount;
|
||
if (!rTextFileLoader.GetTokenDoubleWord("spheredatacount", &dwSphereDataCount))
|
||
return false;
|
||
|
||
pCollisionData->SphereDataVector.clear();
|
||
pCollisionData->SphereDataVector.resize(dwSphereDataCount);
|
||
for (DWORD i = 0; i < dwSphereDataCount; ++i)
|
||
{
|
||
TSphereData & r = pCollisionData->SphereDataVector[i].GetAttribute();
|
||
|
||
if (!rTextFileLoader.SetChildNode("spheredata", i))
|
||
return false;
|
||
|
||
if (!rTextFileLoader.GetTokenFloat("radius", &r.fRadius))
|
||
return false;
|
||
if (!rTextFileLoader.GetTokenPosition("position", &r.v3Position))
|
||
return false;
|
||
|
||
rTextFileLoader.SetParentNode();
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
void NRaceData::SaveEffectData(FILE * File, int iTabCount, const TAttachingEffectData & c_rEffectData)
|
||
{
|
||
PrintfTabs(File, iTabCount, "EffectScriptName \"%s\"\n", c_rEffectData.strFileName.c_str());
|
||
|
||
PrintfTabs(File, iTabCount, "EffectPosition %f %f %f\n", c_rEffectData.v3Position.x, c_rEffectData.v3Position.y, c_rEffectData.v3Position.z);
|
||
PrintfTabs(File, iTabCount, "EffectRotation %f %f %f\n", c_rEffectData.v3Rotation.x, c_rEffectData.v3Rotation.y, c_rEffectData.v3Rotation.z);
|
||
}
|
||
|
||
void NRaceData::SaveObjectData(FILE * File, int iTabCount, const TAttachingObjectData & c_rObjectData)
|
||
{
|
||
PrintfTabs(File, iTabCount, "ObjectScriptName \"%s\"\n", c_rObjectData.strFileName.c_str());
|
||
}
|
||
|
||
BOOL NRaceData::LoadEffectData(CTextFileLoader & rTextFileLoader, TAttachingEffectData * pEffectData)
|
||
{
|
||
if (!rTextFileLoader.GetTokenString("effectscriptname",&pEffectData->strFileName))
|
||
return false;
|
||
|
||
if (!rTextFileLoader.GetTokenPosition("effectposition",&pEffectData->v3Position))
|
||
{
|
||
pEffectData->v3Position = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
||
}
|
||
|
||
if (!rTextFileLoader.GetTokenPosition("effectrotation",&pEffectData->v3Rotation))
|
||
{
|
||
//pEffectData->qRotation = D3DXQUATERNION(0.0f,0.0f,0.0f,1.0f);
|
||
pEffectData->v3Rotation = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
||
}
|
||
|
||
/*if (!*/
|
||
// TODO DELETEME FIXME
|
||
CEffectManager::Instance().RegisterEffect(pEffectData->strFileName.c_str());
|
||
/*) return false;*/
|
||
|
||
return true;
|
||
}
|
||
|
||
BOOL NRaceData::LoadObjectData(CTextFileLoader & rTextFileLoader, TAttachingObjectData * pObjectData)
|
||
{
|
||
if (!rTextFileLoader.GetTokenString("objectscriptname",&pObjectData->strFileName))
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
void NRaceData::SaveAttackData(FILE * File, int iTabCount, const TAttackData & c_rData)
|
||
{
|
||
PrintfTabs(File, iTabCount, "AttackType %d\n", c_rData.iAttackType);
|
||
PrintfTabs(File, iTabCount, "HittingType %d\n", c_rData.iHittingType);
|
||
PrintfTabs(File, iTabCount, "StiffenTime %f\n", c_rData.fStiffenTime);
|
||
PrintfTabs(File, iTabCount, "InvisibleTime %f\n", c_rData.fInvisibleTime);
|
||
PrintfTabs(File, iTabCount, "ExternalForce %f\n", c_rData.fExternalForce);
|
||
PrintfTabs(File, iTabCount, "HitLimitCount %d\n", c_rData.iHitLimitCount);
|
||
}
|
||
|
||
void NRaceData::SaveMotionAttackData(FILE * File, int iTabCount, const TMotionAttackData & c_rData)
|
||
{
|
||
SaveAttackData(File, iTabCount, c_rData);
|
||
|
||
PrintfTabs(File, iTabCount, "\n");
|
||
PrintfTabs(File, iTabCount, "MotionType %d\n", c_rData.iMotionType);
|
||
PrintfTabs(File, iTabCount, "HitDataCount %d\n", c_rData.HitDataContainer.size());
|
||
|
||
DWORD dwHitDataNumber = 0;
|
||
THitDataContainer::const_iterator itor = c_rData.HitDataContainer.begin();
|
||
for (; itor != c_rData.HitDataContainer.end(); ++itor, ++dwHitDataNumber)
|
||
{
|
||
const THitData & c_rHitData = *itor;
|
||
|
||
PrintfTabs(File, iTabCount, "Group HitData%02d\n", dwHitDataNumber);
|
||
PrintfTabs(File, iTabCount, "{\n");
|
||
PrintfTabs(File, iTabCount+1, "AttackingStartTime %f\n", c_rHitData.fAttackStartTime);
|
||
PrintfTabs(File, iTabCount+1, "AttackingEndTime %f\n", c_rHitData.fAttackEndTime);
|
||
|
||
PrintfTabs(File, iTabCount+1, "AttackingBone \"%s\"\n", c_rHitData.strBoneName.c_str());
|
||
PrintfTabs(File, iTabCount+1, "WeaponLength %f\n", c_rHitData.fWeaponLength);
|
||
PrintfTabs(File, iTabCount+1, "List HitPosition\n");
|
||
PrintfTabs(File, iTabCount+1, "{\n");
|
||
|
||
NRaceData::THitTimePositionMap::const_iterator it;
|
||
for(it = c_rHitData.mapHitPosition.begin(); it!= c_rHitData.mapHitPosition.end();++it)
|
||
{
|
||
PrintfTabs(File, iTabCount+2, "%f %f %f %f %f %f %f\n", it->first,
|
||
it->second.v3LastPosition.x, it->second.v3LastPosition.y, it->second.v3LastPosition.z,
|
||
it->second.v3Position.x, it->second.v3Position.y, it->second.v3Position.z);
|
||
}
|
||
PrintfTabs(File, iTabCount+1, "}\n");
|
||
PrintfTabs(File, iTabCount, "}\n");
|
||
}
|
||
}
|
||
|
||
void NRaceData::SaveCollisionData(FILE * File, int iTabCount, const TCollisionData & c_rCollisionData)
|
||
{
|
||
PrintfTabs(File, iTabCount, "CollisionType %d\n", c_rCollisionData.iCollisionType);
|
||
PrintfTabs(File, iTabCount, "\n");
|
||
|
||
const CSphereCollisionInstanceVector & c_rSphereDataVector = c_rCollisionData.SphereDataVector;
|
||
|
||
PrintfTabs(File, iTabCount, "SphereDataCount %d\n", c_rSphereDataVector.size());
|
||
|
||
for (DWORD i = 0; i < c_rSphereDataVector.size(); ++i)
|
||
{
|
||
const TSphereData & c_rAttr = c_rSphereDataVector[i].GetAttribute();
|
||
|
||
PrintfTabs(File, iTabCount, "Group SphereData%02d\n", i);
|
||
|
||
PrintfTabs(File, iTabCount, "{\n");
|
||
|
||
PrintfTabs(File, iTabCount+1, "Radius %f\n",
|
||
c_rAttr.fRadius);
|
||
|
||
PrintfTabs(File, iTabCount+1, "Position %f %f %f\n",
|
||
c_rAttr.v3Position.x,
|
||
c_rAttr.v3Position.y,
|
||
c_rAttr.v3Position.z);
|
||
|
||
PrintfTabs(File, iTabCount, "}\n");
|
||
}
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////
|
||
// Attaching Data
|
||
void NRaceData::SaveAttachingData(FILE * File, int iTabCount, const TAttachingDataVector & c_rAttachingDataVector)
|
||
{
|
||
DWORD dwAttachingDataCount = c_rAttachingDataVector.size();
|
||
|
||
PrintfTabs(File, iTabCount, "AttachingDataCount %d\n", dwAttachingDataCount);
|
||
PrintfTabs(File, iTabCount, "\n");
|
||
|
||
for (DWORD i = 0; i < dwAttachingDataCount; ++i)
|
||
{
|
||
const NRaceData::TAttachingData & c_rAttachingData = c_rAttachingDataVector[i];
|
||
|
||
PrintfTabs(File, iTabCount, "Group AttachingData%02d\n", i);
|
||
PrintfTabs(File, iTabCount, "{\n", i);
|
||
|
||
PrintfTabs(File, iTabCount+1, "AttachingDataType %d\n", c_rAttachingData.dwType);
|
||
PrintfTabs(File, iTabCount+1, "\n", i);
|
||
|
||
PrintfTabs(File, iTabCount+1, "isAttaching %d\n", c_rAttachingData.isAttaching);
|
||
PrintfTabs(File, iTabCount+1, "AttachingModelIndex %d\n", c_rAttachingData.dwAttachingModelIndex);
|
||
PrintfTabs(File, iTabCount+1, "AttachingBoneName \"%s\"\n", c_rAttachingData.strAttachingBoneName.c_str());
|
||
PrintfTabs(File, iTabCount+1, "\n");
|
||
|
||
switch (c_rAttachingData.dwType)
|
||
{
|
||
case NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA:
|
||
NRaceData::SaveCollisionData(File, iTabCount+1, *c_rAttachingData.pCollisionData);
|
||
break;
|
||
case NRaceData::ATTACHING_DATA_TYPE_EFFECT:
|
||
NRaceData::SaveEffectData(File, iTabCount+1, *c_rAttachingData.pEffectData);
|
||
break;
|
||
case NRaceData::ATTACHING_DATA_TYPE_OBJECT:
|
||
NRaceData::SaveObjectData(File, iTabCount+1, *c_rAttachingData.pObjectData);
|
||
break;
|
||
}
|
||
|
||
PrintfTabs(File, iTabCount, "}\n");
|
||
|
||
if (i != dwAttachingDataCount-1)
|
||
PrintfTabs(File, iTabCount, "\n");
|
||
}
|
||
}
|
||
|
||
BOOL NRaceData::LoadAttachingData(CTextFileLoader & rTextFileLoader, TAttachingDataVector * pAttachingDataVector)
|
||
{
|
||
DWORD dwDataCount;
|
||
if (!rTextFileLoader.GetTokenDoubleWord("attachingdatacount", &dwDataCount))
|
||
return false;
|
||
|
||
pAttachingDataVector->clear();
|
||
pAttachingDataVector->resize(dwDataCount);
|
||
|
||
for (DWORD i = 0; i < dwDataCount; ++i)
|
||
{
|
||
NRaceData::TAttachingData & rAttachingData = pAttachingDataVector->at(i);
|
||
if (!rTextFileLoader.SetChildNode("attachingdata", i))
|
||
return false;
|
||
|
||
if (!rTextFileLoader.GetTokenDoubleWord("attachingdatatype", &rAttachingData.dwType))
|
||
return false;
|
||
|
||
if (!rTextFileLoader.GetTokenInteger("isattaching", &rAttachingData.isAttaching))
|
||
return false;
|
||
if (!rTextFileLoader.GetTokenDoubleWord("attachingmodelindex", &rAttachingData.dwAttachingModelIndex))
|
||
return false;
|
||
if (!rTextFileLoader.GetTokenString("attachingbonename", &rAttachingData.strAttachingBoneName))
|
||
return false;
|
||
|
||
switch (rAttachingData.dwType)
|
||
{
|
||
case NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA:
|
||
rAttachingData.pCollisionData = g_CollisionDataPool.Alloc();
|
||
if (!NRaceData::LoadCollisionData(rTextFileLoader, rAttachingData.pCollisionData))
|
||
return false;
|
||
break;
|
||
case NRaceData::ATTACHING_DATA_TYPE_EFFECT:
|
||
rAttachingData.pEffectData = g_EffectDataPool.Alloc();
|
||
if (!NRaceData::LoadEffectData(rTextFileLoader, rAttachingData.pEffectData))
|
||
return false;
|
||
break;
|
||
case NRaceData::ATTACHING_DATA_TYPE_OBJECT:
|
||
rAttachingData.pObjectData = g_ObjectDataPool.Alloc();
|
||
if (!NRaceData::LoadObjectData(rTextFileLoader, rAttachingData.pObjectData))
|
||
return false;
|
||
break;
|
||
}
|
||
|
||
rTextFileLoader.SetParentNode();
|
||
}
|
||
return TRUE;
|
||
}
|