/* ** Copyright (C) 1996, 1997 Microsoft Corporation. All Rights Reserved. ** ** File: treasureSetIGC.h ** ** Author: ** ** Description: ** Header for the CtreasureSetIGC class. This file was initially created by ** the ATL wizard. ** ** History: */ // treasureSetIGC.h : Declaration of the CtreasureSetIGC #ifndef __TREASURESETIGC_H_ #define __TREASURESETIGC_H_ ///////////////////////////////////////////////////////////////////////////// // CtreasureSetIGC class CtreasureSetIGC : public ItreasureSetIGC { public: CtreasureSetIGC(void) : m_data(NULL) { } ~CtreasureSetIGC(void) { delete [] (char*)m_data; } // IbaseIGC 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; } // ItreasureSetIGC 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) { //Not enough space to add one ... reallocate a larger array 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 //__TREASURESETIGC_H_