/**************************************************\
| - Programa: Helad'o'matic                        |
| - Grupo: Emerald Works                           |
| - Iniciado: 29/08/2004                           |
| - Terminado:                                     |
| - Programado para el concurso de mini-juegos     |
| veraniegos de DIVnet (http://divnet.divsite.net) |
\**************************************************/

Program Heladomatic;
Const
   VEL_INICIAL = 6000;
   VALOR_CONTADOR = 1000;
   CAMBIO_VEL = 1000;
   VEL_MIN = 1000;
   
   PTO_FALLO = -1;
   PTO_UNA_BOLA = 5;
   PTO_DOS_BOLAS = 10;
   PTO_CHOCOLATE = 3;

Global
   // Para el proceso fundir()
   fundiendo = 0;
   mapFundir;
   
   // FPGs
   fpgIntro;
   fpgMenu;
   fpgJuego;
   
   // Fuentes
   fntFuente;
   
   // Sonidos
   wavIntro;

   wavBien; wavMal;
   wavBajaBrazo;
   wavBola; wavChocolate;
   wavCucurucho;
   wavCinta;
   
   oggMenu;
   
   graficoCartel[20] = 101, 102, 103, 104,
                       112, 113, 114, 123,
                       124, 134,
                       201, 202, 203, 204,
                       212, 213, 214, 223,
                       224, 234;
   teclas[6] = _1, _2, _3, _4, _5, _p;
   puntuación = 0;
   mejorPuntuación = 0;

   velocidad;
   contador;

Local
   saborHelado = 0;
   segundaBola = 0;
   idCucurucho;

Private
   fichero;

Begin
   Graph_mode = mode_16bits;
   Full_screen = false;
   set_mode(m640x480);
   
   // Carga de recursos
   mapFundir = load_map("fundenegro.map");

   fntFuente = load_fnt("fuente.fnt");

   wavBien = load_wav("sonidos/bien.wav");
   wavMal = load_wav("sonidos/mal.wav");
   wavBajaBrazo = load_wav("sonidos/baja_brazo.wav");
   wavBola = load_wav("sonidos/colocar_bola.wav");
   wavChocolate = load_wav("sonidos/chocolate.wav");
   wavCucurucho = load_wav("sonidos/soltar_cucurucho.wav");
   wavCinta = load_wav("sonidos/cintaloop.wav");
   
   oggMenu = load_song("sonidos/hurryup.ogg");


   write(fntFuente,320,220,4,"Pantalla completa?");
   write(fntFuente,320,260,4,"Si (s) / No (n)");
   
   Loop
      If (key(_s))
         Full_screen = true;
         Break;
      End
      If (key(_n))
         Full_screen = false;
         Break;
      End
      
      Frame;
   End
   
   fundir(1);
   While (fundiendo) Frame; End

   Frame;

   set_mode(m640x480);
   delete_text(all_text);

   Frame;

   graph = load_map("logo.map");
   x = 320; y = 240;

   fundir(2);
   While (fundiendo) Frame; End

   fichero = fopen("config.dat",O_READ);
   fread(fichero,(teclas));
   fread(fichero,(puntuacion));
   fread(fichero,(mejorPuntuacion));
   fclose(fichero);
   
   Frame(5000);

   fundir(1);
   While (fundiendo) Frame; End
   
   introEmeraldWorks();
End


/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\
|||                      GENERALES                          |||
/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*/

/*********************************************\
|  Proceso: fundir(cual)                      |
|  Función: "fade on y off"                   |
|  Parámetros:                                |
|    cual: 1 -> apagar                        |
|          2 -> encender                      |
\*********************************************/

Process fundir(cual);
Begin
   graph = mapFundir;

   x = 320; y = 240; z = -10000;
   fundiendo = 1;

   If (cual)
      From alpha = 0 To 255 Step 10; Frame; End
   Else
      From alpha = 255 To 0 Step -10; Frame; End
   End

   fundiendo = 0;

   Frame;
End


/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\
|||                     INTRODUCCIÓN                        |||
/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*/

/*****************************************\
|  Proceso: introEmeraldWorks()           |
|  Función: Introducción Emerald Works    |
|  Parámetros:                            | 
\*****************************************/

Process introEmeraldWorks();
Begin
   // Fondo de estrellas
   From z=0 To 9999; put_pixel(rand(1,799),rand(1,599),rand(5,15)); End

   fpgIntro = load_fpg("intro/intro.fpg");
   x = 320; y = 240; z = -100;
   file = fpgIntro;
   graph = 1;
   
   wavIntro = load_wav("intro/intro.wav");
   play_wav(wavIntro,0);
   
   fondoIntro();
   
   Loop
      If (key(_esc) OR NOT get_id(Type fondoIntro)) Break; End
      Frame;
   End
   
   fundir(1);
   While (fundiendo) Frame; End
   
   unload_fpg(fpgIntro);
   clear_screen();
   stop_wav(all_sound);
   unload_wav(wavIntro);
   
   menu();
