#ifndef CBLOC_H
#define CBLOC_H


// Type énumération selon le type de mouvement du bloc, c'est-à-dire
// sans mouvement autre que la chute, en translation ou en rotation.

enum type_mouvement { IMMOBILE, ROTATION, TRANSLATION };


// Classe de bloc

class CBloc
{
public:
	std::vector<CCube> LesCubes;
	float x, y, z;
	float offX, offY, offZ;			// Offset pour les blocs dont le centre 
									// n'est pas un coin de cube
	float r1, g1, b1;
	float r2, g2, b2;

	long Temps0;					// Temps initial de la chute pour savoir la hauteur du bloc
	type_mouvement EstMouvement;	// Type de mouvement du bloc
	long Temps0Mouv;				// Temps initial du mouvement (rotation ou translation) du bloc
	short RotX, RotY, RotZ;			// Axe de rotation
	type_direction MouvDir;			// Direction dans laquelle se fait le mouvement
	float AncienX, AncienY;			// Anciennes coordonnées qui servent lors de translations
	bool EstEnBas;					// Vrai si le bloc est en bas, et donc qu'il ne descend plus
	bool EstDescenteRapide;			// Vrai si on appuie sur ' ' et donc que le bloc descend vite
	long Temps0Arret;				// Temps initial d'une pause
	long Temps0Preview;				// Temps initial pour la rotation du bloc de preview

	CBloc(float rr1 = 1.0f, float gg1 = 1.0f, float bb1 = 1.0f,
		  float rr2 = 0.0f, float gg2 = 0.0f, float bb2 = 0.0f,
		  float xx = MAX_X2, float yy = MAX_Y2, float zz = MAX_Z,
		  float offxx = 0.0f, float offyy = 0.0f, float offzz = 0.0f)
	{
		x = xx; y = yy; z = zz;
		offX = offxx; offY = offyy; offZ = offzz;
		r1 = rr1; g1 = gg1; b1 = bb1;
		r2 = rr2; g2 = gg2; b2 = bb2;
		Temps0 = Temps0Preview = GetTemps();
		EstMouvement = IMMOBILE;
		AncienX = x; AncienY = y;
		EstEnBas = EstDescenteRapide = false;
	}

	// Début de la rotation
	void BeginRotation(short AxeX, short AxeY, short AxeZ);
	// Rotation du bloc autour d'un axe
	void Rotate(short AxeX, short AxeY, short AxeZ);
	// Début de la translation
	void BeginTranslation(type_direction Direction);
	// Translation du bloc dans une direction
	void Translate(type_direction Direction);


	// Dessin du bloc
	void Draw(void);
	// Dessin du bloc guide
	void DrawGuide(void);

	// Descend le bloc en bas à la position du guide
	void DropBloc(void);





	// Fonctions pour la création d'un bloc
	// Create0x => Blocs du Tetris original
	// Create1x => Blocs du Tetris original doublés
	// Le reste => Blocs inventés

	void Create01();
	void Create02();
	void Create03();
	void Create04();
	void Create05();

	void Create11();
	void Create12();
	void Create13();
	void Create14();
	void Create15();

	void Create20();
	void Create21();


	// Fonctions pour la couleur d'un bloc
	void Couleur01();	// Rouge
	void Couleur02();	// Bleu
	void Couleur03();	// Vert
	void Couleur04();	// Jaune
	void Couleur05();	// Magenta
	void Couleur06();	// Cyan
	void Couleur07();	// Blanc
	void Couleur08();	// Noir




	/**/
	void CreateTemp();
	void CreatePlan();

};

#endif