#pragma once
#include "Ability.h"
#include "Animation.h"
#include "olcPixelGameEngine.h"

enum Class{
	WARRIOR,THIEF,RANGER,BARD,WIZARD,WITCH
};
struct ClassData{
	std::string name;
	Class cl;
	Ability rightClickAbility,ability1,ability2,ability3;
	AnimationState walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w;
	static void InitializeClassData();
	ClassData(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3,
		AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w);
	virtual void Update(float fElapsedTime)=0;
	virtual bool AutoAttack()=0;
	virtual bool Ability1()=0;
	virtual bool Ability2()=0;
	virtual bool Ability3()=0;
	virtual bool RightClickAbility()=0;
};

struct Warrior:public ClassData{
	Warrior(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3,
		AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w);
	void Update(float fElapsedTime)override;
	bool AutoAttack()override;
	bool Ability1()override;
	bool Ability2()override;
	bool Ability3()override;
	bool RightClickAbility()override;
};
struct Thief:public ClassData{
	Thief(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3,
		AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w);
	void Update(float fElapsedTime)override;
	bool AutoAttack()override;
	bool Ability1()override;
	bool Ability2()override;
	bool Ability3()override;
	bool RightClickAbility()override;
};
struct Ranger:public ClassData{
	Ranger(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3,
		AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w);
	void Update(float fElapsedTime)override;
	bool AutoAttack()override;
	bool Ability1()override;
	bool Ability2()override;
	bool Ability3()override;
	bool RightClickAbility()override;
};
struct Bard:public ClassData{
	Bard(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3,
		AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w);
	void Update(float fElapsedTime)override;
	bool AutoAttack()override;
	bool Ability1()override;
	bool Ability2()override;
	bool Ability3()override;
	bool RightClickAbility()override;
};
struct Wizard:public ClassData{
	Wizard(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3,
		AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w);
	void Update(float fElapsedTime)override;
	bool AutoAttack()override;
	bool Ability1()override;
	bool Ability2()override;
	bool Ability3()override;
	bool RightClickAbility()override;
};
struct Witch:public ClassData{
	Witch(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3,
		AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w);
	void Update(float fElapsedTime)override;
	bool AutoAttack()override;
	bool Ability1()override;
	bool Ability2()override;
	bool Ability3()override;
	bool RightClickAbility()override;
};