
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_InventoryItem_SubType.cpp
// Author : Andy Tate
// Date   : 21-Nov-2007
//
// Copyright (C) 2007 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura.h"

// This file's header...
#include "Inventory/AVP_InventoryItem_SubType.h"

// Asura independent header-files...
#include "Blueprint/Asura_Blueprint_System.h"
#include "ChunkSystem/Asura_Chunk_Stream.h"

// Game independent header-files...
#include "Blueprint/AVP_Blueprint_HashIDs.h"
#include "Input/AVP_Rumble_System.h"
#include "Inventory/AVP_Inventory_ItemTypes.h"

////////////////////////////////////////////////////////////////////////////////
// Constant declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Static variable declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Private functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Protected functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Public functions...
////////////////////////////////////////////////////////////////////////////////

AVP_InventoryItem_SubType::AVP_InventoryItem_SubType( const int iSubType, const Asura_Hash_ID uBlueprintHashID )
: m_iType(iSubType)
, m_uBlueprintHash(uBlueprintHashID)
, m_uAmmoType(ASURA_HASH_ID_UNSET)
, m_fCurrentQuantity(1.0f)
, m_fMaxQuantity(1.0f)
, m_uVibrationHash(ASURA_HASH_ID_UNSET)
{
}

AVP_InventoryItem_SubType::AVP_InventoryItem_SubType(const Asura_Hash_ID uBlueprintHash)
: m_iType(AVP_INVENTORYITEMSUBTYPE_BASE)
, m_uBlueprintHash(uBlueprintHash)
, m_uAmmoType(ASURA_HASH_ID_UNSET)
, m_fCurrentQuantity(1.0f)
, m_fMaxQuantity(1.0f)
, m_uVibrationHash(ASURA_HASH_ID_UNSET)
{
}

void AVP_InventoryItem_SubType::InitialiseFromBlueprint()
{
	const Asura_Blueprint* pxBlueprint = Asura_Blueprint_System::GetBlueprintByHashID( uAVP_BLUEPRINT_TYPE_INVENTORY_ITEMS, m_uBlueprintHash );
	if ( pxBlueprint )
	{
		Asura_Value	xValue;
		if(pxBlueprint->GetParameterValueByHashID(0x28B065EF, xValue))	//Asura_Hash_ID("MaxQuantity"), xValue))
		{
			m_fMaxQuantity	= xValue.GetFloatValue();
		}
		if(pxBlueprint->GetParameterValueByHashID(0x1A7037CF, xValue))	//Asura_Hash_ID("InitialQuantity"), xValue))
		{
			m_fCurrentQuantity	= xValue.GetFloatValue();
		}
		if(pxBlueprint->GetParameterValueByHashID(uAVP_BLUEPRINT_PARAM_AMMOTYPE, xValue))	//Asura_Hash_ID("AmmoType"), xValue))
		{
			m_uAmmoType	= xValue.GetHashIDValue();
		}
		if(pxBlueprint->GetParameterValueByHashID(0xFB1EF292, xValue))	//Asura_Hash_ID("Vibration"), xValue))
		{
			m_uVibrationHash = xValue.GetHashIDValue();
		}
	}
	else
	{
		Asura_Assertf( false, ( "AVP_InventoryItem_SubType::InitialiseFromBlueprint - cannot find blueprint 0x%x to initialise from.", m_uBlueprintHash ) );
	}
}

void AVP_InventoryItem_SubType::ReadFromChunkStream( Asura_Chunk_Stream& xStream )
{
	u_int uVersion;
	xStream >> uVersion;
	if ( uVersion == uCURRENT_CHUNK_VERSION )
	{
		xStream >> m_uAmmoType;
		xStream >> m_fCurrentQuantity;
		xStream >> m_fMaxQuantity;
		xStream >> m_uVibrationHash;
	}
	else if ( uVersion == 0 )
	{
		xStream >> m_uAmmoType;
		xStream >> m_fCurrentQuantity;
		xStream >> m_fMaxQuantity;
	}
	else
	{
		Asura_Assertf( false, ( "AVP_InventoryItem_SubType::ReadFromChunkStream - unhandled chunk version (%u)", uVersion ) );
	}
}

void AVP_InventoryItem_SubType::WriteToChunkStream( Asura_Chunk_Stream& xStream ) const
{
	xStream << uCURRENT_CHUNK_VERSION;

	xStream << m_uAmmoType;
	xStream << m_fCurrentQuantity;
	xStream << m_fMaxQuantity;
	xStream << m_uVibrationHash;
}

////////////////////////////////////////////////////////////////////////////////
// Function     : AVP_InventoryItem_SubType::DecreaseQuantity
// Author       : Andy Tate
// Date         : 21-Nov-2007
////////////////////////////////////////////////////////////////////////////////

float AVP_InventoryItem_SubType::DecreaseQuantity(const float fQuantity)
{
	const float	fQuantityRemaining	= m_fCurrentQuantity;

//	float		fActualQuantity;

	// Are we able to remove all of them?
	if(fQuantityRemaining < fQuantity)
	{
//		fActualQuantity		= fQuantityRemaining;
		m_fCurrentQuantity	= 0;
	}
	else
	{
		m_fCurrentQuantity	-= fQuantity;
//		fActualQuantity		 = fQuantity;
	}

	// Return the quantity actually modified...
	return(m_fCurrentQuantity);
}

/// End of function 'AVP_InventoryItem_SubType::DecreaseQuantity'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : AVP_InventoryItem_SubType::IncreaseQuantity
// Author       : Andy Tate
// Date         : 21-Nov-2007
////////////////////////////////////////////////////////////////////////////////

float AVP_InventoryItem_SubType::IncreaseQuantity(const float fQuantity)
{
	const float	fQuantityRemaining	= m_fMaxQuantity - m_fCurrentQuantity;

//	float		fActualQuantity;

	// Are we able to remove all of them?
	if(fQuantityRemaining < fQuantity)
	{
//		fActualQuantity		= fQuantityRemaining;
		m_fCurrentQuantity	= m_fMaxQuantity;
	}
	else
	{
		m_fCurrentQuantity	+= fQuantity;
//		fActualQuantity		 = fQuantity;
	}

	// Return the quantity actually modified...
	return(m_fCurrentQuantity);
}
/// End of function 'AVP_InventoryItem_SubType::IncreaseQuantity'. ///

////////////////////////////////////////////////////////////////////////////////
// Function     : AVP_InventoryItem_SubType::InitRumble
// Author       : AJK
// Date         : 27-03-2009
////////////////////////////////////////////////////////////////////////////////
void AVP_InventoryItem_SubType::InitRumble() const
{
	if ( m_uVibrationHash != ASURA_HASH_ID_UNSET  )
	{
		AVP_Rumble_System::InitFromBlueprint( m_uVibrationHash );
	}
}
/// End of file. ///
