/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of Penumbra Overture.
*
* Penumbra Overture is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Penumbra Overture is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Penumbra Overture. If not, see .
*/
#ifndef GAME_INVENTORY_H
#define GAME_INVENTORY_H
#include "StdAfx.h"
using namespace hpl;
#include "GameTypes.h"
class cInit;
class cInventory_GlobalSave;
class cGameItemType;
typedef std::vector tGameItemTypeVec;
typedef tGameItemTypeVec::iterator tGameItemTypeVecIt;
//--------------------------------------------
class iInventoryWidget
{
public:
iInventoryWidget(cInit *apInit, const cRect2f &aRect, cGfxObject* apGfxObject, float afZ);
virtual ~iInventoryWidget()
{
if(mpGfxObject)
mpDrawer->DestroyGfxObject(mpGfxObject);
}
virtual void Draw();
virtual void OnDraw(){}
virtual void OnMouseOver(){}
virtual void OnMouseDown(eMButton aButton){}
virtual void OnMouseUp(eMButton aButton){}
virtual void OnDoubleClick(eMButton aButton){}
virtual void OnUpdate(float afTimeStep){}
virtual void OnShortcutDown(int alNum){}
cRect2f& GetRect(){ return mRect;}
cGfxObject* GetGfxObject(){ return mpGfxObject;}
protected:
cInit *mpInit;
cGraphicsDrawer *mpDrawer;
cGfxObject* mpGfxObject;
cRect2f mRect;
float mfZ;
};
typedef std::list tInventoryWidgetList;
typedef tInventoryWidgetList::iterator tInventoryWidgetListIt;
//-----------------------------------------
class cInventoryItem;
class cInventorySlot : public iInventoryWidget
{
friend class cInventory;
public:
cInventorySlot(cInit *apInit, const cVector2f &avPos, bool abEquip, int alIndex);
void OnDraw();
void OnMouseOver();
void OnMouseDown(eMButton aButton);
void OnMouseUp(eMButton aButton);
void OnDoubleClick(eMButton aButton);
void OnUpdate(float afTimeStep);
void OnShortcutDown(int alNum);
cInventoryItem* GetItem(){ return mpItem;}
void SetItem(cInventoryItem* apItem){ mpItem = apItem;}
void SetIndex(int alX){ mlIndex = alX;}
void SetEquip(bool abX){ mbEquip = abX;}
void SetEquipIndex(int alX){ mlEquipIndex = alX;}
int GetEquipIndex(){ return mlEquipIndex;}
private:
cInventoryItem *mpItem;
int mlIndex;
bool mbEquip;
int mlEquipIndex;
cGfxObject *mpGfxBack;
iFontData *mpFont;
};
typedef std::list tInventorySlotList;
typedef tInventorySlotList::iterator tInventorySlotListIt;
//-----------------------------------------
class cGameItem;
class cInventoryItem
{
friend class cInventory;
public:
cInventoryItem(cInit *apInit);
~cInventoryItem();
bool Init(cGameItem *apGameItem);
bool InitFromFile(const tString &asFile);
void Drop();
void SetName(const tString &asName){ msName = asName;}
const tString& GetName(){ return msName;}
void SetSubType(const tString &asSubType){ msSubType = asSubType;}
const tString& GetSubType(){ return msSubType;}
const tWString& GetGameName(){ return msGameName;}
const tWString& GetDescription(){ return msDescription;}
const tString& GetHudModelFile(){ return msHudModelFile;}
const tString& GetHudModelName(){ return msHudModelName;}
const tString& GetEntityFile(){ return msEntityFile;}
cGfxObject* GetGfxObject(){ return mpGfxObject;}
cGfxObject* GetGfxObjectAdditive(){ return mpGfxObjectAdditive;}
eGameItemType GetItemType(){ return mItemType;}
bool CanBeDropped(){ return mbCanBeDropped;}
bool HasCount(){ return mbHasCount;}
int GetCount(){ return mlCount;}
void AddCount(int alX){ mlCount += alX;}
void SetCount(int alX){ mlCount = alX;}
private:
cInit *mpInit;
tString msName;
tString msSubType;
tWString msGameName;
tWString msDescription;
eGameItemType mItemType;
tString msEntityFile;
tString msHudModelFile;
tString msHudModelName;
cGfxObject* mpGfxObject;
cGfxObject* mpGfxObjectAdditive;
cGraphicsDrawer *mpDrawer;
cInventoryItem *mpItem;
bool mbCanBeDropped;
bool mbHasCount;
int mlCount;
};
typedef std::multimap tInventoryItemMap;
typedef tInventoryItemMap::iterator tInventoryItemMapIt;
//-----------------------------------------
class cInventoryBattery : public iInventoryWidget
{
public:
cInventoryBattery(cInit *apInit, const cRect2f &aRect, cGfxObject* apGfxObject, float afZ);
~cInventoryBattery();
void OnDraw();
void OnMouseOver();
void OnUpdate(float afTimeStep);
private:
cGfxObject* mpGfxBatteryMeter;
cGfxObject* mpGfxBatteryMeterBar;
};
//-----------------------------------------
class cInventoryHealth : public iInventoryWidget
{
public:
cInventoryHealth(cInit *apInit, const cRect2f &aRect, cGfxObject* apGfxObject, float afZ);
~cInventoryHealth();
void OnDraw();
void OnMouseOver();
void OnUpdate(float afTimeStep);
private:
cGfxObject* mpGfxFine;
cGfxObject* mpGfxCaution;
cGfxObject* mpGfxDanger;
};
//-----------------------------------------
class cInventoryContext
{
public:
cInventoryContext(cInit *apInit);
~cInventoryContext();
void SetActive(bool abX);
bool IsActive(){ return mbActive;}
void Draw();
void Update(float afTimeStep);
void OnMouseDown(eMButton aButton);
void OnMouseUp(eMButton aButton);
void Setup(cInventoryItem *apItem, const cVector2f& avPos);
private:
cInit *mpInit;
cGraphicsDrawer *mpDrawer;
iFontData *mpFont;
cGfxObject* mpGfxBack;
cGfxObject* mpGfxCorner11;
cGfxObject* mpGfxCorner12;
cGfxObject* mpGfxCorner21;
cGfxObject* mpGfxCorner22;
cGfxObject* mpGfxRight;
cGfxObject* mpGfxLeft;
cGfxObject* mpGfxTop;
cGfxObject* mpGfxBottom;
bool mbActive;
float mfAlpha;
tWStringVec *mpActionVec;
float mfRowStart;
float mfRowSize;
float mfColLength;
int mlSelectedRow;
cInventoryItem *mpItem;
cVector3f mvPos;
cVector2f mvSize;
cRect2f mRect;
};
//-----------------------------------------
kSaveData_BaseClass(cInventory)
{
kSaveData_ClassInit(cInventory)
public:
cContainerList mlstStartpos;
cContainerList mlstUseCallbacks;
cContainerList mlstPickupCallbacks;
cContainerList mlstCombineCallbacks;
virtual iSaveObject* CreateSaveObject(cSaveObjectHandler *apSaveObjectHandler,cGame *apGame);
virtual int GetSaveCreatePrio();
};
//--------------------------------------------
class cInventory : public iUpdateable
{
friend class cSaveHandler;
public:
cInventory(cInit *apInit);
~cInventory();
void OnStart();
void Update(float afTimeStep);
void Reset();
void OnDraw();
void SetActive(bool abX);
bool IsActive();
float GetAlpha(){ return mfAlpha;}
void AddWidget(iInventoryWidget* apWidget);
void AddItem(cGameItem *apGameItem);
void AddItemFromFile(const tString &asName,const tString &asFile, int alSlotIndex);
void RemoveItem(cInventoryItem *apItem);
cInventoryItem *GetItem(const tString &asName);
void SetMousePos(const cVector2f &avPos);
void AddMousePos(const cVector2f &avRel);
void SetNoteBookActive(bool abX){ mbNoteBookIsActive = abX;}
bool GetNoteBookActive(){ return mbNoteBookIsActive;}
void OnMouseDown(eMButton aButton);
void OnMouseUp(eMButton aButton);
void OnDoubleClick(eMButton aButton);
void OnInventoryDown();
void OnShortcutDown(int alNum);
cVector2f GetMousePos(){return mvMousePos;}
//void SetMousePos(const cVector2f& avPos){ mvMousePos = avPos;}
void SetItemName(const tWString &asName){ msItemName = asName;mbDrawText=true;}
void SetItemDesc(const tWString &asDesc) {msItemDesc = asDesc;mbDrawText=true;}
cInventoryItem *GetCurrentItem(){ return mpCurrentItem;}
void SetCurrentItem(cInventoryItem *apItem){ mpCurrentItem = apItem;}
cInventorySlot *GetCurrentSlot(){ return mpCurrentSlot;}
void SetCurrentSlot(cInventorySlot *apSlot){ mpCurrentSlot = apSlot;}
void SetCurrentItemOffset(const cVector2f& avOffset){ mvCurrentItemOffset = avOffset;}
cInventorySlot* GetEquipSlot(int alIdx){ return mvEquipSlots[alIdx];}
cInventoryContext* GetContext(){ return mpContext;}
cGameItemType* GetItemType(int alIndex){ return mvItemTypes[alIndex];}
void SetDroppedInSlot(bool abX){ mbDroppedInSlot = abX;}
void SetMessage(const tWString &asMessage);
void AddPickupCallback(const tString &asItem, const tString &asFunction);
void AddUseCallback(const tString &asItem, const tString &asObject, const tString &asFunction);
void AddCombineCallback(const tString &asItem1,const tString &asItem2, const tString &asFunction);
void RemovePickupCallback(const tString &asFunction);
void RemoveUseCallback(const tString &asFunction);
void RemoveCombineCallback(const tString &asFunction);
void ClearCallbacks();
void CheckPickupCallback(const tString &asItem);
bool CheckUseCallback(const tString &asItem, const tString &asObject);
bool CheckCombineCallback(const tString &asItem1,const tString &asItem2,int alSlotIndex);
//Global save
void SaveToGlobal(cInventory_GlobalSave *apSave);
void LoadFromGlobal(cInventory_GlobalSave *apSave);
//Save
iSaveData* CreateSaveData();
private:
cInit *mpInit;
cGraphicsDrawer *mpDrawer;
cInventoryContext *mpContext;
cGfxObject *mpGfxBackground;
cGfxObject *mpBatteryMeter;
cGfxObject *mpBatteryMeterBar;
cGfxObject *mpHealthMan_Fine;
cGfxObject *mpHealthMan_Caution;
cGfxObject *mpHealthMan_Danger;
cGfxObject *mpHealthTextFrame;
cGfxObject *mpBagpack;
tGameItemTypeVec mvItemTypes;
bool mbActive;
float mfAlpha;
float mfTextAlpha;
eCrossHairState mLastCrossHairState;
tWString msItemName;
tWString msItemDesc;
bool mbDrawText;
bool mbDroppedInSlot;
bool mbCheckingCombineItems;
bool mbNoteBookIsActive;
iFontData *mpFont;
cVector2f mvMousePos;
bool mbMessageActive;
tWString msMessage;
float mfMessageAlpha;
cGfxObject *mpMessageBackground;
cInventoryItem *mpCurrentItem;
cVector2f mvCurrentItemOffset;
cInventorySlot *mpCurrentSlot;
tInventoryWidgetList mlstWidgets;
tInventoryItemMap m_mapItems;
tInventorySlotList mlstSlots;
std::vector mvEquipSlots;
tInventoryPickupCallbackMap m_mapPickupCallbacks;
tInventoryUseCallbackMap m_mapUseCallbacks;
tInventoryCombineCallbackList mlstCombineCallbacks;
};
#endif // GAME_INVENTORY_H