#ifndef __INTERFACE_ITEMS_H
#define __INTERFACE_ITEMS_H

#include "Items.h"
#include "Handle Items.h"
#include "popup_class.h"

// DEFINES FOR ITEM SLOT SIZES IN PIXELS
#define		BIG_INV_SLOT_WIDTH				61
#define		BIG_INV_SLOT_HEIGHT				22
#define		SM_INV_SLOT_WIDTH				30
#define		SM_INV_SLOT_HEIGHT				23
#define		ATTACH_SLOT_WIDTH				32
#define		ATTACH_SLOT_BIG_WIDTH			64
#define		VEST_INV_SLOT_WIDTH				43
#define		VEST_INV_SLOT_HEIGHT			24
#define		LEGS_INV_SLOT_WIDTH				43
#define		LEGS_INV_SLOT_HEIGHT			24
#define		HEAD_INV_SLOT_WIDTH				43
#define		HEAD_INV_SLOT_HEIGHT			24

#define		NUM_UDB_GEN_LINES	12
#define		NUM_UDB_ADV_LINES	13			// Flugente FTW 1.1: 12->13
#define		GEN_SEC_REGION_ENTRIES 24		// 6 lines x 4 icons
 
// HEADROCK HAM 4: These rectangle definitions are used in UDB to determine locations for icons, data, and tooltip
// regions. They replace the plethora of region data provided in EDB.
typedef struct
{
	INT16 sLeft;
	INT16 sTop;
	INT16 sRight;
	INT16 sBottom;
} INV_DESC_REGIONS;

extern INV_DESC_REGIONS gItemDescLBEBackground[4]; // Coordinates for displaying LBE background image
extern INV_DESC_REGIONS gItemDescGenHeaderRegions[3]; // Header text regions for various parts of the General Tab
extern INV_DESC_REGIONS gItemDescGenIndexRegions[3][4]; // Index text regions for various parts of the General Tab
extern INV_DESC_REGIONS gItemDescGenRegions[NUM_UDB_GEN_LINES * 2][4]; // Data regions, 4 sub-columns each
extern INV_DESC_REGIONS gItemDescGenSecondaryRegions[GEN_SEC_REGION_ENTRIES]; // Secondary data regions, 6 lines x 4 icons
extern INV_DESC_REGIONS gItemDescTextRegions[9]; // Main description regions
extern INV_DESC_REGIONS gItemDescAdvIndexRegions[1][4];
extern INV_DESC_REGIONS gItemDescAdvRegions[NUM_UDB_ADV_LINES][4]; // Advanced data regions, 4 sub-columns each

// ODB arrays
extern INV_DESC_REGIONS gODBItemDescRegions[4][8]; // Four regions of eight sub-regions each.

//CHRISL: moved from Interface Items.cpp
typedef struct
{
	INT16		sX;
	INT16		sY;
	INT16		sValDx;

} INV_DESC_STATS;
typedef struct
{
	INT16		sX;
	INT16		sY;
	INT16		sHeight;
	INT16		sWidth;
	INT16		sBarDx;
	INT16		sBarDy;

} INV_ATTACHXY;
typedef struct
{
	UINT32	uiTotalAmount;
	UINT32	uiMoneyRemaining;
	UINT32	uiMoneyRemoving;

} REMOVE_MONEY;
typedef struct
{
	UINT16 x;
	UINT16 y;
} MoneyLoc;
void ItemDescCallback( MOUSE_REGION * pRegion, INT32 iReason );
#define		ITEMDESC_FONT					BLOCKFONT2
#define		INV_BAR_DX						5
#define		INV_BAR_DY						21
#define		ITEM_STATS_WIDTH				26
#define		ITEM_STATS_HEIGHT				8
#define		EXCEPTIONAL_GUN_DAMAGE			40
#define		EXCEPTIONAL_MELEE_DAMAGE		40
#define		EXCEPTIONAL_WEIGHT				20
#define		EXCEPTIONAL_RANGE				400
#define		EXCEPTIONAL_MAGAZINE			50
#define		EXCEPTIONAL_AP_COST				5
#define		EXCEPTIONAL_BURST_SIZE			5
#define		EXCEPTIONAL_RELIABILITY			2
#define		EXCEPTIONAL_REPAIR_EASE			2
#define		EXCEPTIONAL_ACCURACY			4
#define		ITEMDESC_FONTHIGHLIGHT			FONT_MCOLOR_WHITE
#define		ITEMDESC_FONTPOSITIVE		FONT_MCOLOR_LTGREEN
#define		ITEMDESC_FONTNEGATIVE		FONT_MCOLOR_LTRED

