# include <allegro.h>
# include <stdio.h>

# define SX 0
# define DX 800
# define ALTO 0
# define BASSO 600
# define LARGH_BLOCCO 50
# define ALT_BLOCCO 10
# define MIN_PLAYER 25
# define ALT_PLAYER 10
# define LARGH_PLAYER MIN_PLAYER*player.livello_larghezza
# define VEL_PAL 5
# define LIFE 5

MIDI *nirvana;
SAMPLE *bong;
int nb=0; //numero blocchi
RGB *pal;
BITMAP *buffer;

struct blocco
{
 int x1,x2,y1,y2;
 short ener;
}*blocchi;

struct rach
{
 int x;
 int y;
 int livello_larghezza; //1,2,4
 int vel;//velocit…
 int vite;
}player;

struct ball
{
 int x;
 int y;
 int raggio;
 int vel_x;
 int vel_y;
}palla;

int calc_livel(char *path);
int inizializza_grafica();
int inizializza_mult();
int play();
int dis_buffer();
int control_pal();
int collisione(struct blocco *muro);
int mov_mouse();
void mov_palla();
int elena();

int elena()
{
 printf("Ciao Elena!!!!!!!!!!!!!!!!\n");
 getch();
 printf("come stai??\n");
 getch();
 printf("Spero bene\n");
   getch();
 printf("Io devo studiare ancora studiare quel coso dell'ECDL :-(\n");
   getch();
 printf("Ma va beh...\n");
   getch();
 printf("č tutto il giorno che lo studio...\n");
   getch();
 printf("e quindi non sono riuscito a rispondere al tuo msg\n");
   getch();
 printf("quindi per farmi perdonare di faccio vedere in anteprima il mio nuovo videogioco\n");
 getch();
 printf("non sei emozionata??\n");
   getch();
 printf("No dai non mandarmi a fanculo cosi'...\n");
  getch();
 printf("lo sa anch'io che č una cagata come gioco...forse non funziona neanche..\n");
 getch();
 printf("Ma magari per il prossimo natale puo' tornare utile :-D\n");
  getch();
 printf("va beh basta parlare...gioca...\n");
   getch();
 printf("CIAO!!!!!!!!!!!!!!!!!\n");
 printf("p.s. se non vuoi giocare clicca la x in alto\n ");
getch();
}

int spazio()
{

}
 
int mov_mouse()
{
 if((mouse_x>player.x)&&(player.x+LARGH_PLAYER<DX))
  player.x+=4;
 else if((mouse_x<player.x)&&(player.x>SX))
  player.x-=4;
 mouse_x=player.x;
 
}

int collisione(struct blocco *muro)
{
 if(muro->ener)
 {
 if((palla.x+palla.raggio==muro->x1) || (palla.x-palla.raggio==muro->x2))
  if((palla.y+palla.raggio>=muro->y1)&&(palla.y-palla.raggio<=muro->y2))
 {
  palla.vel_x*=(-1);
  muro->ener-=1;
  play_sample(bong, 200, 150, 1000, 0);
  return 1;
 }
 if((palla.y+palla.raggio==muro->y1+1)||(palla.y-palla.raggio==muro->y2-1))
  if((palla.x+palla.raggio>=muro->x1)&&(palla.x-palla.raggio<=muro->x2))
  {
   palla.vel_y*=(-1);
   muro->ener-=1;
   play_sample(bong, 200, 150, 1000, 0);
   return 1;
  }
 }
 return 0;
}


int s=0;
 
int control_pal()
{
 int x;
 //collisioni muro
 if(palla.y+palla.raggio==BASSO)
  {
   player.vite-=1;
   palla.x=400;
   palla.y=530;
   install_int(mov_palla,0);
   s=0;
  }
 if(palla.x+palla.raggio==DX)
  palla.vel_x*=(-1);
 else if(palla.x-palla.raggio==SX)
  palla.vel_x*=(-1);
 if(palla.y-palla.raggio==ALTO)
  palla.vel_y*=(-1);
 //collisione player
 else if(((palla.y+palla.raggio>=player.y)&&(palla.y+palla.raggio<=player.y+5)))
        if((palla.x+palla.raggio>=player.x)&&(palla.x-palla.raggio<=player.x+LARGH_PLAYER))
         {
         palla.vel_y=(-1);
         play_sample(bong, 200, 150, 1000, 0);
         }
 for(x=nb;(x>=0);--x)
  if(collisione(blocchi+x))
   break;
}

void mov_palla()
{
 palla.x+=palla.vel_x;
 palla.y+=palla.vel_y;
 control_pal();
}
END_OF_FUNCTION(mov_palla);

