#include <iostream>
#include "conio.h"
#include "classes.h"

using namespace std;


//////////////////////////////////////////////deplacements/////////////////////////////

void deplacement(monde world[10][10], int tour)
{
    etreVivant no;
    for ( int i = 0; i < 10;i++)
    {
        for( int j= 0; j < 10; j++)
        {
            if(world[i][j].ev2.nbtour == tour)//si l'animal a toujours pas ete deplace dans ce tour
            {
                world[i][j].ev2.nbtour += 1;//on lui fait passé au tour suivant, le but étant de ne pas déplacer plusieurs fois le meme animal

                //on autorise un deplacement de 2cases dans tous les sens

                int x;
                int y;
                int k=0;


                    x = rand()%3-1;
                    y = rand()%3-1;
                    x = i+x;
                    y = j+y;
                    x = x%10;//on s'assure d'etre bien dans le tableau, sinon on accorde avec le bord opposé
                    y = y%10;
                    k++;

                if(world[x][y].ev2.type == 0)
                {
                    world[x][y].ev2 = world[i][j].ev2;//deplacement
                    world[i][j].ev2 = no;//liberation de la case de depart
                }
                else if(world[x][y].ev3.type == 0)
                {
                    world[x][y].ev3 = world[i][j].ev2;//deplacement
                    world[i][j].ev2 = no;//liberation de la case de depart
                }
            }
                // de meme pour ev3
            if(world[i][j].ev3.nbtour == tour)//si l'animal a toujours pas ete deplace dans ce tour
            {
                world[i][j].ev3.nbtour += 1;//on lui fait passé au tour suivant, le but étant de ne pas déplacer plusieurs fois le meme animal

                //on autorise un deplacement de 2cases dans tous les sens

                int x;
                int y;
                int k=0;


                    x = rand()%3-1;
                    y = rand()%3-1;
                    x = i+x;
                    y = j+y;
                    x = x%10;//on s'assure d'etre bien dans le tableau, sinon on accorde avec le bord opposé
                    y = y%10;
                    k++;

                 if(world[x][y].ev2.type == 0)
                {
                    world[x][y].ev2 = world[i][j].ev3;//deplacement
                    world[i][j].ev3 = no;//liberation de la case de depart
                }
                else if(world[x][y].ev3.type == 0)
                {
                    world[x][y].ev3 = world[i][j].ev3;//deplacement
                    world[i][j].ev3 = no;//liberation de la case de depart
                }
            }



        }
    }
}

//////////////////////////////////////////////deces///////////////////////////////////

void deces(monde world[10][10], int i, int j)//permet de mettre les sels mineraux si un animal meurt par l'age ou de faim
{
    for (int k = i-1 ; k< i+1; k++)
    {
        for (int l = j-1; l < j+1; l++)
        {
            k = k%10;//on s'assure de rester dans le tableau^^
            l = l%10;
            world[k][l].selsMineraux +=3;
        }
    }
    world[i][j].selsMineraux +=3;//on double le dépot de sels mineraux sur la case du décès^^
}

//////////////////////////////////////////////tuerie///////////////////////////////////

void tuerie(monde world[10][10], int i, int j)//permet de mettre les sels mineraux si un animal mouton se fait tuer
{


    for (int k = 0 ; k ==8; k++)//une grande sueface avec un peut
    {
        for (int l = 0; l == 8; l++)
        {
            k = (k-4)%10;//on s'assure de rester dans le tableau^^
            l = (l-4)%10;
            /*if ( k <0)
            {
                k = k+10;
            }
            if( l<0)
            {
                l =l+10;
            }*/

            world[k][l].selsMineraux +=2;
        }

    }
    for (int k = 0; k ==4; k++)//on en rajoute à proximité
    {
        for (int l = 0; l ==4; l++)
        {
            k = (k-2)%10;//on s'assure de rester dans le tableau^^
            l = (l-2)%10;
            /*if ( k <0)
            {
                k = k+10;
            }
            if( l<0)
            {
                l =l+10;
            }
*/
            world[k][l].selsMineraux +=2;
        }

    }

    world[i][j].selsMineraux +=4;//on double le dépot de sels mineraux sur la case du meurtre

}


