/*
**  Copyright (C) 1996, 1997 Microsoft Corporation. All Rights Reserved.
**
**  File:	treasureIGC.h
**
**  Author: 
**
**  Description:
**      Header for the CtreasureIGC class. This file was initially created by
**  the ATL wizard.
**
**  History:
*/
// treasureIGC.h : Declaration of the CtreasureIGC

#ifndef __TRESUREIGC_H_
#define __TRESUREIGC_H_

#include    "modelIGC.h"

class CtreasureIGC : public TmodelIGC<ItreasureIGC>
{
    public:
    // IbaseIGC
        virtual HRESULT         Initialize(ImissionIGC* pMission, Time now, const void* data, int length);
        virtual void    Terminate(void)
        {
            AddRef();

            GetMyMission()->DeleteTreasure(this);
            TmodelIGC<ItreasureIGC>::Terminate();

            if (m_buyable)
            {
                m_buyable->Release();
                m_buyable = NULL;
            }

            Release();
        }

        virtual void            Update(Time now);

        virtual int             Export(void* data) const;

        virtual ObjectType      GetObjectType(void) const
        {
            return OT_treasure;
        }

        virtual ObjectID        GetObjectID(void) const
        {
            return m_data.objectID;
        }

    // ImodelIGC
        virtual void    SetCluster(IclusterIGC* cluster)
        {
            AddRef();

            //Overrride the model's cluster method so that we can maintain the cluster's treasure list
            //(as well as letting the model maintain its model list)
            {
                IclusterIGC*    c = GetCluster();
                if (c)
                    c->DeleteTreasure(this);
            }

            TmodelIGC<ItreasureIGC>::SetCluster(cluster);

            if (cluster)
                cluster->AddTreasure(this);

            Release();
        }

        virtual void                 HandleCollision(Time       timeCollision,
                                                     float                  tCollision,
                                                     const CollisionEntry&  entry,
                                                     ImodelIGC* pModel)
        {
            if (pModel->GetObjectType() == OT_ship)
            {
                //A treasure hitting a ship ... can the ship pick treasures up?
                if ((((IshipIGC*)pModel)->GetPilotType() >= c_ptPlayer) &&
                    ((IshipIGC*)pModel)->GetBaseHullType()->HasCapability(c_habmRescue))
                {
                    //yes ...let the gamesite deal with it.
                    IIgcSite*   igc = GetMyMission()->GetIgcSite();

                    if (igc->HitTreasureEvent(timeCollision,
                                              (IshipIGC*)pModel,
                                              this))
                    {
                        igc->KillTreasureEvent(this);
                    }
                }
            }
            else if (pModel->GetAttributes() & c_mtStatic)
            {
                GetMyMission()->GetIgcSite()->KillTreasureEvent(this);
            }
        }

    // ItreasureIGC
        virtual TreasureCode    GetTreasureCode(void) const
        {
            return m_data.treasureCode;
        }

        virtual IbuyableIGC*   GetBuyable(void) const
        {
            return m_buyable;
        }
        virtual ObjectID       GetTreasureID(void) const
        {
            return m_data.treasureID;
        }
        virtual void            SetTreasureID(ObjectID newVal)
        {
            m_data.treasureID = newVal;
        }
        virtual short           GetAmount(void) const
        {
            return m_data.amount;
        }
        virtual void            SetAmount(short a)
        {
            m_data.amount = a;
        }
        virtual void            ResetExpiration(Time now)
        {
            m_expire = now + m_data.lifespan;
        }

        virtual void            SetCreateNow (void)
        {
            m_data.createNow = true;
        }

    private:
        DataTreasureIGC     m_data;
        IbuyableIGC*        m_buyable;
        Time                m_expire;
        float               m_speed0;

        bool                m_stationaryF;
};

#endif //__TRESUREIGC_H_