client/GameLib/GameType.cpp

363 lines
12 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 "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;
}