////////////////////////////////////////////////////age//////////////////////////////////////////////////////////////////

void age(monde world[10][10])
{
    etreVivant no;
    for ( int i = 0; i < 10;i++)
    {
        for( int j= 0; j < 10; j++)
        {
            if(world[i][j].ev2.type == 3 || world[i][j].ev2.type == 4)
            {
                world[i][j].ev2.esperance -= 1;//on reduit son espaerance de vie tour apres tour
                if(world[i][j].ev2.esperance == 0)//si il est mort
                {
                    cout << "un animal est mort apres victime du temps" <<endl;
                    world[i][j].ev2 = no;
                    deces(world, i, j);
                }
            }
            if(world[i][j].ev3.type == 3 || world[i][j].ev3.type == 4)
            {
                world[i][j].ev3.esperance -= 1;//on reduit son espaerance de vie tour apres tour
                if(world[i][j].ev3.esperance == 0)//si il est mort
                {
                    cout << "un animal est mort apres victime du temps" <<endl;
                    world[i][j].ev3 = no;
                    deces(world, i, j);
                }
            }
        }
    }
}


///////////////////////////////////////////////////accouplement///////////////////////////////////////////////////////////

void accouplement(monde world[10][10], loup l, mouton m)
{
    etreVivant no;
    for ( int i = 0; i < 10;i++)
    {

        for( int j= 0; j < 10; j++)
        {
            //cas des loups
            if( world[i][j].ev2.type == 4 && world[i][j].ev3.type == 4 && world[i][j].ev2.reproduction > 11 && world[i][j].ev3.reproduction > 11)
            {//si on a 2 loups, qui peuvent se reproduire
                if(world[(i+1)%10][j].ev2.type == 0)//on verifie qu'il y est une place
                {
                    world[(i+1)%10][j].ev2 = l;
                }
                else
                {
                    world[(i+1)%10][j].ev3 = l;
                }

                cout << "un bebe loup voit le jour" << endl;

            }
            //de meme pour les moutons
            if( world[i][j].ev2.type == 3 && world[i][j].ev3.type == 3 && world[i][j].ev2.reproduction > 11 && world[i][j].ev3.reproduction > 11)
            {//si on a 2 loups, qui peuvent se reproduire
                if(world[(i+1)%10][j].ev2.type == 0)//on verifie qu'il y est une place
                {
                    world[(i+1)%10][j].ev2 = l;
                }
                else
                {
                    world[(i+1)%10][j].ev3 = l;
                }
                system("color 9");
                cout << "un agneau voit le jour" << endl;
                system("color 7");
            }
        }
    }
}


///////////////////////////////////////////////////affichage//////////////////////////////////////////////////////////

