// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010  Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.



#ifndef RY_ITEM_INFOS_H
#define RY_ITEM_INFOS_H

#include "nel/misc/types_nl.h"
#include "damage_types.h"
#include "protection_type.h"
#include "people.h"
#include "skills.h"
#include "characteristics.h"
#include "sphrase_com.h"
#include "type_skill_mod.h"


///\structure defining the protection of an item
struct SProtection
{
	inline SProtection():Factor(0.0f),Max(0){}
	void serial( NLMISC::IStream & f )
	{
		f.serial( Factor );
		f.serial( Max );
	}
	/// protection factor ( must be in [0..1] range 0 means no protection)
	float Factor;
	/// max absorbed damage
	uint16 Max;
};


/**
 * class used to store the item advanced infos and to send it to the client
 * \author Nicolas Brigand
 * \author Nevrax France
 * \date 2003
 */
class CItemInfos
{
public:
	enum
	{
		// The number of bits of the lower bits part (the index part)
		// 10 because the trading list can have 1024 entries
		SlotIdIndexBitSize= 11,
		SlotIdIndexBitMask= (1<<SlotIdIndexBitSize)-1,
	};

	enum
	{
		MaxMagicProtectionByJewel= 3,
		MaxMagicResistanceByJewel= 3,
	};

public:
	/// ctor
	CItemInfos();

	///\serial
	void serial(NLMISC::IStream & s);

	/// inventoryId(6 higher order bits )/slotId(10 lowers bits)
	uint16	slotId;
	/// version of the inventory slot
	uint16	versionInfo;
	///\name item properties
	//{@
	uint32 Hp;				// Current Durability of item
	uint32 HpMax;			// Max Durability of item (when is new)
	uint32 CreatorName;		// player character crafted item (if is a item crafted by PC)
	uint32 CurrentDamage;	// if is weapons or ammo, damage made by item whith current PC skill, if item is an range weapon, it is a modifier (+/- and base is ammo) (can be modified by action)
	uint32 MaxDamage;		// if is weapons or ammo, maximum damage can be made by item (due to his recommended skill (= old quality for weapon and ammos), this is reached when skill = recommended (can be modified by action)
	float HitRate;			// nb hits per minute item made (can be modified by action)
	uint32 SapLoadCurrent;	// sap load of item (for enchantment)
	uint32 SapLoadMax;		// sap load of item (for enchantment)
	float Range;			// range of weapon in milimeter, if item is an ammo, it is a modifier (+/-, base is range weapon)
	sint32 ParryModifier;	// parry modifier
	sint32 DodgeModifier;	// dodge modifier
	sint32 AdversaryParryModifier; // target parry modifier
	sint32 AdversaryDodgeModifier; // target dodge modifier
	float ProtectionFactor;	// protection in % gived by item
	uint32 MaxSlashingProtection; // max damage absorbed by protection
	uint32 MaxBluntProtection;    // max damage absorbed by protection
	uint32 MaxPiercingProtection; // max damage absorbed by protection
	PROTECTION_TYPE::TProtectionType MagicProtection[MaxMagicProtectionByJewel]; //magic protection, only gived by jewel
	uint32 MagicProtectionFactor[MaxMagicProtectionByJewel];
	uint32 DesertMagicResistance;	// Magic resistances
	uint32 ForestMagicResistance;
	uint32 LacustreMagicResistance;
	uint32 JungleMagicResistance;
	uint32 PrimaryRootMagicResistance;
	sint32 HpBuff;	// hp buff / debuff gived when item is equiped
	sint32 SapBuff; // sap buff / debuff gived when item is equiped
	sint32 StaBuff; // sta buff / debuff gived when item is equiped
	sint32 FocusBuff; // focus buff / debuff gived when item is equiped

	SKILLS::ESkills	RequiredSkill; // required skill
	uint16 RequiredSkillLevel; // required skill level
	SKILLS::ESkills	RequiredSkill2; // required skill
	uint16 RequiredSkillLevel2; // required skill level
	CHARACTERISTICS::TCharacteristics RequiredCharac; // required stat
	uint16 RequiredCharacLevel; // min required stat level

	// type specific skill bonus (applied against given race ennemies)
	std::vector<CTypeSkillMod>	TypeSkillMods;

	// magic focus factor
	enum	TMagicFactorType
	{
		OffensiveElemental=0,	// elemental spells (DD acid, fire...)
		OffensiveAffliction,	// offensive affliction spells
		DefensiveHeal,			// heal spells
		DefensiveAffliction,	// defensive affliction spells

		NumMagicFactorType
	};
	float	CastingSpeedFactor[NumMagicFactorType];
	float	MagicPowerFactor[NumMagicFactorType];

	CSPhraseCom	Enchantment;
	float  WearEquipmentMalus; // Malus for wearing this equipment (malus is used when execute an magic, forage action, craft action...), malus is only applicable for weapon and armor pieces

	ucstring	CustomText;
	ucstring	R2ItemDescription;
	ucstring	R2ItemComment;
	uint8		PetNumber; // 1 based pet index
	//@}
};


#endif // RY_ITEM_INFOS_H

/* End of item_infos.h */