process vaso_nota(x,y,graph2,graph3)
begin
     loop
         if (key(_tab))
            graph=graph3;
         else
             graph=graph2;
         end
         frame;
     end
end

process vaso_cursor (x,y)
begin
     file=graficos1;
     graph=15;
     signal(id,s_freeze);
     frame;
end

function vaso_get_joy_dir ()
private
       cont;
       dato_a_devolver;
begin
     cont=0;
     dato_a_devolver=-1;
     for (cont=0;cont<=7;cont++)
         if (get_joy_button(cont)!=0)
            dato_a_devolver=cont*2;
            break;
         end
     end
     if (dato_a_devolver!=-1)
        switch (cont)
        case 0:
             if (get_joy_button(7)!=0) dato_a_devolver=15; end
             if (get_joy_button(1)!=0) dato_a_devolver=1; end
        end
        case 1..6:
             if (get_joy_button(cont+1)!=0) dato_a_devolver++; end
        end
        end
     end
     return (dato_a_devolver);
end

process vaso ()
private
       hijos[6];
       
       distancia;        //del raton al centro de la imagen
       angulo;           //posición angular actual del raton
       dir_giro;         //0= no giro    1=giro clockwise     2=giro contrarreloj
       ant_angulo;       //posicion angular anterior del raton
       dif_angulo;       //sirve para calcular hacia donde se mueve el raton
       
       joy_dir;          //posición angular actual del joystick
       joy_dir_ant;      //posición angular anterior del joystick
       dif_joy_dir;      //sirve para calcular hacia donde rotamos el joystick
       cont;             //cuenta el tiempo que lleva sin cambiarse de dir el joystick
       
       tocando;          //indica que se ha hecho una maniobra correcta de giro para tocar
       ant_a;
       ant_b;
       ant_x;
       ant_y;
       ant_sel;
       ant_null;
       ant_l;
       nota;             //guarda la nota activa
       nota_wav[11];     //guarda el id de carga de los wavs (samples)
       nota_chan[11];    //guarda el canal por el que suena cada sample
       nota_vol[11];     //guarda el volumen al que se reproduce cada sample
       nota_cont;
       byte nota_posx[5]=159,104,159,204,114,159; //diferencia 45
       byte nota_posy[5]=119,174,164,119,119,74; //diferencia 45
       nota_seleccionada; //flag que detecta que no hay ningun boton pulsado,
                          //para seleccionar la nota del centro de la pantalla
       
       joy_butt[7];