End


Process fondoIntro();
Begin
   file = fpgIntro;
   
   x = 320; y = 190; z = 0;
   graph = 2;
   
   From alpha = 0 To 255 Step 10; Frame; End
   
   barraIntro();
   
   Loop
      If (NOT get_id(Type barraIntro)) Break; End
      Frame;
   End
   
   Size_y = 300;
   
   Loop
      If (NOT get_id(Type fundeIntro)) Break; End
      Frame;
   End
   
   From alpha = 255 To 0 Step -10; Frame; End   
End


Process barraIntro();
Begin
   file = fpgIntro;
   
   Size_x = 50;
   Size_y = 300;
   
   // Pasa por las dos a la vez
   x = 25; y = 240; z = -50;
   graph = 3; flags = 4;
   angle = -30000;
   
   From x = 25 To 615 Step 10; Frame; End
   
   fundeIntro();
   
   Frame;
End


Process fundeIntro();
Begin
   signal(father,s_sleep);
   
   file = fpgIntro;
   x = 320; y = 240; graph = 5;
   z = -500;
   
   From alpha = 0 To 255 Step 30; Frame; End
   
   signal(father,s_wakeup);

   From alpha = 255 To 0 Step -10; Frame; End
   
   Frame(3000);
End


/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\
|||                        MENU                             |||
/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*/

/*****************************************\
|  Proceso: menu()                        |
|  Función: Menú del juego                |
|  Parámetros:                            |
\*****************************************/

Process menu();
Begin
   let_me_alone();
   delete_text(all_text);
   stop_wav(all_sound);

   fpgMenu = load_fpg("menu.fpg");

   file = fpgMenu; graph = 1;
   x = 320; y = 240; z = 1000;
   
   play_song(oggMenu,-1);
   
   titulo();
   letrero(320,280,3);
   letrero(320,350,4);
   
   If (puntuacion > mejorPuntuacion) mejorPuntuacion = puntuacion; End
   
   write(fntFuente,320,440,4,"Ultima puntuacion: "+puntuación);
   write(fntFuente,320,460,4,"Mejor puntuacion: "+mejorPuntuación);

   fundir(2);
   While (fundiendo) Frame; End
   
   Loop
      If (key(_esc))
         fundir(1);
         While (fundiendo) Frame; End
         creditos();
      End
      If (key(_enter))
         fundir(1);
         While (fundiendo) Frame; End
         juego();
      End
      
      If (key(_r)) redefinir(); End
      
      Frame;
   End
End


/*****************************************\
|  Proceso: titulo()                      |
|  Función: Título del menú               |
|  Parámetros:                            |
\*****************************************/

Process titulo();
Begin
   file = fpgMenu; graph = 2;
   x = 320; y = 150; z = -100;
   
   Loop
      From x = 280 To 360 Step 1; Frame; End
      From x = 360 To 280 Step -1; Frame; End      
   End
End


/*****************************************\
|  Proceso: letrero(x,y,graph)            |
|  Función: Letrero del menú              |
|  Parámetros:                            |
|    x: posición horizontal               |
|    y: posición vertical                 |
|    graph: gráfico                       |
\*****************************************/

Process letrero(x,y,graph);
Begin
   file = fpgMenu; z = -100;
   
   Loop
      From alpha = 0 To 255 Step 20; Frame; End
      From z = -100 To -200;
         Frame;
         If (get_id(Type redefinir)) Break; End
      End
      From alpha = 255 To 0 Step -20; Frame; End
      
      If (get_id(Type redefinir))
         signal(id,s_sleep);
         Frame;
      End      
   End
End


/*****************************************\
|  Proceso: redefinir()                   |
|  Función: Redefinir las teclas          |
|  Parámetros:                            |
\*****************************************/

Process redefinir();
Begin
   signal(father,s_freeze);

   file = fpgMenu; z = -100;
   
   x = 320; y = 315; graph = 11; alpha = 0;
   
   From z = -355 To -100 Step 10; Frame; End   
   
   From z = 0 To 5;
      From alpha = 0 To 255 Step 20; Frame; End

      While (scan_code==0 OR scan_code==_esc)
            If (key(_control)) scan_code=29; Break; End
            If (key(_r_shift)) scan_code=54; Break; End  // Comprobar si son
            If (key(_l_shift)) scan_code=42; Break; End  // correctos los valores
            If (key(_alt)) scan_code=56; Break; End
            If (key(_space)) scan_code=57; Break; End
            
            Frame;
      End

      teclas[z] = scan_code;

      From alpha = 255 To 0 Step -20; Frame; End
      
      graph++;
   End
   
   From z = -355 To -100 Step 10; Frame; End   
   
   signal(father,s_wakeup);
   signal(Type letrero,s_wakeup);