//CHRISL: extern'd for EDB project
extern INT16	gsInvDescX;
extern INT16	gsInvDescY;
extern UINT8	gubItemDescStatusIndex;

extern INT16	BULLET_SING_X;
extern INT16	BULLET_SING_Y;
extern INT16	BULLET_BURST_X;
extern INT16	BULLET_BURST_Y;
extern INT16	ITEMDESC_CALIBER_X;
extern INT16	ITEMDESC_CALIBER_Y;
extern INT16	ITEMDESC_CALIBER_WIDTH;
extern INT16	ITEMDESC_NAME_X;
extern INT16	ITEMDESC_NAME_Y;
extern INT16	ITEMDESC_ITEM_X;
extern INT16	ITEMDESC_ITEM_Y;
extern INT16	ITEMDESC_ITEM_STATUS_X;
extern INT16	ITEMDESC_ITEM_STATUS_Y;
extern INT16	ITEMDESC_ITEM_STATUS_HEIGHT;
extern INT16	ITEMDESC_AMMO_X;
extern INT16	ITEMDESC_AMMO_Y;
extern INT16	ITEMDESC_DONE_X;
extern INT16	ITEMDESC_DONE_Y;

// A STRUCT USED INTERNALLY FOR INV SLOT REGIONS
typedef struct
{
	BOOLEAN		fBigPocket;
	INT16			sBarDx;
	INT16			sBarDy;
	INT16			sWidth;
	INT16			sHeight;
	INT16			sX;				// starts at 0, gets set via InitInvSlotInterface()
	INT16			sY;				// starts at 0, gets set via InitInvSlotInterface()
} INV_REGIONS;

// USED TO SETUP REGION POSITIONS, ETC
typedef struct
{
	INT16			sX;
	INT16			sY;
} INV_REGION_DESC;


class OLD_ITEM_CURSOR_SAVE_INFO_101
{
public:
	OLD_OBJECTTYPE_101	ItemPointerInfo;
	UINT8				ubSoldierID;
	UINT8				ubInvSlot;
	BOOLEAN				fCursorActive;
	INT8				bPadding[5];

};


class ITEM_CURSOR_SAVE_INFO
{
public:
	ITEM_CURSOR_SAVE_INFO& operator=(OLD_ITEM_CURSOR_SAVE_INFO_101& src)
	{
		this->fCursorActive = src.fCursorActive;
		this->ItemPointerInfo = src.ItemPointerInfo;
		this->ubInvSlot = src.ubInvSlot;
		this->ubSoldierID = static_cast<UINT16>(src.ubSoldierID);
		return *this;
	}
	//could use a little tidying up
	BOOLEAN Save(HWFILE hFile);
	BOOLEAN Load(HWFILE hFile);

	SoldierID			ubSoldierID;
	UINT8				ubInvSlot;
	BOOLEAN				fCursorActive;
	OBJECTTYPE			ItemPointerInfo;
};
#define SIZEOF_ITEM_CURSOR_SAVE_INFO_POD offsetof( ITEM_CURSOR_SAVE_INFO, ItemPointerInfo )

// HEADROCK HAM 5: Enums for big-item display attachment asterisks.
enum
{
	ATTACHMENT_NONE,
	ATTACHMENT_GENERAL,
	ATTACHMENT_GL,
	ATTACHMENT_RECOILREDUCTION,
	ATTACHMENT_OPTICAL,
};

