#include <stdlib.h>
#include <SDL/SDL.h>
#include "structures.h"
#include "partie.h"
#include "joueur.h"
#include "joueurList.h"
#include "personnage.h"
#include "case.h"
#include "deplacements.h"
#include "SDL.h"
#include "controleurSDL.h"

/*!
* \file controleurSDL.c
* \brief Fichier contenant le code des fonctions du controleur pour l'affichage avec SDL
*/


Carte Carte_actuelle;
Personnage ListePersos[NB_PERSO];
int perso_actuel=0;

/*!
 * \fn void init_controleur(SDL_Rect Position_Case[])
 * \brief fonction du controleur appell�e par l'affichage et qui initialise le moteur du jeu (cr�ation de la carte et des personnages)
 *
 * \param les coordonn�es de toutes les cases
 */
void init_controleur(SDL_Rect Position_Case[])
{
    int i;
    for(i=0;i<LARGEUR_CARTE*HAUTEUR_CARTE;i++)
     {
       init_case(&Carte_actuelle[i],Position_Case[i].x,Position_Case[i].y,NULL);
     }
    for(i=0;i<NB_PERSO;i++)
    set_personnage(&ListePersos[i],NULL,&Carte_actuelle[i]);
}

/*!
 * \fn int x_case_cliquee(int x_pixel, int y_pixel)
 * \brief La fonction retourne la colonne d'une case � partir de sa position en pixels
 *
 * \param les coordonn�es x et y de la case en pixels
 * \return la colonne de la case
 */
int x_case_cliquee(int x_pixel, int y_pixel)
{
    return x_pixel/LARGEUR_CASE;
}
/*!
 * \fn int y_case_cliquee(int x_pixel, int y_pixel)
 * \brief La fonction retourne la ligne d'une case � partir de sa position en pixels
 *
 * \param les coordonn�es x et y de la case en pixels
 * \return la ligne de la case
 */
int y_case_cliquee(int x_pixel, int y_pixel)
{
    int i, x_case, y_case;
    x_case = x_pixel/LARGEUR_CASE;
    y_case = y_pixel/HAUTEUR_CASE;
    for(i=1;i<LARGEUR_CARTE;i+=2)
    {
           if(x_case==i)
            {
                y_case=(y_pixel-HAUTEUR_CASE/2)/HAUTEUR_CASE;
            }
    }
    return y_case;
}

/*!
 * \fn void persosuivant()
 * \brief La fonction permet de selectionner le personnage suivant
 */
void persosuivant(){
    if(perso_actuel<NB_PERSO-1)
    perso_actuel++;
    else
    perso_actuel=0;
}
/*!
 * \fn int persoactuel()
 * \brief La fonction retourne le num�ro du personnage actuellement control�
 */
int persoactuel(){
return perso_actuel;
}
/*!
 * \fn void deplacement_personnage(int x, int y))
 * \brief Cette fonction du controleur appelle la fonction du moteur permettant de d�placer le personnage selectionn�
 *
 * \param les coordonn�es (en pixels) de l'endroit ou l'utilisateur a cliqu�
 */
void deplacement_personnage(int x, int y)
{
    if(x<LARGEUR_CARTE*LARGEUR_CASE&&y<HAUTEUR_CARTE*HAUTEUR_CASE)
    {
        Case* case_cliquee = trouverCase(Carte_actuelle,x_case_cliquee(x,y),y_case_cliquee(x,y));
        Personnage* perso = &ListePersos[perso_actuel];
        deplacement_unitaire(perso, case_cliquee,HAUTEUR_CASE,LARGEUR_CASE);
    }
}
/*!
 * \fn Case* get_case_perso(int num)
 * \brief donne la case sur laquelle est situ�e un personnage
 *
 * \param le num�ro d'un personnage
 * \return un pointeur vers la case du personnage
 */
Case* get_case_perso(int num)
{
    Personnage* perso = &ListePersos[num];
    return getPosition(perso);
}
/*!
 * \fn int get_position_perso_x(int num)
 * \brief donne la coordonn�e x en pixels d'un personnage
 *
 * \param le num�ro d'un personnage
 * \return la coordonn�e x en pixels du personnage
 */
int get_position_perso_x(int num)
{
    Case* case_perso = get_case_perso(num);
    return get_x(case_perso);
}
/*!
 * \fn int get_position_perso_y(int num)
 * \brief donne la coordonn�e y en pixels d'un personnage
 *
 * \param le num�ro d'un personnage
 * \return la coordonn�e y en pixels du personnage
 */
int get_position_perso_y(int num)
{
    Case* case_perso = get_case_perso(num);
    return get_y(case_perso);
}
/*!
 * \fn Case* deplacement_brillance(int x,int y)
 * \brief La fonction retourne un pointeur vers la case de coordonn�es x,y
 *
 * \param les coordonn�es x et y d'une case (pas en pixels mais bien en colonne et ligne), ainsi que la carte utilis�e
 * \return un pointeur vers cette case
 */
Case* deplacement_brillance(int x,int y)
{
    if(x<LARGEUR_CARTE*LARGEUR_CASE&&y<HAUTEUR_CARTE*HAUTEUR_CASE)
    {
        return trouverCase(Carte_actuelle,x_case_cliquee(x,y),y_case_cliquee(x,y));
    }
    return NULL;
}

/*!
 * \fn int get_position_case_y(Case * Case)
 * \brief  retourne la coordonn�e y d'une case
 *
 * \param un pointeur vers une case
 * \return la coordonn�e y de la case
 */
int get_position_case_y(Case * Case){
    return get_y(Case);
}
/*!
 * \fn int get_position_case_x(Case * Case)
 * \brief  retourne la coordonn�e x d'une case
 *
 * \param un pointeur vers une case
 * \return la coordonn�e x de la case
 */
int get_position_case_x(Case * Case)
{
    return get_x(Case);
}