#ifndef __WEAPONIGC_H_
#define __WEAPONIGC_H_
class CweaponIGC : public IweaponIGC
{
public:
CweaponIGC(void);
virtual HRESULT Initialize(ImissionIGC* pMission, Time now, const void* data, int dataSize);
virtual void Terminate(void);
virtual void Update(Time now)
{
if (m_mountedFraction < 1.0f)
{
float dt = now - m_ship->GetLastUpdate();
m_mountedFraction += dt * m_pMission->GetFloatConstant(c_fcidMountRate);
if (m_mountedFraction < 1.0f)
{
m_fFiringShot = false;
m_fFiringBurst = false;
return;
}
IIgcSite* pigc = GetMission()->GetIgcSite();
pigc->PlayNotificationSound(mountedSound, m_ship);
pigc->PostNotificationText(m_ship, false, "%s ready.", GetPartType()->GetName());
m_mountedFraction = 1.0f;
}
if ((!m_fActive) && fIsWeaponSelected())
Activate();
if (m_fActive)
{
FireWeapon(now);
}
else
{
m_fFiringShot = false;
m_fFiringBurst = false;
}
}
virtual ObjectType GetObjectType(void) const
{
return OT_weapon;
}
virtual ImissionIGC* GetMission(void) const
{
return m_pMission;
}
virtual EquipmentType GetEquipmentType(void) const
{
return ET_Weapon;
}
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_fActive;
}
virtual void Activate(void)
{
assert (m_ship);
if (!m_fActive)
{
m_ship->ChangeSignature(m_typeData->signature);
m_nextFire = m_ship->GetLastUpdate() + m_typeData->dtimeBurst;
m_fActive = true;
}
}
virtual void Deactivate(void)
{
assert (m_ship);
if (m_fActive)
{
m_ship->ChangeSignature(-m_typeData->signature);
m_fActive = false;
}
m_fFiringBurst = false;
m_fFiringShot = false; }
virtual float GetMass(void) const
{
return m_typeData->mass;
}
virtual Money GetPrice(void) const
{
return m_typeData->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_nextFire = m_ship->GetLastUpdate();
}
virtual IprojectileTypeIGC* GetProjectileType(void) const
{
return m_projectileType;
}
virtual short GetAmmoPerShot(void) const
{
return m_typeData->cAmmoPerShot;
}
virtual float GetLifespan(void) const
{
float ls = m_projectileType->GetLifespan();
if (m_ship && (m_typeData->energyPerShot != 0.0f))
ls *= m_ship->GetSide()->GetGlobalAttributeSet().GetAttribute(c_gaLifespanEnergy);
return ls;
}
virtual const Vector& GetPosition(void) const
{
return *m_pposition;
}
virtual float GetDtBurst(void) const
{
return m_typeData->dtimeBurst;
}
virtual void SetGunner(IshipIGC* pship)
{
Deactivate();
if (m_pshipGunner)
m_pshipGunner->Release();
m_pshipGunner = pship;
if (pship)
{
assert (m_ship);
assert (pship->GetParentShip() == m_ship);
pship->AddRef();
assert (m_mountID >= 0);
assert (pship->GetParentShip());
assert (pship->GetParentShip()->GetHullType()->GetHardpointData(m_mountID).bFixed == false);
}
}
virtual IshipIGC* GetGunner(void) const
{
return m_pshipGunner;
}
virtual bool fFiringShot(void) const
{
return m_fFiringShot;
}
virtual bool fFiringBurst(void) const
{
return m_fFiringBurst;
}
virtual SoundID GetActivateSound(void) const
{
return m_typeData->activateSound;
}
virtual SoundID GetSingleShotSound(void) const
{
return m_typeData->singleShotSound;
}
virtual SoundID GetBurstSound(void) const
{
return m_typeData->burstSound;
}
private:
bool fIsWeaponSelected(void) const
{
bool fSelected;
if (m_ship->GetHullType()->GetHardpointData(m_mountID).bFixed)
{
int stateM = m_ship->GetStateM();
fSelected = ((stateM & allWeaponsIGC) ||
((stateM & oneWeaponIGC) &&
(m_mountID == ((stateM & selectedWeaponMaskIGC) >> selectedWeaponShiftIGC)))) &&
(m_ship->GetRipcordModel() == NULL);
}
else
{
fSelected = m_pshipGunner && (m_pshipGunner->GetStateM() & weaponsMaskIGC);
}
return fSelected;
}
void FireWeapon(Time now);
ImissionIGC* m_pMission;
IshipIGC* m_pshipGunner;
const DataWeaponTypeIGC* m_typeData;
IpartTypeIGC* m_partType;
IshipIGC* m_ship;
IprojectileTypeIGC* m_projectileType;
Time m_nextFire;
const Vector* m_pposition;
const Orientation* m_porientation;
float m_mountedFraction;
Mount m_mountID;
bool m_fActive;
bool m_fFiringShot;
bool m_fFiringBurst;
};
#endif