// HEADROCK HAM 5: Asterisks for use with big item images
extern UINT32 guiAttachmentAsterisks;

// Itempickup stuff
BOOLEAN InitializeItemPickupMenu( SOLDIERTYPE *pSoldier, INT32 sGridNo, ITEM_POOL *pItemPool, INT16 sScreenX, INT16 sScreenY, INT8 bZLevel );
void RenderItemPickupMenu( );
void RemoveItemPickupMenu( );
void SetItemPickupMenuDirty( BOOLEAN fDirtyLevel );
BOOLEAN HandleItemPickupMenu( );
void SetPickUpMenuDirtyLevel( BOOLEAN fDirtyLevel );


// FUNCTIONS FOR INTERFACEING WITH ITEM PANEL STUFF
void INVRenderINVPanelItem( SOLDIERTYPE *pSoldier, INT16 sPocket, UINT8 fDirtyLevel );
BOOLEAN InitInvSlotInterface( INV_REGION_DESC *pRegionDesc , INV_REGION_DESC *pCamoRegion, MOUSE_CALLBACK INVMoveCallback, MOUSE_CALLBACK INVClickCallback, MOUSE_CALLBACK INVMoveCammoCallback, MOUSE_CALLBACK INVClickCammoCallback, BOOLEAN fSetHighestPrioity );
void ShutdownInvSlotInterface( );
void GetSlotInvXY( UINT8 ubPos, INT16 *psX, INT16 *psY );
void GetSlotInvHeightWidth( UINT8 ubPos, INT16 *psWidth, INT16 *psHeight );
void HandleRenderInvSlots( SOLDIERTYPE *pSoldier, UINT8 fDirtyLevel );
void HandleNewlyAddedItems( SOLDIERTYPE *pSoldier, BOOLEAN *fDirtyLevel );
void RenderInvBodyPanel( SOLDIERTYPE *pSoldier, INT16 sX, INT16 sY );
void DisableInvRegions( BOOLEAN fDisable );

void DegradeNewlyAddedItems( );
void CheckForAnyNewlyAddedItems( SOLDIERTYPE *pSoldier );


BOOLEAN HandleCompatibleAmmoUI( SOLDIERTYPE *pSoldier, INT8 bInvPos, BOOLEAN fOn );



// THIS FUNCTION IS CALLED TO RENDER AN ITEM.
// uiBuffer - The Dest Video Surface - can only be FRAME_BUFFER or guiSAVEBUFFER
// pSoldier - used for determining whether burst mode needs display
// pObject	- Usually taken from pSoldier->inv[HANDPOS]
// sX, sY, Width, Height,	- Will Center it in the Width
// fDirtyLevel	if == DIRTYLEVEL2 will render everything
//							if == DIRTYLEVEL1 will render bullets and status only
// 
//	pubHighlightCounter - if not null, and == 2 - will display name above item
//											-	if == 1 will only dirty the name space and then set counter to 0
//	Last parameter used mainly for when mouse is over item

