#pragma once

#include <fstream>
using namespace std;
using std::string;

//Need to know these for Profession-Comparison
enum ClassNames { Warrior, Thief, Cleric, Wizard, Tradesman, General, TOTAL_PC_JOBS };

//Skill Levels for ease any changes
#define multiplier 1.7

#define LEVEL_01 int(0)						// 0
#define LEVEL_02 int(100)					// 100
#define LEVEL_03 int(LEVEL_02 * multiplier)	// 170
#define LEVEL_04 int(LEVEL_03 * multiplier)	// 289
#define LEVEL_05 int(LEVEL_04 * multiplier)	// 491
#define LEVEL_06 int(LEVEL_05 * multiplier)	// 834
#define LEVEL_07 int(LEVEL_06 * multiplier)	// 1,417
#define LEVEL_08 int(LEVEL_07 * multiplier)	// 2,408
#define LEVEL_09 int(LEVEL_08 * multiplier)	// 4,093
#define LEVEL_10 int(LEVEL_09 * multiplier)	// 6,958
#define LEVEL_11 int(LEVEL_10 * multiplier)	// 11,828
#define LEVEL_12 int(LEVEL_11 * multiplier)	// 20,107
#define LEVEL_13 int(LEVEL_12 * multiplier)	// 34,181
#define LEVEL_14 int(LEVEL_13 * multiplier)	// 58,107
#define LEVEL_15 int(LEVEL_14 * multiplier)	// 98,781
#define LEVEL_16 int(LEVEL_15 * multiplier)	// 167,927
#define LEVEL_17 int(LEVEL_16 * multiplier)	// 285,475
#define LEVEL_18 int(LEVEL_17 * multiplier)	// 485,307
#define LEVEL_19 int(LEVEL_18 * multiplier)	// 825,021
#define LEVEL_20 int(LEVEL_19 * multiplier)	// 1,402,535
#define LEVEL_21 int(LEVEL_20 * multiplier)	// 2,384,309
#define LEVEL_22 int(LEVEL_21 * multiplier)	// 4,053,325
#define LEVEL_23 int(LEVEL_22 * multiplier)	// 6,890,652
#define LEVEL_24 int(LEVEL_23 * multiplier)	// 11,714,108
#define LEVEL_25 int(LEVEL_24 * multiplier)	// 19,913,983
//Skill Defines
enum SkillList
{
	SkAlchemy, SkAniTrain, SkBalance, SkBargain, SkBegging, SkB_Smith, SkBoatWri, SkBowyer, SkBrewing, SkCandle,	//0-9
	SkCarpent, SkCartogr, SkCartWri, SkCheese, SkClimb, SkCooking, SkCraftIn, SkDiagnos, SkDirSens, SkDisguis,		//10-19
	SkEavesDr, SkEnduran, SkEnginee, SkFarming, SkFieldSt, SkFireBui, SkFishing, SkGemCutt, SkGeograp, SkGeology,	//20-29
	SkHealing, SkHerbali, SkHiding, SkJumping, SkLeaders, SkLeathWo, SkLockPic, SkLockSmi, SkMeditat, SkMetalSm,	//30-39
	SkMndOvBo, SkMining, SkNightSi, SkObserva, SkPhiloso, SkPickpoc, SkPoison, SkPottery, SkReadWri, SkRopeNet,		//40-49
	SkRunning, SkSeamans, SkSeance, SkSkinnin, SkStealth, SkStonema, SkSurviva, SkSwimmin, SkTailori, SkTrackin,	//50-59
	SkTrailSk, SkTraps, SkVeterin, SkWeapSmi, SkWeaving, SkWghtLif, SkWSBloPa, SkWSDodgi, SkWSPunch, SkWSBrdic,		//60-69
	SkWSBstSw, SkWSBatAx, SkWSBLong, SkWSBShor, SkWSBrSwr, SkWSClub, SkWSCLBow, SkWSCSBow, SkWSCrBow, SkWSDagge,	//70-79
	SkWSFlail, SkWSHndAx, SkWSLance, SkWSLngSw, SkWSMace, SkWSMrnSt, SkWSPick, SkWSQStaf, SkWSScimi, SkWSScour,		//80-89
	SkWSShoSw, SkWSSickl, SkWSSpear, SkWSTride, SkWSWarHa, SkWSWhip,												//90-95
	MAX_NUM_SKILLS
};
#define Sk100 100
class Skill
{
public:
	Skill();
	~Skill();
	void		SetSkill			(int w)			{ Skill_ID = w;		};
	int			GetSkill			() const		{ return Skill_ID;	};
	void		SetXP				(int i);	
	int			GetXP				() const		{ return XP;		};
	void		SetLevel			(int i)			{ Level = i;		};
	int			GetLevel			() const		{ return Level;		};
	void		SetTimer			(int i)			{ Timer = i;		};
	int			GetTimer			() const		{ return Timer;		};
	void		Reset				();
	void		AssignLevel			();
	int			getXPPercent		();
	void		adjustXP			(int amount);
	int			getXPNextLvl		();

	int			GetAssoc			();
	int			GetAssocByRef		(int index);

	string		getUserSkillName	();
	string		getUserSkillName	(int i);
	string		getSkillStrID		(int i);
	void		UseSkill	();

	const Skill& operator =			(const Skill &newData);
	const Skill* operator =			(const Skill *newData);
	bool		operator  <			(const Skill& other) const;
	bool		operator  ==		(const Skill& other) const;

private:
	int			Skill_ID;
	int			XP;
	int			Level;
	int			Timer;
};