End


/*****************************************\
|  Proceso: creditos()                    |
|  Función: Créditos                      |
|  Parámetros:                            |
\*****************************************/

Process creditos();
Private
   fichero;

Begin
   let_me_alone();
   delete_text(all_text);

   file = fpgMenu; graph = 21;
   x = 320; y = 240; z = 0;
   
   fundir(2);
   While (fundiendo) Frame; End
   
   fichero = fopen("config.dat",O_WRITE);
   fwrite(fichero,(teclas));
   fwrite(fichero,(puntuacion));
   fwrite(fichero,(mejorPuntuacion));
   fclose(fichero);   
   
   While (NOT key(_esc)) Frame; End

   fundir(1);
   While (fundiendo) Frame; End
   
   exit("",0);
End   


/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\
|||                        JUEGO                            |||
/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*\/*/

/*****************************************\
|  Proceso: juego()                       |
|  Función: Control del juego y fondo     |
|  Parámetros:                            |
\*****************************************/

Process juego();
Private
   pausado = 0;

Begin
   let_me_alone();
   delete_text(all_text);
   stop_song();
   
   fpgJuego = load_fpg("juego.fpg");
   
   juego2();
   
   Loop
      If (key(_esc))
         fundir(1);
         While (fundiendo) Frame; End
         unload_fpg(fpgJuego);
         menu();
      End

      If (key(teclas[5]))
         While (key(teclas[5])) Frame; End
         If (pausado)
            signal(Type juego2,s_wakeup_tree);
            pausado = 0;
         Else
            signal(Type juego2,s_freeze_tree);
            pausado = 1;
         End
      End
      
      Frame;
   End
End

Process juego2();
Begin
   fundir(1);
   While (fundiendo) Frame; End

   file = fpgJuego; graph = 1;
   x = 320; y = 240; z = 1000;
   
   velocidad = VEL_INICIAL;
   puntuacion = 0;
   
   cinta();

   conera();
   heladera(2);
   heladera(3);
   heladera(4);
   heladera(5);
   chocolatera();
   
   write_int(fntFuente,320,460,4,&puntuacion);

   fundir(2);
   While (fundiendo) Frame; End
   
   Loop
      contador++;
      
      If (contador > VALOR_CONTADOR)
         velocidad -= CAMBIO_VEL;
         contador = 0;
      End
      If (velocidad == VEL_MIN)
         fundir(1);
         While (fundiendo) Frame; End
         menu();
      End
      
      Frame;
   End
End


/*****************************************\
|  Proceso: cinta()                       |
|  Función: Cinta transportadora          |
|  Parámetros:                            |
\*****************************************/

Process cinta();
Begin
   file = fpgJuego; graph = 2;
   z = father.z - 1000;
   x = 320; y = 440;
   
   play_wav(wavCinta,-1);
   
   Loop Frame; End
End


/*****************************************\
|  Proceso: conera()                      |
|  Función: Máquina de conos              |
|  Parámetros:                            |
\*****************************************/

Process conera();
Begin
   file = fpgJuego; graph = 16;
   z = father.z - 10;
   x = 600; y = 240;
   
   poneConos();
   
   Loop Frame; End
End


/*****************************************\
|  Proceso: poneConos()                   |
|  Función: Apéndice de poner cucuruchos  |
|  Parámetros:                            |
\*****************************************/

Process poneConos();
Private
   idCucurucho;

Begin
   file = fpgJuego; graph = 18;
   z = father.z + 5;
   x = father.x; y = father.y - 80;
   
   Loop
      idCucurucho = cucurucho();

      play_wav(wavBajaBrazo,0);
      From y = (father.y - 120) To (father.y + 60) Step 10;
         idCucurucho.y = y;
         Frame;
      End
      
      signal(idCucurucho,s_wakeup);

      play_wav(wavBajaBrazo,0);
      From y = (father.y + 60) To (father.y - 120) Step -10; Frame; End

      Frame(velocidad);
   End
End


/*****************************************\
|  Proceso: heladera(cual)                |
|  Función: Máquina de helados            |
|  Parámetros:                            |
|    cual: Cuál de las heladeras          |
\*****************************************/

Process heladera(cual);
Begin
   file = fpgJuego; graph = 10 + cual;;
   z = father.z - 10;
   x = 150 + (cual - 2)*110; y = 198;
   
   poneHelado(cual);
   
   Loop Frame; End
End


/*****************************************\
|  Proceso: poneHelado(cual)              |
|  Función: Apéndice de poner helado      |
|  Parámetros:                            |
|    cual: Cuál de las heladeras          |
\*****************************************/