void RenderBulletIcon(OBJECTTYPE *pObject, UINT32 ubStatusIndex = 0);
void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE	*pObject, INT16 sX, INT16 sY, INT16 sWidth, INT16 sHeight, UINT8 fDirtyLevel, UINT8 *pubHighlightCounter, UINT8 ubStatusIndex, BOOLEAN fOutline, INT16 sOutlineColor, UINT8 iter = 0 );
void INVRenderSteeringWheel( UINT32 uiBuffer, UINT32 uiSteeringWheelIndex, SOLDIERTYPE *pSoldier, INT16 sX, INT16 sY, INT16 sWidth, INT16 sHeight, UINT8 fDirtyLevel );
// HEADROCK HAM 5: Drawing a large item pic with extra data.
void MAPINVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE  *pObject, UINT32 uiItemGraphicNum, INT16 sX, INT16 sY, INT16 sWidth, INT16 sHeight, BOOLEAN fOutline, INT16 sOutlineColor );
// CHRISL: Add a new function that will be used to render a pocket silhouette
void INVRenderSilhouette( UINT32 uiBugger, INT16 PocketIndex, INT16 SilIndex, INT16 sX, INT16 sY, INT16 sWideth, INT16 sHeight);
// CHRISL: New function to handle display of inventory quantities based on item current in cursor
void RenderPocketItemCapacity( UINT32 uiWhichBuffer, INT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT16 sX, INT16 sY );
// CHRISL: New function to display items stored in an LBENODE
void RenderLBENODEItems( OBJECTTYPE *pObj, int subObject );
// CHRISL: New function to setup GSMInvData based on game options
void InitInvData(INV_REGIONS &InvData, BOOLEAN fBigPocket, INT16 sBarDx, INT16 sBarDy, INT16 sWidth, INT16 sHeight, INT16 sX, INT16 sY);
void InitInventoryOld();
void InitInventoryNew();
void InitInventoryVehicle(INV_REGION_DESC *pRegionDesc, MOUSE_CALLBACK INVMoveCallback, MOUSE_CALLBACK INVClickCallback, BOOLEAN fSetHighestPrioity);
void InitInventoryRobot(INV_REGION_DESC *pRegionDesc, MOUSE_CALLBACK INVMoveCallback, MOUSE_CALLBACK INVClickCallback, BOOLEAN fSetHighestPrioity);
void InitInventorySoldier(INV_REGION_DESC *pRegionDesc, MOUSE_CALLBACK INVMoveCallback, MOUSE_CALLBACK INVClickCallback, BOOLEAN fSetHighestPrioity, BOOLEAN fNIVmode);



extern BOOLEAN		gfInItemDescBox;

BOOLEAN InItemDescriptionBox( );
BOOLEAN InitItemDescriptionBox( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sX, INT16 sY, UINT8 ubStatusIndex );
BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY, UINT8 ubStatusIndex, SOLDIERTYPE *pSoldier, UINT8 ubPosition = NUM_INV_SLOTS );
void UpdateAttachmentTooltips( OBJECTTYPE *pObject, UINT8 ubStatusIndex );
BOOLEAN InitKeyItemDescriptionBox( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sX, INT16 sY, UINT8 ubStatusIndex );
void RenderItemDescriptionBox( );
void HandleItemDescriptionBox( BOOLEAN *pfDirty );
void DeleteItemDescriptionBox( );
extern BOOLEAN UseNASDesc(OBJECTTYPE  *pObject);
INT16 sNASXCorrection(OBJECTTYPE * pObject);
INT16 sNASYCorrection(OBJECTTYPE * pObject);
void HandleItemDescTabButton( );

BOOLEAN InItemStackPopup( );
BOOLEAN InitItemStackPopup( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight );
BOOLEAN InSectorStackPopup( );
BOOLEAN InitSectorStackPopup( SOLDIERTYPE *pSoldier, WORLDITEM *pInventoryPoolList, INT32 ubPosition, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight );
void RenderItemStackPopup( BOOLEAN fFullRender );
void HandleItemStackPopup( );
void DeleteItemStackPopup( );
void EndItemStackPopupWithItemInHand( );


// keyring handlers
BOOLEAN InitKeyRingPopup( SOLDIERTYPE *pSoldier, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight );
void RenderKeyRingPopup( BOOLEAN fFullRender );
void InitKeyRingInterface( MOUSE_CALLBACK KeyRingClickCallback );
void InitMapKeyRingInterface( MOUSE_CALLBACK KeyRingClickCallback );
void DeleteKeyRingPopup( );


void ShutdownKeyRingInterface( void );
void ShutdownInventoryInterface( void );

BOOLEAN InKeyRingPopup( void );
void BeginKeyRingItemPointer( SOLDIERTYPE *pSoldier, UINT8 ubKeyRingPosition );