begin
     while (key(_backspace)) frame; end
     graficos1=load_fpg("vaso.fpg");
     put_screen(graficos1,1);
     put(graficos1,2,0,0);
     nota_wav[0]=load_wav("vaso/00-C-Do.wav");
     nota_wav[1]=load_wav("vaso/01-CS-DoS.wav");
     nota_wav[2]=load_wav("vaso/02-D-Re.wav");
     nota_wav[3]=load_wav("vaso/03-DS-ReS.wav");
     nota_wav[4]=load_wav("vaso/04-E-Mi.wav");
     nota_wav[5]=load_wav("vaso/05-F-Fa.wav");
     nota_wav[6]=load_wav("vaso/06-FS-FaS.wav");
     nota_wav[7]=load_wav("vaso/07-G-Sol.wav");
     nota_wav[8]=load_wav("vaso/08-GS-SolS.wav");
     nota_wav[9]=load_wav("vaso/09-A-La.wav");
     nota_wav[10]=load_wav("vaso/10-AS-LaS.wav");
     nota_wav[11]=load_wav("vaso/11-B-Si.wav");
     for (nota=0;nota<=5;nota++)
         hijos[nota]=vaso_nota(nota_posx[nota],nota_posy[nota],nota+3,nota+9);
     end
     hijos[6]=vaso_cursor(nota_posx[0],nota_posy[0]);
     select_joy(0);
     
     //debug
     /*draw_circle(159,119,119);
     draw_circle(159,119,79);
     write_int(0,0,240,6,&tocando);
     write_int(0,10,240,6,&dir_giro);
     write_int(0,30,240,6,&dif_joy_dir);
     write_int(0,50,240,6,&cont);
     write_int(0,0,230,6,&joy_dir);
     write_int(0,320,0,2,&nota);
     mouse.graph=16;*/
     
     /*write_int(0,180,240,8,&joy_butt[0]);
     write_int(0,200,240,8,&joy_butt[1]);
     write_int(0,220,240,8,&joy_butt[2]);
     write_int(0,240,240,8,&joy_butt[3]);
     write_int(0,260,240,8,&joy_butt[4]);
     write_int(0,280,240,8,&joy_butt[5]);
     write_int(0,300,240,8,&joy_butt[6]);
     write_int(0,320,240,8,&joy_butt[7]);*/
     
     loop
         /*for (cont=0;cont<=7;cont++)
             joy_butt[cont]=get_joy_button(cont);
         end*/
         //comprobando si estamos acariciando la copa
         //modo tactil
         if (mouse.left)
            distancia=fget_dist(159,119,mouse.x,mouse.y);
            if ((distancia<119) && (distancia>79))      //comprobamos que estamos sobre el vaso
               angulo=fget_angle(159,119,mouse.x,mouse.y);
               if (angulo<0) angulo+=360000; end        //hacemos que el angulo esté entre 0º y 359º
               dif_angulo=ant_angulo-angulo;
               switch (dir_giro)
               case 0:             //antes no giraba
                    //gira contrareloj sin pasar por cero
                    if (dif_angulo>0 && dif_angulo<270) dir_giro=2; end
                    //gira clockwise sin pasar por cero
                    if (dif_angulo<0 && dif_angulo>-270) dir_giro=1; end
                    //gira contrarreloj pasando por cero
                    if (dif_angulo<=-270) dir_giro=2; end
                    //gira clockwise pasando por cero
                    if (dif_angulo>=270) dir_giro=1; end
               end
               case 1:             //giro clockwise
                    //mantenemos la direccion de giro
                    if ((dif_angulo<0 && dif_angulo>-270) || (dif_angulo>=270))
                       tocando=true;
                    else
                        tocando=false;
                        dir_giro=0;
                    end
               end
               case 2:             //giro contrarreloj
                    //mantenemos la direccion de giro
                    if ((dif_angulo>0 && dif_angulo<270) || (dif_angulo<=-270))
                       tocando=true;
                    else
                        tocando=false;
                        dir_giro=0;
                    end
               end
               end
               ant_angulo=angulo;  //actualizamos el angulo anterior
            else    //no estamos sobre el vaso
                tocando=false;
                dir_giro=0;
            end
         else
             //modo no tactil (con  el mando, vamos)
             joy_dir=vaso_get_joy_dir();
             //el angulo devuelto por esta funcion crece en sentido contrario respecto
             //al ángulo normal
             
             //no funciona el retardo de espera
             if (joy_dir==-1)
                cont++;
                if (cont>14)
                   tocando=false;
                   dir_giro=0;
                end
             else
                 dif_joy_dir=joy_dir-joy_dir_ant;
                 switch (dir_giro)
                 case 0:
                      //gira contrarreloj sin pasar por cero
                      if (dif_joy_dir>0 && dif_joy_dir<12) dir_giro=2; end
                      //gira clockwise sin pasar por cero
                      if (dif_joy_dir<0 && dif_joy_dir>-12) dir_giro=1; end
                      //gira contrarreloj pasando por cero
                      if (dif_joy_dir<=-12) dir_giro=2; end
                      //gira clockwise pasando por cero
                      if (dif_joy_dir>=12) dir_giro=1; end
                  
                      //if (dif_joy_dir==0) dir_giro=0; end
                      if (dif_joy_dir==0)  //si no se mueve durante un tiempo pequeño es
                         cont++;           //que no ha dado tiempo al usuario a cambiar de
                         if (cont>4) dir_giro=0; end  //direccion, pero si es largo es que ha parado.
                      end
                 end
                 case 1: //giro clockwise
                      if ((dif_joy_dir<0 && dif_joy_dir>-12) || (dif_joy_dir>=12))
                         tocando=true;
                         cont=0;
                      else
                          if (dif_joy_dir==0)  //si no se mueve durante un tiempo pequeño es
                             cont++;           //que no ha dado tiempo al usuario a cambiar de
                             if (cont>14)       //direccion, pero si es largo es que ha parado.
                                tocando=false;
                                dir_giro=0;
                             end
                          else
                              tocando=false;
                              dir_giro=0;
                          end
                      end
                 end
                 case 2: //giro contrarreloj
                      if ((dif_joy_dir>0 && dif_joy_dir<12) || (dif_joy_dir<=-12))
                         tocando=true;
                         cont=0;
                      else
                          if (dif_joy_dir==0)  //si no se mueve durante un tiempo pequeño es
                             cont++;           //que no ha dado tiempo al usuario a cambiar de
                             if (cont>14)       //direccion, pero si es largo es que ha parado.
                                tocando=false;
                                dir_giro=0;
                             end
                          else
                              tocando=false;
                              dir_giro=0;
                          end
                      end
                 end
                 end
                 joy_dir_ant=joy_dir;
             end
         end
         
         //seleccion de la nota
         nota_seleccionada=false;
         
         //mal, primero hay que ver si realmente queremos hacer que suene
         /*if (key(_space))
            nota_seleccionada=true;  //indicamos que hay una nota pulsada
            if (!ant_sel)            //si se acaba de pulsar
               ant_sel=true;           //indicamos que ya no esta recien pulsada
               nota=1;               //que la nota es la nuestra
               if (is_playing_wav(nota_chan[1]))  //aun no se ha extinguido de antes
                  if (nota_vol[1]<128) nota_vol[1]+=2; end
               else
                   nota_vol[1]=0;        //inicializamos volumen
                   //nota_chan[1]=play_wav(nota_wav,-1);
               end
               //set_wav_volume(nota_chan[1],nota_vol[1]);
            else                     //hace rato que se pulsó
                if (nota==1)         //sigue siendo la nota activa
                   if (nota_vol[1]<128) nota_vol[1]+=2; end
                   //set_wav_volume(nota_chan[1],nota_vol[1]);
                else                 //ya no es nota activa, hay que apagarla
                    if (nota_vol[1]>0)
                       nota_vol[1]-=2;
                       //set_wav_volume(nota_chan[1],nota_vol[1]);
                    else
                        stop_wav(nota_chan[1]);   //una vez con volumen a cero hay pararla
                    end
                end
            end
         else  //no esta pulsada la tecla
             ant_sel=false;
             if (is_playing_wav(nota_chan[1]))   //la nota esta sonando?
                if (nota_vol[1]>0)               //hay que bajarle el volumen o cortarla
                   nota_vol[1]-=2;
                   //set_wav_volume(nota_chan[1],nota_vol[1]);
                else
                    stop_wav(nota_chan[1]);   //una vez con volumen a cero hay pararla
                end
             end
         end*/
         if (key(_space))
            nota_seleccionada=true;
            if (!ant_sel)
               ant_sel=true;
               if (!key(_tab)) nota=1; else nota=7; end
            end
         end
         if (!key(_space) && ant_sel) ant_sel=false; end
         
         if (key(_x))
            nota_seleccionada=true;
            if (!ant_x)
               ant_x=true;
               if (!key(_tab)) nota=2; else nota=8; end
            end
         end
         if (!key(_x) && ant_x) ant_x=false; end
         
         if (key(_alt))
            nota_seleccionada=true;
            if (!ant_b)
               ant_b=true;
               if (!key(_tab)) nota=3; else nota=9; end
            end
         end
         if (!key(_alt) && ant_b) ant_b=false; end
         
         if (key(_control))
            nota_seleccionada=true;
            if (!ant_a)
               ant_a=true;
               if (!key(_tab)) nota=4; else nota=10; end
            end
         end
         if (!key(_control) && ant_a) ant_a=false; end
         
         if (key(_z))
            nota_seleccionada=true;
            if (!ant_y)
               ant_y=true;
               if (!key(_tab)) nota=5; else nota=11; end
            end
         end
         if (!key(_z) && ant_y) ant_y=false; end
         
         if (!nota_seleccionada)// && !ant_null)
            ant_null=true;
            if (!key(_tab)) nota=0; else nota=6; end
         end
         if (nota_seleccionada && ant_null) ant_null=false; end
         
         if (key(_tab) && !ant_l)
            ant_l=true;
            if (nota<6) nota+=6; end
         end
         if (!key(_tab) && ant_l)
            ant_l=false;
            if (nota>5) nota-=6; end
         end
         
         //nota vale la nota activa y tocando indica si se esta deslizando
         //el dedo por el vaso
         //gestion de sonidos
         for (nota_cont=0;nota_cont<=11;nota_cont++)
             if ((nota_cont==nota) && tocando)     //nota activa y tocandola
                if (nota_vol[nota_cont]==0)        //antes no estaba sonando
                   //nota_vol[nota_cont]=2;
                   nota_vol[nota_cont]=4;
                   nota_chan[nota_cont]=play_wav(nota_wav[nota_cont],0);
                   //set_wav_volume(nota_chan[nota_cont],nota_vol[nota_cont]);
                   set_distance(nota_chan[nota_cont],255-nota_vol[nota_cont]);
                else                               //antes si estaba sonando
                    //nota_vol[nota_cont]+=2;        //subimos el volumen (si se puede más)
                    nota_vol[nota_cont]+=4;        //subimos el volumen (si se puede más)
                    //if (nota_vol[nota_cont]>128) nota_vol[nota_cont]=128; end
                    if (nota_vol[nota_cont]>255) nota_vol[nota_cont]=255; end
                    if (!is_playing_wav(nota_chan[nota_cont]))  //si ha terminado de sonar, repetimos
                        nota_chan[nota_cont]=play_wav(nota_wav[nota_cont],0);
                    end
                    //set_wav_volume(nota_chan[nota_cont],nota_vol[nota_cont]);
                    set_distance(nota_chan[nota_cont],255-nota_vol[nota_cont]);
                end
             else                                  //nota no activa, o activa y no tocándola
                 if (nota_vol[nota_cont]>0)        //comprobamos su volumen
                    //nota_vol[nota_cont]-=2;        //si es mayor que cero, está sonando y hay que apagarlo
                    nota_vol[nota_cont]-=4;        //si es mayor que cero, está sonando y hay que apagarlo
                    if (nota_vol[nota_cont]<=0)    //si lo apagamos, lo cortamos
                       nota_vol[nota_cont]=0;
                       if (is_playing_wav(nota_chan[nota_cont]))
                          stop_wav(nota_chan[nota_cont]);
                       end
                    else                           //si no, pues simplemente bajamos su volumen
                        //set_wav_volume(nota_chan[nota_cont],nota_vol[nota_cont]);
                        set_distance(nota_chan[nota_cont],255-nota_vol[nota_cont]);
                    end
                 end
             end
         end
         
         //mover cursor
         if (hijos[6].x>nota_posx[nota%6]) hijos[6].x-=5; end
         if (hijos[6].x<nota_posx[nota%6]) hijos[6].x+=5; end
         if (hijos[6].y>nota_posy[nota%6]) hijos[6].y-=5; end
         if (hijos[6].y<nota_posy[nota%6]) hijos[6].y+=5; end
         
         if (key(_backspace)) break; end
         frame;
     end
     
     for (nota=0;nota<=6;nota++)
         signal(hijos[nota],s_kill);
     end
     for (nota=0;nota<=11;nota++)
         if (is_playing_wav(nota_chan[nota])) stop_wav(nota_chan[nota]); end
         unload_wav(nota_wav[nota]);
     end
     clear_screen();
     //delete_draw(0);
     unload_fpg(graficos1);
     estado=0;
     frame;
