#ifndef __DISPENSERIGC_H_
#define __DISPENSERIGC_H_
class CdispenserIGC : public IdispenserIGC
{
public:
CdispenserIGC(void);
~CdispenserIGC(void);
virtual HRESULT Initialize(ImissionIGC* pMission, Time now, const void* data, int dataSize);
virtual void Terminate(void);
virtual void Update(Time now);
virtual ObjectType GetObjectType(void) const
{
return OT_dispenser;
}
virtual ImissionIGC* GetMission(void) const
{
return m_pMission;
}
virtual EquipmentType GetEquipmentType(void) const
{
return m_expendableType->GetEquipmentType();
}
virtual IpartTypeIGC* GetPartType(void) const
{
return m_partType;
}
virtual IshipIGC* GetShip(void) const
{
return m_ship;
}
virtual void SetShip(IshipIGC* newVal, Mount mount);
virtual Mount GetMountID(void) const
{
return m_mountID;
}
virtual void SetMountID(Mount newVal);
virtual bool fActive(void) const
{
return m_mountID == 0;
}
virtual void Activate(void)
{
m_ship->ChangeSignature(m_expendableType->GetLauncherDef()->signature);
m_timeLoaded = m_ship->GetLastUpdate() + ((1.0f/m_pMission->GetFloatConstant(c_fcidMountRate)) + m_expendableType->GetLoadTime());
}
virtual void Deactivate(void)
{
m_ship->ChangeSignature(-m_expendableType->GetLauncherDef()->signature);
}
virtual float GetMass(void) const
{
return m_amount * m_expendableType->GetMass();
}
virtual Money GetPrice(void) const
{
return ((Money)m_amount) * m_expendableType->GetLauncherDef()->price;
}
virtual float GetMountedFraction(void) const
{
return m_mountedFraction;
}
virtual void SetMountedFraction(float f)
{
m_mountedFraction = f;
}
virtual void Arm(void)
{
m_mountedFraction = 1.0f;
m_timeLoaded = m_ship->GetLastUpdate();
}
virtual void SetAmount(short a)
{
{
short maxAmount = m_partType->GetAmount(m_ship);
if (a > maxAmount)
a = maxAmount;
}
if (a != m_amount)
{
if (m_ship)
{
m_ship->SetMass(m_ship->GetMass() +
(a - m_amount) * m_expendableType->GetMass());
m_pMission->GetIgcSite()->LoadoutChangeEvent(m_ship, this, c_lcQuantityChange);
}
m_amount = a;
}
}
virtual short GetAmount(void) const
{
return m_amount;
}
virtual void SetTimeFired(Time now)
{
m_timeLoaded = now + m_expendableType->GetLoadTime();
}
virtual Time GetTimeLoaded(void) const
{
return m_timeLoaded;
}
virtual void SetTimeLoaded(Time tl)
{
m_timeLoaded = tl;
}
virtual void ResetTimeLoaded(void)
{
assert (m_ship);
m_timeLoaded = m_ship->GetLastUpdate() + ((1.0f/m_pMission->GetFloatConstant(c_fcidMountRate)) + m_expendableType->GetLoadTime());
}
virtual const Vector& GetEmissionPt(void) const
{
return m_emissionPt;
}
virtual IexpendableTypeIGC* GetExpendableType(void) const
{
return m_expendableType;
}
virtual float GetArmedFraction(void)
{
if (GetMountedFraction() < 1.0f)
{
return 0;
}
else
{
return 1.0f - max(0.0f, (m_timeLoaded - Time::Now()) / m_expendableType->GetLoadTime());
}
}
private:
ImissionIGC* m_pMission;
IlauncherTypeIGC* m_partType;
IexpendableTypeIGC* m_expendableType;
IshipIGC* m_ship;
Vector m_emissionPt;
float m_mountedFraction;
Time m_timeLoaded;
short m_amount;
Mount m_mountID;
};
#endif