123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- /*
- ** Copyright (C) 1996, 1997 Microsoft Corporation. All Rights Reserved.
- **
- ** File: dispenserIGC.cpp
- **
- ** Author:
- **
- ** Description:
- ** Implementation of the CdispenserIGC class. This file was initially created by
- ** the ATL wizard for the core object.
- **
- ** History:
- */
- // dispenserIGC.cpp : Implementation of CdispenserIGC
- #include "pch.h"
- #include "dispenserIGC.h"
- /////////////////////////////////////////////////////////////////////////////
- // CdispenserIGC
- CdispenserIGC::CdispenserIGC(void)
- :
- m_ship(NULL),
- m_partType(NULL),
- m_expendableType(NULL),
- m_mountID(c_mountNA)
- {
- }
- CdispenserIGC::~CdispenserIGC(void)
- {
- }
- HRESULT CdispenserIGC::Initialize(ImissionIGC* pMission, Time now, const void* data, int dataSize)
- {
- assert (pMission);
- m_pMission = pMission;
- ZRetailAssert (data && (dataSize == sizeof(DataPartIGC)));
- {
- m_partType = (IlauncherTypeIGC*)(((DataPartIGC*)data)->partType);
- assert (m_partType);
- m_partType->AddRef();
- m_expendableType = (IexpendableTypeIGC*)(m_partType->GetExpendableType());
- assert (m_expendableType);
- assert ((m_expendableType->GetObjectType() == OT_mineType) ||
- (m_expendableType->GetObjectType() == OT_probeType) ||
- (m_expendableType->GetObjectType() == OT_chaffType));
- m_expendableType->AddRef();
- m_amount = 0;
- }
- return S_OK;
- }
- void CdispenserIGC::Terminate(void)
- {
- AddRef();
- SetShip(NULL, NA);
- if (m_partType)
- {
- m_partType->Release();
- m_partType = NULL;
- }
- if (m_expendableType)
- {
- m_expendableType->Release();
- m_expendableType = NULL;
- }
- Release();
- }
- void CdispenserIGC::Update(Time now)
- {
- assert (m_ship);
- if (m_mountedFraction < 1.0f)
- {
- float dt = now - m_ship->GetLastUpdate();
- assert (dt >= 0.0f);
- m_mountedFraction += dt * m_pMission->GetFloatConstant(c_fcidMountRate);
- if (m_mountedFraction < 1.0f)
- 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_timeLoaded < now) && (m_amount > 0))
- {
- static const int c_maskFire[ET_MAX] =
- { chaffFireIGC,
- 0, 0,
- mineFireIGC,
- 0, 0, 0, 0 };
- assert (c_maskFire[ET_ChaffLauncher] == chaffFireIGC);
- assert (c_maskFire[ET_Dispenser] == mineFireIGC);
- EquipmentType et = m_expendableType->GetEquipmentType();
-
- if ((m_ship->GetStateM() & c_maskFire[et]) &&
- ((et == ET_ChaffLauncher) || (m_ship->GetRipcordModel() == NULL)))
- {
- m_timeLoaded = now + m_expendableType->GetLoadTime();
- m_pMission->GetIgcSite()->FireExpendable(m_ship,
- this,
- now);
- }
- }
- }
- void CdispenserIGC::SetShip(IshipIGC* newVal, Mount mount)
- {
- //There may be only a single reference to this part ... so make sure the part
- //does not get deleted midway through things
- AddRef();
- if (m_ship)
- {
- m_ship->DeletePart(this);
- m_ship->Release();
- }
- assert (m_mountID == c_mountNA);
- m_ship = newVal;
- if (m_ship)
- {
- m_ship->AddRef();
- m_ship->AddPart(this);
- m_emissionPt = m_ship->GetHitTest()->GetFrameOffset("missemt");
- SetMountID(mount);
- }
- Release();
- }
- void CdispenserIGC::SetMountID(Mount newVal)
- {
- assert (m_ship);
- if (newVal != m_mountID)
- {
- if ((newVal < 0) && (m_mountID == 0))
- Deactivate(); //was active iff mounted
- m_ship->MountPart(this, newVal, &m_mountID);
- if (newVal == 0)
- Activate(); //active iff mounted
- }
- }
|