#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
//#include "structs.h"
//#include "destination.h"
//#include "drawl.h"
//#include "attack.h"

struct soldier_struct
{
        double X; //current locations
        double Y;
        double destX; //destination locations
        double destY;
        int team; //0=team1 1=team2
        int type; //0=archer 1=spearman 2=swordman
        int alive; //0=dead 1=alive
};


struct soldier_struct soldier[19];

#include "destination.h"
#include "attack.h"
#include "drawl.h"
#include "grid.h"

/*
void destination(int i);
void attack(int count1);
void drawl(int count1);
*/


void OpenGLInit(void);
static void Animate(void );
static void ResizeWindow(int w, int h);

int ocupied(int count1)
{
	int ocupied_int=0;
	int i;
	double distance;

	for(i = 0; i < 18; i++) {

		//use distance formula, if distance less than 2

		distance = sqrt( ((soldier[i].X - soldier[count1].X)*(soldier[i].X - soldier[count1].X)) + ((soldier[i].Y - soldier[count1].Y)*(soldier[i].Y - soldier[count1].Y)) );
                //distance = distance - 2;
                if(distance < 1 && i != count1) {
			ocupied_int=1;
		}

/*
        	if( soldier[count1].X ==  soldier[count2].X && count2 != count1){
                	ocupied=1;
                }
                if( soldier[count1].Y ==  soldier[count2].Y && count2 != count1){
                        ocupied=1;
                }
*/


        }

	return ocupied_int;
}

static void Animate(void)
{
	int count1;
	//int count2;
	int ocupied_int;
	double count2=5.0;
	double count3=-3.0;
	double tmpX;
	double tmpY;
	
	for(count1 = 0; count1 < 9; count1++) {
		soldier[count1].team = 0;
		soldier[count1].alive = 1;

		if(count1 < 4){
			soldier[count1].X=count2;
			soldier[count1].Y=count3;
			soldier[count1].type=0;
			count3 = count3+2;
			if(count1==3){count3=-2;}
		}else if(count1 < 7){
			soldier[count1].X=count2+5;
			soldier[count1].Y=count3;
			count3 = count3+2;
			soldier[count1].type=1;
			if(count1==6){count3=-1;}
		}else{
			soldier[count1].X=count2+10;
			soldier[count1].Y=count3;
			count3 = count3+2;
			soldier[count1].type=2;
		}
	}
	count2=-5.0;
	count3=-3.0;
	for(count1 = 9; count1 < 18; count1++) {
		soldier[count1].team = 1;
		soldier[count1].alive = 1;

                if(count1 < 13){
                        soldier[count1].X=count2;
                        soldier[count1].Y=count3;
                        count3 = count3+2;
			soldier[count1].type=0;
                        if(count1==12){count3=-2;}
                }else if(count1 < 16){
                        soldier[count1].Y=count3;
                        count3 = count3+2;
                        if(count1==15){count3=-1;}
                        soldier[count1].X=count2-5;
			soldier[count1].type=1;
                }else{
                        soldier[count1].Y=count3;
                        count3 = count3+2;
                        soldier[count1].X=count2-10;
			soldier[count1].type=2;
                }



	}






	while(1==1) {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		grid();
		//drawl(count1);
		for(count1 = 0; count1 < 18; count1++) {
			if(soldier[count1].alive != 0) {
				//grid();
				drawl(count1);
				//sleep(1);
				destination(count1);
				//ocupied = ocupied(count1);
				if(soldier[count1].X != soldier[count1].destX) {
					tmpX=soldier[count1].X;
					tmpY=soldier[count1].Y;
					if(soldier[count1].destX > soldier[count1].X) {
						if(soldier[count1].destX <= (soldier[count1].X + 1)) {
							//if(ocupied != 1){
							soldier[count1].X = soldier[count1].destX;
							//}
						}else{
							//if(ocupied != 1){
							soldier[count1].X++;
							//}
						}
					}else if(soldier[count1].destX < soldier[count1].X) {
						if(soldier[count1].destX >= (soldier[count1].X - 1)) {

							soldier[count1].X = soldier[count1].destX;

						}else{
							soldier[count1].X--;
						}
					}
				}

			/*	ocupied_int = ocupied(count1);
                                if(ocupied_int == 1) {
                                        soldier[count1].X = tmpX;
				}
			*/
				if(soldier[count1].Y != soldier[count1].destY) {

					if(soldier[count1].destY > soldier[count1].Y) {
                                        	if(soldier[count1].destY < (soldier[count1].Y +1)) {
                                                	soldier[count1].Y = soldier[count1].destY;
                                        	}else{
							soldier[count1].Y++;
						} 	
					}else if(soldier[count1].destY < soldier[count1].Y) {
                                        	if(soldier[count1].destY > (soldier[count1].Y -1)) {
                                                	soldier[count1].Y = soldier[count1].destY;
                                        	}else{  
							soldier[count1].Y--;
						}
					}
				}

				ocupied_int = ocupied(count1);
				
				if(ocupied_int == 1) {
					//soldier[count1].X = tmpX; 
					soldier[count1].Y = tmpY;
				}
			
				//drawl(count1);


				//if(soldier[count1].X == soldier[count1].destX && soldier[count1].Y == soldier[count1].destY ) {
				
				attack(count1);
				
				//}
		                glFlush();
		                glutSwapBuffers();
                		glutPostRedisplay();
                		//sleep(1);

			}
		}

                                //drawl(count1);
                                //attack(count1);
                                glFlush();
                                glutSwapBuffers();
                                glutPostRedisplay();
                                //sleep(1);




	sleep(1);
	}


}



void OpenGLInit(void)
{
    glShadeModel( GL_FLAT );
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
    glClearDepth( 1.0 );
    glEnable( GL_DEPTH_TEST );
}


static void ResizeWindow(int w, int h)
{   
    float aspectRatio;
        h = (h == 0) ? 1 : h;
        w = (w == 0) ? 1 : w;
        glViewport( 0, 0, w, h );       // View port uses whole window
        aspectRatio = (float)w/(float)h;

        // Set up the projection view matrix (not very well!)
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 200.0, aspectRatio, 1.0, 100.0 );
    
        // Select the Modelview matrix
    glMatrixMode( GL_MODELVIEW );
}


int main( int argc, char** argv )
{

        glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );

        // Create and position the graphics window
    glutInitWindowPosition( 0, 0 );
    glutInitWindowSize( 1000, 1000 );
    glutCreateWindow( "fightgl test" );
    
        // Initialize OpenGL.
    OpenGLInit();
    glutReshapeFunc( ResizeWindow );

        // Callback for graphics image redrawing
    glutDisplayFunc( Animate );
        
        // Start the main loop.  glutMainLoop never returns.
        glutMainLoop(  );

   exit(1);
}

