#include <graphics.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <dos.h>


typedef struct
{
 int Ex, Ey, Ez;
 char Ecolor;
} CAMPO_de_ESTRELLAS;

CAMPO_de_ESTRELLAS *Cestrellas, *o;


void Actualiza(CAMPO_de_ESTRELLAS *Cest);
void Star3d(CAMPO_de_ESTRELLAS *Cest);
void pon_estrella(CAMPO_de_ESTRELLAS *Cest);
void llena_campo(CAMPO_de_ESTRELLAS *Cest);
void deinit_star(void);
void init_star(void);

void init_star(void)
{
  randomize();
  if ( ( Cestrellas = (CAMPO_de_ESTRELLAS *)malloc( sizeof(CAMPO_de_ESTRELLAS)*200 ) ) == NULL ) return;
  if ( ( o = (CAMPO_de_ESTRELLAS *)malloc( sizeof(CAMPO_de_ESTRELLAS)*200 ) ) == NULL ) return;

  llena_campo(Cestrellas);
}

void deinit_star(void)
{
 free( Cestrellas );
 free( o          );
}



void llena_campo(CAMPO_de_ESTRELLAS *Cest)
{
 int estrellas;
 for ( estrellas = 0; estrellas < 200; estrellas++ )
                                                pon_estrella( &Cest[estrellas] );
}

void pon_estrella(CAMPO_de_ESTRELLAS *Cest)
{

  Cest -> Ex = random(320)+1;
  Cest -> Ey = random(240)+1;
  Cest -> Ez = 400          ;
  Cest -> Ecolor = EGA_WHITE;

}

void Star3d(CAMPO_de_ESTRELLAS *Cest)
{
  Star3d( Cestrellas );
  while( !kbhit() ) Actualiza(Cest);

}

void Actualiza(CAMPO_de_ESTRELLAS *Cest)
{
 int Ex, Ey, conta;
 static float FactorMovimientoX = 0, FactorMovimientoY = 0, ox = 0, oy = 0;
 static float x=0.1, y=0.1;
 static char color = 0;


 for( conta=0; conta<200; conta++ )
 {
if (  o[conta].Ex+ox> 10 && o[conta].Ex+ox < 635 && o[conta].Ey+oy+100 >325 && o[conta].Ey+oy+100 < 470 )
  putpixel ( o[conta].Ex+ox, o[conta].Ey+oy+100, 0 );
//  putpixel ( o[conta].Ex+ox+5, o[conta].Ey+oy+(317/2), 0 );
  Ex = ( ((256*Cest[conta].Ex)/Cest[conta].Ez))+320;
  Ey = ( ((256*Cest[conta].Ey)/Cest[conta].Ez))+320;//240;
  Cest[conta].Ez = Cest[conta].Ez - 5            ;

  o[conta].Ex = Ex;
  o[conta].Ey = Ey;

color++;
if ( color > 10 )
{
if ( Cest[conta].Ecolor == EGA_WHITE )
  Cest[conta].Ecolor = EGA_LIGHTGRAY;
else if ( Cest[conta].Ecolor == EGA_LIGHTGRAY )
  Cest[conta].Ecolor = EGA_DARKGRAY;
else
  Cest[conta].Ecolor = EGA_WHITE;
color = 0;
}

  if ( Ex>635 && Ey>470+100 )
                 pon_estrella ( &Cest[conta] );

  if ( Cest[conta].Ez <= 20  || Ex>635 || Ey>470 || Ex<5 || Ey<0 )
//  if ( Cest[conta].Ez <= 20  || Ex>635 || Ey>470 || Ex<5 || Ey<317 )
                 pon_estrella ( &Cest[conta] );

if ( Ex+FactorMovimientoX > 10 && Ex+FactorMovimientoX < 635 && Ey+FactorMovimientoY+100 >325 && Ey+FactorMovimientoY+100 < 470 )
  putpixel ( Ex+FactorMovimientoX, Ey+FactorMovimientoY+100, Cest[conta].Ecolor );
//  putpixel ( Ex+FactorMovimientoX+5, Ey+FactorMovimientoY+(317/2), Cest[conta].Ecolor );


 }

 ox = FactorMovimientoX;
 oy = FactorMovimientoY;

 FactorMovimientoX+= x;
 FactorMovimientoY+= y;
 if ( FactorMovimientoX > 100 ) x = -0.1;
 if ( FactorMovimientoX < -100 ) x =  0.1;
 if ( FactorMovimientoY > 100 ) y = -0.1;
 if ( FactorMovimientoY < -100 ) y =  0.1;



}