extern OBJECTTYPE		*gpItemPointer;
extern OBJECTTYPE		gItemPointer;
extern SOLDIERTYPE		*gpItemPointerSoldier;
extern UINT16				usItemSnapCursor;
extern UINT16				us16BPPItemCyclePlacedItemColors[ 20 ];
extern BOOLEAN				gfItemPointerDifferentThanDefault;


void BeginItemPointer( SOLDIERTYPE *pSoldier, UINT8 ubHandPos );
void InternalBeginItemPointer( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObject, INT8 bHandPos );
void EndItemPointer( );
void DrawItemFreeCursor( );
void DrawItemTileCursor( );
void HideItemTileCursor( );
void InitItemInterface( );
BOOLEAN ItemCursorInLobRange( INT32 usMapPos );
BOOLEAN	 HandleItemPointerClick( INT32 usMapPos );
UINT32 GetInterfaceGraphicForItem( INVTYPE *pItem );
UINT16 GetTileGraphicForItem( INVTYPE *pItem );
BOOLEAN LoadTileGraphicForItem( INVTYPE *pItem, UINT32 *puiVo );

void GetHelpTextForItem( STR16 pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldier, int subObject = -1 );

void CancelItemPointer( );

BOOLEAN LoadItemCursorFromSavedGame( HWFILE hFile );
BOOLEAN SaveItemCursorToSavedGame( HWFILE hFile );

void EnableKeyRing( BOOLEAN fEnable );

// handle compatable items for merc and map inventory
BOOLEAN HandleCompatibleAmmoUIForMapScreen( SOLDIERTYPE *pSoldier, INT32 bInvPos, BOOLEAN fOn, BOOLEAN fFromMerc );
BOOLEAN HandleCompatibleAmmoUIForMapInventory( SOLDIERTYPE *pSoldier, INT32 bInvPos, INT32 iStartSlotNumber, BOOLEAN fOn, BOOLEAN fFromMerc	);
void ResetCompatibleItemArray( );

void CycleItemDescriptionItem( INT16 sX, INT16 sY );
INT16 CycleItems( UINT16 usOldItem );

BOOLEAN InitializeStealItemPickupMenu( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, ITEM_POOL *pItemPool, UINT8 ubCount);

// BOB : quick attachment selection popups
extern POPUP* gItemDescAttachmentPopups[MAX_ATTACHMENTS];	// popup list for attachment slots
extern INT32 giActiveAttachmentPopup;	// the attachment popup to display in mapscreen

// BOB : quick equip popups
extern POPUP* gEquipPopups[NUM_INV_SLOTS];	// popup list for attachment slots
extern INT32 giActiveEquipPopup;	// the attachment popup to display in mapscreen

// HEADROCK HAM 5: Item Transformation Popup
extern POPUP* gItemDescTransformPopup;
extern BOOLEAN gfItemDescTransformPopupInitialized;
extern BOOLEAN gfItemDescTransformPopupVisible;

// BOB : duh...
void DoAttachment( UINT8 subObject, INT32 iItemPos );

// THE_BOB (AKA BOB): ammo box/mag popups
void PocketPopupFull( SOLDIERTYPE *pSoldier, INT16 sPocket );	// displays all suported options
void PocketPopupDefault( SOLDIERTYPE *pSoldier, INT16 sPocket );	// displays only pocket-specific (predefined) options

POPUP * createPopupForPocket( SOLDIERTYPE *pSoldier, INT16 sPocket );	// creates a popup positioned next to the pocket

// THE_BOB 
extern UINT16 gsPocketUnderCursor;


void addArmorToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addLBEToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addWeaponsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addWeaponGroupsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addGrenadesToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addBombsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addFaceGearToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addAmmoToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );

void addRifleGrenadesToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addRocketAmmoToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addMiscToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addKitsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );

// Flugente: update merc info text on merc body silhouette in strategic view
void UpdateMercBodyRegionHelpText( );

#endif
