353 lines
9.8 KiB
C++
353 lines
9.8 KiB
C++
#include "Stdafx.h"
|
|
#include "../effectLib/EffectManager.h"
|
|
|
|
#include "FlyingData.h"
|
|
|
|
CDynamicPool<CFlyingData> CFlyingData::ms_kPool;
|
|
|
|
CFlyingData::CFlyingData()
|
|
{
|
|
__Initialize();
|
|
}
|
|
|
|
void CFlyingData::__Initialize()
|
|
{
|
|
m_v3AngVel = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
m_bIsHoming = false;
|
|
m_fInitVel = 200.0f;
|
|
m_fConeAngle = (0.0f);
|
|
m_fRollAngle = 0.0f;
|
|
m_fRange = 500.0f;
|
|
m_v3Accel = D3DXVECTOR3(0,0,0.0f);// gravity direction :-z
|
|
m_fHomingMaxAngle = 3.0f;
|
|
m_fHomingStartTime = 0.0f;
|
|
m_fGravity = 0;
|
|
m_bSpreading = false;
|
|
m_bMaintainParallel = false;
|
|
|
|
m_bHitOnBackground = false;
|
|
m_bHitOnAnotherMonster = false;
|
|
m_iPierceCount = 0;
|
|
m_fCollisionSphereRadius = 0.0f;
|
|
|
|
m_fBombRange = 10.0f;
|
|
SetBombEffect("");
|
|
}
|
|
|
|
void CFlyingData::Destroy()
|
|
{
|
|
m_AttachDataVector.clear();
|
|
|
|
__Initialize();
|
|
}
|
|
|
|
CFlyingData::~CFlyingData()
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
void CFlyingData::SetBombEffect(const char* szEffectName)
|
|
{
|
|
m_strBombEffectName = szEffectName;
|
|
if (m_strBombEffectName.empty())
|
|
{
|
|
m_dwBombEffectID = 0;
|
|
return;
|
|
}
|
|
StringPath(m_strBombEffectName);
|
|
if (CEffectManager::Instance().RegisterEffect(m_strBombEffectName.c_str()),true)
|
|
{
|
|
m_dwBombEffectID = GetCaseCRC32(m_strBombEffectName.c_str(),m_strBombEffectName.size());
|
|
}
|
|
else
|
|
{
|
|
m_dwBombEffectID = 0;
|
|
}
|
|
|
|
}
|
|
|
|
CFlyingData::TFlyingAttachData & CFlyingData::GetAttachDataReference(int iIndex)
|
|
{
|
|
return m_AttachDataVector[iIndex];
|
|
}
|
|
|
|
DWORD CFlyingData::AttachFlyEffect(int iType, const std::string & strFilename, float fRoll, float fArg1, float fArg2)
|
|
{
|
|
TFlyingAttachData fad;
|
|
memset(&fad,0, sizeof(fad));
|
|
fad.iType = FLY_ATTACH_EFFECT;
|
|
fad.iFlyType = iType;
|
|
fad.fPeriod = 1.0f;
|
|
fad.strFilename = strFilename;
|
|
fad.fRoll = fRoll;
|
|
fad.dwTailColor = 0xffffffff;
|
|
fad.fTailLength = 1.0f;
|
|
fad.fTailSize = 10.0f;
|
|
|
|
switch(iType)
|
|
{
|
|
case FLY_ATTACH_TYPE_MULTI_LINE:
|
|
fad.fDistance = fArg1;
|
|
break;
|
|
case FLY_ATTACH_TYPE_SINE:
|
|
case FLY_ATTACH_TYPE_EXP:
|
|
fad.fPeriod=fArg1;
|
|
fad.fAmplitude=fArg2;
|
|
break;
|
|
case FLY_ATTACH_TYPE_NONE:
|
|
case FLY_ATTACH_TYPE_LINE:
|
|
default:
|
|
// Do nothing
|
|
break;
|
|
}
|
|
|
|
m_AttachDataVector.push_back(fad);
|
|
return m_AttachDataVector.size()-1;
|
|
}
|
|
|
|
void CFlyingData::RemoveAttach(int iIndex)
|
|
{
|
|
assert(0<=iIndex && iIndex<(int)m_AttachDataVector.size());
|
|
m_AttachDataVector.erase(m_AttachDataVector.begin()+iIndex);
|
|
}
|
|
|
|
void CFlyingData::RemoveAllAttach()
|
|
{
|
|
m_AttachDataVector.clear();
|
|
}
|
|
|
|
void CFlyingData::DuplicateAttach(int iIndex)
|
|
{
|
|
assert(0<=iIndex && iIndex<(int)m_AttachDataVector.size());
|
|
m_AttachDataVector.push_back(m_AttachDataVector[iIndex]);
|
|
}
|
|
|
|
bool CFlyingData::LoadScriptFile(const char* c_szFilename)
|
|
{
|
|
NANOBEGIN
|
|
Destroy();
|
|
|
|
m_strFilename = c_szFilename;
|
|
StringPath(m_strFilename);
|
|
CTextFileLoader TextFileLoader;
|
|
if (!TextFileLoader.Load(m_strFilename.c_str()))
|
|
return false;
|
|
|
|
TextFileLoader.SetTop();
|
|
int temp;
|
|
|
|
if (!TextFileLoader.GetTokenInteger("spreadingflag",&temp))
|
|
{
|
|
m_bSpreading = false;
|
|
}
|
|
else
|
|
{
|
|
m_bSpreading = temp?true:false;
|
|
}
|
|
|
|
if (!TextFileLoader.GetTokenInteger("maintainparallelflag", &temp))
|
|
{
|
|
m_bMaintainParallel = false;
|
|
}
|
|
else
|
|
{
|
|
m_bMaintainParallel = temp?true:false;
|
|
}
|
|
|
|
if (!TextFileLoader.GetTokenFloat("initialvelocity",&m_fInitVel))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
TextFileLoader.GetTokenFloat("coneangle", &m_fConeAngle);
|
|
//if (!TextFileLoader.GetTokenFloat("coneangle", &m_fConeAngle))
|
|
// m_fConeAngle = 0.0f;
|
|
|
|
TextFileLoader.GetTokenFloat("rollangle", &m_fRollAngle);
|
|
//if (!TextFileLoader.GetTokenFloat("rollangle", &m_fRollAngle))
|
|
// m_fRollAngle = 0.0f;
|
|
|
|
TextFileLoader.GetTokenVector3("angularvelocity",&m_v3AngVel);
|
|
//if (!TextFileLoader.GetTokenVector3("angularvelocity",&m_v3AngVel))
|
|
// m_v3AngVel = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
|
|
TextFileLoader.GetTokenFloat("gravity",&m_fGravity);
|
|
//if (!TextFileLoader.GetTokenFloat("gravity",&m_fGravity))
|
|
//m_fGravity = 0.0f;
|
|
|
|
if (TextFileLoader.GetTokenInteger("hitonbackground",&temp))
|
|
m_bHitOnBackground = temp?true:false;
|
|
else
|
|
m_bHitOnBackground = false;
|
|
|
|
if (TextFileLoader.GetTokenInteger("hitonanothermonster",&temp))
|
|
m_bHitOnAnotherMonster = temp?true:false;
|
|
else
|
|
m_bHitOnAnotherMonster = false;
|
|
|
|
if (!TextFileLoader.GetTokenInteger("piercecount",&m_iPierceCount))
|
|
m_iPierceCount = 0;
|
|
|
|
// if (!TextFileLoader.GetTokenFloat("collisionsphereradius",&m_fCollisionSphereRadius))
|
|
// m_fCollisionSphereRadius = 0.0f;
|
|
|
|
TextFileLoader.GetTokenFloat("bombrange",&m_fBombRange);
|
|
//if (!TextFileLoader.GetTokenFloat("bombrange",&m_fBombRange))
|
|
// m_fBombRange = 10.0f;
|
|
|
|
if (!TextFileLoader.GetTokenString("bombeffect",&m_strBombEffectName))
|
|
{
|
|
m_strBombEffectName = "";
|
|
}
|
|
else if (!m_strBombEffectName.empty())
|
|
{
|
|
if (!IsGlobalFileName(m_strBombEffectName.c_str()))
|
|
m_strBombEffectName = GetOnlyPathName(TextFileLoader.GetFileName()) + m_strBombEffectName;
|
|
CEffectManager::Instance().RegisterEffect2(m_strBombEffectName.c_str(),&m_dwBombEffectID);
|
|
}
|
|
|
|
if (!TextFileLoader.GetTokenInteger("homingflag", &temp))
|
|
m_bIsHoming = false;
|
|
else
|
|
m_bIsHoming = temp?true:false;
|
|
|
|
if (!TextFileLoader.GetTokenFloat("homingstarttime",&m_fHomingStartTime))
|
|
m_fHomingStartTime = 0.0f;
|
|
|
|
if (!TextFileLoader.GetTokenFloat("homingmaxangle",&m_fHomingMaxAngle))
|
|
m_fHomingMaxAngle = 0.0f;
|
|
|
|
if (!TextFileLoader.GetTokenFloat("range",&m_fRange))
|
|
return false;
|
|
|
|
if (!TextFileLoader.GetTokenVector3("acceleration",&m_v3Accel))
|
|
m_v3Accel = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
|
|
DWORD i;
|
|
for(i=0;i<TextFileLoader.GetChildNodeCount();i++)
|
|
{
|
|
CTextFileLoader::CGotoChild GotoChild(&TextFileLoader, i);
|
|
|
|
std::string strNodeName;
|
|
|
|
TextFileLoader.GetCurrentNodeName(&strNodeName);
|
|
|
|
if (strNodeName=="attachdata")
|
|
{
|
|
TFlyingAttachData fad;
|
|
|
|
if (!TextFileLoader.GetTokenInteger("type",&fad.iType))
|
|
continue;
|
|
TextFileLoader.GetTokenInteger("flytype",&fad.iFlyType);
|
|
if (!TextFileLoader.GetTokenString("attachfile",&fad.strFilename))
|
|
{
|
|
fad.strFilename = "";
|
|
}
|
|
else if (!fad.strFilename.empty())
|
|
{
|
|
if (!IsGlobalFileName(fad.strFilename.c_str()))
|
|
fad.strFilename = GetOnlyPathName(TextFileLoader.GetFileName()) + fad.strFilename;
|
|
CEffectManager::Instance().RegisterEffect(fad.strFilename.c_str());
|
|
}
|
|
|
|
TextFileLoader.GetTokenInteger("tailflag",&temp);
|
|
if (temp)
|
|
{
|
|
fad.bHasTail = true;
|
|
TextFileLoader.GetTokenDoubleWord("tailcolor",&fad.dwTailColor);
|
|
TextFileLoader.GetTokenFloat("taillength",&fad.fTailLength);
|
|
TextFileLoader.GetTokenFloat("tailsize",&fad.fTailSize);
|
|
TextFileLoader.GetTokenInteger("tailshaperect",&temp);
|
|
fad.bRectShape = temp?true:false;
|
|
}
|
|
else
|
|
{
|
|
fad.bHasTail = false;
|
|
}
|
|
|
|
TextFileLoader.GetTokenFloat("roll",&fad.fRoll);
|
|
TextFileLoader.GetTokenFloat("distance",&fad.fDistance);
|
|
TextFileLoader.GetTokenFloat("period",&fad.fPeriod);
|
|
TextFileLoader.GetTokenFloat("amplitude",&fad.fAmplitude);
|
|
|
|
m_AttachDataVector.push_back(fad);
|
|
}
|
|
else
|
|
{
|
|
TraceError("CFlyingData::LoadScriptFile Wrong Data : %s", m_strFilename.c_str());
|
|
}
|
|
}
|
|
|
|
NANOEND
|
|
return true;
|
|
}
|
|
|
|
bool CFlyingData::SaveScriptFile(const char* c_szFilename)
|
|
{
|
|
FILE* fp = fopen(c_szFilename,"w");
|
|
if (!fp) return false;
|
|
|
|
PrintfTabs(fp, 0, "SpreadingFlag %d\n", m_bSpreading?1:0);
|
|
PrintfTabs(fp, 0, "MaintainParallelFlag %d\n", m_bMaintainParallel?1:0);
|
|
|
|
PrintfTabs(fp, 0, "InitialVelocity %f\n", m_fInitVel);
|
|
PrintfTabs(fp, 0, "ConeAngle %f\n", m_fConeAngle);
|
|
PrintfTabs(fp, 0, "RollAngle %f\n", m_fRollAngle);
|
|
PrintfTabs(fp, 0, "AngularVelocity %f %f %f\n", m_v3AngVel.x, m_v3AngVel.y, m_v3AngVel.z);
|
|
PrintfTabs(fp, 0, "Gravity %f\n", m_fGravity);
|
|
|
|
PrintfTabs(fp, 0, "HitOnBackground %d\n",m_bHitOnBackground?1:0);
|
|
PrintfTabs(fp, 0, "HitOnAnotherMonster %d\n",m_bHitOnAnotherMonster?1:0);
|
|
PrintfTabs(fp, 0, "PierceCount %d\n",m_iPierceCount);
|
|
PrintfTabs(fp, 0, "CollisionSphereRadius %f\n",m_fCollisionSphereRadius);
|
|
|
|
PrintfTabs(fp, 0, "BombRange %f\n", m_fBombRange);
|
|
|
|
std::string strGlobalPathName;
|
|
StringPath(GetOnlyPathName(c_szFilename), strGlobalPathName);
|
|
|
|
std::string strLocalFileName;
|
|
if (GetLocalFileName(strGlobalPathName.c_str(), m_strBombEffectName.c_str(), &strLocalFileName))
|
|
PrintfTabs(fp, 0, "BombEffect \"%s\"\n", strLocalFileName.c_str());
|
|
else
|
|
PrintfTabs(fp, 0, "BombEffect \"%s\"\n", m_strBombEffectName.c_str());
|
|
|
|
PrintfTabs(fp, 0, "HomingFlag %d\n", m_bIsHoming?1:0);
|
|
PrintfTabs(fp, 0, "HomingStartTime %f\n", m_fHomingStartTime);
|
|
PrintfTabs(fp, 0, "HomingMaxAngle %f\n", m_fHomingMaxAngle);
|
|
PrintfTabs(fp, 0, "Range %f\n", m_fRange);
|
|
PrintfTabs(fp, 0, "Acceleration %f %f %f\n", m_v3Accel.x, m_v3Accel.y, m_v3Accel.z);
|
|
|
|
std::vector<TFlyingAttachData>::iterator it;
|
|
for(it = m_AttachDataVector.begin();it!=m_AttachDataVector.end();++it)
|
|
{
|
|
PrintfTabs(fp, 0, "Group AttachData\n");
|
|
PrintfTabs(fp, 0, "{\n");
|
|
PrintfTabs(fp, 1, "Type %d\n", it->iType);
|
|
PrintfTabs(fp, 1, "FlyType %d\n", it->iFlyType);
|
|
if (GetLocalFileName(strGlobalPathName.c_str(), it->strFilename.c_str(), &strLocalFileName))
|
|
PrintfTabs(fp, 1, "AttachFile \"%s\"\n", strLocalFileName.c_str());
|
|
else
|
|
PrintfTabs(fp, 1, "AttachFile \"%s\"\n", it->strFilename.c_str());
|
|
//PrintfTabs(fp, 1, "AttachFile \"%s\"\n", it->strFilename);
|
|
|
|
PrintfTabs(fp, 1, "TailFlag %d\n", it->bHasTail?1:0);
|
|
if (it->bHasTail)
|
|
{
|
|
PrintfTabs(fp, 1, "TailColor %ud\n", it->dwTailColor);
|
|
PrintfTabs(fp, 1, "TailLength %f\n", it->fTailLength);
|
|
PrintfTabs(fp, 1, "TailSize %f\n", it->fTailSize);
|
|
PrintfTabs(fp, 1, "TailShapeRect %d\n", it->bRectShape?1:0);
|
|
}
|
|
|
|
PrintfTabs(fp, 1, "Roll %f\n",it->fRoll );
|
|
PrintfTabs(fp, 1, "Distance %f\n",it->fDistance );
|
|
PrintfTabs(fp, 1, "Period %f\n",it->fPeriod );
|
|
PrintfTabs(fp, 1, "Amplitude %f\n",it->fAmplitude );
|
|
|
|
PrintfTabs(fp, 0, "}\n");
|
|
}
|
|
|
|
fclose(fp);
|
|
return true;
|
|
} |