#ifndef __WARPIGC_H_
#define __WARPIGC_H_
#include "modelIGC.h"
class CwarpIGC : public TmodelIGC<IwarpIGC>
{
public:
CwarpIGC(void)
:
m_destination(NULL)
{
}
~CwarpIGC(void)
{
}
virtual HRESULT Initialize(ImissionIGC* pMission, Time now, const void* data, int length);
virtual void Terminate(void)
{
AddRef();
GetMyMission()->DeleteWarp(this);
TmodelIGC<IwarpIGC>::Terminate();
if (m_destination)
{
m_destination->Release();
m_destination = NULL;
}
m_bombs.purge();
Release();
}
virtual void Update(Time now)
{
WarpBombLink* plink;
while ((plink = m_bombs.first()) && (plink->data().timeExplosion <= now))
{
ImissileTypeIGC* pmt = plink->data().pmt;
assert (pmt);
assert (pmt->GetObjectType() == OT_missileType);
DamageTypeID dtid = pmt->GetDamageType();
float p = pmt->GetPower();
float r = pmt->GetBlastRadius();
IclusterIGC* pcluster = GetCluster();
if (pmt->HasCapability(c_eabmWarpBombDual)) pcluster->CreateExplosion(dtid,
p,
r,
c_etBigShip,
plink->data().timeExplosion,
GetPosition(),
NULL);
IwarpIGC* pwarp = GetDestination();
pcluster = pwarp->GetCluster();
pcluster->CreateExplosion(dtid,
p,
r,
c_etBigShip,
plink->data().timeExplosion,
pwarp->GetPosition(),
NULL);
delete plink;
}
TmodelIGC<IwarpIGC>::Update(now);
}
virtual int Export(void* data) const;
virtual ObjectType GetObjectType(void) const
{
return OT_warp;
}
virtual ObjectID GetObjectID(void) const
{
return m_warpDef.warpID;
}
virtual void SetCluster(IclusterIGC* cluster)
{
AddRef();
{
IclusterIGC* c = GetCluster();
if (c)
c->DeleteWarp(this);
}
TmodelIGC<IwarpIGC>::SetCluster(cluster);
if (cluster)
cluster->AddWarp(this);
Release();
}
virtual IwarpIGC* GetDestination(void)
{
if (!m_destination)
{
m_destination = GetMyMission()->GetWarp(m_warpDef.destinationID);
if (m_destination)
m_destination->AddRef();
}
return m_destination;
}
virtual void AddBomb(Time timeExplosion,
ImissileTypeIGC* pmt)
{
WarpBombLink* p = new WarpBombLink;
p->data().timeExplosion = timeExplosion;
p->data().pmt = pmt;
Color blastColor (0.6f, 0.8f, 1.0f);
float fExplodeTime = timeExplosion - Time::Now ();
GetCluster ()->GetClusterSite ()->AddPulse (fExplodeTime, GetPosition (), pmt->GetBlastRadius (), blastColor);
IwarpIGC* pDestination = GetDestination();
pDestination->GetCluster ()->GetClusterSite ()->AddPulse (fExplodeTime, m_destination->GetPosition (), pmt->GetBlastRadius (), blastColor);
ThingSite* pThingSite = GetThingSite ();
pThingSite->AddPulse (fExplodeTime, GetPosition (), pmt->GetBlastRadius (), blastColor);
pThingSite = pDestination->GetThingSite ();
pThingSite->AddPulse (fExplodeTime, GetPosition (), pmt->GetBlastRadius (), blastColor);
m_bombs.last(p);
}
virtual const WarpBombList* GetBombs(void) const
{
return &m_bombs;
}
private:
IwarpIGC* m_destination;
WarpDef m_warpDef;
WarpBombList m_bombs;
};
#endif