int dis_buffer(BITMAP *buffer)
{
 int p;
 textprintf(buffer, font, 0,500, 50, "  %d vite rimaste",player.vite);
 if(s==0)
  textprintf(buffer, font, 0, 550, 2,"  premere SPAZIO per iniziare");
 rectfill(buffer,player.x,player.y,player.x+MIN_PLAYER*player.livello_larghezza,player.y+ALT_PLAYER,2);
 circlefill(buffer, palla.x, palla.y, palla.raggio, 4);
 for(p=0;p!=nb;++p)
 {
  if(blocchi[p].ener)
   rectfill(buffer, blocchi[p].x1+1, blocchi[p].y1+1, blocchi[p].x2-1, blocchi[p].y2-1, blocchi[p].ener);
 }
}



int play()
{
 extern BITMAP *buffer;
 buffer=create_bitmap(800,600);
 clear(buffer);
 dis_buffer(buffer);
 blit(buffer,screen,0,0,0,0,800,600);
 while(!key[KEY_ESC])
 {
  if((s==0)&&(key[KEY_SPACE]))
   {
    s=1;
    install_int(mov_palla,VEL_PAL);
   }
  if((key[KEY_RIGHT])&&((player.x+MIN_PLAYER*player.livello_larghezza)!=DX))
  player.x+=player.vel;
  else if((key[KEY_LEFT])&&((player.x!=SX)))
  player.x-=player.vel;
  else
  mov_mouse();
  dis_buffer(buffer);
  blit(buffer,screen,0,0,0,0,800,600);
  clear(buffer);
  if(player.vite==(-1))
  {
   allegro_exit();
   printf("GAME OVER\n");
  }
 }
}


 
int inizializza_mult()
{
 install_keyboard();
 install_timer();
 if(!install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,""))
 {
  set_volume(200,200);
 }
 else
  printf("non Š stato possibile inizializzare la scheda sonora\n");
 if(!(nirvana=load_midi("lithium.mid") ) )
  printf("errore: impossibile aprire il file lithium.mid\n");
 if(!(bong=load_wav("bong.wav")))
  printf("errore: impossibile aprire il file bong.wav");
 else
  play_midi(nirvana,1);
 install_mouse();
}
 

int inizializza_grafica()
{
 allegro_init();
 set_color_depth(8);
 set_gfx_mode(GFX_AUTODETECT,800,600,800,600);
 pal=desktop_palette;
 pal[0].r=0;
 pal[0].g=0;
 pal[0].b=0;
 set_palette(pal);
}


int calc_livel(char *path)
{
 FILE *stream;
 int x,y;
 blocchi=malloc(sizeof(struct blocco));
 if(!(stream=fopen(path,"r")))
 {
  printf("impossibile aprire il file %s\n",path);
  return 1;
 }
 for(y=0;y!=58;++y)
 {
  char buf[18];
  fgets(buf,18,stream);
  for(x=0;x!=18;++x)
  {
   if((isdigit(buf[x]))&&(buf[x]!='0'))
   {
    blocchi[nb].y1=ALTO+y*ALT_BLOCCO;
    blocchi[nb].y2=blocchi[nb].y1+ALT_BLOCCO;
    blocchi[nb].x1=SX+x*LARGH_BLOCCO;
    blocchi[nb].x2=blocchi[nb].x1+LARGH_BLOCCO;
    blocchi[nb].ener=buf[x]-'0';
    blocchi=realloc(blocchi,sizeof(struct blocco)*(nb+2));
    ++nb;
   }
  }
 }
 return 0;
}


int main(int argc, char *argv[])
{
 palla.x=400;
 palla.y=530;
 palla.vel_x=1;
 palla.vel_y=(-1);
 palla.raggio=3;
 player.x=400;
 player.y=550;
 player.livello_larghezza=2;
 player.vel=2;
 player.vite=LIFE;
 //elena();//bellissima
 system("cls");
 printf("Arkanoid v 0.0.1a\n");
 if((argc==1) || (calc_livel(argv[1])))
 {
  printf("carico livello di default....");
  if(calc_livel("livello.ark"))
  {
   printf("Errore nel caricare livello.ark..");
   exit(1);
  }
 }
 if(inizializza_grafica())
 printf("impossibile inizializzare la grafica: assicurarsi che la scheda grafica supporti la modalit… 800x600 a 256 colori\n");
 inizializza_mult();
 play();
 set_gfx_mode(GFX_TEXT,0,0,0,0);
 allegro_exit();
}
END_OF_MAIN();
 