void affichage(monde world[10][10])
{
	for ( int i = 0; i < 10;i++)
		{
			cout << endl;
			for( int j= 0; j < 10; j++)
			{
                textcolor(LIGHTBLUE);
				cout << "|[" <<world[i][j].selsMineraux <<"]";
				if(world[i][j].ev1.type != 2)// d'abord le sol = herbe
				{
                    textcolor(YELLOW);
					cout << "s" ;

					if(world[i][j].ev2.type == 3 && world[i][j].ev3.type == 3)//cas ou l'on a sable + 2 moutons
					{
                        textcolor(WHITE);
						cout << "mm" ;
					}
					else if((world[i][j].ev2.type == 4 && world[i][j].ev3.type == 3) || ( world[i][j].ev2.type == 3 && world[i][j].ev3.type == 4))
					{//cas ou l'on a sable + mouton+ loup
                        textcolor(WHITE);
						cout << "lm" ;
					}
					else if(world[i][j].ev2.type == 4 && world[i][j].ev3.type == 4 )
					{//cas ou l'on a sable + 2 loups
                        textcolor(WHITE);
						cout << "ll" ;

					}
					else if(world[i][j].ev2.type == 3  || world[i][j].ev3.type == 3)
					{//cas ou l'on a sable + mouton
                        textcolor(WHITE);
						cout << "m " ;
					}
					else if(world[i][j].ev2.type == 4  || world[i][j].ev3.type == 4)
					{//cas ou l'on a sable + loup
                        textcolor(WHITE);
						cout << "l " ;
						;
					}
					else
					{//cas ou l'on a que du sable
					    textcolor(WHITE);
						cout<< "  ";
					}
				}
				else if(world[i][j].ev1.type == 2)// ici on test pour l'herbe
				{
                    textcolor(GREEN);
					cout << "h" ;

					if(world[i][j].ev2.type == 3 && world[i][j].ev3.type == 3)//cas ou l'on a herbe + 2 moutons
					{
                        textcolor(WHITE);
						cout << "mm" ;
					}
					else if((world[i][j].ev2.type == 4 && world[i][j].ev3.type == 3) || ( world[i][j].ev2.type == 3 && world[i][j].ev3.type == 4))
					{//cas ou l'on a herbe + mouton+ loup
                        textcolor(WHITE);
						cout << "lm" ;
					}
					else if(world[i][j].ev2.type == 4 && world[i][j].ev3.type == 4 )
					{//cas ou l'on a herbe + 2 loups
                        textcolor(WHITE);
						cout << "ll" ;

					}
					else if(world[i][j].ev2.type == 3  || world[i][j].ev3.type == 3)
					{//cas ou l'on a herbe + mouton
                        textcolor(WHITE);
						cout << "m " ;
					}
					else if(world[i][j].ev2.type == 4 || world[i][j].ev3.type == 4 )
					{//cas ou l'on a herbe + loup
                        textcolor(WHITE);

						cout << "l " ;

					}
					else
					{//cas ou l'on a herbe tout seul
                        textcolor(WHITE);
						cout << "  " ;
					}
				}

			}
	}
	system("pause");
}

///////////////////////////////////////////////initialisation du plateau/////////////////////////////////////////////////

void initialisation(herbe h,mouton m,loup l,sable sand,	monde world[10][10], int nbmouton, int nbloup, int nbherbe)
{


	etreVivant no;
	for(int i=0; i<10; i++)//initialisation a sable^^ on creer un desert
	{
		for(int j=0; j<10; j++)
		{
			world[i][j].ev1 = sand;
			world[i][j].ev2 = no;
			world[i][j].ev3 = no;
		}
	}
	int x, y;



	for (int i = 0; i < nbherbe; i++)//position aléatoire de l'herbe
	{

		//herbe
		x = rand()%10;

		y = rand()%10;

		world[x][y].ev1 = h;
	}

	for (int i = 0; i < nbmouton; i++)//position aléatoire des moutons
	{
		//mouton
		x = rand()%10;// on charge sa position ds la liste
		y = rand()%10;
		world[x][y].ev2 =  m;// on le place ds le tableau
		m.ev = 2;
	}

	for (int i = 0; i < nbloup; i++)//position aléatoire des loups
	{
		//loup

		x = rand()%10;
		y = rand()%10;
		if(world[x][y].ev2.type == 0)//test si il y a de la place
		{
			world[x][y].ev2 =  l;// on le place ds le tableau
			l.ev = 2;
		}
		else
		{
			world[x][y].ev3 =  l;// sinon on le met après
			l.ev = 3;
		}
	}
	affichage(world);
}

//////////////////////////////////////////////mise a jour des sels mineraux///////////////////////////////////////////////
void majSelsMineraux(herbe h,  monde world[10][10])
{
    sable sand;
	for( int i =0; i < 10; i++)
	{
		for( int j= 0; j< 10; j++)
		{
			/*if(world[i][j].selsMineraux != 0)
			{
				world[i][j].selsMineraux -=1;//on enleve 1 selmineral par tour
			}*/
			if( world[i][j].selsMineraux != 0 && world[i][j].ev1.type == 1)// si on a des sels et du sable
			{
				world[i][j].ev1 = h;                                    // on met de l'herbe
			}
			if( world[i][j].selsMineraux == 0 && world[i][j].ev1.type == 2)// si on a de l'herbe et pu de sels mineraux
			{
				world[i][j].ev1 = sand;                                     // on rempla e l'herbe par du sable
			}
			if( world[i][j].ev1.type == 2)
			{
				world[i][j].selsMineraux -=1;//on enleve 1 selmineral pour l'herbe
			}
		}
	}
}

