#pragma once

//-----------------------------------------------------------------
// Include Files
//-----------------------------------------------------------------

#include "AbstractGame.h"

//#include embedded resources
#include "Resource.h"
//include base class header
#include "Caller.h"
#include "Hero.h"
#include "LevelProp.h"
#include "Level.h"
#include "Bar.h"
#include "FoodList.h"
#include "BarrelList.h"
#include "Food.h"
#include "Barrel.h"
#include "Enemy.h"
#include "Goblin.h"
#include "Archer.h"

class ResourceManager;
class Painter;
class InputState;
class Image;
class CollisionMesh;
class TextFormat;
class Button;
class TextBox;
class GameConfigurator;
class Audio;
//-----------------------------------------------------------------
// BarbarianOnslaughtApp Class																
//-----------------------------------------------------------------
class BarbarianOnslaughtApp : public AbstractGame, public Callable
{
public:				
	//---------------------------
	// Constructor(s)
	//---------------------------
	BarbarianOnslaughtApp();

	//---------------------------
	// Destructor
	//---------------------------
	virtual ~BarbarianOnslaughtApp();

	//---------------------------
	// General Public Methods
	//---------------------------

	void GameInitialize(GameConfigurator *gameConfiguratorPtr);
	void GameStart(ResourceLoader* resourceManagerPtr);
	void KeyUp(TCHAR cKey);
	void GamePaint(Painter *painterPtr);
	void GameTick(InputState *inputStatePtr);
	void GameEnd();
	void CallAction(Caller* callerPtr);
	void WindowResized(double width, double height);				// empty definition
	void CollisionHandling(Character *characterPtr, LevelProp *propPtr);

private:
	//---------------------------
	// Private Methods
	//---------------------------

	// -------------------------
	// Datamembers
	// -------------------------
	Hero *m_HeroPtr;
	Point2D m_SpawnPoint;
	Level *m_LevelPtr;
	Point2D m_CamPos;
	Matrix2D m_MatView, m_MatScreen;
	double m_CamAngle;
	double m_CameraScale;
	Bar *m_HealthBar;
	Bar *m_RageBar;
	FoodList *m_FoodList;
	BarrelList *m_BarrelList;
	EnemyList *m_EnemyList;

	// -------------------------
	// Disabling default copy constructor and default assignment operator.
	// If you get a linker error from one of these functions, your class is internally trying to use them. This is
	// an error in your class, these declarations are deliberately made without implementation because they should never be used.
	// -------------------------
	BarbarianOnslaughtApp(const BarbarianOnslaughtApp& tRef);
	BarbarianOnslaughtApp& operator=(const BarbarianOnslaughtApp& tRef);
};
