// 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_MISSION_DESC_H
#define RY_MISSION_DESC_H

#include "nel/misc/types_nl.h"

// Number of missions a player can take
const uint	MAX_NUM_MISSIONS = 15;

// Number of mission tagret in a mission
const uint	MAX_NUM_MISSION_TARGETS = 8;

namespace MISSION_DESC
{
	enum TMissionType
	{
		Solo = 0,
		Group,
		Guild
	};

	enum TStepType
	{
		KillCreature = 0,
		EndDynSteps = KillCreature,
		Talk,
		Target,
		SkillProgress,
		Craft,
		Harvest,
		BuyItem,
		SellItem,
		KillNpc,
		GiveItem,
		NbStepTypes,
	};
	enum TDifficulty
	{
		Easy = 0,
		Medium,
		Hard,
		NbDifficulties
	};

	enum TLength
	{
		Short = 0,
		Normal,
		Long,
		NbLength
	};

	enum TRewardType
	{
		Seeds = 0,
		Sp,
		ZCBuilding,
		NbReward,
	};

	/** This enum describe the visual on client (for window title text for instance)
	 *	You must change botchat_v4.xml
	 */
	enum TClientMissionType
	{
		Mission= 0,				// Describe a standard mission
		ZCRequirement,			// A Guild Mission, requirement to take a ZC pacifically
		BuildingRequirement,	// A Guild Mission, requirement to
		ZCCharge,				// Fake Mission. Represent a ZC Charge acquiring
		Building,				// Fake Mission. Represent a Building acquiring
		RMBuy,					// Fake Mission. Represent a BotMaster buying
		RMUpgrade,				// Fake Mission. Represent a BotMaster upgrading

		NumClientMissionType
	};

	/** This enum describe the visual on client. This is what filled in ICON Database field
	 *	If you change this enum, you MUST also change <options type="mission_icons" name="mission_icons">
	 *	in client config.xml.
	 *	You must also change the IconToClientMissionType below
	 */
	enum TIconId
	{
		IconNone= 0,
		IconMNCraft,					// 01) BK_generic.tga	ICO_Task_Craft.tga
		IconMNFight,					// 02) BK_generic.tga	ICO_Task_Fight.tga
		IconMNForage,					// 03) BK_generic.tga	ICO_Task_Forage.tga
		IconMNTravel,					// 04) BK_generic.tga	ICO_Task_Travel.tga
		IconMNGeneric,					// 05) BK_generic.tga	ICO_Task_Generic.tga
		IconMNRite,						// 06) BK_generic.tga	ICO_Task_Rite.tga
		IconMGGuild,					// 07) BK_guild.tga		ICO_Task_Guild.tga
		IconMGCraft,					// 08) BK_guild.tga		ICO_Task_Craft.tga
		IconMGFight,					// 09) BK_guild.tga		ICO_Task_Fight.tga
		IconMGForage,					// 10) BK_guild.tga		ICO_Task_Forage.tga
		IconMGTravel,					// 11) BK_guild.tga		ICO_Task_Travel.tga
		IconZCCharge,
		IconRMMagicBuy,
		IconRMFightBuy,
		IconRMCraftBuy,
		IconRMMagicUpgrade,
		IconRMFightUpgrade,
		IconRMCraftUpgrade,
		IconZCRequirement,
		IconBuildingRequirement,
		IconBuilding,
		NumIcons
	};

	// For each IconId, gives the ClientMissionType
	const	TClientMissionType		IconToClientMissionType[]=
	{
		Mission,
		Mission,
		Mission,
		Mission,
		Mission,
		Mission,
		Mission,
		Mission,
		Mission,
		Mission,
		Mission,
		Mission,
		ZCCharge,
		RMBuy,
		RMBuy,
		RMBuy,
		RMUpgrade,
		RMUpgrade,
		RMUpgrade,
		ZCRequirement,
		BuildingRequirement,
		Building
	};

	// The pre-requesit state of a mission (the client know why he can't do a mission)
	enum TPreReqState
	{
		PreReqSuccess = 0,
		PreReqFailAlreadyDone,
		PreReqFail,
		PreReqFailRunning
	};

	/// get the TClientMissionType according to TIconId. return Mission if error.
	TClientMissionType	getClientMissionType(TIconId iconId);

	const std::string & toString(TStepType type);
	TStepType toStepType( const std::string & str );

	const std::string & toString(TRewardType type);
	TRewardType toRewardType( const std::string & str );
}


#endif // RY_MISSION_DESC_H

/* End of mission_desc.h */