/*Copyright (C) 2010 Deveaux Duncan

This file is part of Hikou no mizu.

Hikou no mizu is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Hikou no mizu 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 General Public License for more details.

You should have received a copy of the GNU General Public License
along with Hikou no mizu.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef DEF_JOUEUR
#define DEF_JOUEUR

#include <string>
#include "Etat.hpp"

#include "Moteurs/Physique/MoteurPhysique.hpp"
#include "Moteurs/Physique/ObjetPhysique.hpp"
#include "Moteurs/Graphique/MoteurGraphique.hpp"
#include "Animation/GestionnaireAnimation.hpp"

class Joueur : public ObjetPhysique
{
	public:
		Joueur(std::string pNom, int pVies, int pEnergie, int pPuissance, int pVitesse, MoteurPhysique *pMoteurPhysique);
		~Joueur();
		
		void executeActions(const sf::Input &pTouches);
		
		void bouger(int pSens);
		void arreter();
		
		void sauter();
		
		void attaquer();
		void prendreCoup(int pPuissance);
		
		//Graphics methods
		void demarreAffichage(MoteurGraphique &pMoteurRendu);
		void supprimeAffichage(MoteurGraphique &pMoteurRendu);
		
		//Physics methods
		void setMoteurPhysique(MoteurPhysique *pMoteurPhysique);
		MoteurPhysique *getMoteurPhysique() const;
		
		//get-set methods
		std::string getNom() const;
		
		void setMaxVies(int pMaxVies);
		int getMaxVies() const;
		void setVies(int pVies);
		int getVies() const;
		
		void setEnergie(int pEnergie);
		int getEnergie() const;
		void setMaxEnergie(int pMaxEnergie);
		int getMaxEnergie() const;
		
		void setPuissance(int pPuissance);
		int getPuissance() const;
		void setVitesse(int pVitesse);
		int getVitesse() const;
		void setSens(int pSens);
		int getSens() const;
		
		//events methods
		bool vieChangee();
		bool energieChangee();
		
		//ObjetPhysique virtual methods
		const sf::Vector2f &getOrigin() const;
		
		float getLargeur() const;
		float getHauteur() const;
		
		void setPositionX(float pPosition);
		float getPositionX() const;
		void setPositionY(float pPosition);
		float getPositionY() const;
	
	private:
		std::string nom;
		int vies;
		int maxVies;
		int oldVies;
		
		int energie;
		int maxEnergie;
		int oldEnergie;
		
		int baseEnergieSaut;
		int energieSaut;
		
		int puissance;
		int vitesse;
		Etat etat;
		GestionnaireAnimation *gestionAnimations;
		MoteurPhysique *moteurPhysique;
};

#endif