//////////////////////////////////////////////manger///////////////////////////////////////////////////////////

void manger( monde world[10][10], etreVivant no)
{

	sable sand;
	for (int i = 0; i<10; i++)
	{
	    for(int j = 0; j<10; j++)
	    {
//le mouton mange
            if( world[i][j].ev2.type == 3 && world[i][j].ev1.type == 2)
            {

                //de l'herbe
                world[i][j].ev2.faim += 1;
                //est ce qu'il ya assez de sels mineraux pour avoir de l'herbe?
                if(world[i][j].selsMineraux <= 1)
                {
                    world[i][j].ev1 = sand;
                }
            }
            else if(world[i][j].ev3.type == 3 && world[i][j].ev1.type == 2)//cas du mouton dans l'autre case
            {

                // de meme si le mouton est dans l'autre case
                    world[i][j].ev3.faim += 1;
                    if(world[i][j].selsMineraux <= 1)//si il y a pas assez de sels mineraux, on obtiendra du sable, sinon de l'herbe reapparaitra immediatement
                    {
                        world[i][j].ev1 = sand;

                    }
            }
//cas du mouton sans nouriture...
            else if( world[i][j].ev2.type == 3 && world[i][j].ev1.type == 1)
            {

                //perte en "faim"
                world[i][j].ev2.faim -= 1;
                if(world[i][j].ev2.faim ==0 )//si il est mort de faim... il doit disparaitre ET faire apparaitre un peut de selsmineraux
                {
                    world[i][j].ev2 = no;
                    deces(world, i, j);
                    cout << "un mouton est mort de faim" <<endl;

                }
            }
            //de meme pour l'autre case
            else if( world[i][j].ev3.type == 3 && world[i][j].ev1.type == 1)
            {

                //perte en "faim"
                world[i][j].ev3.faim -= 1;
                if(world[i][j].ev3.faim ==0 )//si il est mort de faim... il doit disparaitre ET faire apparaitre un peut de selsmineraux
                {
                    world[i][j].ev3 = no;
                    deces(world, i, j);
                    cout << "un mouton est mort de faim" <<endl;

                }
            }
//pour le loup quand il mange
            if(world[i][j].ev2.type == 4 && world[i][j].ev3.type == 3)//si le loup est avec un mouton...
            {

                world[i][j].ev2.faim +=1;//le loup gagne en faim
                world[i][j].ev3 = no;//le mouton disparait
                tuerie( world,  i,  j);//et on met des sels mineraux partout
                cout << "un loup a tue un mouton" << endl;

            }
            else if(world[i][j].ev2.type == 3 && world[i][j].ev3.type == 4)//si le loup est avec un mouton...
            {

                world[i][j].ev3.faim +=1;//le loup gagne en faim
                world[i][j].ev2 = no;//le mouton disparait
                tuerie( world,  i,  j);//et on met des sels mineraux partout
                cout << "un loup a tue un mouton" << endl;

            }
//le loup à la diete
            else if(world[i][j].ev2.type == 4 && world[i][j].ev3.type != 3)//si le loup est avec un mouton...
            {


                world[i][j].ev2.faim -=1;//le loup perd en faim
                if(world[i][j].ev2.faim == 0)//si il meurt de faim
                {
                    world[i][j].ev2 = no;//disparition
                    deces(world, i, j);//plein de petit selsMineraux
                    cout << "un loup est mort de faim" <<endl;
                }

            }
            else if(world[i][j].ev2.type != 3 && world[i][j].ev3.type == 4)//si le loup est avec un mouton...
            {

                world[i][j].ev3.faim -=1;//le loup perd en faim
                if(world[i][j].ev3.faim == 0)//si il meurt de faim
                {
                    world[i][j].ev3 = no;//disparition
                    deces(world, i, j);//plein de petit selsMineraux
                    cout << "un loup est mort de faim" <<endl;
                }
            }
        }
    }
}
