#include <dos.h>
#include <dir.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <alloc.h>
#include <graphics.h>

#include "..\..\libs\make_bot\make_bot.h"
#include "frec.h"
#include "dibujos.h"
#include "frec_f.h"


extern CFG_FREC cfgFREC;
extern int Dispersion;     // En el juego la dispersi˘n es la velocidad
extern int Sensibilidad;   // Para sensibilidad > 1, dos jugadores.....

typedef struct
{
 int *x;
 int *y;
 char direccion;
 char vidas;
} JUGADORES;

JUGADORES J1;// = {  40, ( oAltoVentana / 2 ) + 2 + 135, 6, 3 };
JUGADORES J2;// = { 600, ( oAltoVentana / 2 ) + 2 + 135, 4, 3 };

void LimpiaTablero(void);
int MoverJugador( JUGADORES *Jug, int color );
void AnalizaTeclas( JUGADORES *J1, JUGADORES *J2 );

int numero;

void JuegoTRON(void)
{
 int  muertes = 0;
 char Buffer[80];

 // Asignamos memoria para las lineas
 if ( ( J1.x = (int *)malloc( 1502*sizeof( int ) ) ) == NULL ) return;
 if ( ( J1.y = (int *)malloc( 1502*sizeof( int ) ) ) == NULL ) return;
 if ( ( J2.x = (int *)malloc( 1502*sizeof( int ) ) ) == NULL ) return;
 if ( ( J2.y = (int *)malloc( 1502*sizeof( int ) ) ) == NULL ) return;

 LimpiaTablero();
 /**************************************************************************/
 setcolor( 13 );
 rectangle( 9, 134, 626, 275 );
 /**************************************************************************/


 numero = 1500;
 J1.x[numero] =  40;          J2.x[numero] = 600;
 J1.y[numero] = J2.y[numero]  =   ( oAltoVentana / 2 ) + 2 + 135;
 J1.direccion = 6;    J2.direccion = 4;
 J1.vidas = J2.vidas = 3;
 sprintf( Buffer, "Puntos: %d - %d", J1.vidas, J2.vidas );
 Fuente_Amplia( Buffer, &Letras );

 // Comienza el juego mientras a alguno le quede alguna vida
 while( J1.vidas > 0 && J2.vidas > 0 )
 {
   numero--;
   if ( numero < 0 )
   {
     J1.x[1501] = J1.x[numero+1];
     J1.y[1501] = J1.y[numero+1];
     J2.x[1501] = J2.x[numero+1];
     J2.y[1501] = J2.y[numero+1];

    for ( numero = 0; numero < 1500; numero++ )
    {
     putpixel( J1.x[numero], J1.y[numero], EGA_BLACK );
     putpixel( J2.x[numero], J2.y[numero], EGA_BLACK );
    }
    numero = 1500;
    fflush(stdin);
   }
   Numero_Digital( numero,  &Numeros );

   AnalizaTeclas( &J1, &J2 );

   // Movemos al 1er Jugador
   if ( MoverJugador( &J1, cfgFREC.gOnda  ) ) { J1.vidas--; muertes = 1; }
   // Movemos al 2¦  Jugador
   if ( MoverJugador( &J2, cfgFREC.mFondo ) ) { J2.vidas--; muertes = 1; }

   if ( muertes != 0 )
   {
    muertes = 0;
    for ( ; numero <= 1500; numero++ )
    {
     putpixel( J1.x[numero], J1.y[numero], EGA_BLACK );
     putpixel( J2.x[numero], J2.y[numero], EGA_BLACK );
    }
    numero = 1500;
    J1.x[numero] =  40;          J2.x[numero] = 600;
    J1.y[numero] = J2.y[numero]  =   ( oAltoVentana / 2 ) + 2 + 135;
    J1.direccion = 6;    J2.direccion = 4;
    // Inicializamos el tablero
    LimpiaTablero();
    sprintf( Buffer, "Puntos: %d - %d", J1.vidas, J2.vidas );

    Fuente_Amplia( Buffer, &Letras );
    fflush(stdin);
   }

   delay( Dispersion * 2 );

 };

 free( J1.x );
 free( J1.y );
 free( J2.x );
 free( J2.y );

 bar( 9, 134, 626, 275 );
 LimpiaTablero();
 DesplazaOnda( CENTRAR );

}

int MoverJugador( JUGADORES *Jug, int color )
{
   int Estado = 0; // 0 VIVO      1 MUERTO

   // Imprimimos 1pixel de cola para el jugador
   putpixel( Jug -> x[numero+1], Jug -> y[numero+1], color );

   // Movemos al jugador
   switch( Jug -> direccion )
   {
    case 8:
           Jug -> y[numero] = Jug -> y[numero+1] - 1;
           Jug -> x[numero] = Jug -> x[numero+1]    ;
           break;
    case 2:
           Jug -> y[numero] = Jug -> y[numero+1] + 1;
           Jug -> x[numero] = Jug -> x[numero+1]    ;
           break;
    case 4:
           Jug -> x[numero] = Jug -> x[numero+1] - 1;
           Jug -> y[numero] = Jug -> y[numero+1]    ;
           break;
    case 6:
           Jug -> x[numero] = Jug -> x[numero+1] + 1;
           Jug -> y[numero] = Jug -> y[numero+1]    ;
           break;
   }

   // Miramos si esta fuera de los limites para matarlo
   if ( Jug -> x[numero] < 10 || Jug -> x[numero] > 625 || Jug -> y[numero] < 135 || Jug -> y[numero] > 274 )
     return 1;
   // Miramos si ha chocado con sigo mismo o con el compa¤ero
   color = getpixel( Jug -> x[numero], Jug -> y[numero] );
   if ( color == cfgFREC.gOnda || color == cfgFREC.mFondo )
     return 1;

   return 0;
}

void LimpiaTablero(void)
{
 int yM, xM;

 setfillstyle( SOLID_FILL, EGA_BLACK );
 setcolor( EGA_BLACK );
 bar( 10, 135, 625, 274 );


 // Dibujamos matrix, linea del cero
 for ( xM = 0;  ( xM + inicioMGx ) < ( oAnchoVentana + inicioMGx ); xM += SaltosMatrixX )
  for ( yM = 0; ( yM + inicioMGy ) < ( oAltoVentana + inicioMGy  ); yM += SaltosMatrixY )
   putpixel( xM + inicioMGx, yM + inicioMGy, cfgFREC.gMatrix );

}

void AnalizaTeclas( JUGADORES *J1, JUGADORES *J2 )
{
   // vemos si la tecla del BUFFER es para nosotros
   if ( kbhit() )
      switch( getch() )
      {
       // Teclas del 1er Jugador
       case 'D':
       case 'd':
            J1 -> direccion = 4;
            break;
       case 'G':
       case 'g':
            J1 -> direccion = 6;
            break;
       case 'R':
       case 'r':
            J1 -> direccion = 8;
            break;
       case 'F':
       case 'f':
            J1 -> direccion = 2;
            break;
       // Teclas del 2§ Jugador
       case  0 :
            switch( getch() )
            {
             case 75:
                  J2 -> direccion = 4;
                  break;
             case 77:
                  J2 -> direccion = 6;
                  break;
             case 72:
                  J2 -> direccion = 8;
                  break;
             case 80:
                  J2 -> direccion = 2;
                  break;
            }
      }
}
