#include <stdio.h>
#include <stdlib.h>
#include "structures.h"
#include "case.h"
#include "personnage.h"
#include "deplacements.h"

/*!
* \file personnage.c
* \brief Fichier contenant le code des fonctions liees aux personnages.
*/

/*!
 * \fn Personnage* init_personnage(Personnage *perso)
 * \brief La fonction initialise un Personnage.
 *
 * \param Un personnage.
 * \return Un personnage initialis�.
 */
Personnage* init_personnage()
{
    Personnage * perso = malloc(sizeof(Personnage));
    perso->numero=-1;
    perso->classe=NULL;
    perso->points_deplacement=0;
    perso->PV=0;
    perso->mana=0;
    perso->position=NULL;
    return perso;
}

/*!
 * \fn Personnage* set_personnage(Personnage *perso, Classe *c, Case *casedepart))
 * \brief La fonction initialise un Personnage.
 *
 * \param Un personnage.
 * \return Un personnage initialis�.
 */
Personnage* set_personnage(Personnage *perso, Classe *c)
{
    perso->classe=c;
    if(c!=NULL){
        perso->points_deplacement=c->points_deplacement_max;
        perso->PV=c->PV_max;
        perso->mana=c->mana_max;
    }
    perso->position=NULL;
    return perso;
}

/*!
 * \fn Personnage* default_personnage(int numero, Game_Package Pack)
 * \brief La fonction construit un personnage par default, a partir de ses caracteristiques dans le fichier Classes.xml
 *
 * \param Le num�ro de la d�fination du personnage dans le fichier XML, un game_package.
 * \return Un personnage pret a l'action.
 */
Personnage* default_personnage(int numero, Game_Package Pack)
{
    Personnage* Perso = init_personnage();
    set_personnage(Perso, &Pack.Classes_Package[numero]);
    return Perso;
}

/*!
 * \fn void freePersonnage(Personnage * p)
 * \brief lib�re l'espace m�moire allou� � un personnage.
 *
 * \param un pointeur vers le personnage � supprimmer.
 */
void freePersonnage(Personnage * p){
    free(p);
}

/*!
 * \fn void setNumero(Personnage * p, int n)
 * \brief Initialise le num�ro d'un Personnage.

 * \param Un pointeur vers le Personnage � modifier, un int d�terminant son num�ro.
 */
 void setNumero(Personnage * p, int n){
    p->numero = n;
 }

 /*!
 * \fn int getNumero(Personnage * p)
 * \brief La fonction renvoie le num�ro du personnage.
 *
 * \param Un pointeur vers le Personnage � tester.
 * \return un entier vers le num�ro du personnage.
 */
 int getNumero(Personnage * p){
    return p->numero;
 }

/*!
 * \fn Classe * getClasse(Personnage *p)
 * \brief La fonction renvoie la classe d'un personnage.
 *
 * \param Un personnage.
 * \return une classe.
 */
Classe * getClasse(Personnage *p){
    return p->classe;
}

/*!
 * \fn Case * getPosition(Personnage *p)
 * \brief La fonction renvoie la position d'un personnage.
 *
 * \param Un personnage.
 * \return une position.
 */
Case * getPosition(Personnage *p){
    return p->position;
}

/*!
 * \fn void setPosition(Personnage *p)
 * \brief La fonction initialise la position d'un personnage.
 *
 * \param Un personnage.
 */
void setPosition(Personnage * p, Case * c){
    p->position=c;
    marquer_occupee(c);
}

/*!
 * \fn Classe * get_PV(Personnage *p)
 * \brief La fonction renvoie les points de vie d'un personnage.
 *
 * \param Un personnage.
 * \return un entier.
 */
int get_PV(Personnage *p){
    return p->PV;
}

/*!
 * \fn Classe * get_mana(Personnage *p)
 * \brief La fonction renvoie les points de mana d'un personnage.
 *
 * \param Un personnage.
 * \return un entier.
 */
int get_mana(Personnage *p){
    return p->mana;
}

/*!
 * \fn Classe * get_PD(Personnage *p)
 * \brief La fonction renvoie les points de vie d'un personnage.
 *
 * \param Un personnage.
 * \return un entier.
 */
int get_PD(Personnage *p){
    return p->points_deplacement;
}

/* Cette fonction ne fonctionne plus, il faut une fonction qui accede aux effets.
boolean est_paralyse(Personnage *p){
    return p->paralyse;
}
*/

/*!
 * \fn deplacer_personnage (Personnage *perso, Case *destination)
 * \brief La fonction deplace un personnage.
 *
 * \param Un personnage, une case.
 * \return un entier.
 */
int deplacer_personnage (Personnage *perso, Case *destination){ /*d�place un personnage d'une case � une autre. Ne v�rifie pas si le d�placement est autoris�, cela doit �tre fait par la fonction qui l'appelle*/
    marquer_libre(getPosition(perso));
    perso->position=destination;
    marquer_occupee(getPosition(perso));
    if(getPosition(perso)==destination) return 0;
    return 1;
}

/*!
 * \fn int estSurLaCase(Personnage * p, Case * c)
 * \brief La fonction teste si un Personnage est sur une Case.
 *
 * \param Le Personnage et la Case a tester.
 * \return 1 si le Personnage est sur la Case, 0 sinon.
 */
int estSurLaCase(Personnage * p, Case * c){
    return c==getPosition(p);
}