end

//*****************************************************************************
//  MENU INICIAL
//*****************************************************************************
process vaso_flecha (x,y)
begin
     file=graficos1;
     flags=4;
     z=-600;
     signal(id,s_freeze);
     frame;
     //loop frame; end
end

process intro_vaso ()
private
       cont;
       hijos[1];
       ant_l;
       ant_r;
       fuentes1;
begin
     set_text_color(rgb(255,255,255));
     write(0,160,100,1,"Y : Instrucciones");
     write(0,160,140,1,"X : Tocar");
     load_pal("gothic_agua.fnt");
     fuentes1=load_fnt("gothic_agua.fnt");
     loop
         if (key(_z))
            delete_text(all_text);
            graficos1=load_fpg("inst_vaso.fpg");
            file=graficos1;
            hijos[0]=vaso_flecha(0,240);
            hijos[1]=vaso_flecha(320,240);
            while (cont<6)
                  switch (cont)
                  case 0:      //foto: como coger la consola
                       x=480;
                       y=120;
                       graph=3;
                       hijos[0].graph=0;
                       hijos[1].graph=2;
                       while (x!=160)
                             x-=5;
                             frame;
                       end
                       loop
                           if (!ant_r && key(_tab))
                              cont++;
                              ant_r=true;
                              while (x>=-160)
                                    x-=5;
                                    frame;
                              end
                              break;
                           end
                           if (ant_r && !key(_tab)) ant_r=false; end
                           frame;
                       end
                  end
                  case 1:      //Como tocar
                       hijos[0].graph=1;
                       hijos[1].graph=2;
                       write(fuentes1,160,3,1,"COMO SE TOCA UN VASO");
                       write(fuentes1,160,30,1,"DE AGUA");
                       set_text_color(rgb(0,0,255));
                       write(0,30,90,0,"Para tocar un vaso de agua se necesitan");
                       write(0,10,100,0,"dos cosas: seleccionar la nota, y hacer que");
                       write(0,10,110,0,"suene.");
                       write(0,30,120,0,"Para seleccionar una nota usaremos los");
                       write(0,10,130,0,"botones de la parte derecha.");
                       write(0,30,140,0,"Para hacer que suene usaremos la pantalla");
                       write(0,10,150,0,"táctil o el joystick analógico.");
                       loop
                           if (!ant_r && key(_tab))
                              cont++;
                              ant_r=true;
                              delete_text(all_text);
                              break;
                           end
                           if (ant_r && !key(_tab)) ant_r=false; end
                           if (!ant_l && key(_backspace))
                              cont--;
                              ant_l=true;
                              delete_text(all_text);
                              break;
                           end
                           if (ant_l && !key(_backspace)) ant_l=false; end
                           frame;
                       end
                  end
                  case 2:     //como tocar (pantalla táctil)
                       x=480;
                       y=120;
                       graph=4;
                       hijos[0].graph=1;
                       hijos[1].graph=2;
                       write(fuentes1,160,3,1,"HACIENDOLO SONAR CON F200");
                       while (x!=165)
                             x-=5;
                             frame;
                       end
                       write(0,20,50,0,"Mueve el dedo o el");
                       write(0,10,60,0,"puntero describiendo");
                       write(0,10,70,0,"círculos por el borde");
                       write(0,10,80,0,"del vaso.");
                       write(0,20,90,0,"Poco a poco, el volu-");
                       write(0,10,100,0,"men irá aumentando.");
                       write(0,10,110,0,"Si paras el sonido se");
                       write(0,10,120,0,"apagará poco a poco");
                       write(0,10,130,0,"hasta desaparecer.");
                       write(0,20,140,0,"No aprientes más para");
                       write(0,10,150,0,"que suene más fuerte.");
                       write(0,20,160,0,"Y, por favor: NO TE");
                       write(0,10,170,0,"HUMEDEZCAS EL DEDO,");
                       write(0,10,180,0,"no es necesario, la si-");
                       write(0,10,190,0,"mulación no llega a");
                       write(0,10,200,0,"tanto");
                       loop
                           if (!ant_r && key(_tab))
                              cont++;
                              ant_r=true;
                              while (x<=480)
                                    x+=5;
                                    frame;
                              end
                              delete_text(all_text);
                              break;
                           end
                           if (ant_r && !key(_tab)) ant_r=false; end
                           if (!ant_l && key(_backspace))
                              cont--;
                              ant_l=true;
                              while (x<=480)
                                    x+=5;
                                    frame;
                              end
                              delete_text(all_text);
                              break;
                           end
                           if (ant_l && !key(_backspace)) ant_l=false; end
                           frame;
                       end
                  end
                  case 3:     //como tocar (joystick analógico)
                       x=-160;
                       y=120;
                       graph=5;
                       hijos[0].graph=1;
                       hijos[1].graph=2;
                       write(fuentes1,160,3,1,"HACIENDOLO SONAR CON F100");
                       while (x!=155)
                             x+=5;
                             frame;
                       end
                       write(0,180,50,0,"Mueve el mando des-");
                       write(0,160,60,0,"cribiendo círculos. Da");
                       write(0,160,70,0,"igual el sentido de giro.");
                       write(0,180,80,0,"Gracias al uso de ocho");
                       write(0,160,90,0,"direcciones, en lugar de");
                       write(0,160,100,0,"las cuatro clásicas de");
                       write(0,160,110,0,"las crucetas normales,");
                       write(0,160,120,0,"se gana en sensibilidad,");
                       write(0,160,130,0,"mejorando la experiencia,");
                       write(0,160,140,0,"pese a no sentir el cris-");
                       write(0,160,150,0,"tal bajo la yema del dedo.");
                       write(0,180,160,0,"Se recomienda no apre-");
                       write(0,160,170,0,"tar con excesiva fuerza.");
                       loop
                           if (!ant_r && key(_tab))
                              cont++;
                              ant_r=true;
                              while (x>=-160)
                                    x-=5;
                                    frame;
                              end
                              delete_text(all_text);
                              break;
                           end
                           if (ant_r && !key(_tab)) ant_r=false; end
                           if (!ant_l && key(_backspace))
                              cont--;
                              ant_l=true;
                              while (x>=-160)
                                    x-=5;
                                    frame;
                              end
                              delete_text(all_text);
                              break;
                           end
                           if (ant_l && !key(_backspace)) ant_l=false; end
                           frame;
                       end
                  end
                  case 4:      //Las notas
                       x=480;
                       y=120;
                       graph=6;
                       hijos[0].graph=1;
                       hijos[1].graph=2;
                       while (x!=160)
                             x-=5;
                             frame;
                       end
                       write(0,40,55,0,"Usa los botones A,");
                       write(0,40,65,0,"B, X, Y y SELECT");
                       write(0,40,75,0,"para elegir una nota.");
                       write(0,150,165,0,"/-- Pulsando R obten-");
                       write(0,150,175,0,"\-- drás más notas");
                       loop
                           if (!ant_r && key(_tab))
                              cont++;
                              ant_r=true;
                              delete_text(all_text);
                              while (x>=-160)
                                    x-=5;
                                    frame;
                              end
                              break;
                           end
                           if (ant_r && !key(_tab)) ant_r=false; end
                           if (!ant_l && key(_backspace))
                              cont--;
                              ant_l=true;
                              delete_text(all_text);
                              while (x>=-160)
                                    x-=5;
                                    frame;
                              end
                              break;
                           end
                           if (ant_l && !key(_backspace)) ant_l=false; end
                           frame;
                       end
                  end
                  case 5:
                       write(0,10,10,0,"Para salir de nuevo al menu, pulsa L.");
                       write(fuentes1,160,120,4,"Pulsa R para empezar.");
                       loop
                           if (!ant_r && key(_tab))
                              cont++;
                              ant_r=true;
                              delete_text(all_text);
                              signal(hijos[0],s_kill);
                              signal(hijos[1],s_kill);
                              unload_fpg(graficos1);
                              break;
                           end
                           if (ant_r && !key(_tab)) ant_r=false; end
                           if (!ant_l && key(_backspace))
                              cont--;
                              ant_l=true;
                              delete_text(all_text);
                              break;
                           end
                           if (ant_l && !key(_backspace)) ant_l=false; end
                           frame;
                       end
                  end
                  end //switch
            end   //while (cont<4)
            //unload_fnt(fuentes1);
         end      //if (key(_z))

         //empieza el instrumento
         if (key(_x) || (cont==6))
            break;
         end

         frame;
     end
     unload_fnt(fuentes1);
     delete_text(all_text);
     estado=2;
     vaso();
end
