#ifndef __TREASURESETIGC_H_
#define __TREASURESETIGC_H_
class CtreasureSetIGC : public ItreasureSetIGC
{
public:
CtreasureSetIGC(void)
:
m_data(NULL)
{
}
~CtreasureSetIGC(void)
{
delete [] (char*)m_data;
}
virtual HRESULT Initialize(ImissionIGC* pMission, Time now, const void* data, int dataSize);
virtual void Terminate(void)
{
m_pMission->DeleteTreasureSet(this);
}
virtual int Export(void* data) const;
virtual ObjectType GetObjectType(void) const
{
return OT_treasureSet;
}
virtual ObjectID GetObjectID(void) const
{
return m_data->treasureSetID;
}
virtual const char* GetName(void) const
{
return m_data->name;
}
virtual bool GetZoneOnly(void) const
{
return m_data->bZoneOnly;
}
virtual void AddTreasureData(TreasureCode tc, ObjectID oid, unsigned char chance)
{
if (m_data->nTreasureData == m_maxTreasureData)
{
int oldSize = sizeof(DataTreasureSetIGC) + sizeof(TreasureData) *
m_maxTreasureData;
const int c_increment = 10;
int newSize = oldSize + sizeof(TreasureData) * c_increment;
m_maxTreasureData += c_increment;
DataTreasureSetIGC* newData = (DataTreasureSetIGC*)(new char [newSize]);
memcpy(newData, m_data, oldSize);
delete [] (char*)m_data;
m_data = newData;
}
TreasureData* ptd = m_data->treasureData0() + m_data->nTreasureData;
ptd->treasureCode = tc;
ptd->treasureID = oid;
ptd->chance = chance;
m_totalTreasureChance += chance;
m_data->nTreasureData++;
}
virtual const TreasureData& GetRandomTreasureData(void) const
{
assert (m_totalTreasureChance >= 1);
int r = randomInt(1, m_totalTreasureChance);
TreasureData* ptd = m_data->treasureData0();
while (true)
{
r -= ptd->chance;
if (r <= 0)
return *ptd;
ptd++;
assert (ptd < (m_data->treasureData0() + m_data->nTreasureData));
}
}
private:
ImissionIGC* m_pMission;
DataTreasureSetIGC* m_data;
short m_totalTreasureChance;
short m_maxTreasureData;
};
#endif