Process poneHelado(cual);
Begin
   file = fpgJuego; graph = 17;
   z = father.z + 5;
   x = father.x; y = father.y - 20;
   
   Loop
      If (key(teclas[cual-1]))
         play_wav(wavBajaBrazo,0);
         From y = (father.y - 20) To (father.y + 75) Step 15; Frame; End
         
         bolaHelado(x,y+40,z+3,19+cual);
         
         play_wav(wavBajaBrazo,0);
         From y = (father.y + 75) To (father.y - 50) Step -15; Frame; End
         
         From y = (father.y - 50) To (father.y - 20) Step 5; Frame; End
      End

      Frame;
   End
End


/*****************************************\
|  Proceso: chocolatera()                 |
|  Función: Máquina de chocolate          |
|  Parámetros:                            |
\*****************************************/

Process chocolatera();
Begin
   file = fpgJuego; graph = 11;
   z = father.z - 10;
   x = 50; y = 239;
   
   Loop
      If (key(teclas[0]))
         play_wav(wavChocolate,0);
         chocolate();
         While(key(teclas[0])) Frame; End
      End

      Frame;
   End
End


/*****************************************\
|  Proceso: chocolate()                   |
|  Función: Chocolate                     |
|  Parámetros:                            |
\*****************************************/

Process chocolate();
Private
   idBolaHelado;

Begin
   file = fpgJuego; graph = 19;
   z = father.z + 1;
   x = father.x; y = father.y + 31;
   
   Frame;

   If (collision(Type cinta)) signal(id,s_kill); Frame; End

   If (idBolaHelado = collision(Type bolaHelado))
      If (abs(idBolaHelado.x - x) < 25)
         capaChocolate(idBolaHelado);
      End
   Else
      chocolate();
   End
   
   Frame(200);      
End


/*****************************************\
|  Proceso: capaChocolate()               |
|  Función: Capa de chocolate             |
|  Parámetros:                            |
\*****************************************/

Process capaChocolate(idBolaHelado);
Begin
   file = fpgJuego; graph = 25;
   
   z = idBolaHelado.z - 1;
   
   Loop
      If (NOT exists(idBolaHelado)) Break; End

      x = idBolaHelado.x; y = idBolaHelado.y - 20;
   
      Frame;
   End   
End


/*****************************************\
|  Proceso: cucurucho()                   |
|  Función: Cucurucho                     |
|  Parámetros:                            |
\*****************************************/

Process cucurucho();
Begin
   file = fpgJuego; graph = 31;
   z = father.z - 1;
   x = father.x; y = father.y;
   
   signal(id,s_freeze);
   Frame;
   
   play_wav(wavCucurucho,0);

   y += 10;
   
   cartel();
   
   Loop
      x -= 2;

      If (x < -50) Break; End

      Frame;
   End
End


/*****************************************\
|  Proceso: cartel()                      |
|  Función: Cartel indicador              |
|  Parámetros:                            |
\*****************************************/

Process cartel();
Begin
   file = fpgJuego; graph = graficoCartel[rand(0,19)];
   z = -1000;
   size = 200;
   
   Loop
      If (x < -30) Break; End

      x = father.x; y = 430;
      
      Frame;
   End

   If (father.saborHelado == (graph-100))
      If ((father.saborHelado/10) MOD 10 > 0)
         puntuacion += PTO_DOS_BOLAS;
      Else
         puntuacion += PTO_UNA_BOLA;
      End
      If (father.saborHelado > 100)
         puntuacion += PTO_CHOCOLATE;
      End
   Else
      puntuacion += PTO_FALLO;
   End
   
   Loop Frame; End
End


/*****************************************\
|  Proceso: bolaHelado()                  |
|  Función: Bola de helado                |
|  Parámetros:                            |
\*****************************************/

Process bolaHelado(x,y,z,graph);
Private
   idBolaHelado;
   hayChocolate = 0;

Begin
   file = fpgJuego;
   y += 15;
   
   idCucurucho = collision(Type cucurucho);
   If (NOT idCucurucho)
      signal(id,s_kill);
      Frame;
   End
   
   If (abs(idCucurucho.x - x) > 25)
      signal(id,s_kill);
      Frame;
   End
   
   play_wav(wavBola,0);
   If (collision(Type bolaHelado))
      If (idCucurucho.saborHelado > 10)
         signal(id,s_kill);
         Frame;
      Else
         segundaBola = 1;
         z--;
         idCucurucho.saborHelado += (graph - 20) * 10;
      End
   Else
      idCucurucho.saborHelado = graph - 20;
   End
   
   Loop
      If (NOT exists(idCucurucho)) Break; End
      
      x = idCucurucho.x; y = idCucurucho.y - segundaBola*20;
      
      If (collision(Type capaChocolate) AND hayChocolate == 0)
         hayChocolate = 1;
         idCucurucho.saborHelado += 100;
      End

      Frame;
   End
End      













