#include "pch.h"
#include "bucketIGC.h"
HRESULT CbucketIGC::Initialize(ImissionIGC* pMission,
Time now,
const void* data,
int dataSize)
{
assert (pMission);
m_pMission = pMission;
ZRetailAssert (data && (dataSize == sizeof(DataBucketIGC)));
m_data = *((DataBucketIGC*)data);
assert (m_data.side);
m_data.side->AddRef();
m_price = m_data.buyable->GetPrice();
m_timeToBuild = m_data.buyable->GetTimeToBuild();
if (m_data.buyable->GetObjectType() == OT_development)
{
IdevelopmentIGC* pdevelopment = (IdevelopmentIGC*)(m_data.buyable);
if ((!pdevelopment->GetTechOnly()) && pdevelopment->GetEffectTechs().GetAllZero())
{
Money price = pdevelopment->GetPrice();
const GlobalAttributeSet& gas = pdevelopment->GetGlobalAttributeSet();
for (BucketLinkIGC* pbl = m_data.side->GetBuckets()->last(); (pbl != NULL); pbl = pbl->txen())
{
IbucketIGC* pbucket = pbl->data();
IbuyableIGC* pbuyable = pbucket->GetBuyable();
if (pbuyable->GetObjectType() == OT_development)
{
IdevelopmentIGC* pd = (IdevelopmentIGC*)pbuyable;
if ((!pd->GetTechOnly()) && (pd->GetPrice() <= price) && pd->GetEffectTechs().GetAllZero())
{
if (pd->GetGlobalAttributeSet() == gas)
{
pbucket->AddRef();
m_pbucketPredecessor = pbucket;
break;
}
}
}
}
}
if (pdevelopment->GetObjectID() != c_didTeamMoney)
{
m_price = (Money)(m_price * m_data.side->GetGlobalAttributeSet().GetAttribute(c_gaDevelopmentCost));
m_timeToBuild = (DWORD)(m_timeToBuild * m_data.side->GetGlobalAttributeSet().GetAttribute(c_gaDevelopmentTime));
}
}
m_data.side->AddBucket(this);
assert (m_data.buyable);
m_data.buyable->AddRef();
m_lastUpdate = now;
return S_OK;
}
void CbucketIGC::Terminate(void)
{
AddRef();
assert (m_data.side);
if (m_pbucketPredecessor)
{
m_pbucketPredecessor->Release();
m_pbucketPredecessor = NULL;
}
m_pMission->GetIgcSite()->BucketChangeEvent(c_bcTerminated, this);
assert (m_data.side);
m_data.side->DeleteBucket(this);
m_data.side->Release();
m_data.side = NULL;
assert (m_data.buyable);
m_data.buyable->Release();
m_data.buyable = NULL;
Release();
}
int CbucketIGC::Export(void* data) const
{
return NA;
}