/* ** Copyright (C) 1996, 1997 Microsoft Corporation. All Rights Reserved. ** ** File: dispenserIGC.h ** ** Author: ** ** Description: ** Header for the CdispenserIGC class. This file was initially created by ** the ATL wizard. ** ** History: */ // dispenserIGC.h : Declaration of the CdispenserIGC #ifndef __DISPENSERIGC_H_ #define __DISPENSERIGC_H_ ///////////////////////////////////////////////////////////////////////////// // CdispenserIGC class CdispenserIGC : public IdispenserIGC { public: CdispenserIGC(void); ~CdispenserIGC(void); // IbaseIGC 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; } // IpartIGC 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(); } // IlauncherIGC virtual void SetAmount(short a) { { short maxAmount = m_partType->GetAmount(m_ship); if (a > maxAmount) a = maxAmount; } if (a != m_amount) { //Adjust the mass of the ship (if there is one) to account for the change in the number of mines 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; } // IdispenserIGC 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 //__DISPENSERIGC_H_