Codice sorgente

 

Home
Su
I videogiochi
Documentazione

Il codice sorgente del gioco č molto complesso, č composto da pių di 6200 righe di programma!. Per questo motivo l'ho suddiviso in sezioni:

Sezione 1 Menų del gioco

Sezione 2 Gioco: comprende i processi del gioco vero e proprio

Sezione 3 Tutorial: i processi che gestiscono il tutorial del gioco per l'utente

Sezione 4 Multi Players: per il gioco in rete (parte non terminata)

Sezione 5 Mappa del mondo: la mappa del mondo per la scelta dei livelli

Sezione 6 Funzioni per i tasti: sono le funzioni che controllano quando il giocatore preme i tasti

Sezione 7 Tabella dei record: qui viene gestito il file contenente i migliori punteggi

Sezione 8 Editor dei livelli: per la creazione dei livelli

 

// Scot Davide
// Classe 5°Bi
// Anno 1999/2001
// Ultima modifica 18/06/01
// 1.00
Program Gioco_Principale;
Global
  File_Fnt[1];
  Byte Controllo;          // Utilizzata dall'editor e da tipo gioco 2 e dai menu
  /* Timer del gioco sono usati
   0 Per giocatore 1 Per Paletta 1
   1 Per giocatore 2 Per Paletta 2
   2 Per Tabella Giocatore 1 o Taballa a tempo
   3 Per Tabella Giocatore 2
   4 Schermata Continua  o Schermata Continua_Doppio
   5 Continua_Doppio
   6
   7
   8 Gioco Utente[n].Tempo_Ani[n]
   9 Per andare al tutorial da
  */
  /* Gerarchia altezze
   -10   Scia palla
   -30   Palla
   -20   Paletta e Oggetti
   -40   Barre e Bonus
   -50   Sparo
   -100  Tebelle Varie
   -120  Palla all'Inizio
  */
  Struct Tasti[1]
      Byte Tipo_Sel;
      /*
         1 Tasti
         2 Joy
      */
      Byte Sinistra;
      Byte Destra  ;
      Byte Bottone ;
  End //=
  //  1,75,77,28,
  //  1,30,32,29;
  Struct Cont_Palla[1]
      Byte Quante;
           Ferma[2];
      Struct Movimento[2]  // Per controllo loop
        x [19];
        y [19];
      End
      Byte Velocita[2];
           Angolo[2];
  End;
  Struct Utente[1]
           Matrice [36,50]; // Per controllo rimbalzi
      Byte Blocco_Comandi;
      Byte Lancio_Iniziale;   // Per far decidere l'angolo
      Byte Inizio_sn;         // Per fare partire i timer delle tabelle
      Int  Punti_Colpi;       // Punti proporzionali a mattoni in successione colpiti
      Byte Tempo_Ani[5];
      /* Uso velocit… animazioni
       1 Paletta
       2 e 3 Grafici Sparo
       4 Palla
       5 Decidi Angolo
      */
      Byte   Livello;
      String Sezione[1];
      Byte Numero_Blocchi;
      Byte Numero_Tunnel;
      Int  Vite;        // Int perchŠ deve andare negativo nel gioco a vita
      Byte Continua;
           Punteggio;
  End;
  Byte Esci_Gioco;
  /* Quando deve uscire da un gioco
   0 Non esce da processo gioco
   1 Esce e va a Mappa mondo
   2 Esce, Inserisci record e Scelta
   3 Esce, Scelta ma non inserisci record
   4 Esce, ma non carica nessuna schermata
  */
  Struct Cont_Paletta[1]
      Byte Lung;
      Byte Tipo;
  End;
  Nome_Palette[]="Palett01.fpg","Palett02.fpg","Palett03.fpg";
  Nome_Suoni[]="Suoni\Click.wav","Suoni\Back.wav","Suoni\SPaletta.wav",
               "Suoni\Track.wav","Suoni\Tselect.wav","Suoni\Ogg1.wav",
               "Suoni\Ogg2.wav", "Suoni\Ogg3.wav" ,"Suoni\All_P.wav",
               "Suoni\All_M.wav","Suoni\Laser.wav","Suoni\Battle1.wav","Suoni\Battle2.wav";
  Nome_Sezioni[]="Foresta.fpg","America.fpg","Egitto.fpg";
  Nome_Font[]   ="Foresta.fnt","America.fnt","Egitto.fnt";
  Struct Cont_Bonus[1]
      Byte Contrario;
      Byte Multi_Ball;
      Byte Sparo_sn;
      Byte Super_sn;
      Byte Attaccata;
      Byte Allungamento;
  End;
  Struct Multi_Player[1]
    Struct Paletta
        X,Y,Graph;
    End;
//    Struct Palla[2]
//        Id_Palla,X,Y,Graph;
//    End
    Byte Ready;
    Int Vita;
  End;
  Pos_Sch[1]=180,180;       // Da la posizione dei due giocatori
  Byte Tipo_Gioco;          // Tipo di gioco scelto
  Byte Tutorial_SN;         // Se il tutorial Š in azione
  File_Contorni;
  File_Paletta[1];
  File_Palla  ;
  File_Blocchi;
  File_Bonus  ;
  File_Oggetti;  //Utilizzato da Mondo e da alcuni Men—
  File_Tutorial;
  File_Record;
  File_Menu;
  Id_Font[1];
  Id_Paletta[1];
  memi;    //Tamporano
  Byte prova_liv; // Temporaneo per prova livello
Begin
  Set_fps (60,10);
  Set_mode (m640x480);
  Load_pal ("Gioco.pal");
  Load ("Tasti.cfg",Offset (Tasti));  // Carica la configurazione dei tasti
  MKDir ("Livelli");
  MKDir ("Livelli/Singolo");
  MKDir ("Livelli/Doppio");
  MKDir ("Livelli/VSTempo");
  MKDir ("Livelli/VSLiv");
  MKDir ("Livelli/VSVita");
  MKDir ("Livelli/Multi");
  MKDir ("Hit");
  Mouse.File=Load_fpg ("Mouse.fpg");
  Presentazione();
  Loop
    Frame;
  End
End
/*    
// Sezione 1
//    	
// Menu Gioco
*/
// Presentazione
Process Presentazione ();
Begin
  Signal (Type Gioco_Principale,S_Freeze);
  Frame;
  Clear_Screen();
  Fade_On();
  File_Menu=Load_Fpg("Menu.fpg");
  File=File_Menu;
  Put_Screen(File_Menu,201);
  Graph=410;
  Size=0;
  x=320;
  y=240;
  Repeat
    Size+=1;
    Angle+=3600;
    Frame(100);
  Until (Size==100);
  Frame(500);
  Repeat
    y-=2;
    Frame(100);
  Until (y==140);
  Fade_Off();
  Menu_Iniziale ();
End
// Menu iniziale
Process Menu_Iniziale ();
Private
  Contatore;
  Id_Opzioni[5];
  Byte Vai_al_menu;
Begin
  Signal (Type Gioco_Principale,S_Freeze);
  Frame;
  Clear_Screen();
  Fade_On();
  File_Menu=Load_Fpg("Menu.fpg");
  File=File_Menu;
  Define_Region (1,0  ,0,100,480);
  Define_Region (2,540,0,100,480);
  Start_Scroll(0,File_Menu,210,0,1,2);
  Start_Scroll(1,File_Menu,210,0,2,2);
  Mouse.Graph=1;
  Graph=410;
  x=320;
  y=140;
  Put_Screen(File_Menu,201);
  Id_Opzioni[0]=Opzioni_Scelta (320,200,1,0);
  Frame (400);
  Id_Opzioni[1]=Opzioni_Scelta (320,250,2,1);
  Frame (400);
  Id_Opzioni[2]=Opzioni_Scelta (320,300,3,0);
  Frame (400);
  Id_Opzioni[3]=Opzioni_Scelta (320,350,4,1);
  Frame (400);
  Id_Opzioni[4]=Opzioni_Scelta (320,400,5,0);
  Frame (400);
  Id_Opzioni[5]=Opzioni_Scelta (320,450,6,1);
  Vai_al_menu=0;
  Controllo=0;
  Timer[9]=0;
  Repeat
    If (Mouse.Left)
      If (Id_Opzioni[0].z==60) Vai_al_menu=1; End
      If (Id_Opzioni[1].z==60) Vai_al_menu=2; End
      If (Id_Opzioni[2].z==60) Vai_al_menu=3; End
      If (Id_Opzioni[3].z==60) Vai_al_menu=4; End
      If (Id_Opzioni[4].z==60) Vai_al_menu=5; End
      If (Id_Opzioni[5].z==60) Vai_al_menu=6; End
    End
    If (Timer[9]>=1000) Vai_al_menu=7; End
    Scroll[0].y0++;
    Scroll[1].y0++;
    Frame;
  Until (Vai_Al_Menu>0);
  Controllo=100;
  Frame;
  Contatore=Get_Id (Type Opzioni_Scelta);
  While (Contatore)
    Frame;
    Contatore=Get_Id (Type Opzioni_Scelta);
  End
  Stop_Scroll(0);
  Stop_Scroll(1);
  Unload_fpg(File_Menu);
  Clear_Screen();
  Fade_Off();
  Switch (Vai_al_menu)
    Case 1: Menu_Campagna();                              End
    Case 2: Menu_Versus();                                End
    Case 3: Tipo_Gioco=10; Editor();                      End
    Case 4: Tipo_Gioco=0;  Visualizza_Record(Tipo_Gioco); End
    Case 5: Menu_Opzioni();                               End
    Case 6: Exit ("Grazie per aver giocato",0);           End
    Case 7: Tutorial();                                   End
  End
End
// Menu camagna
Process Menu_Campagna ();
Private
  Contatore;
  Font[1];
  Frasi[3];
  String Frase;
  Id_Opzioni[6];
  Byte Vai_al_menu;
Begin
  Signal (Type Gioco_Principale,S_Freeze);
  For (Contatore=0; Contatore<=1; Contatore++)
    Utente[Contatore].Vite=3;
    Utente[Contatore].Continua=3;
    Utente[Contatore].Numero_Blocchi=0;
    Utente[Contatore].Punteggio=0;
    Utente[Contatore].Livello=0;
    Utente[Contatore].Sezione="A";
  End
  Clear_Screen();
  Controllo=0;
  Fade_On();
  File_Menu=Load_Fpg("Menu.fpg");
  File_Oggetti=Load_Fpg("VisPalet.fpg");
  Font[0]=Load_Fnt("Menu.fnt");
  Font[1]=Load_Fnt("Menu2.fnt");
  Define_Region (1,0  ,0,100,480);
  Define_Region (2,540,0,100,480);
  Start_Scroll(0,File_Menu,210,0,1,2);
  Start_Scroll(1,File_Menu,210,0,2,2);
  Mouse.Graph=1;
  Put_Screen(File_Menu,201);
  Frasi[0]=Opzioni_Testo(320,50,"Modalita in campagna",100,1,Font[0]);
  Id_Opzioni[0]=Opzioni_Modalita (320,100,0);
  Frame (400);
  Frasi[1]=Opzioni_Testo(320,150,"Paletta giocatore 1",100,1,Font[0]);
  Id_Opzioni[1]=Opzioni_Cambia (320,200,1,1);
  Frame (400);
  Id_Opzioni[3]=Opzioni_Scelta (320,400,7,1);
  Frame (400);
  Id_Opzioni[4]=Opzioni_Scelta (320,450,8,0);
  Tipo_Gioco=1;
  Frase="Singolo";
  Cont_Paletta[0].Tipo=0;
  Cont_Paletta[1].Tipo=0;
  Vai_al_menu=0;
  Repeat
    If (Id_Opzioni[0].z==40)
      Frasi[3]=Write (Font[1],320,100,4,Frase);
    End
    If (Id_Opzioni[1].z==100)
      Id_Opzioni[5]=Vis_Palette_OPT (320,205,0,800);
    End
    If (Frase=="Cooperativa")          // In modo non ci siano errori
      If (Id_Opzioni[2].z==100)
        Id_Opzioni[6]=Vis_Palette_OPT (320,315,1,25);
      End
    End
    If (Mouse.Left)
      If (Id_Opzioni[0].z==60 And Timer[0]>=100)
        Switch (Tipo_Gioco)
          Case 1: Tipo_Gioco=2;
                  Frase="Cooperativa";
                  Frasi[2]=Opzioni_Testo(320,260,"Paletta giocatore 2",25,0,Font[0]);
                  Id_Opzioni[2]=Opzioni_Cambia (320,310,25,0);
                  Controllo=0;
          End
          Case 2: Tipo_Gioco=1;
                  Frase="Singolo";
                  Controllo=25;
          End
        End
        Timer[0]=0;
      End
      If (Id_Opzioni[1].z==40 And Timer[1]>=50)
        Cont_Paletta[0].Tipo++;
        If (Cont_Paletta[0].Tipo==3) Cont_Paletta[0].Tipo=0; End
        Id_Opzioni[5].z=40;
        Timer[1]=0;
      End
      If (Id_Opzioni[1].z==60 And Timer[1]>=50)
        If (Cont_Paletta[0].Tipo==0)
          Cont_Paletta[0].Tipo=2;
        Else
          Cont_Paletta[0].Tipo--;
        End
        Id_Opzioni[5].z=40;
        Timer[1]=0;
      End
      If (Frase=="Cooperativa")  // PerchŠ non ci siano errori
        If (Id_Opzioni[2].z==40 And Timer[2]>=50)
          Cont_Paletta[1].Tipo++;
          If (Cont_Paletta[1].Tipo==3) Cont_Paletta[1].Tipo=0; End
          Id_Opzioni[6].z=40;
          Timer[2]=0;
        End
        If (Id_Opzioni[2].z==60 And Timer[2]>=50)
          If (Cont_Paletta[1].Tipo==0)
            Cont_Paletta[1].Tipo=2;
          Else
            Cont_Paletta[1].Tipo--;
          End
          Id_Opzioni[6].z=40;
          Timer[2]=0;
        End
      End
      If (Id_Opzioni[3].z==60) Vai_al_menu=1; End
      If (Id_Opzioni[4].z==60) Vai_al_menu=2; End
    End
    Scroll[0].y0++;
    Scroll[1].y0++;
    Frame;
  Until (Vai_Al_Menu>0);
  Controllo=100;
  Delete_Text(Frasi[3]);
  Frame;
  Contatore=Get_Id (Type Opzioni_Scelta);
  While (Contatore)
    Frame;
    Contatore=Get_Id (Type Opzioni_Scelta);
  End
  Stop_Scroll(0);
  Stop_Scroll(1);
  Unload_fpg(File_Menu);
  Unload_fpg(File_Oggetti);
  Unload_fnt(Font[0]);
  Unload_fnt(Font[1]);
  Delete_Text(All_Text);
  Clear_Screen();
  Fade_Off();
  Switch (Vai_al_menu)
    Case 1: Menu_Iniziale();   End
    Case 2: Mouse.Graph=0; Mappa_Mondo(); End
  End
End
// Menu versus
Process Menu_Versus ();
Private
  Contatore;
  Font[1];
  Frasi[7];
  String Frase1;
  String Frase2;
  String Frase3;
  Byte Automatico[1];
  Id_Opzioni[8];
  Byte Vai_al_menu;
Begin
  Signal (Type Gioco_Principale,S_Freeze);
  For (Contatore=0; Contatore<=1; Contatore++)
    Utente[Contatore].Vite=3;
    Utente[Contatore].Continua=3;
    Utente[Contatore].Numero_Blocchi=0;
    Utente[Contatore].Punteggio=0;
    Utente[Contatore].Livello=0;
    Utente[Contatore].Sezione="A";
  End
  Clear_Screen();
  Controllo=0;
  Fade_On();
  File_Menu=Load_Fpg("Menu.fpg");
  File_Oggetti=Load_Fpg("VisPalet.fpg");
  Font[0]=Load_Fnt("Menu.fnt");
  Font[1]=Load_Fnt("Menu2.fnt");
  Define_Region (1,0  ,0,100,480);
  Define_Region (2,540,0,100,480);
  Start_Scroll(0,File_Menu,210,0,1,2);
  Start_Scroll(1,File_Menu,210,0,2,2);
  Mouse.Graph=1;
  Put_Screen(File_Menu,201);
  Frasi[0]=Opzioni_Testo(320,50,"Modalita in versus",100,1,Font[0]);
  Id_Opzioni[0]=Opzioni_Modalita (320,100,0);
  Frame (400);
  Frasi[1]=Opzioni_Testo(195,150,"Modalita 1",100,1,Font[0]);
  Id_Opzioni[1]=Opzioni_Modalita (195,200,1);
  Frame (400);
  Frasi[2]=Opzioni_Testo(445,150,"Modalita 2",100,1,Font[0]);
  Id_Opzioni[2]=Opzioni_Modalita (445,200,1);
  Frame (400);
  Frasi[3]=Opzioni_Testo(195,250,"Paletta 1",100,0,Font[0]);
  Id_Opzioni[3]=Opzioni_Cambia (195,300,100,0);
  Frame (400);
  Frasi[4]=Opzioni_Testo(445,250,"Paletta 2",100,1,Font[0]);
  Id_Opzioni[4]=Opzioni_Cambia (445,300,100,1);
  Frame (400);
  Id_Opzioni[5]=Opzioni_Scelta (320,400,7,1);
  Frame (400);
  Id_Opzioni[6]=Opzioni_Scelta (320,450,8,0);
  Tipo_Gioco=3;
  Cont_Paletta[0].Tipo=0;
  Cont_Paletta[1].Tipo=0;
  Automatico[0]=0;
  Automatico[1]=0;
  Frase1="Tempo";
  Frase2="Giocatore";
  Frase3="Giocatore";
  Vai_al_menu=0;
  Repeat
    If (Id_Opzioni[0].z==40)
      Frasi[5]=Write (Font[1],320,100,4,Frase1);
    End
    If (Id_Opzioni[1].z==40)
      Frasi[6]=Write (Font[1],195,200,4,Frase2);
    End
    If (Id_Opzioni[2].z==40)
      Frasi[7]=Write (Font[1],445,200,4,Frase3);
    End
    If (Id_Opzioni[3].z==100)
      Id_Opzioni[7]=Vis_Palette_OPT (195,305,0,800);
    End
    If (Id_Opzioni[4].z==100)
      Id_Opzioni[8]=Vis_Palette_OPT (445,305,1,800);
    End
    If (Mouse.Left)
      If (Id_Opzioni[0].z==60 And Timer[0]>=50)
        Switch (Tipo_Gioco)
          Case 3: Frase1="Livello"; Tipo_Gioco=4; End
          Case 4: Frase1="Vita"   ; Tipo_Gioco=5; End
          Case 5: Frase1="Tempo"  ; Tipo_Gioco=3; End
        End
        Timer[0]=0;
      End
      If (Id_Opzioni[1].z==60 And Timer[1]>=50)
        Switch (Automatico[0])
          Case 0: Automatico[0]=1; Frase2="Computer" ; End
          Case 1: Automatico[0]=0; Frase2="Giocatore"; End
        End
        Timer[1]=0;
      End
      If (Id_Opzioni[2].z==60 And Timer[2]>=50)
        Switch (Automatico[1])
          Case 0: Automatico[1]=1; Frase3="Computer" ; End
          Case 1: Automatico[1]=0; Frase3="Giocatore"; End
        End
        Timer[2]=0;
      End
      If (Id_Opzioni[3].z==40 And Timer[3]>=50)
        Cont_Paletta[0].Tipo++;
        If (Cont_Paletta[0].Tipo==3) Cont_Paletta[0].Tipo=0; End
        Id_Opzioni[7].z=40;
        Timer[3]=0;
      End
      If (Id_Opzioni[4].z==40 And Timer[4]>=50)
        Cont_Paletta[1].Tipo++;
        If (Cont_Paletta[1].Tipo==3) Cont_Paletta[1].Tipo=0; End
        Id_Opzioni[8].z=40;
        Timer[4]=0;
      End
      If (Id_Opzioni[3].z==60 And Timer[3]>=50)
        If (Cont_Paletta[0].Tipo==0)
          Cont_Paletta[0].Tipo=2;
        Else
          Cont_Paletta[0].Tipo--;
        End
        Id_Opzioni[7].z=40;
        Timer[3]=0;
      End
      If (Id_Opzioni[4].z==60 And Timer[4]>=50)
        If (Cont_Paletta[1].Tipo==0)
          Cont_Paletta[1].Tipo=2;
        Else
          Cont_Paletta[1].Tipo--;
        End
        Id_Opzioni[8].z=40;
        Timer[4]=0;
      End
      If (Id_Opzioni[5].z==60) Vai_al_menu=1; End
      If (Id_Opzioni[6].z==60) Vai_al_menu=2; End
    End
    Scroll[0].y0++;
    Scroll[1].y0++;
    Frame;
  Until (Vai_Al_Menu>0);
  Controllo=100;
  Delete_Text(Frasi[5]);
  Delete_Text(Frasi[6]);
  Delete_Text(Frasi[7]);
  Frame;
  Contatore=Get_Id (Type Opzioni_Scelta);
  While (Contatore)
    Frame;
    Contatore=Get_Id (Type Opzioni_Scelta);
  End
  Stop_Scroll(0);
  Stop_Scroll(1);
  Unload_fpg(File_Menu);
  Unload_fpg(File_Oggetti);
  Unload_fnt(Font[0]);
  Unload_fnt(Font[1]);
  Delete_Text(All_Text);
  Clear_Screen();
  Fade_Off();
  Switch (Vai_al_menu)
    Case 1: Menu_Iniziale();   End
    Case 2: Mouse.Graph=0; Gioco(Automatico[0],Automatico[1]); End
  End
End
// Menu opzioni
Process Menu_Opzioni ();
Private
  Contatore;
  Font[2];
  Frasi[3];
  String Frase1,Frase2;
  Id_Opzioni[2];
  Byte Vai_al_menu;
Begin
  Clear_Screen();
  Controllo=0;
  Fade_On();
  File_Menu=Load_Fpg("Menu.fpg");
  Font[0]=Load_Fnt("Menu.fnt");
  Font[1]=Load_Fnt("Menu2.fnt");
  Font[2]=Load_Fnt("Menu3.fnt");
  Define_Region (1,0  ,0,100,480);
  Define_Region (2,540,0,100,480);
  Start_Scroll(0,File_Menu,210,0,1,2);
  Start_Scroll(1,File_Menu,210,0,2,2);
  Mouse.Graph=1;
  Put_Screen(File_Menu,201);
  Frasi[0]=Opzioni_Testo(320,10,"Tasti giocatore 1",100,1,Font[0]);
  Id_Opzioni[0]=Opzioni_Modalita (320,60,1);
  Cambia_Tasti_OPT (320,150,1);
  Frame (400);
  Frasi[1]=Opzioni_Testo(320,220,"Tasti giocatore 2",100,0,Font[0]);
  Id_Opzioni[1]=Opzioni_Modalita (320,270,0);
  Cambia_Tasti_OPT (320,360,0);
  Frame (400);
  Id_Opzioni[2]=Opzioni_Scelta (320,450,7,1);
  Frame (400);
  Vai_al_menu=0;
  If (Tasti[0].Tipo_Sel==1)
    Frase1="Tastiera";
  Else
    Frase1="Joystick";
  End
  If (Tasti[1].Tipo_Sel==1)
    Frase2="Tastiera";
  Else
    Frase2="Joystick";
  End
  Repeat
    If (Id_Opzioni[0].z==40)
      Frasi[2]=Write (Font[1],320,60,4,Frase1);
      Tasti_OPT (200,155,0,1);
      Tasti_OPT (310,155,0,2);
      Tasti_OPT (440,155,0,3);
    End
    If (Id_Opzioni[1].z==40)
      Frasi[3]=Write (Font[1],320,270,4,Frase2);
      Tasti_OPT (200,365,1,1);
      Tasti_OPT (310,365,1,2);
      Tasti_OPT (440,365,1,3);
    End
    If (Mouse.Left)
      If (Id_Opzioni[0].z==60 And Timer[0]>=50)
        If (Tasti[0].Tipo_Sel==1)
          If (Tasti[1].Tipo_Sel==2)
            Frase2="Tastiera";
            Tasti[1].Tipo_Sel=1;
          End
          Frase1="Joystick";
          Tasti[0].Tipo_Sel=2;
        Else
          Frase1="Tastiera";
          Tasti[0].Tipo_Sel=1;
        End
        Timer[0]=0;
      End
      If (Id_Opzioni[1].z==60 And Timer[1]>=50)
        If (Tasti[1].Tipo_Sel==1)
          If (Tasti[0].Tipo_Sel==2)
            Frase1="Tastiera";
            Tasti[0].Tipo_Sel=1;
          End
          Frase2="Joystick";
          Tasti[1].Tipo_Sel=2;
        Else
          Frase2="Tastiera";
          Tasti[1].Tipo_Sel=1;
        End
        Timer[1]=0;
      End
      If (Id_Opzioni[2].z==60) Vai_al_menu=1; End
    End
    Scroll[0].y0++;
    Scroll[1].y0++;
    Frame;
  Until (Vai_Al_Menu>0);
  Controllo=100;
  Delete_Text(Frasi[2]);
  Delete_Text(Frasi[3]);
  Frame;
  Contatore=Get_Id (Type Opzioni_Scelta);
  While (Contatore)
    Frame;
    Contatore=Get_Id (Type Opzioni_Scelta);
  End
  Signal (Type Cambia_Tasti_OPT,S_Kill);
  Unload_fpg(File_Menu);
  Unload_fnt(Font[0]);
  Unload_fnt(Font[1]);
  Unload_fnt(Font[2]);
  Stop_Scroll(0);
  Stop_Scroll(1);
  Delete_Text(All_Text);
  Clear_Screen();
  Fade_Off();
  Switch (Vai_al_menu)
    Case 1: Save("Tasti.cfg",Offset Tasti,Sizeof (Tasti)); Menu_Iniziale();   End
  End
End
// Processo che visualizza le diverse palette
Process Vis_Palette_OPT (x,y,Giocatore,Esci_Per);
Private
  Byte Base;
Begin
  File=File_Oggetti;
  z=40;
  Repeat
    If (z==40)
      Switch (Cont_Paletta[Giocatore].Tipo)
        Case 0: If (Giocatore==0)
                   Graph=1;
                   Base=1;
                Else
                   Graph=7;
                   Base=7;
                End
        End
        Case 1: If (Giocatore==0)
                   Graph=13;
                   Base=13;
                Else
                   Graph=19;
                   Base=19;
                End
        End
        Case 2: If (Giocatore==0)
                   Graph=25;
                   Base=25;
                Else
                   Graph=31;
                   Base=31;
                End
        End
      End
      z=50;
    End
    Frame(600);
    Graph++;
    If (Graph==Base+6) Graph=Base; End
  Until (Controllo==100 Or Controllo==Esci_Per);
End
// Grafico cambia tasti
Process Cambia_Tasti_OPT (Pos_x,y,Byte Ent_Des_Sin);
Begin
  File=File_Menu;
  Graph=400;
  If (Ent_Des_Sin==0)
    x=Pos_x-400;          // Entra nel schermo da sinistra
    Repeat
      x+=10;
      Frame;
    Until (x==Pos_x);
  Else
    x=Pos_x+400;          // Entra nel schermo da destra
    Repeat
      x-=10;
      Frame;
    Until (x==Pos_x);
  End
  z=40;
  Frame;
  Repeat
    Frame;
  Until (Controllo==100);
  If (Ent_Des_Sin==0)
    Repeat                // Esce dal schermo a destra
      x+=10;
      Frame;
    Until (x==Pos_x+400);
  Else
    Repeat                // Esce dal schermo a sinistra
      x-=10;
      Frame;
    Until (x==Pos_x-400);
  End
End
// Casella per cambiare i tasti
Process Tasti_OPT (x,y,Giocatore,Numero);
Private
  String Frase;
  Byte Si_No_Tasto;
  Byte Valore;
  Id_Frase;
Begin
  File=File_Menu;
  Switch (Numero)
    Case 1: Frase=Caratteri_OPT (Tasti[Giocatore].Sinistra); End
    Case 2: Frase=Caratteri_OPT (Tasti[Giocatore].Destra  ); End
    Case 3: Frase=Caratteri_OPT (Tasti[Giocatore].Bottone ); End
  End
  Graph=300;
  Id_Frase=Write (3,x,y,4,Frase);
  Repeat
    If (Mouse.X>X-30 And Mouse.X<X+30 And Mouse.Y>Y-10 And Mouse.Y<Y+10)
      Graph=301;
      If (Mouse.Left And Controllo==0)
        Controllo=1;  // PerchŠ non si premano pi— bottoni insieme
        Si_No_Tasto=False;
        Graph=302;
        Repeat
          If (Scan_Code!=0)
            Valore=Scan_Code;
            Si_No_Tasto=Controllo_OPT(Valore);
          End
          If (key(_Control) And Si_No_Tasto==False)
            Valore=29;
            Si_No_Tasto=Controllo_OPT(Valore);
          End
          If (key(_Alt) And Si_No_Tasto==False)
            Valore=56;
            Si_No_Tasto=Controllo_OPT(Valore);
          End
          If (key(_L_Shift) And Si_No_Tasto==False)
            Valore=42;
            Si_No_Tasto=Controllo_OPT(Valore);
          End
          If (key(_R_Shift) And Si_No_Tasto==False)
            Valore=54;
            Si_No_Tasto=Controllo_OPT(Valore);
          End
          If (key(58) And Si_No_Tasto==False)
            Valore=58;
            Si_No_Tasto=Controllo_OPT(Valore);
          End
          Frame;
        Until (Si_No_Tasto Or Key(_Esc));
        If (Si_No_Tasto)
          Switch (Numero)
            Case 1:
                   Tasti[Giocatore].Sinistra=Valore;
                   Frase=Caratteri_OPT (Tasti[Giocatore].Sinistra); End
            Case 2:
                   Tasti[Giocatore].Destra=Valore;
                   Frase=Caratteri_OPT (Tasti[Giocatore].Destra  ); End
            Case 3:
                   Tasti[Giocatore].Bottone=Valore;
                   Frase=Caratteri_OPT (Tasti[Giocatore].Bottone ); End
          End
        End
        Controllo=0;
      End
    Else
      Graph=300;
    End
    Frame;
  Until (Controllo==100);
  Delete_Text(Id_Frase);
End
// Funzione controllo tasti
Function Controllo_OPT (Numero);
Private
  Byte Cont_Tasti;
Begin
  Cont_Tasti=0;
  If (Tasti[0].Sinistra==Numero) Cont_Tasti++; End
  If (Tasti[0].Destra  ==Numero) Cont_Tasti++; End
  If (Tasti[0].Bottone ==Numero) Cont_Tasti++; End
  If (Tasti[1].Sinistra==Numero) Cont_Tasti++; End
  If (Tasti[1].Destra  ==Numero) Cont_Tasti++; End
  If (Tasti[1].Bottone ==Numero) Cont_Tasti++; End
  If (Cont_Tasti>=1)
    Return (False);
  Else
    If (Caratteri_OPT(Numero)!="0")
      Return (True);
    Else
      Return (False);
    End
  End
End
// Funzione che controlla i caratteri
Function Caratteri_OPT (Numero);
Private
  String Tasto="0000000000000001QWERTYUIOP[]11ASDFGHJKL@#010ZXCVBNM,._10111010000000000111010101111100000000000000000000000000000000000000000000";
  String Frase_Ritorno;
Begin
  If (Tasto[Numero]=="0")
    Frase_Ritorno="0";
  Else If (Tasto[Numero]!="0" And Tasto[Numero]!="1")
         Frase_Ritorno=Tasto[Numero];
       Else
         Switch (Numero)
           Case 15: Frase_Ritorno="Tab"; End
           Case 58: Frase_Ritorno="Block"; End
           Case 28: Frase_Ritorno="Enter"; End
           Case 29: Frase_Ritorno="Control"; End
           Case 42: Frase_Ritorno="L-Shift"; End
           Case 54: Frase_Ritorno="R-Shift"; End
           Case 56: Frase_Ritorno="Alt"; End
           Case 57: Frase_Ritorno="Space"; End
           Case 71: Frase_Ritorno="Home"; End
           Case 73: Frase_Ritorno="Page UP"; End
           Case 79: Frase_Ritorno="End"; End
           Case 81: Frase_Ritorno="Pege DW"; End
           Case 82: Frase_Ritorno="Insert"; End
           Case 83: Frase_Ritorno="Delete"; End
           Case 72: Frase_Ritorno="Up"; End
           Case 80: Frase_Ritorno="Down"; End
           Case 75: Frase_Ritorno="Left"; End
           Case 77: Frase_Ritorno="Right"; End
         End
       End
  End
  Return (Frase_Ritorno);
End
// Pulsante per la scelta
Process Opzioni_Scelta (Pos_x,y,Byte Tipo,Byte Ent_Des_Sin)
Private
  Byte Sel;
  Byte Base_Graph;
Begin
  File=File_Menu;
  Switch (Tipo)
    Case 1: Base_Graph=1  ; End
    Case 2: Base_Graph=12 ; End
    Case 3: Base_Graph=23 ; End
    Case 4: Base_Graph=34 ; End
    Case 5: Base_Graph=45 ; End
    Case 6: Base_Graph=56 ; End
    Case 7: Base_Graph=67 ; End
    Case 8: Base_Graph=78 ; End
  End
  Graph=Base_Graph;
  If (Ent_Des_Sin==0)
    x=Pos_x-400;          // Entra nel schermo da sinistra
    Repeat
      x+=10;
      Frame;
    Until (x==Pos_x);
  Else
    x=Pos_x+400;          // Entra nel schermo da destra
    Repeat
      x-=10;
      Frame;
    Until (x==Pos_x);
  End
  Repeat                // Gira opzione
    Graph++;
    Frame(300);
  Until (Graph==6+Base_Graph);
  Repeat
    If (Mouse.X>X-75 And Mouse.X<X+75 And Mouse.Y>Y-22 And Mouse.Y<Y+22)
      If (Sel==0)
        Graph++;
      Else
        Graph--;
      End
      If (Graph==11+Base_Graph) Sel=1; Graph=10+Base_Graph; End
      If (Graph==6 +Base_Graph) Sel=0; Graph=7 +Base_Graph; End
      z=60;
    Else
      Sel=0;
      Graph=6+Base_Graph;
      z=50;
    End
    Frame(250);
  Until (Controllo==100);
  Graph=6+Base_Graph;
  Repeat                  // Rigira opzione
    Graph--;
    Frame(300);
  Until (Graph==Base_Graph);
  If (Ent_Des_Sin==0)
    Repeat                // Esce dal schermo a destra
      x+=10;
      Frame;
    Until (x==Pos_x+400);
  Else
    Repeat                // Esce dal schermo a sinistra
      x-=10;
      Frame;
    Until (x==Pos_x-400);
  End
End
// Pulsante per i cambiamenti
Process Opzioni_Cambia (Pos_x,y,Byte Fino_A,Byte Ent_Des_Sin)
Private
  Byte Sel;
Begin
  File=File_Menu;
  Graph=89;
  If (Ent_Des_Sin==0)
    x=Pos_x-400;          // Entra nel schermo da sinistra
    Repeat
      x+=10;
      Frame;
    Until (x==Pos_x);
  Else
    x=Pos_x+400;          // Entra nel schermo da destra
    Repeat
      x-=10;
      Frame;
    Until (x==Pos_x);
  End
  Repeat                // Gira opzione
    Graph++;
    Frame(300);
  Until (Graph==95);
  z=100;
  Frame;
  Repeat
    If (Mouse.X>X-125 And Mouse.X<X-50 And Mouse.Y>Y-35 And Mouse.Y<Y+35)
      If (Graph>=100) Sel=1; Graph=96; End
      If (Graph<=96 ) Sel=0; Graph=96; End
      If (Sel==0)
        Graph++;
      Else
        Graph--;
      End
      z=60;
    Else If (Mouse.X>X+50 And Mouse.X<X+125 And Mouse.Y>Y-35 And Mouse.Y<Y+35)
           If (Graph>=104) Sel=1; Graph=100; End
           If (Graph<=100) Sel=0; Graph=100; End
           If (Sel==0)
             Graph++;
           Else
             Graph--;
           End
           z=40;
         Else
           Sel=0;
           Graph=95;
           z=50;
         End
    End
    Frame(450);
  Until (Controllo==100 Or Controllo==Fino_A);
  Graph=95;
  Repeat                  // Rigira opzione
    Graph--;
    Frame(300);
  Until (Graph==89);
  If (Ent_Des_Sin==0)
    Repeat                // Esce dal schermo a destra
      x+=10;
      Frame;
    Until (x==Pos_x+400);
  Else
    Repeat                // Esce dal schermo a sinistra
      x-=10;
      Frame;
    Until (x==Pos_x-400);
  End
End
// Modalita gioco
Process Opzioni_Modalita (Pos_x,y,Byte Ent_Des_Sin)
Private
  Byte Sel;
Begin
  File=File_Menu;
  Graph=105;
  z=60;
  If (Ent_Des_Sin==0)
    x=Pos_x-400;          // Entra nel schermo da sinistra
    Repeat
      x+=10;
      Frame;
    Until (x==Pos_x);
  Else
    x=Pos_x+400;          // Entra nel schermo da destra
    Repeat
      x-=10;
      Frame;
    Until (x==Pos_x);
  End
  Repeat                // Gira opzione
    Graph++;
    Frame(300);
  Until (Graph==111);
  z=40;
  Frame;
  Repeat
    If (Mouse.X>X-100 And Mouse.X<X+100 And Mouse.Y>Y-30 And Mouse.Y<Y+30)
      If (Sel==0)
        Graph++;
      Else
        Graph--;
      End
      If (Graph==116) Sel=1; Graph=115; End
      If (Graph==111) Sel=0; Graph=112; End
      z=60;
    Else
      Sel=0;
      Graph=111;
      z=50;
    End
    Frame(250);
  Until (Controllo==100);
  Graph=111;
  Repeat                  // Rigira opzione
    Graph--;
    Frame(300);
  Until (Graph==105);
  If (Ent_Des_Sin==0)
    Repeat                // Esce dal schermo a destra
      x+=10;
      Frame;
    Until (x==Pos_x+400);
  Else
    Repeat                // Esce dal schermo a sinistra
      x-=10;
      Frame;
    Until (x==Pos_x-400);
  End
End
// Testi in movimanto
Process Opzioni_Testo (Pos_x,y,String Frase,Fino_A,Byte Ent_Des_Sin,Font)
Private
  Id_Frase;
Begin
  File=File_Menu;
  Id_Frase=Write (Font,Pos_x,y,4,Frase);
  If (Ent_Des_Sin==0)
    x=Pos_X-400;        // Entra nel schermo da sinistra
    Repeat
      x+=10;
      Move_Text(Id_Frase,x,y);
      Frame;
    Until (x==Pos_x);
  Else
    x=Pos_x+400;          // Entra nel schermo da destra
    Repeat
      x-=10;
      Move_Text(Id_Frase,x,y);
      Frame;
    Until (x==Pos_x);
  End
  Repeat
    Frame;
  Until (Controllo==100 Or Controllo==Fino_A);
  If (Ent_Des_Sin==0)
    Repeat                // Esce dal schermo a destra
      x+=10;
      Move_Text(Id_Frase,x,y);
      Frame;
    Until (x==Pos_x+400);
  Else
    Repeat                // Esce dal schermo a sinistra
      x-=10;
      Move_Text(Id_Frase,x,y);
      Frame;
    Until (x==Pos_x-400);
  End
  Delete_Text(Id_Frase);
End
/* 
// Sezione 2
//
// Gioco
*/
// Procedure controllo palla
Process Palla (x,y,Byte Numero,Byte Giocatore);
Private
  Int Contatore,Dist;
      Id2,Id_Tunnel,Id_Punto;
      Id_Blocco;
      Ancora;
  Byte Gioc_2;
  Byte Indice;
Begin
  File=File_Palla;
  z=-120;             // Sopra a tutto nell'inizio
  Indice=0;           // Inizializzazione
  Id_Blocco=0;
  Id_Tunnel=0;
  Id_Punto=0;
  Utente[Giocatore].Punti_Colpi=0;
  Graph=1+Giocatore*100;
  While (Cont_Palla[Giocatore].Ferma[Numero]==1 Or Graph<11+Giocatore*100 And Cont_Bonus[Giocatore].Multi_Ball==False)
    x=Id_Paletta[Giocatore].x;
    y=Id_Paletta[Giocatore].y-4;
    If (Utente[Giocatore].Tempo_Ani[4]>=3 And Graph<11+Giocatore*100)
      Graph+=1;
      Utente[Giocatore].Tempo_Ani[4]=0;
    End
    Frame;
  End
  Graph=11+Giocatore*100;
  z=-30;
  Repeat
    // Controllo barriere
    If (y<=60)
      id2=get_id(Type BarraN);
      While (id2)
        Ancora=True;
        For (contatore=140;contatore>=-140 And Ancora==True;contatore-=5)
          dist=fget_dist(x,y,id2.x-contatore,id2.y);
          If (dist<=6)
            Switch (Cont_Palla[Giocatore].Angolo[Numero])
              Case 91000..180000: Cont_Palla[Giocatore].Angolo[Numero]+=(180000-Cont_Palla[Giocatore].Angolo[Numero])*2;
              End
              Case 0..89000     : Cont_Palla[Giocatore].Angolo[Numero] =360000-Cont_Palla[Giocatore].Angolo[Numero];
              End
            End
            Cont_Palla[Giocatore].Movimento[Numero].x[Indice]=Id.x;
            Cont_Palla[Giocatore].Movimento[Numero].y[Indice]=Id.y;
            Indice++;
            If (Indice==20)
              Loop_Palla (Numero,Giocatore);
              Indice=0;
            End
            Ancora=False;
            Id_Tunnel=0;
            Id_Punto=0;
            Id_Blocco=0;
            Utente[Giocatore].Punti_Colpi=1;
          End
        End
        id2=get_id(Type BarraN);
      End
    End
    If (x>260+Pos_Sch[Giocatore])
      id2=get_id(Type BarraE);
      While (id2)
        Ancora=True;
        For (contatore=240;contatore>=-240 And Ancora==True;contatore-=5)
          dist=fget_dist(x,y,id2.x,id2.y-contatore);
          If (dist<=6)
            Switch (Cont_Palla[Giocatore].Angolo[Numero])
              Case 1000..90000    : Cont_Palla[Giocatore].Angolo[Numero]=180000-Cont_Palla[Giocatore].Angolo[Numero];
              End
              Case 270000..359000 : Cont_Palla[Giocatore].Angolo[Numero]-=(Cont_Palla[Giocatore].Angolo[Numero]-270000)*2;
              End
            End
            Cont_Palla[Giocatore].Movimento[Numero].x[Indice]=Id.x;
            Cont_Palla[Giocatore].Movimento[Numero].y[Indice]=Id.y;
            Indice++;
            If (Indice==20)
              Loop_Palla (Numero,Giocatore);
              Indice=0;
            End
            Ancora=False;
            Id_Tunnel=0;
            Id_Punto=0;
            Id_Blocco=0;
            Utente[Giocatore].Punti_Colpi=1;
          End
        End
        id2=get_id(Type BarraE);
      End
    End
    If (x<40+Pos_Sch[Giocatore])
      id2=get_id(Type BarraO);
      While (id2)
        Ancora=True;
        For (contatore=240;contatore>=-240 And Ancora==True;contatore-=5)
          dist=fget_dist(x,y,id2.x,id2.y-contatore);
          If (dist<=6)
            Switch (Cont_Palla[Giocatore].Angolo[Numero])
              Case 181000..270000: Cont_Palla[Giocatore].Angolo[Numero]+=(270000-Cont_Palla[Giocatore].Angolo[Numero])*2;
              End
              Case  90000..179000: Cont_Palla[Giocatore].Angolo[Numero]=180000-Cont_Palla[Giocatore].Angolo[Numero];
              End
            End
            Cont_Palla[Giocatore].Movimento[Numero].x[Indice]=Id.x;
            Cont_Palla[Giocatore].Movimento[Numero].y[Indice]=Id.y;
            Indice++;
            If (Indice==20)
              Loop_Palla (Numero,Giocatore);
              Indice=0;
            End
            Ancora=False;
            Id_Tunnel=0;
            Id_Punto=0;
            Id_Blocco=0;
            Utente[Giocatore].Punti_Colpi=1;
          End
        End
        id2=get_id(Type BarraO);
      End
    End
    // Controllo paletta 1
    Switch (Giocatore)
      Case 0: id2=Id_Paletta[0];  End
      Case 1: id2=Id_Paletta[1];  End
    End;
    If (y>=440)
      Ancora=True;
      For (contatore=Cont_Paletta[Giocatore].Lung;contatore>=-Cont_Paletta[Giocatore].Lung And Ancora==True;contatore-=5)
        dist=fget_dist(x,y,id2.x-contatore,id2.y);
        If (dist<=6)
          If (Cont_Palla[Giocatore].Ferma[Numero]==1)
            Repeat
              x=id2.x-contatore;
              Frame;
            Until (Cont_Palla[Giocatore].Ferma[Numero]==0);
          End
          Switch (Cont_Palla[Giocatore].Angolo[Numero])
            Case 271000..360000:
              If (Sinistra(Giocatore) Or Destra(Giocatore))
                Cont_Palla[Giocatore].Angolo[Numero]=360000-Cont_Palla[Giocatore].Angolo[Numero];
                Indice=0;
              Else
                Cont_Palla[Giocatore].Angolo[Numero]=rand(10000,80000);
                Indice=0;
              End
            End
            Case 180000..269000:
              If (Sinistra(Giocatore) Or Destra(Giocatore))
                Cont_Palla[Giocatore].Angolo[Numero]-=(Cont_Palla[Giocatore].Angolo[Numero]-180000)*2;
                Indice=0;
              Else
                Cont_Palla[Giocatore].Angolo[Numero]=Rand(100000,170000);
                Indice=0;
              End
            End
          End
          Ancora=False;
          Id_Tunnel=0;
          Id_Punto=0;
          Id_Blocco=0;
          Utente[Giocatore].Punti_Colpi=1;
        End
      End
    End
    // Controllo paletta 2 Solo Per modalita 2
    If (Tipo_Gioco==2)
      Switch (Giocatore)
        Case 0: id2=Id_Paletta[1]; Gioc_2=1; End
        Case 1: id2=Id_Paletta[0]; Gioc_2=0; End
      End
      If (y>=440)
        Ancora=True;
        For (contatore=Cont_Paletta[Gioc_2].Lung;contatore>=-Cont_Paletta[Gioc_2].Lung And Ancora==True;contatore-=5)
          dist=fget_dist(x,y,id2.x-contatore,id2.y);
          If (dist<=6)
            Switch (Cont_Palla[Giocatore].Angolo[Numero])
              Case 271000..360000:
                If (Sinistra(Giocatore) Or Destra(Giocatore))
                  Cont_Palla[Giocatore].Angolo[Numero]=360000-Cont_Palla[Giocatore].Angolo[Numero];
                  Indice=0;
                Else
                  Cont_Palla[Giocatore].Angolo[Numero]=rand(10000,80000);
                  Indice=0;
                End
              End
              Case 180000..269000:
                If (Sinistra(Giocatore) Or Destra(Giocatore))
                  Cont_Palla[Giocatore].Angolo[Numero]-=(Cont_Palla[Giocatore].Angolo[Numero]-180000)*2;
                  Indice=0;
                Else
                  Cont_Palla[Giocatore].Angolo[Numero]=Rand(100000,170000);
                  Indice=0;
                End
              End
            End
            Ancora=False;
            Id_Tunnel=0;
            Id_Punto=0;
            Id_Blocco=0;
            Utente[Giocatore].Punti_Colpi=1;
          End
        End
      End
    End
    // Controllo blocchi
    Ancora=True;
    id2=Get_id(Type Blocco);
    While (id2 And Ancora)
      Switch (id2.z)
        Case 1: Ancora=Controllo_Blocco (40,40,8,8,id,id2,Numero,Giocatore,Indice,Id_Blocco);  End
        Case 2: Ancora=Controllo_Blocco (40,8 ,8,8,id,id2,Numero,Giocatore,Indice,Id_Blocco);  End
        Case 3: Ancora=Controllo_Blocco (8 ,40,8,8,id,id2,Numero,Giocatore,Indice,Id_Blocco);  End
        Case 4: Ancora=Controllo_Blocco (40,16,8,8,id,id2,Numero,Giocatore,Indice,Id_Blocco);  End
        Case 5: Ancora=Controllo_Blocco (16,40,8,8,id,id2,Numero,Giocatore,Indice,Id_Blocco);  End
      End
      If (Ancora==False)
        Id_Tunnel=0;
        Id_Blocco=id2;
        Id_Punto=0;
        Utente[Giocatore].Punti_Colpi++;
        Indice++;
        If (Indice==20)
          Loop_Palla (Numero,Giocatore);
          Indice=0;
        End
      End;
      id2=Get_id(Type Blocco);
    End
    // Controllo blocchi speciali
    Ancora=True;
    id2=Get_id(Type Blocco_Speciale);
    While (id2 And Ancora)
      Ancora=Controllo_Blocco (56,56,8,8,id,id2,Numero,Giocatore,Indice,Id_Blocco);
      If (Ancora==False)
        Id_Tunnel=0;
        Id_Blocco=id2;
        Id_Punto=0;
        Utente[Giocatore].Punti_Colpi++;
        Indice++;
        If (Indice==20)
          Loop_Palla (Numero,Giocatore);
          Indice=0;
        End
      End;
      id2=Get_id(Type Blocco_Speciale);
    End
    // Controllo tunnel
    id2=Collision(Type Tunnel);
    If (id2 And id2<>Id_Tunnel)
      Ancora=True;
      Repeat
        Switch (Tipo_Gioco)
          Case 1..2: Contatore=Rand(1,Utente[Giocatore].Numero_Tunnel); End
          Case 3..6: Contatore=Rand(1,Utente[0].Numero_Tunnel+Utente[1].Numero_Tunnel); End
        End
        Dist=0;
        Repeat
          Id_Tunnel=Get_Id (Type Tunnel);
          Dist+=1;
        Until (Dist==Contatore)
        Frame;
      Switch (Tipo_Gioco)
        Case 1..2: Ancora=(Id_Tunnel==id2); End
        Case 3..6: Ancora=((Id_Tunnel==id2) Or (Id_Tunnel.z-50<>Giocatore)); End
      End
      Until (Not Ancora);
      x=id_Tunnel.x;
      y=id_Tunnel.y;
      Id_Punto=0;
      Id_Blocco=0;
      Utente[Giocatore].Punti_Colpi=1;
    End
    // Controllo Multi_Ball
    Id2=collision(Type Multi_Ball);
    If (Id2 And Cont_Bonus[Giocatore].Multi_Ball==False)
      If (Id2.z==104)
        Id2.z+=1;
        Frame(1000);
        Signal (Id,S_kill);
        Cont_Palla[Giocatore].Velocita[0]=6;
        Cont_Palla[Giocatore].Velocita[1]=6;
        Cont_Palla[Giocatore].Velocita[2]=6;
        Cont_Palla[Giocatore].Angolo[0]=Cont_Palla[Giocatore].Angolo[0];
        Cont_Palla[Giocatore].Angolo[1]=Cont_Palla[Giocatore].Angolo[0]*3;
        Cont_Palla[Giocatore].Angolo[2]=Cont_Palla[Giocatore].Angolo[0]/3;
        For (Contatore=1;Contatore<=2;Contatore++)
          If (Cont_Palla[Giocatore].Angolo[Contatore]>=350000 And Cont_Palla[Giocatore].Angolo[Contatore]<=10000)
            Cont_Palla[Giocatore].Angolo[Contatore]+=30000;
          End
          If (Cont_Palla[Giocatore].Angolo[Contatore]>=80000 And Cont_Palla[Giocatore].Angolo[Contatore]<=100000)
            Cont_Palla[Giocatore].Angolo[Contatore]+=30000;
          End
          If (Cont_Palla[Giocatore].Angolo[Contatore]>=170000 And Cont_Palla[Giocatore].Angolo[Contatore]<=190000)
            Cont_Palla[Giocatore].Angolo[Contatore]+=30000;
          End
          If (Cont_Palla[Giocatore].Angolo[Contatore]>=260000 And Cont_Palla[Giocatore].Angolo[Contatore]<=280000)
            Cont_Palla[Giocatore].Angolo[Contatore]+=30000;
          End
        End
        Cont_Palla[Giocatore].Ferma[0]=0;
        Cont_Palla[Giocatore].Ferma[1]=0;
        Cont_Palla[Giocatore].Ferma[2]=0;
        Cont_Bonus[Giocatore].Multi_Ball=True;
        Cont_Palla[Giocatore].Quante=3;
        Palla (id2.x,id2.y,0,Giocatore);
        Palla (id2.x,id2.y,1,Giocatore);
        Palla (id2.x,id2.y,2,Giocatore);
      End
      If (Id2.z<104)
        Id2.z+=1;
        Signal (Id,S_kill);
        Cont_Palla[Giocatore].Ferma[0]=1;
        Cont_Palla[Giocatore].Velocita[0]=6;
        Utente[Giocatore].Lancio_Iniziale=0;
        Palla (x,y,0,Giocatore);
      End
    End
    // Controllo punto
    id2=collision(Type Punti);
    If (id2 And id2<>Id_Punto)
      Utente[Giocatore].Punteggio+=100;
      Id_Punto=id2;
      Id_Tunnel=0;
      Id_Blocco=0;
      Utente[Giocatore].Punti_Colpi=1;
    End
    If (Cont_Bonus[Giocatore].Super_sn==1) Scia_Palla(Id.x,Id.y,Giocatore); End
    If (Cont_Palla[Giocatore].Angolo[Numero]>=360000) Cont_Palla[Giocatore].Angolo[Numero]-=360000; End
    x+=get_distx(Cont_Palla[Giocatore].Angolo[Numero],Cont_Palla[Giocatore].Velocita[Numero]);
    y+=get_disty(Cont_Palla[Giocatore].Angolo[Numero],Cont_Palla[Giocatore].Velocita[Numero]);
    Frame;
  Until (y>=480);
  Cont_Palla[Giocatore].Quante--;
  If (Cont_Palla[Giocatore].Quante==1) Cont_Bonus[Giocatore].Multi_Ball=False; End
End
// Funzione controllo loop palla
Function Loop_Palla (Byte Numero,Byte Giocatore)
Private
  Byte Indice1,Indice2;
  N_Volte_Trovato;
Begin
  For (Indice1=0;Indice1<=19;Indice1++)
    Indice2=0;
    Repeat
      If ((Indice1<>Indice2) And (Cont_Palla[Giocatore].Movimento[Numero].x[Indice1]==Cont_Palla[Giocatore].Movimento[Numero].x[Indice2])
           And (Cont_Palla[Giocatore].Movimento[Numero].y[Indice1]==Cont_Palla[Giocatore].Movimento[Numero].y[Indice2]))
        N_Volte_Trovato++;
        Indice2=49;
      End
      Indice2++;
    Until (Indice2==20 Or Indice2==50);
  End
  If (N_Volte_Trovato>=10)
    N_Volte_Trovato=Rand(10000,20000);
    Cont_Palla[Giocatore].Angolo[Numero]=Cont_Palla[Giocatore].Angolo[Numero]+N_Volte_Trovato;
    Switch (Cont_Palla[Giocatore].Angolo[Numero])
      Case 75000 ..105000: Cont_Palla[Giocatore].Angolo[Numero]=Cont_Palla[Giocatore].Angolo[Numero]-(2*N_Volte_Trovato); End;
      Case 165000..195000: Cont_Palla[Giocatore].Angolo[Numero]=Cont_Palla[Giocatore].Angolo[Numero]-(2*N_Volte_Trovato); End;
      Case 255000..285000: Cont_Palla[Giocatore].Angolo[Numero]=Cont_Palla[Giocatore].Angolo[Numero]-(2*N_Volte_Trovato); End;
      Case 345000..375000: Cont_Palla[Giocatore].Angolo[Numero]=Cont_Palla[Giocatore].Angolo[Numero]-(2*N_Volte_Trovato); End;
    End
  End
End
// Scia Palla
Process Scia_Palla (x,y,Giocatore);
Begin
  File=File_Palla;
  z=-10;
  Graph=12+Giocatore*100;
  z=200;
  Repeat
    Graph++;
    Frame(250);
  Until (Graph==17+Giocatore*100);
End
// Procedura controllo rimbalzo su blocco
Function Controllo_Blocco (L_Blocco,A_Blocco,Incx,Incy,Id_Palla,Id_Blocco,Byte Numero,Byte Giocatore,Byte Indice,Id_Pre)
Private
  Int Dist,Contatore;
  Ancora=True;
  Byte Minore_Di;
Begin
      L_Blocco=L_Blocco/2;
      A_Blocco=A_Blocco/2;
      Ancora=True;
      Dist=Fget_Dist(Id_Palla.x,Id_Palla.y,Id_Blocco.x,Id_Blocco.y);
      Switch (Id_Blocco.z)
        Case 1..8: Minore_Di=30; End
        Case    9: Minore_Di=45; End
      End
      If (Dist<Minore_Di And Id_Blocco<>Id_Pre)
        // Controllo sinistra
        For (contatore=A_Blocco;contatore>=-A_Blocco And Ancora==True;contatore-=Incy)
          Dist=Fget_Dist(Id_Palla.x,Id_Palla.y,Id_Blocco.x-L_Blocco,Id_Blocco.y-contatore);
          If (Dist<=6)
            If (Cont_Bonus[Giocatore].Super_sn==False And Controllo_Ind(Id_Blocco))
              Switch (Cont_Palla[Giocatore].Angolo[Numero])
                Case 1000..90000   : If (Controllo_Matrice(Giocatore,Contatore,L_Blocco,A_Blocco,Id_Blocco,1)==1)
                                       Cont_Palla[Giocatore].Angolo[Numero]=180000-Cont_Palla[Giocatore].Angolo[Numero];
                                       Signal(Id_Blocco,S_Wakeup);
                                       Ancora=False;
                                     End
                End
                Case 270000..359000: If (Controllo_Matrice(Giocatore,Contatore,L_Blocco,A_Blocco,Id_Blocco,1)==1)
                                       Cont_Palla[Giocatore].Angolo[Numero]-=(Cont_Palla[Giocatore].Angolo[Numero]-270000)*2;
                                       Signal(Id_Blocco,S_Wakeup);
                                       Ancora=False;
                                     End
                End
              End
            End
          End
        End
        // Controllo destra
        For (contatore=A_Blocco;contatore>=-A_Blocco And Ancora==True;contatore-=Incy)
          Dist=Fget_Dist(Id_Palla.x,Id_Palla.y,Id_Blocco.x+L_Blocco,Id_Blocco.y-contatore);
          If (Dist<=6)
            If (Cont_Bonus[Giocatore].Super_sn==False And Controllo_Ind(Id_Blocco))
              Switch (Cont_Palla[Giocatore].Angolo[Numero])
                Case 181000..270000: If (Controllo_Matrice(Giocatore,Contatore,L_Blocco,A_Blocco,Id_Blocco,2)==1)
                                       Cont_Palla[Giocatore].Angolo[Numero]+=(270000-Cont_Palla[Giocatore].Angolo[Numero])*2;
                                       Signal(Id_Blocco,S_Wakeup);
                                       Ancora=False;
                                     End
                End
                Case  89000..179000: If (Controllo_Matrice(Giocatore,Contatore,L_Blocco,A_Blocco,Id_Blocco,2)==1)
                                       Cont_Palla[Giocatore].Angolo[Numero]=180000-Cont_Palla[Giocatore].Angolo[Numero];
                                       Signal(Id_Blocco,S_Wakeup);
                                       Ancora=False;
                                     End
                End
              End
            End
          End
        End
        // Controllo giu
        For (contatore=L_Blocco;contatore>=-L_Blocco And Ancora==True;contatore-=Incx)
          Dist=Fget_Dist(Id_Palla.x,Id_Palla.y,Id_Blocco.x-contatore,Id_Blocco.y+A_Blocco);
          If (Dist<=6)
            If (Cont_Bonus[Giocatore].Super_sn==False And Controllo_Ind(Id_Blocco))
              Switch (Cont_Palla[Giocatore].Angolo[Numero])
                Case 91000..180000: Cont_Palla[Giocatore].Angolo[Numero]+=(180000-Cont_Palla[Giocatore].Angolo[Numero])*2;
                End
                Case 0..89000     : Cont_Palla[Giocatore].Angolo[Numero]=360000-Cont_Palla[Giocatore].Angolo[Numero];
                End
              End
            End
            Signal(Id_Blocco,S_Wakeup);
            Ancora=False;
          End
        End
        // Controllo su
        For (contatore=L_Blocco;contatore>=-L_Blocco And Ancora==True;contatore-=Incx)
          Dist=Fget_Dist(Id_Palla.x,Id_Palla.y,Id_Blocco.x-contatore,Id_Blocco.y-A_Blocco);
          If (Dist<=6)
            If (Cont_Bonus[Giocatore].Super_sn==False And Controllo_Ind(Id_Blocco))
              Switch (Cont_Palla[Giocatore].Angolo[Numero])
                Case 271000..360000: Cont_Palla[Giocatore].Angolo[Numero]=360000-Cont_Palla[Giocatore].Angolo[Numero];
                End
                Case 180000..269000: Cont_Palla[Giocatore].Angolo[Numero]-=(Cont_Palla[Giocatore].Angolo[Numero]-180000)*2;
                End
              End
            End
            Signal(Id_Blocco,S_Wakeup);
            Ancora=False;
          End
        End
        Cont_Palla[Giocatore].Movimento[Numero].x[Indice]=Id_Palla.x;
        Cont_Palla[Giocatore].Movimento[Numero].y[Indice]=Id_Palla.y;
      End
   Return (Ancora);
End
// Funzione controllo se il mattone Š indistruttibile
Function Controllo_Ind (Id_Blocco);
Private
  Ind_si_no;
Begin
  Ind_si_no= (Id_Blocco.Graph==33 Or Id_Blocco.Graph==66
              Or Id_Blocco.Graph==99 Or Id_Blocco.Graph==132
              Or Id_Blocco.Graph==165 Or Id_Blocco=>200);
  Return(Ind_si_no);
End
// Funzione controllo rimbalzo su matrice per spigoli
Function Controllo_Matrice (Byte Giocatore,Pos_Cont,Dax,Day,Id_Blocco,Tipo)
Private
  Si_No,PX,PY;
Begin
  If (Tipo_Gioco==2) Giocatore=0; End;
  Switch (Tipo)
    Case 1: PX=(Id_Blocco.x-Dax-10-Pos_Sch[Giocatore])/8-1;
            If (Pos_Cont==Day)
              PY=(Id_Blocco.y-Day-10)/8;
              Si_No=(Utente[Giocatore].Matrice[PX+1,Py+1]==0);
            Else
              If (Pos_Cont==-Day)
                PY=(Id_Blocco.y+Day-10)/8-1;
                Si_No=(Utente[Giocatore].Matrice[PX+1,PY+1]==0);
              Else
                Si_No=True;
              End
            End
    End
    Case 2: PX=(Id_Blocco.x+Dax-10-Pos_Sch[Giocatore])/8;
            If (Pos_Cont==Day)
              PY=(Id_Blocco.y-Day-10)/8;
              Si_No=(Utente[Giocatore].Matrice[PX+1,PY+1]==0);
            Else
              If (Pos_Cont==-Day)
                PY=(Id_Blocco.y+Day-10)/8-1;
                Si_No=(Utente[Giocatore].Matrice[PX+1,PY+1]==0);
              Else
                Si_No=True;
              End
            End
    End
  End
  Return(Si_No);
End
// Funzione cancella tutta la matrice
Function Cancella_Matrice (Byte Giocatore)
Private
  Byte A,B;
Begin
  For (A=0;A<=36;A++)
    Utente[Giocatore].Matrice[A,0]=1;
  End
  For (B=0;B<=50;B++)
    Utente[Giocatore].Matrice[0 ,B]=1;
    Utente[Giocatore].Matrice[36,B]=1;
  End
  For (A=1;A<=35;A++)
    For (B=1;B<=50;B++)
      Utente[Giocatore].Matrice[A,B]=0;
    End
  End
End
// Funzione inserimento o cancellazione su matrice
Function Ins_Can_Matrice (Byte Cancella,Byte Giocatore,Byte Tipo,Posx,Posy,Id2)
Private
  Byte Dax,Day,Ax,Ay,Contx,Conty;
Begin
  Posx=(Posx-Pos_Sch[Giocatore]-10-4)/8;
  Posy=(Posy-10-4)/8;
  Switch (Tipo)
    Case 1: Dax=2; Ax=2; Day=2; Ay=2; End;
    Case 2: Dax=2; Ax=2; Day=0; Ay=0; End;
    Case 3: Dax=0; Ax=0; Day=2; Ay=2; End;
    Case 4: Dax=2; Ax=2; Day=0; Ay=1; End;
    Case 5: Dax=0; Ax=1; Day=2; Ay=2; End;
    Case 9: Dax=3; Ax=3; Day=3; Ay=3; End;
  End
  If (Cancella==0)
    For (Contx=Posx-Dax;Contx<=Posx+Ax;Contx++)
      For (Conty=Posy-Day;Conty<=Posy+Ay;Conty++)
        Utente[Giocatore].Matrice[Contx+1,Conty+1]=1;
      End
    End
    Utente[Giocatore].Matrice[Posx+1,Posy+1]=2;
  Else
    For (Contx=Posx-Dax;Contx<=Posx+Ax;Contx++)
      For (Conty=Posy-Day;Conty<=Posy+Ay;Conty++)
        Utente[Giocatore].Matrice[Contx+1,Conty+1]=0;
      End
    End
  End
End
// Procedure delle barre di rimbalzo
Process BarraN (x,y);
Begin
  File=File_Contorni;
  z=-40;
  Graph=6;
  Loop
    Signal(id,s_freeze);
    Frame;
  End
End
Process BarraE (x,y);
Begin
  File=File_Contorni;
  z=-40;
  Graph=8;
  Loop
    Signal(id,s_freeze);
    Frame;
  End
End
Process BarraO (x,y);
Begin
  File=File_Contorni;
  z=-40;
  Graph=10;
  Loop
    Signal(id,s_freeze);
    Frame;
  End
End
// Procedura controllo paletta
Process Paletta (x,y,Byte Giocatore,Byte Computer);
Private
  Id_Bonus,Id_Sparo[1];
  Byte I;
  Id_Con,Id_Fin,Yp,Xp;  // Per modalit… automatica
  Byte Tempo[6]=0,0,0,0,0,0,0;  // 5 Inversione dir 6 tempo lancio
  Struct Anima
    Byte Avanti;
    Byte Massimo;
    Byte Minimo;
    Byte Velocita;
  End
Begin
  File=File_Paletta[Giocatore];
  Graph=1+Giocatore*100;
  z=-30;
  Timer[Giocatore]=0;
  // Inizializzazione
  Cont_Paletta[Giocatore].Lung=20;
  Cont_Palla[Giocatore].Velocita[0]=6;
  Cont_Palla[Giocatore].Ferma[0]=1;
  Cont_Palla[Giocatore].Quante=1;
  Cont_Bonus[Giocatore].Sparo_sn=False;
  Cont_Bonus[Giocatore].Super_sn=False;
  Cont_Bonus[Giocatore].Multi_Ball=False;
  Cont_Bonus[Giocatore].Attaccata=False;
  Cont_Bonus[Giocatore].Allungamento=0;
  If (Cont_Bonus[Giocatore].Contrario==True)  // Controllo
    Tasti[Giocatore].Destra=Tasti[Giocatore].Destra+Tasti[Giocatore].Sinistra;
    Tasti[Giocatore].Sinistra=Tasti[Giocatore].Destra-Tasti[Giocatore].Sinistra;
    Tasti[Giocatore].Destra=Tasti[Giocatore].Destra-Tasti[Giocatore].Sinistra;
  End
  Cont_Bonus[Giocatore].Contrario=False;
  Utente[Giocatore].Lancio_Iniziale=0;
  Repeat
    If (Utente[Giocatore].Tempo_Ani[1]>=3)
      Utente[Giocatore].Tempo_Ani[1]=0;
      Graph+=1;
    End
    Frame;
  Until (Graph==10+Giocatore*100);
  Anima.Massimo=14;
  Anima.Minimo=11;
  Anima.Velocita=4;
  Anima.Avanti=1;
  //Blocco comandi fino a inizio livello
  Id_Bonus=Get_id(Type Inizio_Livello);
  While (Id_Bonus)
    Frame;
    Id_Bonus=Get_id(Type Inizio_Livello);
  End
  Repeat
    If (Collision(Type Paletta))
      Flags=4;
    Else
      Flags=0;
    End
    If (Utente[Giocatore].Blocco_Comandi==1)
      Graph=10+Giocatore*100;
      Signal (Id_Sparo[0],S_Kill);
      Signal (Id_Sparo[1],S_Kill);
      y=500;
      Switch (Tipo_Gioco)
        Case 2: If (Giocatore==0)
                  x=75+Pos_Sch[Giocatore];
                Else
                  x=225+Pos_Sch[Giocatore];
                End
        End
        Default: x=150+Pos_Sch[Giocatore]; End
      End
      Anima.Massimo=14;
      Anima.Minimo=11;
      Anima.Velocita=4;
      Anima.Avanti=1;
      Cont_Paletta[Giocatore].Lung=20;
      Cont_Palla[Giocatore].Velocita[0]=6;
      Cont_Palla[Giocatore].Ferma[0]=1;
      Cont_Palla[Giocatore].Quante=1;
      Cont_Bonus[Giocatore].Sparo_sn=False;
      Cont_Bonus[Giocatore].Super_sn=False;
      Cont_Bonus[Giocatore].Multi_Ball=False;
      Cont_Bonus[Giocatore].Attaccata=False;
      Cont_Bonus[Giocatore].Allungamento=0;
      If (Cont_Bonus[Giocatore].Contrario==True)
        Tasti[Giocatore].Destra=Tasti[Giocatore].Destra+Tasti[Giocatore].Sinistra;
        Tasti[Giocatore].Sinistra=Tasti[Giocatore].Destra-Tasti[Giocatore].Sinistra;
        Tasti[Giocatore].Destra=Tasti[Giocatore].Destra-Tasti[Giocatore].Sinistra;
      End
      Cont_Bonus[Giocatore].Contrario=False;
      Utente[Giocatore].Lancio_Iniziale=0;
      While (Utente[Giocatore].Blocco_Comandi==1)
        Frame;
        If (y>460) y-=2; End
      End
    End;
    Switch (Computer)
      Case 0:If (Bottone(Giocatore) And Cont_Palla[Giocatore].Ferma[0]==1)
               If (Cont_Palla[Giocatore].Quante==1 And Cont_Bonus[Giocatore].Attaccata==False And Utente[Giocatore].Lancio_Iniziale==0)
                 Decidi_Angolo(Giocatore,Computer);
                 Utente[Giocatore].Inizio_Sn=0;
                 Utente[Giocatore].Lancio_Iniziale=1;
               Else If (Utente[Giocatore].Lancio_Iniziale==2)
                      For (I=0;I<=2;I++)
                        Cont_Palla[Giocatore].Ferma[I]=0;
                      End
                      Frame;
                    End
               End
             End
             If (Sinistra(Giocatore))
               If (x-Cont_Paletta[Giocatore].Lung<=20+Pos_Sch[Giocatore])
                 x=Cont_Paletta[Giocatore].Lung+10+Pos_Sch[Giocatore];
               Else
                 x-=10;
               End
             End
             If (Destra(Giocatore))
               If (x+Cont_Paletta[Giocatore].Lung>=280+Pos_Sch[Giocatore])
                 x=290-Cont_Paletta[Giocatore].Lung+Pos_Sch[Giocatore];
               Else
                 x+=10;
               End
             End
      End
      Case 1:If (Cont_Palla[Giocatore].Ferma[0]==1)
               If (Cont_Palla[Giocatore].Quante==1 And Cont_Bonus[Giocatore].Attaccata==False And Utente[Giocatore].Lancio_Iniziale==0)
                 Decidi_Angolo(Giocatore,Computer);
                 Utente[Giocatore].Inizio_Sn=0;
                 Utente[Giocatore].Lancio_Iniziale=1;
               Else If (Utente[Giocatore].Lancio_Iniziale==2)
                      For (I=0;I<=2;I++)
                        Cont_Palla[Giocatore].Ferma[I]=0;
                      End
                      Frame;
                    End
               End
             End
             Id_Con=Get_Id(Type Palla);
             Yp=0;
             Repeat
               Switch (Tipo_Gioco)
                 Case 1..2:If (Yp<Id_Con.y)
                             Id_Fin=Id_Con;
                             Yp=Id_Fin.y;
                           End
                 End
                 Case 3..5:If (Giocatore==0 And Id_Con.x<320)
                             If (Yp<Id_Con.y)
                               Id_Fin=Id_Con;
                               Yp=Id_Fin.y;
                             End
                           End
                           If (Giocatore==1 And Id_Con.x>320)
                             If (Yp<Id_Con.y)
                               Id_Fin=Id_Con;
                               Yp=Id_Fin.y;
                             End
                           End
                 End
               End
               Id_Con=Get_Id(Type Palla);
             Until (Not Id_Con);
             If (x>Id_Fin.x)
               If (x-Cont_Paletta[Giocatore].Lung<=20+Pos_Sch[Giocatore])
                 x=Cont_Paletta[Giocatore].Lung+10+Pos_Sch[Giocatore];
               Else
                 x-=10;
               End
             End
             If (x<Id_Fin.x)
               If (x+Cont_Paletta[Giocatore].Lung>=280+Pos_Sch[Giocatore])
                 x=290-Cont_Paletta[Giocatore].Lung+Pos_Sch[Giocatore];
               Else
                 x+=10;
               End
             End
      End
      Case 2:Switch (Tutorial_SN)
               Case 6: If (x+Cont_Paletta[Giocatore].Lung>=290+Pos_Sch[Giocatore])
                         x=290-Cont_Paletta[Giocatore].Lung+Pos_Sch[Giocatore];
                       Else If (Timer[9]>200)
                              x+=2;
                            End
                       End
               End
               Case 8: If (x-Cont_Paletta[Giocatore].Lung<=10+Pos_Sch[Giocatore])
                         x=Cont_Paletta[Giocatore].Lung+10+Pos_Sch[Giocatore];
                       Else If (Timer[9]>200)
                              x-=2;
                            End
                       End
               End
               Case 10:If (x<150)
                         x+=2;
                       End
               End
               Case 14:If (Timer[9]>200 And Utente[Giocatore].Lancio_Iniziale==0)
                         Utente[Giocatore].Lancio_Iniziale=1;
                         Decidi_Angolo(Giocatore,Computer);
                       End
               End
               Case 32:If (Timer[9]>100 And Utente[Giocatore].Lancio_Iniziale==0)
                         Computer=1;
                         Tipo_Gioco=1;
                         Utente[Giocatore].Numero_Tunnel=2;
                       End
               End
             End
      End
    End
    If (Timer[Giocatore]>=10)
      For (I=0;I<=6;I++)
        Tempo[I]+=1;
      End
      Timer[Giocatore]=0;
    End
    If (Tempo[6]==100 And
        Cont_Palla[Giocatore].Ferma[0]==1 And
        Cont_Bonus[Giocatore].Attaccata==False And
        Tutorial_SN==0)               // Lancio Palla per troppa tenuta
      For (I=0;I<=2;I++)
        Cont_Palla[Giocatore].Ferma[I]=0;
      End
      Cont_Palla[Giocatore].Angolo[0]=Rand(20000,80000)*Rand(1,2);
      Utente[Giocatore].Inizio_Sn=0;
      Utente[Giocatore].Lancio_Iniziale=2;
      Tempo[6]=0;
    Else If (Utente[Giocatore].Lancio_Iniziale==2)
           Tempo[6]=0;
         End
    End
    If (Utente[Giocatore].Tempo_Ani[1]>=Anima.Velocita)
      If (Graph==Anima.Massimo+Giocatore*100)
        Graph=Anima.Minimo+Giocatore*100;
        Anima.Velocita=4;
        If (Anima.Avanti==0)
          Anima.Avanti=Anima.Minimo;
          Anima.Minimo=Anima.Massimo;
          Anima.Massimo=Anima.Avanti;
        End
        Anima.Avanti=1;
      Else
        If (Anima.Avanti==1)
          Graph+=1;
        Else
          Graph-=1;
        End
      End
      Utente[Giocatore].Tempo_Ani[1]=0;
    End
    Id_Bonus=0;
    Id_Bonus=collision(Type Caduta_Bonus);
    While (Id_Bonus)
      Signal(Id_Bonus,S_Kill);
      Switch (Id_Bonus.Graph)
        //Allungameto
        Case 10..19  :If (Cont_Bonus[Giocatore].Multi_Ball==False)
                        Switch (Cont_Bonus[Giocatore].Allungamento)
                          Case 0: Anima.Massimo=24;
                                  Anima.Minimo=21;
                                  Anima.Avanti=1;
                                  Cont_Paletta[Giocatore].Lung=30 ;
                                  Cont_Bonus[Giocatore].Allungamento=1;
                                  Tempo[0]=0;
                          End
                          Case 1: Anima.Massimo=34;
                                  Anima.Minimo=31;
                                  Anima.Avanti=1;
                                  Cont_Paletta[Giocatore].Lung=40;
                                  Cont_Bonus[Giocatore].Allungamento=2;
                                  Tempo[0]=0;
                          End
                          Case 2: Utente[Giocatore].Punteggio+=400; End
                        End
                        If (x-Cont_Paletta[Giocatore].Lung<=20+Pos_Sch[Giocatore])
                          x=Cont_Paletta[Giocatore].Lung+10+Pos_Sch[Giocatore];
                        End
                        If (x+Cont_Paletta[Giocatore].Lung>=280+Pos_Sch[Giocatore])
                          x=290-Cont_Paletta[Giocatore].Lung+Pos_Sch[Giocatore];
                        End
                      Else
                        Utente[Giocatore].Punteggio+=400;
                      End
        End
        //Vita
        Case 20..29  :If (Tipo_Gioco==5)
                        Utente[Giocatore].Vite+=10;
                      Else
                        Utente[Giocatore].Vite+=1;
                      End;
        End
        //Sparo
        Case 30..39  :If (Cont_Bonus[Giocatore].Sparo_sn==False)
                        Cont_Bonus[Giocatore].Sparo_sn=True;
                        Tempo[1]=0;
                        Tempo[2]=0;
                        Id_Sparo[0]=Sparo_Gra (0,Giocatore);
                        Id_Sparo[1]=Sparo_Gra (1,Giocatore);
                      Else
                        Utente[Giocatore].Punteggio+=400;
                      End
        End
        //Super
        Case 40..49  :If (Cont_Bonus[Giocatore].Super_sn==False)
                        Cont_Bonus[Giocatore].Super_sn=True;
                        Tempo[3]=0;
                      Else
                        Utente[Giocatore].Punteggio+=400;
                      End
        End
        //Attaccata
        Case 50..59  :If (Cont_Bonus[Giocatore].Attaccata==False)
                        Cont_Bonus[Giocatore].Attaccata=True;
                        Tempo[4]=0;
                      Else
                        Utente[Giocatore].Punteggio+=400;
                      End
        End
        // Contrario
        Case 60..69  :If (Cont_Bonus[Giocatore].Contrario==False)
                        Cont_Bonus[Giocatore].Contrario=True;
                        Tasti[Giocatore].Destra=Tasti[Giocatore].Destra+Tasti[Giocatore].Sinistra;
                        Tasti[Giocatore].Sinistra=Tasti[Giocatore].Destra-Tasti[Giocatore].Sinistra;
                        Tasti[Giocatore].Destra=Tasti[Giocatore].Destra-Tasti[Giocatore].Sinistra;
                        Tempo[5]=0;
                      Else
                        Utente[Giocatore].Punteggio+=400;
                      End
        End
      End
      Id_Bonus=collision(Type Caduta_Bonus);
    End
    //Allungamento
    If (Tempo[0]>=50 And Cont_Bonus[Giocatore].Allungamento>0)
      Switch (Cont_Bonus[Giocatore].Allungamento)
        Case 1: Anima.Avanti=0;
                Anima.Massimo=11;
                Anima.Minimo=14;
                Cont_Paletta[Giocatore].Lung=20;
                Cont_Bonus[Giocatore].Allungamento=0;
                Tempo[0]=0;
        End
        Case 2: Anima.Avanti=0;
                Anima.Massimo=21;
                Anima.Minimo=24;
                Cont_Paletta[Giocatore].Lung=30;
                Cont_Bonus[Giocatore].Allungamento=1;
                Tempo[0]=0;
        End
      End
    End
    //Sparo
    Switch (Computer)
      Case 0: If (Bottone(Giocatore) And Tempo[2]>=3 And Cont_Bonus[Giocatore].Sparo_sn==True) Sparo(x-12,y-7,Giocatore); Sparo(x+12,y-7,Giocatore); Tempo[2]=0; End End
      Case 1: If (Tempo[2]>=3 And Cont_Bonus[Giocatore].Sparo_sn==True) Sparo(x-12,y-7,Giocatore); Sparo(x+12,y-7,Giocatore); Tempo[2]=0; End End
    End
    If (Tempo[1]>=100 And Cont_Bonus[Giocatore].Sparo_sn==True)
      Cont_Bonus[Giocatore].Sparo_sn=False;
      Signal(Id_Sparo[0],S_Kill);
      Signal(Id_Sparo[1],S_Kill);
    End
    //Super
    If (Tempo[3]>=80 And Cont_Bonus[Giocatore].Super_sn==True) Cont_Bonus[Giocatore].Super_sn=False; End
    //Attaccata
    If (Tempo[4]>=100 And Cont_Bonus[Giocatore].Attaccata==True) Cont_Bonus[Giocatore].Attaccata=False; End
    If (Cont_Bonus[Giocatore].Attaccata==True)
      For (I=0;I<=2;I++)
        Cont_Palla[Giocatore].Ferma[I]=1;
      End
    End
    //Multi_Ball
    If (Cont_Bonus[Giocatore].Multi_Ball==True And Graph<35+Giocatore*100)
      Anima.Massimo=44;
      Anima.Minimo=41;
      Anima.Velocita=1;
      Anima.Avanti=1;
      Cont_Paletta[Giocatore].Lung=50;
      Cont_Bonus[Giocatore].Allungamento=4;
      If (x-Cont_Paletta[Giocatore].Lung<=20+Pos_Sch[Giocatore])
        x=Cont_Paletta[Giocatore].Lung+10+Pos_Sch[Giocatore];
      Else
        x-=10;
      End
      If (x+Cont_Paletta[Giocatore].Lung>=280+Pos_Sch[Giocatore])
        x=290-Cont_Paletta[Giocatore].Lung+Pos_Sch[Giocatore];
      Else
        x+=10;
      End
    End
    If (Cont_Bonus[Giocatore].Multi_Ball==False And Graph>=41+Giocatore*100)
      Anima.Massimo=11;
      Anima.Minimo=14;
      Anima.Velocita=1;
      Anima.Avanti=0;
      Cont_Paletta[Giocatore].Lung=20;
      Cont_Bonus[Giocatore].Allungamento=0;
    End
    // Contrario
    If (Tempo[5]>=80 And Cont_Bonus[Giocatore].Contrario==True)
      Cont_Bonus[Giocatore].Contrario=False;
      Tasti[Giocatore].Destra=Tasti[Giocatore].Destra+Tasti[Giocatore].Sinistra;
      Tasti[Giocatore].Sinistra=Tasti[Giocatore].Destra-Tasti[Giocatore].Sinistra;
      Tasti[Giocatore].Destra=Tasti[Giocatore].Destra-Tasti[Giocatore].Sinistra;
    End
    Frame;
  Until (Cont_Palla[Giocatore].Quante==0)
  Switch (Tipo_Gioco)
    Case 1:    Can_Bonus(0);  End;
    Case 3..5: Can_Bonus(Giocatore+1); End;
  End;
  Signal(Id_Sparo[0],S_Kill);
  Signal(Id_Sparo[1],S_Kill);
  Signal (Type Sparo,S_kill);
  Repeat
    If (Utente[Giocatore].Tempo_Ani[1]>=2)
      Utente[Giocatore].Tempo_Ani[1]=0;
      Graph-=1;
    End
    Frame;
  Until (Graph==1+Giocatore*100)
  Graph=45+Giocatore*100;
  Repeat
    If (Utente[Giocatore].Tempo_Ani[1]>=4)
      Utente[Giocatore].Tempo_Ani[1]=0;
      Graph+=1;
    End
    Frame;
  Until (Graph==51+Giocatore*100)
  Graph=800;
  If (Tipo_Gioco==5)    // Per gioco a due con vita
    Utente[Giocatore].Vite-=10;
  Else
    Utente[Giocatore].Vite-=1;
  End;
  Utente[Giocatore].Lancio_Iniziale=0;
  If (Utente[Giocatore].Vite<=0)
    Switch (Tipo_Gioco)
      Case 1: Sch_Continua(Giocatore);
              While (Get_Id(Type Sch_Continua))
                Frame;
              End
      End
      Case 2: Sch_Continua_Doppio (Giocatore);
              While (Get_Id(Type Sch_Continua_Doppio))
                Frame;
              End
      End
      Default: Palla(x,y-10,0,Giocatore);
      End
    End
  Else
    Palla(x,y-10,0,Giocatore);
  End
  Id_Paletta[Giocatore]=Paletta(x,y,Giocatore,Computer);
End
// Procedura decidi angolo
Process Decidi_Angolo (Byte Giocatore,Byte Computer)
Private
  Angolo;
  Righa;
  Byte Colore;
  Uscita=False;
Begin
  z=-140;
  Utente[Giocatore].Tempo_Ani[5]=0;
  File=File_Paletta[Giocatore];
  Switch (Giocatore)
    Case 0: Switch (Cont_Paletta[Giocatore].Tipo)
              Case 0: Colore=22 ; End
              Case 1: Colore=40 ; End
              Case 2: Colore=150; End
            End
    End
    Case 1: Switch (Cont_Paletta[Giocatore].Tipo)
              Case 0: Colore=245; End
              Case 1: Colore=72 ; End
              Case 2: Colore=198; End
            End
    End
  End
  Graph=61+(100*Giocatore);
  y=Id_Paletta[Giocatore].y;
  x=Id_Paletta[Giocatore].x;
  Angolo=0;
  Righa=Draw (1,Colore,10,0,Id.x,Id.y,Cos(Angolo)*5,-Sin(Angolo)*5);
  Repeat
    If (Graph==67+(100*Giocatore))
      Graph=61+(100*Giocatore);
    Else
      Graph++;
    End
    Angolo+=1000;
    Move_Draw(Righa,Colore,15,Id.x,Id.y,Cos(Angolo)*15/10,-Sin(Angolo)*15/10);
    If (Angolo==170000) Angolo=0; End
    x=Id_Paletta[Giocatore].x;
    Frame;
    If (Utente[Giocatore].Tempo_Ani[5]>20)
      Switch (Computer)
        Case 0: Uscita=(Bottone(Giocatore) Or Cont_Palla[Giocatore].Ferma[0]==0); End
        Case 1: Uscita=(Rand(0,50)==10);                                          End
        Case 2: If (Tutorial_SN==18 And Timer[9]>200) Uscita=True; End End
      End
    End
  Until (Uscita);
  Delete_Draw(Righa);
  If (Angolo<20000)
    Angolo=20000;
  End;
  If (Angolo>80000 And Angolo<=90000)
    Angolo=80000;
  End;
  If (Angolo<100000 And Angolo>90000)
    Angolo=100000;
  End;
  Cont_Palla[Giocatore].Angolo[0]=Angolo;
  Cont_Palla[Giocatore].Ferma[0]=0;
  Utente[Giocatore].Lancio_Iniziale=2;
End
// Procedura dei Bonus
Process Caduta_Bonus (x,y,Num)
Begin
  File=File_Bonus;
  Graph=Num;
  z=-40;
  Repeat
    y+=4;
    Graph++;
    If (Graph>Num+8) Graph=Num; End
    Frame(400);
  Until (y>=500);
End
// Procedura Sparo Grafica
Process Sparo_Gra (Byte Dove,Byte Giocatore)
Begin
  File=File_Paletta[Giocatore];
  z=-10;
  Graph=51+(100*Giocatore);
  y=Id_Paletta[Giocatore].y;
  Repeat
    If (Utente[Giocatore].Tempo_Ani[2+Dove]>=3)
      Graph+=1;
      Utente[Giocatore].Tempo_Ani[2+Dove]=0;
    End
    If (Dove==0)
      x=Id_Paletta[Giocatore].x-12;
    Else
      x=Id_Paletta[Giocatore].x+12;
    End
    Frame;
  Until (Graph==55+(100*Giocatore));
  Loop
    If (Utente[Giocatore].Tempo_Ani[2+Dove]>=4)
      If (Graph==60+(100*Giocatore))
        Graph=56+(100*Giocatore);
      Else
        Graph+=1;
      End
      Utente[Giocatore].Tempo_Ani[2+Dove]=0;
    End
    If (Dove==0)
      x=Id_Paletta[Giocatore].x-12;
    Else
      x=Id_Paletta[Giocatore].x+12;
    End
    Frame;
  End
End
// Procedura Sparo
Process Sparo (x,y,Giocatore)
Private
  Id_Blocco;
Begin
  File=File_Paletta[Giocatore];
  z=-50;
  If (Giocatore==0)
    Graph=68;
  Else
    Graph=168;
  End
  Id_Blocco=0;
  Repeat
    Id_Blocco=Collision(Type Blocco);
    If (Id_Blocco)
      Signal (Id_Blocco,S_Wakeup);
    End
    y-=4;
    Frame;
  Until (y<=10 or Id_Blocco<>0);
End
// Procedure tipi di blocco
Process Blocco (x,y,Byte Colpi,Byte Colore,Byte Tipo,Byte Giocatore);
Private
  Byte Somma,Bonus;
  Id_Frase;
  Uscita_Ciclo;
  Int Punti_Ass;
Begin
  File=File_Blocchi;
  Switch (Tipo)
    Case 1: Somma=1  ; End
    Case 2: Somma=34 ; End
    Case 3: Somma=67 ; End
    Case 4: Somma=100; End
    Case 5: Somma=133; End
  End
  Switch (Colore)
    Case 1: Somma+=0 ; End
    Case 2: Somma+=8 ; End
    Case 3: Somma+=16; End
    Case 4: Somma+=24; End
    Case 5: Somma+=32; End
  End
  Switch (Colpi)
    Case 1: Somma+=2 ; End
    Case 2: Somma+=1 ; End
    Case 3: Somma+=0 ; End
    Case 4: Somma-=1 ; End
  End
  z=Tipo;
  Graph=Somma;
  Ins_Can_Matrice(0,Giocatore,Tipo,x,y,Id);
  Repeat
    If (Colpi>0 And Tipo<9)
      Graph++ ;
    End;
    Signal (Id,S_Freeze);
    Frame;
    If (Colpi>0)
      Uscita_Ciclo= Graph==(Somma+Colpi);
      Switch (Tipo_Gioco)
        Case 2:  Uscita_Ciclo=Uscita_Ciclo Or (Cont_Bonus[0].Super_sn==1 Or Cont_Bonus[1].Super_sn==1); End
        Default: Uscita_Ciclo=Uscita_Ciclo Or (Cont_Bonus[Giocatore].Super_sn==1); End
      End
    Else
      Uscita_Ciclo= False;
    End;
  Until (Uscita_Ciclo);
  Utente[Giocatore].Numero_Blocchi--;
  z=-5;
  If (Tipo_Gioco==5)
    If (Giocatore==0)         // Per gioco a due con vita
      Utente[1].Vite-=2;
    Else
      Utente[0].Vite-=2;
    End
  End
  Switch (Tipo_Gioco)
    Case 1: Punti_Ass=Utente[Giocatore].Punti_Colpi*25;
            Id_Frase=Write_Int (Id_Font[0],x,y,0,Offset Punti_Ass);
            Utente[Giocatore].Punteggio+=Punti_Ass;
    End
    Case 2: Punti_Ass=(Utente[0].Punti_Colpi+Utente[1].Punti_Colpi)*25;
            Id_Frase=Write_Int (Id_Font[0],x,y,0,Offset Punti_Ass);
            If (Utente[0].Punteggio>Utente[1].Punteggio)
              Utente[0].Punteggio+=Punti_Ass;
            Else If (Utente[0].Punteggio<Utente[1].Punteggio)
                   Utente[1].Punteggio+=Punti_Ass;
                 Else
                   Utente[0].Punteggio+=Punti_Ass;
                   Utente[1].Punteggio+=Punti_Ass;
                 End
            End
    End
  End
  Repeat
    Graph++;
    Frame(250);
  Until (Graph==Somma+Colpi+4);
  Ins_Can_Matrice(1,Giocatore,Tipo,x,y,Id);
  //Caduta_Bonus(x,y,40);
  Bonus=Rand(0,30);
  Switch (Bonus)
     Case 7 : Caduta_Bonus (x,y,10); End // Allungamnto
     Case 8 : If (Tipo_Gioco<>3 And Tipo_Gioco<>4) Caduta_Bonus (x,y,20); End End // Vita
     Case 9 : Caduta_Bonus (x,y,30); End // Sparo
     Case 10: Caduta_Bonus (x,y,40); End // Super Palla
     Case 11: Caduta_Bonus (x,y,50); End // Attaccata
     Case 12: Caduta_Bonus (x,y,60); End // Contrario
  End
  If (Tipo_Gioco<=2) Delete_Text (Id_Frase); End
End
// Procedure tipi di blocco speciali
Process Blocco_Speciale (x,y,Byte Colpi,Byte Colore,Byte Tipo,Byte Giocatore);
Private
  Byte Bonus;
  Id_Frase;
  Int Punti_Ass;
  Byte Colpi_Subiti;
Begin
  File=File_Blocchi;
  Graph=200;
  z=Tipo;
  Colpi_Subiti=0;
  Ins_Can_Matrice(0,Giocatore,Tipo,x,y,Id);
  Repeat
    Signal (Id,S_Freeze);
    Frame;
    Colpi_Subiti++;
    Bonus=Rand(0,30);
    Switch (Bonus)
       Case 7 : Caduta_Bonus (x,y,10); End // Allungamnto
       Case 8 : If (Tipo_Gioco<>3 And Tipo_Gioco<>4) Caduta_Bonus (x,y,20); End End // Vita
       Case 9 : Caduta_Bonus (x,y,30); End // Sparo
       Case 10: Caduta_Bonus (x,y,40); End // Super Palla
       Case 11: Caduta_Bonus (x,y,50); End // Attaccata
       Case 12: Caduta_Bonus (x,y,60); End // Contrario
    End
  Until (Colpi_Subiti==Colpi);
  Utente[Giocatore].Numero_Blocchi--;
  z=-5;
  If (Tipo_Gioco==5)
    If (Giocatore==0)         // Per gioco a due con vita
      Utente[1].Vite-=40;
    Else
      Utente[0].Vite-=40;
    End
  End
  Switch (Tipo_Gioco)
    Case 1: Punti_Ass=200*Colpi;
            Id_Frase=Write_Int (0,x,y,0,Offset Punti_Ass);
            Utente[Giocatore].Punteggio+=Punti_Ass;
    End
    Case 2: Punti_Ass=200*Colpi;
            Id_Frase=Write_Int (0,x,y,0,Offset Punti_Ass);
            If (Utente[0].Punteggio>Utente[1].Punteggio)
              Utente[0].Punteggio+=Punti_Ass;
            Else If (Utente[0].Punteggio<Utente[1].Punteggio)
                   Utente[1].Punteggio+=Punti_Ass;
                 Else
                   Utente[0].Punteggio+=Punti_Ass;
                   Utente[1].Punteggio+=Punti_Ass;
                 End
            End
    End
  End
/*
  Repeat
    Graph++;
    Frame(250);
  Until (Graph==Somma+Colpi+4);
*/
  Ins_Can_Matrice(1,Giocatore,Tipo,x,y,Id);
/*
  Bonus=Rand(0,30);
  Switch (Bonus)
     Case 7 : Caduta_Bonus (x,y,10); End // Allungamnto
     Case 8 : If (Tipo_Gioco<>3 And Tipo_Gioco<>4) Caduta_Bonus (x,y,20); End End // Vita
     Case 9 : Caduta_Bonus (x,y,30); End // Sparo
     Case 10: Caduta_Bonus (x,y,40); End // Super Palla
     Case 11: Caduta_Bonus (x,y,50); End // Attaccata
     Case 12: Caduta_Bonus (x,y,60); End // Contrario
  End
*/
  If (Tipo_Gioco<=2) Delete_Text (Id_Frase); End
End
// Procedura tunnel
Process Tunnel (x,y,Byte Giocatore);
Begin
  File=File_Oggetti;
  z=-20;
  Graph=10;
  Switch(Giocatore)
    Case 0: z=50; End
    Case 1: z=51; End
  End
  Loop
    If (Collision(Type Palla))
      Repeat
        Graph++;
        Frame;
      Until (Graph==16);
      Repeat
        Graph--;
        Frame;
      Until (Graph==10);
    End
    Frame;
  End
End
// Procedura multi_ball
Process Multi_Ball (x,y,Giocatore)
Begin
  File=File_Oggetti;
  z=-20;
  z=100;
  Repeat
    Switch (z)
      Case 100: Graph=30; End
      Case 101: Graph=31; End
      Case 102: Graph=32; End
      Case 103: Graph=33; End
      Case 104: Graph=34; End
      Default: Graph++; End
    End
    While (Cont_Bonus[Giocatore].Multi_Ball==True And z<=104)
      If (Graph<42) Graph++; End
      Frame;
    End
    Frame(300);
  Until (Graph==40);
End
// Punti
Process Punti (x,y);
Private
  Byte Tempo;
Begin
  File=File_Oggetti;
  z=-20;
  Graph=50;
  Loop
    If (Collision(Type Palla))
      Tempo=0;
      Repeat
        If (Graph==50)
          Graph=51;
        Else
          Graph=50;
        End
        Frame(500);
        Tempo++;
      Until (Tempo==10);
    End
    Frame;
  End
End
// Tabella gioco singolo o doppio su stesso schermo
Process Tabella (x,y,Byte Giocatore);
Private
  Id_Frasi[4];
  Byte Minuti;
  Byte Secondi;
Begin
  Priority=100;
  File=File_Contorni;
  Graph=20;
  Switch (Giocatore)
    Case 0:Id_Frasi[0]=Write_Int (Id_Font[0],150,170,5,Offset Utente[Giocatore].Livello);
           Id_Frasi[1]=Write_Int (Id_Font[0],110,230,5,Offset Utente[Giocatore].Punteggio);
           Id_Frasi[2]=Write_Int (Id_Font[0],140,260,5,Offset Utente[Giocatore].Vite);
           Id_Frasi[3]=Write_Int (Id_Font[0],70 ,320,5,Offset Minuti);
           Id_Frasi[4]=Write_Int (Id_Font[0],120,320,5,Offset Secondi);
    End
    Case 1:Id_Frasi[0]=Write_Int (Id_Font[0],630,170,5,Offset Utente[Giocatore].Livello);
           Id_Frasi[1]=Write_Int (Id_Font[0],590,230,5,Offset Utente[Giocatore].Punteggio);
           Id_Frasi[2]=Write_Int (Id_Font[0],620,260,5,Offset Utente[Giocatore].Vite);
           Id_Frasi[3]=Write_Int (Id_Font[0],550,320,5,Offset Minuti);
           Id_Frasi[4]=Write_Int (Id_Font[0],600,320,5,Offset Secondi);
    End
  End
  Switch (Tipo_Gioco)
    Case 1:Loop
             If (Utente[Giocatore].Inizio_Sn==0)
               Secondi=Timer[Giocatore+2] / 100;
               If (Secondi==60)  Secondi=0;  Minuti+=1; Timer[Giocatore+2]=0; End
             Else
               Timer[Giocatore+2]=0;
               Minuti=0;
               Secondi=0;
             End
             If (Utente[Giocatore].Numero_Blocchi==0 And Utente[Giocatore].Inizio_Sn==0
                 And Cont_Palla[Giocatore].Quante>0 And Tutorial_SN==0)
               Fine_Livello(Giocatore,Minuti,Secondi);
               Timer[Giocatore+2]=0;
               Secondi=0;
               Minuti=0;
               Frame;
             End
             If (Key(_Esc) And Tutorial_SN==0 And Not(Get_Id(Type Fine_Livello) Or Get_Id(Type Sch_Continua) Or Get_Id(Type Sch_Uscita)))
               Sch_Uscita();
               Frame;
             End
             Frame;
           End
    End
    Case 2:Loop
             If (Utente[0].Inizio_Sn==0 Or Utente[1].Inizio_Sn==0)
               Secondi=Timer[Giocatore+2] / 100;
               If (Secondi==60)  Secondi=0;  Minuti+=1; Timer[Giocatore+2]=0; End
             Else
               Timer[Giocatore+2]=0;
               Minuti=0;
               Secondi=0;
             End
             If (Giocatore==0 And Utente[0].Numero_Blocchi==0 And Utente[0].Inizio_Sn==0 And Tutorial_SN==0)
               Fine_Livello(Giocatore,Minuti,Secondi);
               Frame;
             End
             If (Key(_Esc) And Tutorial_SN==0 And Not(Get_Id(Type Fine_Livello) Or Get_Id(Type Sch_Uscita)))
               Sch_Uscita();
               Frame;
             End
             Frame;
           End
    End
  End
End
// Tabella per gioco doppio a tempo
Process Tabella_Tempo (x,y)
Private
  Id_Frasi[1];
  Byte Minuti;
  Int Secondi;
Begin
  Priority=100;
  File=File_Contorni;
  z=-100;
  Graph=26;
  Minuti=5;
  Secondi=60;
  Define_Region (1,310,20,30,Minuti*24);
  Define_Region (2,330,20,30,Secondi*2);
  Colonna_Vita_Tempo (320,80,1,28);
  Colonna_Vita_Tempo (340,80,2,27);
  Id_Frasi[0]=Write_int (Id_Font[0],320,400,8,Offset Utente[0].Livello);
  Id_Frasi[1]=Write_int (Id_Font[0],320,440,8,Offset Utente[1].Livello);
  Timer[2]=0;
  Loop
    Secondi=59-Timer[2] / 100;
    If (Secondi<0)
      Secondi=59;
      Minuti--;
      Timer[2]=0;
    End
    Define_Region (1,310,20,30,Minuti*24);
    Define_Region (2,330,20,30,Secondi*2);
    If (Key(_Esc) And Tutorial_SN==0 And Not Get_Id(Type Sch_Uscita)) Sch_Uscita(); Frame;  End;
    If (Minuti==0 And Secondi==0) Fine_A_Tempo(); Frame; End;
    Frame;
  End
End
// Tabella per gioco doppio a livello
Process Tabella_Livello (x,y)
Private
  Id_Frasi[0];
  Byte Liv_Da_Ragg;
Begin
  Priority=100;
  File=File_Contorni;
  z=-100;
  Graph=30;
  Liv_Da_Ragg=16;
  Id_Frasi[0]=Write_int (Id_Font[0],320,60,4,Offset Liv_Da_Ragg);
  Define_Region (1,290,140,30,Utente[0].Livello*10);
  Define_Region (2,330,140,30,Utente[1].Livello*10);
  Colonna_Vita_Tempo (300,220,1,31);
  Colonna_Vita_Tempo (340,220,2,32);
  Loop
    Define_Region (1,290,140,30,Utente[0].Livello*10);
    Define_Region (2,330,140,30,Utente[1].Livello*10);
    If (Key(_Esc) And Not Get_Id(Type Sch_Uscita)) Sch_Uscita(); Frame;  End;
    If (Utente[0].Livello==Liv_Da_Ragg Or Utente[1].Livello==Liv_Da_Ragg) Fine_A_Livello(); Frame; End;
    Frame;
  End
End
// Tabella per gioco doppio a vita
Process Tabella_Vita (x,y)
Begin
  Priority=100;
  File=File_Contorni;
  z=-100;
  Graph=36;
  Utente[0].Vite=300;
  Utente[1].Vite=300;
  Define_Region (1,290,70,30,Utente[0].Vite);
  Define_Region (2,330,110,30,Utente[1].Vite);
  Colonna_Vita_Tempo (300,220,1,37);
  Colonna_Vita_Tempo (340,260,2,37);
  Loop
    If (Utente[0].Vite>300) Utente[0].Vite=300; End;
    If (Utente[1].Vite>300) Utente[1].Vite=300; End;
    Define_Region (1,290,70,30,Utente[0].Vite);
    Define_Region (2,330,110,30,Utente[1].Vite);
    If (Key(_Esc) And Tutorial_SN==0 And Not Get_Id(Type Sch_Uscita)) Sch_Uscita(); Frame;  End;
    If (Utente[0].Vite<=0 Or Utente[1].Vite<=0) Fine_A_Vita(); Frame; End;
    Frame;
  End
End
// Colonna della vita
Process Colonna_Vita_Tempo (x,y,Region,Graph);
Begin
  File=File_Contorni;
  z=-110;
  Loop
    Frame;
  End
End
// Inizio
Process Inizio_Livello (Byte Giocatore)
Begin
  File=File_Contorni;
  Graph=12;
  z=-100;
  y=240;
  x=Pos_Sch[Giocatore]+150;
  If (Tipo_Gioco==2)
    Utente[0].Blocco_Comandi=1;
    Utente[1].Blocco_Comandi=1;
  Else
    Utente[Giocatore].Blocco_Comandi=1;
  End
  Size=0;
  Repeat
    Size+=2;
    Frame;
  Until (Size==110);
  Size=0;
  Graph=14;
  Repeat
    Size+=2;
    Frame;
  Until (Size==110);
  If (Tipo_Gioco==2)
    Utente[0].Blocco_Comandi=0;
    Utente[1].Blocco_Comandi=0;
  Else
    Utente[Giocatore].Blocco_Comandi=0;
  End
End
// Fine per tipo 1 e 2
Process Fine_Livello (Byte Giocatore,Int Minuti,Int Secondi)
Private
  Conteggi;
  Cont,Pot;
  Id_Frasi[2];
Begin
  Signal (Type Palla,S_Kill);
  Signal (Type Caduta_Bonus,S_Kill);
  Signal (Type Gioco,S_Freeze);
  Signal (Type Tabella,S_Freeze);
  File=File_Contorni;
  If (Tipo_Gioco==2)
    Utente[0].Blocco_Comandi=1;
    Utente[1].Blocco_Comandi=1;
  Else
    Utente[Giocatore].Blocco_Comandi=1;
  End
  Graph=200;
  z=-100;
  x=320;
  y=240;
  Conteggi=100*(Utente[Giocatore].Livello);
  Id_Frasi[0]=Write_int (Id_Font[0],300,310,4,Offset Minuti);
  Id_Frasi[1]=Write_int (Id_Font[0],340,310,4,Offset Secondi);
  Id_Frasi[2]=Write_int (Id_Font[0],320,230,4,Offset Conteggi);
  For (Cont=Minuti;Cont>0;Cont--)
    Conteggi-=10;
    Minuti--;
    Frame (1000);
  End
  For (Cont=Secondi;Cont>0;Cont--)
    Conteggi-=2;
    Secondi--;
    Frame (1000);
  End
  Pot=10000000;
  Repeat
    For (Cont=0;Cont<Conteggi/Pot;Cont++)
      If (Tipo_Gioco==2)
        Utente[0].Punteggio+=Pot;
        Utente[1].Punteggio+=Pot;
      Else
        Utente[Giocatore].Punteggio+=Pot;
      End
      Frame (1000);
    End
    Conteggi-=Pot*Cont;
    Pot=Pot/10;
  Until (Pot==0);
  Signal (Type Gioco,S_Wakeup);
  Signal (Type Tabella,S_Wakeup);
  Delete_Text(Id_Frasi[0]);
  Delete_Text(Id_Frasi[1]);
  Delete_Text(Id_Frasi[2]);
  Esci_Gioco=1;
End
// Fine gioco a due giocatori a tempo
Process Fine_A_Tempo ();
Private
  Id_Frasi[1];
  Int Scarto_Livello;
Begin
  File=File_Contorni;
  x=320;
  y=240;
  z=-100;
  Delete_Draw(All_Drawing);
  Signal (Type Paletta,S_Kill_Tree);
  Signal (Type Palla,S_Kill_Tree);
  Signal (Type Inizio_Livello,S_Kill_Tree);
  Frame;
  Blocca_Sblocca(0);
  Scarto_Livello=ABS(Utente[0].Livello-Utente[1].Livello);
  If (Utente[0].Livello>Utente[1].Livello)
    Graph=50;
    Id_Frasi[0]=Write_Int(Id_Font[0],250,310,4,Offset Scarto_Livello);
    Id_Frasi[1]=Write_Int(Id_Font[0],590,310,4,Offset Scarto_Livello);
  Else If (Utente[0].Livello<Utente[1].Livello)
         Graph=52;
         Id_Frasi[0]=Write_Int(Id_Font[0],250,310,4,Offset Scarto_Livello);
         Id_Frasi[1]=Write_Int(Id_Font[0],590,310,4,Offset Scarto_Livello);
       Else
         Graph=54;
       End;
  End;
  Repeat
    Frame;
  Until (Ascii!=0);
  Esci_Gioco=3;
  Delete_Text(Id_Frasi[0]);
  Delete_Text(Id_Frasi[1]);
  Blocca_Sblocca(1);
End;
// Fine gioco a due giocatori a livello
Process Fine_A_Livello ();
Private
  Id_Frasi[1];
Begin
  File=File_Contorni;
  x=320;
  y=240;
  z=-100;
  Delete_Draw(All_Drawing);
  Signal (Type Paletta,S_Kill_Tree);
  Signal (Type Palla,S_Kill_Tree);
  Signal (Type Inizio_Livello,S_Kill_Tree);
  Frame;
  Blocca_Sblocca(0);
  If (Utente[0].Livello>Utente[1].Livello)
    Graph=56;
  Else
    Graph=58;
  End;
  Id_Frasi[0]=Write_Int(Id_Font[0],250,310,4,Offset Utente[0].Livello);
  Id_Frasi[1]=Write_Int(Id_Font[0],590,310,4,Offset Utente[1].Livello);
  Repeat
    Frame;
  Until (Ascii!=0);
  Esci_Gioco=3;
  Delete_Text(Id_Frasi[0]);
  Delete_Text(Id_Frasi[1]);
  Blocca_Sblocca(1);
End;
// Fine gioco a due giocatori a vita
Process Fine_A_Vita ();
Private
  Id_Frasi[1];
Begin
  File=File_Contorni;
  x=320;
  y=240;
  z=-100;
  Delete_Draw(All_Drawing);
  Signal (Type Paletta,S_Kill_Tree);
  Signal (Type Palla,S_Kill_Tree);
  Signal (Type Inizio_Livello,S_Kill_Tree);
  Frame;
  Blocca_Sblocca(0);
  If (Utente[0].Vite>Utente[1].Vite)
    Graph=62;
  Else
    Graph=64;
  End;
  Repeat
    Frame;
  Until (Ascii!=0);
  Esci_Gioco=3;
  Delete_Text(Id_Frasi[0]);
  Delete_Text(Id_Frasi[1]);
  Blocca_Sblocca(1);
End;
// Schermata Uscita
Process Sch_Uscita();
Private
  Byte Uscita;
  Id_Bottoni[1];
Begin
  File=File_Contorni;
  Blocca_Sblocca(0);
  Uscita=0;
  z=-300;
  x=320;
  y=-200;
  Mouse.Graph=1;
  Graph=100;
  Repeat
    y+=20;
    Frame;
  Until (y==240);
  Id_Bottoni[0]=Bottoni_Uscita(220,295,0);
  Id_Bottoni[1]=Bottoni_Uscita(420,295,2);
  Repeat
    If (Mouse.Left)
      If (Id_Bottoni[0].z==-320) Uscita=1; End
      If (Id_Bottoni[1].z==-320) Uscita=2; End
    End
    Frame;
  Until (Uscita<>0);
  Signal (Type Bottoni_Uscita,S_Kill);
  Repeat
    y+=20;
    Frame;
  Until (y==600);
  If (Uscita==1) Esci_Gioco=3; End;
  Blocca_Sblocca(1);
  Mouse.Graph=0;
End;
// Bottoni si/no della schermata uscita
Process Bottoni_Uscita (x,y,Byte Tipo);
Begin
  File=File_Contorni;
  Loop
    If (Mouse.X>=X-75 And Mouse.X<=X+75 And Mouse.Y>=Y-50 And Mouse.Y<=Y+50)
      Graph=Tipo+101+1;
      z=-320;
    Else
      Graph=Tipo+101;
      z=-310;
    End
    Frame;
  End
End
// Schermata Continua per giocatore singolo
Process Sch_Continua(Byte Giocatore);
Private
  Byte Uscita,Tempo;
  Id_Frasi[1]:
Begin
  File=File_Contorni;
  Blocca_Sblocca(0);
  Uscita=0;
  z=-100;
  x=320;
  y=240;
  Graph=202;
  Mouse.Graph=1;
  Tempo=9;
  Id_Frasi[0]=Write_Int (Id_Font[0],320,230,4,Offset Tempo);
  Id_Frasi[1]=Write_Int (Id_Font[0],320,310,4,Offset Utente[Giocatore].Continua);
  Timer[4]=0;
  Repeat
    If (Mouse.Left Or Bottone(Giocatore))
      Uscita=1;
    End;
    If (Timer[4]>=100) Timer[4]=0; Tempo--; End;
    Frame;
  Until (Uscita<>0 Or Tempo==0 Or Utente[Giocatore].Continua==0);
  If (Tempo==0 Or Utente[Giocatore].Continua==0) Uscita=2; End;
  If (Uscita==2)
    Esci_Gioco=2;
  Else
    Utente[Giocatore].Continua--;
    Utente[Giocatore].Vite=3;
    Utente[Giocatore].Livello--;
    Utente[Giocatore].Numero_Blocchi=0;
  End;
  Blocca_Sblocca(1);
  Mouse.Graph=0;
  Id_Paletta[Giocatore].x=Pos_Sch[Giocatore]+150;
  Delete_Text (Id_Frasi[0]);
  Delete_Text (Id_Frasi[1]);
End;
// Schermata Continua per giocatore doppio
Process Sch_Continua_Doppio(Byte Giocatore);
Private
  Byte Uscita,Tempo;
  Id_Frasi[2]:
Begin
  File=File_Contorni;
  Priority=50;
  Uscita=0;
  z=0;
  Tempo=9;
  If (Giocatore==0)
    Id_Frasi[0]=Write     (Id_Font[0],90,380,4,"Vuoi continuare?");
    Id_Frasi[1]=Write_Int (Id_Font[0],90,400,4,Offset Tempo);
    Id_Frasi[2]=Write_Int (Id_Font[0],90,420,4,Offset Utente[Giocatore].Continua);
  Else
    Id_Frasi[0]=Write     (Id_Font[0],550,380,4,"Vuoi continuare?");
    Id_Frasi[1]=Write_Int (Id_Font[0],550,400,4,Offset Tempo);
    Id_Frasi[2]=Write_Int (Id_Font[0],550,420,4,Offset Utente[Giocatore].Continua);
  End;
  Timer[Giocatore+4]=0;
  Repeat
    If (Mouse.Left Or Bottone(Giocatore))
      Uscita=1;
    End;
    If (Timer[Giocatore+4]>=100) Timer[Giocatore+4]=0; Tempo--; End;
    Frame;
  Until (Uscita<>0 Or Tempo==0 Or Utente[Giocatore].Continua==0);
  Delete_Text (Id_Frasi[0]);
  Delete_Text (Id_Frasi[1]);
  Delete_Text (Id_Frasi[2]);
  If (Tempo==0 Or Utente[Giocatore].Continua==0)
    If (Giocatore==0)
      Id_Frasi[0]=Write     (Id_Font[0],90,380,4,"GAME OVER");
      Id_Frasi[1]=Write_Int (Id_Font[0],90,400,4,Offset Tempo);
      Id_Frasi[2]=Write     (Id_Font[0],90,420,4,"Alla fine del gioco");
    Else
      Id_Frasi[0]=Write     (Id_Font[0],550,380,4,"GAME OVER");
      Id_Frasi[1]=Write_Int (Id_Font[0],550,400,4,Offset Tempo);
      Id_Frasi[2]=Write     (Id_Font[0],550,420,4,"Alla fine del gioco");
    End
    Tempo=9;
    Timer[Giocatore+4]=0;
    Repeat
      If (Timer[Giocatore+4]>=100) Timer[Giocatore+4]=0; Tempo--; End;
      Frame;
    Until (Tempo==0);
    Esci_Gioco=2;
    Frame;
  End;
  If (Giocatore==0)
    Id_Frasi[0]=Write (0,90 ,380,4,"WAITING");
  Else
    Id_Frasi[0]=Write (0,550,380,4,"WAITING");
  End
  Controllo++;
  Repeat
    Frame;
  Until (Get_Id(Type Fine_Livello) Or Controllo==2);
  Frame; // Per far si che anche l'altro coclo termini
  If (Controllo==2)
    Utente[Giocatore].Livello--;
    If (Giocatore==0) Utente[0].Numero_Blocchi=0; End;
  End
  Utente[Giocatore].Continua--;
  Utente[Giocatore].Vite=3;
  If (Giocatore==0)
    Id_Paletta[0].x=75+Pos_Sch[0];
  Else
    Id_Paletta[1].x=225+Pos_Sch[1];
  End
  Delete_Text (Id_Frasi[0]);
End;
// Funzione Blocca_Sblocca processi mentre si Š in gioco
Function Blocca_Sblocca (Tipo);
Private
  Byte Frase;
Begin
  If (Tipo==0)
    Frase=3;  // = S_Freeze
  Else
    Frase=1;  // = S_Wakeup
  End;
  Signal (Type Gioco  ,Frase);
  Signal (Type Paletta,Frase);
  Signal (Type Tabella,Frase);
  Signal (Type Tabella_Tempo ,Frase);
  Signal (Type Tabella_Livello,Frase);
  Signal (Type Tabella_Vita,Frase);
  Signal (Type Inizio_Livello,Frase);
  Signal (Type Caduta_Bonus  ,Frase);
  Signal (Type Palla,Frase);
End;
// Controllo Gioco
Process Gioco (Byte Auto1, Byte Auto2);
Private
  Byte Sezione;
  Id_Carica[1];
  Musica;
Begin
  Clear_Screen();
  Delete_Text(All_Text);
  Load_Pal("Gioco.pal");
  Fade_on();
  Esci_Gioco=0;
  Setup.Master=15;
  Setup.Sound_Fx=15;
  Musica=Utente[0].Livello-(Utente[0].Livello/4)*4;
  If (Musica==3)
    Musica=Load_wav(Nome_Suoni[12],1);
  Else
    Musica=Load_wav(Nome_Suoni[11],1);
  End
  Sound(Musica,250,250);
  File_Paletta[0]=Load_Fpg (Nome_Palette[Cont_Paletta[0].Tipo]);
  File_Paletta[1]=Load_Fpg (Nome_Palette[Cont_Paletta[1].Tipo]);
  If (Tipo_Gioco<=2)
    Sezione=(Utente[0].Livello/4);
  Else
    Sezione=Rand(0,2);
  End
  File_Contorni=Load_fpg (Nome_Sezioni[Sezione]);
  Id_Font[0]=Load_fnt (Nome_Font[Sezione]);
  Switch (Tipo_Gioco)
    Case 1: File_Palla   =Load_Fpg ("Palla.fpg");
            File_Blocchi =Load_Fpg ("Blocchi.fpg");
            File_Bonus   =Load_Fpg ("Bonus.fpg");
            File_Oggetti =Load_Fpg ("Oggetti.fpg");
            Utente[0].Inizio_sn=1;
            Utente[1].Numero_Blocchi=100;
            Pos_Sch[0]=170;
            Id_Paletta[0]=Paletta (150+Pos_Sch[0],460,0,Auto1);
            BarraN (150+Pos_Sch[0], 9);
            BarraE (290+Pos_Sch[0],240);
            BarraO (9  +Pos_Sch[0],240);
            Tabella(80,240,0);
    End
    Case 2: File_Palla   =Load_Fpg ("Palla.fpg");
            File_Blocchi =Load_Fpg ("Blocchi.fpg");
            File_Bonus   =Load_Fpg ("Bonus.fpg");
            File_Oggetti =Load_Fpg ("Oggetti.fpg");
            Controllo=0;
            Utente[0].Inizio_sn=1;
            Utente[1].Inizio_sn=1;
            Pos_Sch[0]=170;
            Pos_Sch[1]=170;
            Id_Paletta[0]=Paletta (75+Pos_Sch[0],460,0,Auto1);
            Id_Paletta[1]=Paletta (225+Pos_Sch[1],460,1,Auto2);
            BarraN (150+Pos_Sch[0], 9);
            BarraE (290+Pos_Sch[0],240);
            BarraO (9  +Pos_Sch[0],240);
            Tabella(80,240,0);
            Tabella(560,240,1);
    End
    Case 3: File_Palla   =Load_Fpg ("Palla.fpg");
            File_Blocchi =Load_Fpg ("Blocchi.fpg");
            File_Bonus   =Load_Fpg ("Bonus.fpg");
            File_Oggetti =Load_Fpg ("Oggetti.fpg");
            Pos_Sch[0]=0;
            Pos_Sch[1]=340;
            Id_Paletta[0]=Paletta (150+Pos_Sch[0],460,0,Auto1);
            Id_Paletta[1]=Paletta (150+Pos_Sch[1],460,1,Auto2);
            BarraN (150+Pos_Sch[0], 9);
            BarraE (290+Pos_Sch[0],240);
            BarraO (9  +Pos_Sch[0],240);
            BarraN (150+Pos_Sch[1], 9);
            BarraE (290+Pos_Sch[1],240);
            BarraO (9  +Pos_Sch[1],240);
            Tabella_Tempo (320,240);
    End
    Case 4: File_Palla   =Load_Fpg ("Palla.fpg");
            File_Blocchi =Load_Fpg ("Blocchi.fpg");
            File_Bonus   =Load_Fpg ("Bonus.fpg");
            File_Oggetti =Load_Fpg ("Oggetti.fpg");
            Pos_Sch[0]=0;
            Pos_Sch[1]=340;
            Id_Paletta[0]=Paletta (150+Pos_Sch[0],460,0,Auto1);
            Id_Paletta[1]=Paletta (150+Pos_Sch[1],460,1,Auto2);
            BarraN (150+Pos_Sch[0], 9);
            BarraE (290+Pos_Sch[0],240);
            BarraO (9  +Pos_Sch[0],240);
            BarraN (150+Pos_Sch[1], 9);
            BarraE (290+Pos_Sch[1],240);
            BarraO (9  +Pos_Sch[1],240);
            Tabella_Livello (320,240);
    End
    Case 5: File_Palla   =Load_Fpg ("Palla.fpg");
            File_Blocchi =Load_Fpg ("Blocchi.fpg");
            File_Bonus   =Load_Fpg ("Bonus.fpg");
            File_Oggetti =Load_Fpg ("Oggetti.fpg");
            Pos_Sch[0]=0;
            Pos_Sch[1]=340;
            Id_Paletta[0]=Paletta (150+Pos_Sch[0],460,0,Auto1);
            Id_Paletta[1]=Paletta (150+Pos_Sch[1],460,1,Auto2);
            BarraN (150+Pos_Sch[0], 9);
            BarraE (290+Pos_Sch[0],240);
            BarraO (9  +Pos_Sch[0],240);
            BarraN (150+Pos_Sch[1], 9);
            BarraE (290+Pos_Sch[1],240);
            BarraO (9  +Pos_Sch[1],240);
            Tabella_Vita (320,240);
    End
    Case 6: File_Palla   =Load_Fpg ("Palla.fpg");
            File_Blocchi =Load_Fpg ("Blocchi.fpg");
            File_Bonus   =Load_Fpg ("Bonus.fpg");
            File_Oggetti =Load_Fpg ("Oggetti.fpg");
            Pos_Sch[0]=0;
            Pos_Sch[1]=340;
            Id_Paletta[0]=Paletta (150+Pos_Sch[0],460,0,Auto1);
            Id_Paletta[1]=Paletta_Multi (150+Pos_Sch[1],460);
            BarraN (150+Pos_Sch[0], 9);
            BarraE (290+Pos_Sch[0],240);
            BarraO (9  +Pos_Sch[0],240);
            BarraN (150+Pos_Sch[1], 9);
            BarraE (290+Pos_Sch[1],240);
            BarraO (9  +Pos_Sch[1],240);
            Tabella_Vita (320,240);
    End
  End
//  File_Contorni=Load_fpg (Nome_Sezioni[Sezione]);
//  Id_Font[0]=Load_fnt (Nome_Font[Sezione]);
//  Write_int (0,100,400,0,Offset fps);              //tmp
//  Write_int (0,100,450,0,Offset memi);             //tmp
//  Write_int (0,500,100,0,Offset Utente[0].Lancio_Iniziale);   //tmp
//  Write_int (0,500,140,0,Offset Utente[0].Numero_Blocchi);    //tmp
//  Write_int (0,500,200,0,Offset Cont_Palla[0].Ferma[0]);      //tmp
//  Write_int (0,100,100,0,Offset Utente[0].Inizio_Sn);      //tmp
//  Write_int (0,100,150,0,Offset Utente[0].Blocco_Comandi); //tmp
//  Write_int (0,100,420,0,Offset Cont_Bonus[0].Contrario);    //tmp
//  Write_int (0,100,430,0,Offset Cont_Bonus[0].Multi_Ball);   //tmp
//  Write_int (0,100,440,0,Offset Cont_Bonus[0].Sparo_sn);     //tmp
//  Write_int (0,100,450,0,Offset Cont_Bonus[0].Super_sn);     //tmp
//  Write_int (0,100,460,0,Offset Cont_Bonus[0].Attaccata);    //tmp
//  Write_int (0,100,470,0,Offset Cont_Bonus[0].Allungamento); //tmp
  Id_Carica[0]=Carica_Sfondo(0,Sezione);
  Id_Carica[1]=Carica_Sfondo(1,Sezione);
  Timer[8]=0;
  Repeat
      If (Utente[0].Numero_Blocchi==0)
        Switch (Tipo_Gioco)
          Case 1 : Can_Ogg(0); End
          Case 2 : Can_Ogg(0); End
          Default: Can_Ogg(1); End
        End
        If (Tipo_Gioco==2)
          Controllo=0;
          Signal (Type Palla,S_Kill);
          Cont_Palla[1].Ferma=1;
          Utente[1].Inizio_Sn=1;
          Cont_Bonus[1].Multi_Ball=False;  // PerchŠ si crea prima la palla
          Palla (Id_Paletta[1].x,400,0,1);
        End
        If (Tipo_Gioco==5)    // Per gioco a due con vita
          Utente[0].Vite+=4;
        End;
        Cont_Palla[0].Ferma=1;
        Utente[0].Inizio_Sn=1;
        Cont_Bonus[0].Multi_Ball=False;  // PerchŠ si crea prima la palla
        Palla (Id_Paletta[0].x,400,0,0);
        Carica_Livello (0,Utente[0].Sezione,Id_Carica[0]);
        Inizio_Livello (0);
      End
      If (Utente[1].Numero_Blocchi==0)
        Can_Ogg (2);
        If (Tipo_Gioco==5) // Per gioco a due con vita
          Utente[1].Vite+=4;
        End;
        Cont_Palla[1].Ferma=1;
        Utente[1].Inizio_Sn=1;
        Cont_Bonus[1].Multi_Ball=False;  // PerchŠ si crea prima la palla
        Palla (Id_Paletta[1].x,400,0,1);
        Carica_Livello (1,"A",Id_Carica[1]);
        Inizio_Livello (1);
      End
    If (Timer[8]>=2)
      For (X=0;X<=5;X++)
        For (Y=0;Y<=1;Y++)
          Utente[Y].Tempo_Ani[X]+=1;
        End
      End
      Timer[8]=0;
    End
    Frame;
    memi=Memory_Free();    //tmp
  Until (Esci_Gioco>0)
  Unload_Wav(Musica);
  Signal (Type Carica_Sfondo,S_Kill);
  Signal (Type BarraN,S_Kill_Tree);
  Signal (Type BarraE,S_Kill_Tree);
  Signal (Type BarraO,S_Kill_Tree);
  Signal (Type Tabella,S_Kill_Tree);
  Signal (Type Tabella_Tempo,S_Kill_Tree);
  Signal (Type Tabella_Livello,S_Kill_Tree);
  Signal (Type Tabella_Vita,S_Kill_Tree);
  Signal (Type Palla,S_Kill_Tree);
  Signal (Type Paletta,S_Kill_Tree);
  Signal (Type Blocco,S_Kill_Tree);
  Signal (Type Blocco_Speciale,S_Kill_Tree);
  Signal (Type Tunnel,S_Kill_Tree);
  Signal (Type Multi_Ball,S_Kill_Tree);
  Signal (Type Punti,S_Kill_Tree);
  Signal (Type Caduta_Bonus,S_Kill_Tree);
  Signal (Type Inizio_Livello,S_Kill);
  Signal (Type Fine_Livello,S_Kill);
  Unload_fpg(File_Contorni);
  Unload_fpg(File_Oggetti);
  Unload_fpg(File_Paletta[0]);
  Unload_fpg(File_Paletta[1]);
  Unload_fpg(File_Palla);
  Unload_fpg(File_Blocchi);
  Unload_fpg(File_Bonus);
  Unload_fnt(Id_font[0]);
  Clear_Screen();
  Delete_Text(All_Text);
  Delete_Draw(All_Drawing);
  If (prova_liv==0)     // Temporaneo pre prova livelli
    Switch (Esci_Gioco)
      Case 1: Mappa_Mondo();                                          End
      Case 2: Visualizza_record(Tipo_Gioco); Frame; Menu_Iniziale();  End
      Case 3: Menu_Iniziale();                                        End
    End;
  Else
    Menu_Iniziale();
  End;
  Frame;
End
// Procedura di Carica Sfondi
Process Carica_Sfondo(Giocatore,Sezione);
Private
  String Nome_Sfondo;
         Sfondo;
Begin
  z=0;
  Loop
    Repeat
      Frame;
    Until (z==100)
    z=0;
    Clear_Screen();
    Switch (Tipo_Gioco)
      Case 1..2: If (Utente[Giocatore].Livello<12)
                   Nome_Sfondo="S";
                   StrCat(Nome_Sfondo,Itoa(Utente[Giocatore].Livello));
                   StrCat(Nome_Sfondo,Utente[Giocatore].Sezione);
                   StrCat(Nome_Sfondo,".map");
                 Else
                   Nome_Sfondo="S1A.map";
                 End
      End
      Default: Nome_Sfondo="S";
               StrCat(Nome_Sfondo,Itoa(Sezione*4+Rand(1,4)));
               StrCat(Nome_Sfondo,Utente[Giocatore].Sezione);
               StrCat(Nome_Sfondo,".map");
      End
    End
    Sfondo=Load_Map(Nome_Sfondo);
    Put_Screen (0,Sfondo);
    Unload_map(Sfondo);
  End
End
// Carica Livello
Function Carica_Livello(Byte Giocatore,String Sez,Id_Carica);
Private
  Struct Salvataggio;
     Byte Tipo;
     Int  PosX,PosY;
     Byte Colore;
     Byte Colpi;
  End
  File_Salvato;
  Contatore;
  String Nome_File;
Begin
  Switch (Tipo_Gioco)
    Case 2:Utente[0].Numero_Blocchi=0;
           Utente[0].Numero_Tunnel=0;
           Utente[0].Livello++;
           Cancella_Matrice(0);
           Utente[1].Numero_Blocchi=100;
           Utente[1].Numero_Tunnel=0;
           Utente[1].Livello++;
           Cancella_Matrice(1);
    End
    Default:Utente[Giocatore].Numero_Blocchi=0;
            Utente[Giocatore].Numero_Tunnel=0;
            Utente[Giocatore].livello++;
            Cancella_Matrice(Giocatore);
    End
  End
  Switch (Tipo_Gioco)
    Case 1: Nome_File="Livelli/Singolo/Lev";   End;
    Case 2: Nome_File="Livelli/Doppio/Lev";    End;
    Case 3: Nome_File="Livelli/VSTempo/Lev";   End;
    Case 4: Nome_File="Livelli/VSLiv/Lev";     End;
    Case 5: Nome_File="Livelli/VSVita/Lev";    End;
    Case 6: Nome_File="Livelli/Multi/Lev";     End;
  End
  StrCat (Nome_File,Itoa(Utente[Giocatore].Livello));
  StrCat (Nome_File,Sez);
  StrCat (Nome_File,".con");
  File_Salvato=Fopen(Nome_File,"r");
  For (Contatore=0;Contatore<FileLength(File_Salvato);Contatore+=SizeOf(Salvataggio))
    Fread (Offset Salvataggio,SizeOf(Salvataggio),File_Salvato);
    Switch (Salvataggio.Tipo)
      Case 1..5:
         Blocco (Salvataggio.PosX+Pos_Sch[Giocatore],Salvataggio.PosY,Salvataggio.Colpi,Salvataggio.Colore,Salvataggio.Tipo,Giocatore);
         If (Salvataggio.Colore<>5)
           Utente[Giocatore].Numero_Blocchi+=1;
         End
      End
      Case 6   : Tunnel     (Salvataggio.PosX+Pos_Sch[Giocatore],Salvataggio.PosY,Giocatore);
                 Switch (Tipo_Gioco)
                   Case 2: Utente[0].Numero_Tunnel++;
                           Utente[1].Numero_Tunnel++;
                   End
                   Default: Utente[Giocatore].Numero_Tunnel++; End
                 End
      End
      Case 7   : Multi_Ball (Salvataggio.PosX+Pos_Sch[Giocatore],Salvataggio.PosY,Giocatore); End
      Case 8   : Punti      (Salvataggio.PosX+Pos_Sch[Giocatore],Salvataggio.PosY); End
      Case 9   : Blocco_Speciale (Salvataggio.PosX+Pos_Sch[Giocatore],Salvataggio.PosY,Salvataggio.Colpi,Salvataggio.Colore,Salvataggio.Tipo,Giocatore);
                 Utente[Giocatore].Numero_Blocchi+=1;
      End
    End
  End
  FClose(File_Salvato);
  Id_Carica.z=100;
  Frame;
End
// Cancella Blocchi
Function Can_Ogg (Byte Tipo);
Private
  Id_Vari;
Begin
  Id_Vari=Get_id(Type Blocco);
  While (Id_Vari)
    Switch (Tipo)
      Case 0: Signal(Id_Vari,S_Kill); End
      Case 1: If (Id_Vari.x<320) Signal(Id_Vari,S_Kill); End End
      Case 2: If (Id_Vari.x>320) Signal(Id_Vari,S_Kill); End End
    End
    Id_Vari=Get_id(Type Blocco);
  End
  Id_Vari=Get_id(Type Blocco_Speciale);
  While (Id_Vari)
    Switch (Tipo)
      Case 0: Signal(Id_Vari,S_Kill); End
      Case 1: If (Id_Vari.x<320) Signal(Id_Vari,S_Kill); End End
      Case 2: If (Id_Vari.x>320) Signal(Id_Vari,S_Kill); End End
    End
    Id_Vari=Get_id(Type Blocco_Speciale);
  End
  Id_Vari=Get_id(Type Tunnel);
  While (Id_Vari)
    Switch (Tipo)
      Case 0: Signal(Id_Vari,S_Kill); End
      Case 1: If (Id_Vari.x<320) Signal(Id_Vari,S_Kill); End End
      Case 2: If (Id_Vari.x>320) Signal(Id_Vari,S_Kill); End End
    End
    Id_Vari=Get_id(Type Tunnel);
  End
  Id_Vari=Get_id(Type Multi_Ball);
  While (Id_Vari)
    Switch (Tipo)
      Case 0: Signal(Id_Vari,S_Kill); End
      Case 1: If (Id_Vari.x<320) Signal(Id_Vari,S_Kill); End End
      Case 2: If (Id_Vari.x>320) Signal(Id_Vari,S_Kill); End End
    End
    Id_Vari=Get_id(Type Multi_Ball);
  End
  Id_Vari=Get_id(Type Punti);
  While (Id_Vari)
    Switch (Tipo)
      Case 0: Signal(Id_Vari,S_Kill); End
      Case 1: If (Id_Vari.x<320) Signal(Id_Vari,S_Kill); End End
      Case 2: If (Id_Vari.x>320) Signal(Id_Vari,S_Kill); End End
    End
    Id_Vari=Get_id(Type Punti);
  End
  Id_Vari=Get_id(Type Palla);
  While (Id_Vari)
    Switch (Tipo)
      Case 0: Signal(Id_Vari,S_Kill); End
      Case 1: If (Id_Vari.x<320) Signal(Id_Vari,S_Kill); End End
      Case 2: If (Id_Vari.x>320) Signal(Id_Vari,S_Kill); End End
    End
    Id_Vari=Get_id(Type Palla);
  End
  Id_Vari=Get_id(Type Sparo);
  While (Id_Vari)
    Switch (Tipo)
      Case 0: Signal(Id_Vari,S_Kill); End
      Case 1: If (Id_Vari.x<320) Signal(Id_Vari,S_Kill); End End
      Case 2: If (Id_Vari.x>320) Signal(Id_Vari,S_Kill); End End
    End
    Id_Vari=Get_id(Type Sparo);
  End
  Can_Bonus(Tipo);
End
// Cancella Bonus in caduta
Function Can_Bonus(Byte Tipo)
Private
  Id_Vari;
Begin
  Id_Vari=Get_id(Type Caduta_Bonus);
  While (Id_Vari)
    Switch (Tipo)
      Case 0: Signal(Id_Vari,S_Kill); End
      Case 1: If (Id_Vari.x<320) Signal(Id_Vari,S_Kill); End End
      Case 2: If (Id_Vari.x>320) Signal(Id_Vari,S_Kill); End End
    End
    Id_Vari=Get_id(Type Caduta_Bonus);
  End
End
// Temporaneo
Process SELLEV();
Private
  String Sez,Gio;
Begin
  Delete_Text(All_Text);
  File_Oggetti=Load_fpg("Fare.Fpg");
  x=1;
  y=1;
  z=1;
  Sez="A";
  Gio="Singolo";
  F_Livello_Dest(550,200,Id,1);
  F_Livello_Sini(450,200,Id,1);
  F_Livello_Dest(580,200,Id,2);
  F_Livello_Sini(420,200,Id,2);
  F_Livello_Dest(550,260,Id,3);
  F_Livello_Sini(450,260,Id,3);
  F_Livello_Dest(610,320,Id,4);
  F_Livello_Sini(390,320,Id,4);
  Write    (0,515,0  ,1,"Selezione Livello");
  Write    (0,515,180,1,"Livello corrente");
  Write_int(0,515,200,1,OffSet x);
  Write    (0,515,240,1,"Sezione");
  Write    (0,515,260,1,Sez);
  Write    (0,515,300,1,"Tipo gioco");
  Write    (0,515,320,1,Gio);
  Controllo=0;
  Mouse.Graph=3;
  Mouse.Speed=2;
  Fade_On();
  Repeat
    Switch (Y)
      Case 1: Sez="A"; End;
      Case 2: Sez="B"; End;
      Case 3: Sez="C"; End;
      Case 4: Sez="D"; End;
    End
    Switch (Z)
      Case 1: Gio="Singolo"; End;
      Case 2: Gio="Doppio"; End;
      Case 3: Gio="VS a tempo"; End;
      Case 4: Gio="VS a livello"; End;
      Case 5: Gio="Vs a vita"; End;
      Case 6: Gio="Multi Player"; End;
    End;
    Frame;
  Until (Key(_Enter));
  Signal (Id,S_Kill_Tree);
  Unload_fpg(File_Oggetti);
  Mouse.Graph=0;
  Utente[0].Livello=x-1;
  Switch (z)
    Case 1: Utente[0].Sezione="A"; End;
    Case 2: Utente[0].Sezione="B"; End;
    Case 3: Utente[0].Sezione="C"; End;
    Case 4: Utente[0].Sezione="D"; End;
  End
  Tipo_Gioco=z;
  Prova_liv=1;
  Gioco(0,0);
End;
/*    
// Sezione 3
//
// Tutorial 
*/

Process Tutorial ();
Private
  Byte Modalita;
  Byte Volte;
  Byte Esci;
  Id_Oggetti[3];
  Id_Linee[5];
  Int Tempo;
Begin
  Tutorial_SN=1;
  Mouse.Graph=0;
  File_Contorni=Load_fpg (Nome_Sezioni[0]);
  File_Paletta[0]=Load_Fpg (Nome_Palette[0]);
  Id_Font[0]=Load_Fnt (Nome_Font[0]);
  Id_Font[1]=Load_Fnt ("Tutorial.fnt");
  File_Palla   =Load_Fpg ("Palla.fpg");
  File_Blocchi =Load_Fpg ("Blocchi.fpg");
  File_Bonus   =Load_Fpg ("Bonus.fpg");
  File_Oggetti =Load_Fpg ("Oggetti.fpg");
  File_Tutorial=Load_Fpg ("Tutorial.fpg");
  Utente[0].Inizio_sn=1;
  Pos_Sch[0]=0;
  Id_Paletta[0]=Paletta (150+Pos_Sch[0],460,0,2);
                Palla(Id_Paletta[0],0,0,0);
  BarraN (150+Pos_Sch[0], 9);
  BarraE (290+Pos_Sch[0],240);
  BarraO (9  +Pos_Sch[0],240);
  Id_Oggetti[0]=T_Freccie (1,480,240);
  Id_Oggetti[1]=T_Freccie (2,480,240);
  Id_Oggetti[2]=T_Freccie (3,480,240);
  Id_Oggetti[3]=T_Freccie (4,480,400);
  Write (Id_Font[1],480,10,4,"TUTORIAL");
  T_Scritte(480,460,100);
  Start_Scroll(0,File_Tutorial,1,2,0,15);
  T_Sfondo();
  Inizio_Livello(0);
  Esci=False;
  Fade_on();
  Timer[9]=0;
  Tempo=0;
  Repeat
    Switch (Tutorial_SN)
      Case 1: Id_Linee[0]=T_Scrivi("Benvenuti",480,30);
              Id_Linee[1]=T_Scrivi("nel tutorial",480,45);
              Tutorial_SN++;
              Tempo=200;
      End
      Case 3: Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("Nel gioco non sono",480,30);
              Id_Linee[1]=T_Scrivi("presenti i pulsanti su e giu",480,45);
              Id_Oggetti[2].z=10;
              Tutorial_SN++;
              Tempo=300;
      End
      Case 5: Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Oggetti[2].z=12;
              Frame;
              Id_Linee[0]=T_Scrivi("Per muovere la paletta",480,30);
              Id_Linee[1]=T_Scrivi("a destra si preme",480,45);
              Id_Linee[2]=T_Scrivi("il seguente pulsante ",480,60);
              Id_Oggetti[0].z=10;
              Tutorial_SN++;
              Tempo=450;
      End
      Case 7: Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Linee[2].z=10;
              Id_Oggetti[0].z=12;
              Frame;
              Id_Linee[0]=T_Scrivi("Per muovere la paletta",480,30);
              Id_Linee[1]=T_Scrivi("a sinistra si preme",480,45);
              Id_Linee[2]=T_Scrivi("il seguente pulsante ",480,60);
              Id_Oggetti[1].z=10;
              Tutorial_SN++;
              Tempo=450;
      End
      Case 9: Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Linee[2].z=10;
              Id_Oggetti[1].z=12;
              Frame;
              Tutorial_SN++;
              Tempo=250;
      End
      Case 11:Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Oggetti[1].z=12;
              Frame;
              Id_Linee[0]=T_Scrivi("Per lancare la pallina:",480,30);
              Tutorial_SN++;
              Tempo=200;
      End
      Case 13:Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("Si preme il pulsante sparo per",480,30);
              Id_Linee[1]=T_Scrivi("far comarire la traiettoia",480,45);
              Id_Oggetti[3].z=10;
              Tutorial_SN++;
              Tempo=450;
      End
      Case 15:Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Oggetti[3].z=12;
              Frame;
              Id_Linee[0]=T_Scrivi("Si decide la traiettioa",480,30);
              Tutorial_SN++;
              Tempo=200;
      End
      Case 17:Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("Si preme sparo per",480,30);
              Id_Linee[1]=T_Scrivi("lanciare la pallina",480,45);
              Id_Oggetti[3].z=10;
              Tutorial_SN++;
              Tempo=650;
      End
      Case 19:Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Oggetti[3].z=12;
              Frame;
              Id_Linee[0]=T_Scrivi("Scopo del gioco Š",480,30);
              Id_Linee[1]=T_Scrivi("eliminare i vari mattoni",480,45);
              Id_Linee[2]=T_Scrivi("presenti nello chermo",480,60);
              Tutorial_SN++;
              Tempo=300;
      End
      Case 21:Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Linee[2].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("Ci sono mattoni indistruttibili...",480,30);
              Blocco (30,30,0,5,1,0);
              Blocco (270,30,0,5,1,0);
              Tutorial_SN++;
              Tempo=200;
      End
      Case 23:Id_Linee[0].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("...mattoni normali..",480,30);
              Blocco (70,30,1,2,1,0);
              Blocco (230,30,1,2,1,0);
              Tutorial_SN++;
              Tempo=200;
      End
      Case 25:Id_Linee[0].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("...di vari colori...",480,30);
              Blocco (70,70,1,3,1,0);
              Blocco (230,70,1,3,1,0);
              Blocco (30,70,1,4,1,0);
              Blocco (270,70,1,4,1,0);
              Tutorial_SN++;
              Tempo=200;
      End
      Case 27:Id_Linee[0].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("...e forme.",480,30);
              Blocco (18,110,1,2,5,0);
              Blocco (282,110,1,2,5,0);
              Blocco (18,150,1,3,5,0);
              Blocco (282,150,1,3,5,0);
              Tutorial_SN++;
              Tempo=200;
      End
      Case 29:Id_Linee[0].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("Poi ci sono vari oggetti",480,30);
              Id_Linee[1]=T_Scrivi("e tipi di bonus che",480,45);
              Id_Linee[2]=T_Scrivi("potrete scoprire",480,60);
              Tunnel (70,110,1);
              Tunnel (230,110,1);
              Multi_Ball (70,150,0);
              Multi_Ball (230,150,0);
              Tutorial_SN++;
              Tempo=300;
      End
      Case 31:Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Linee[2].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("Proviamo a giocare",480,30);
              Tutorial_SN++;
              Tempo=800;
      End
      Case 33:Id_Linee[0].z=10;
              Id_Linee[1].z=10;
              Id_Linee[2].z=10;
              Frame;
              Id_Linee[0]=T_Scrivi("Buona fortuna",480,30);
              Id_Linee[1]=T_Scrivi("              ",480,45);
              Id_Linee[2]=T_Scrivi("Fine tutorial",480,60);
              Tutorial_SN++;
              Tempo=400;
      End
      Default:  If (Timer[9]>=Tempo) Timer[9]=0; Tutorial_SN++; End
      End
    End
    Scroll.X0++;
    Scroll.Y0--;
    Scroll.X1--;
    Scroll.Y1++;
    If (Timer[8]>=2)
      For (X=0;X<=5;X++)
        For (Y=0;Y<=1;Y++)
          Utente[Y].Tempo_Ani[X]+=1;
        End
      End
      Timer[8]=0;
    End
    If (Ascii!=0) Esci=True; Frame; End
    Frame;
  Until (Tutorial_SN==35 Or Esci==True);
  Stop_Scroll(0);
  Delete_Text(All_Text);
  Delete_Draw(All_Drawing);
  Signal (Type T_Freccie,S_Kill_Tree);
  Signal (Type BarraN,S_Kill_Tree);
  Signal (Type BarraE,S_Kill_Tree);
  Signal (Type BarraO,S_Kill_Tree);
  Signal (Type Palla,S_Kill_Tree);
  Signal (Type Paletta,S_Kill_Tree);
  Signal (Type T_Sfondo,S_Kill_Tree);
  Signal (Type T_Scrivi,S_Kill_Tree);
  Signal (Type T_Scritte,S_Kill_Tree);
  Signal (Type Caduta_Bonus,S_Kill);
  Signal (Type Blocco,S_Kill);
  Signal (Type Tunnel,S_Kill);
  Signal (Type Multi_Ball,S_Kill);
  Unload_fpg(File_Contorni);
  Unload_fpg(File_Oggetti);
  Unload_fpg(File_Paletta);
  Unload_fpg(File_Palla);
  Unload_fpg(File_Blocchi);
  Unload_fpg(File_Bonus);
  Unload_fnt(Id_Font[0]);
  Unload_fnt(Id_Font[1]);
  Clear_Screen();
  Fade_Off();
  Frame;
  Volte=1;
  Utente[0].Sezione="A";
  Utente[1].Sezione="A";
  T_Scritte(330,10,100);
  While (Volte<5 And Esci==False)
    Modalita=Rand(1,5);
    Switch (Modalita)
      Case 1: Tipo_Gioco=1; End
      Case 2: Tipo_Gioco=2; End
      Case 3: Tipo_Gioco=3; End
      Case 4: Tipo_Gioco=4; End
      Case 5: Tipo_Gioco=5; End
    End
    Cont_Paletta[0].Tipo=Rand(0,2);
    Cont_Paletta[1].Tipo=Rand(0,2);
    If (Tipo_Gioco==4)
      Utente[0].Livello=0;
      Utente[1].Livello=0;
    Else
      Modalita=Rand(0,4);
      Utente[0].Livello=Modalita;
      Utente[1].Livello=Modalita;
    End
    Utente[0].Numero_Blocchi=0;
    Utente[1].Numero_Blocchi=0;
    Utente[0].Vite=3;
    Utente[1].Vite=3;
    Gioco(1,1);
    Fade_On();
    Timer[9]=0;
    Repeat
      Frame;
      If (Timer[9]>=1000) Esci_Gioco=4; Frame; End;
      If (Ascii!=0) Esci_Gioco=4; Esci=True; Frame; End
    Until (Esci_Gioco==4);
    Frame;
    Fade_Off();
    Esci_Gioco=0;
    Volte++;
  End
  Signal (Type T_Scritte,S_Kill);
  Esci_Gioco=0;
  Visualizza_Record(4);
  Fade_On();
  Timer[9]=0;
  While (Esci==False)
    Frame;
    If (Timer[9]>=1000) Esci=True; End;
    If (Ascii!=0) Esci=True; Frame; End
  End
  Esci_Gioco=4;
  Frame(500);
  Esci_Gioco=0;
  Tutorial_SN=0;
  Signal(Type T_Scritte,S_Kill);
  Unload_fpg(File_Tutorial);
  Fade_Off();
  Menu_Iniziale();
End;
// Procedura per lo sfondo
Process T_Sfondo ();
Begin
  File=File_Tutorial;
  z=220;
  x=0;
  y=0;
  Graph=3;
  Loop
    Frame;
  End
End
// Procedura che visualizza le scritte in tutorial
Process T_Scritte (x,y,Graph)
Private
  Byte Av_In;
Begin
  File=File_Tutorial;
  z=-280;
  Av_In=0;
  Loop
    If (Av_In==0)
      Graph++;
      Av_In=1;
    Else
      Graph--;
      Av_In=0;
    End
    Frame(1000);
  End
End
// Procedura controllo freccie direzionali
Process T_Freccie (Tipo,x,y)
Private
  Byte Ini;
Begin
  File=File_Tutorial;
  Switch (Tipo)
    Case 1: Ini=10;  End
    Case 2: Ini=20;  End
    Case 3: Ini=30;  End
    Case 4: Ini=40;  End
  End
  Graph=Ini;
  Loop
    Switch (z)
      Case 10:If (Graph>Ini+3)
                Graph=Ini;
              Else
                Graph++;
              End
      End
      Case 12:Graph=Ini;
      End
    End
    Frame(1000);
  End
End
// Prucedura che scrive scritte a video
Process T_Scrivi (String Frase,x,y)
Private
  String Frase_Video="";
  String Supporto;
  Byte Lung,I;
  Id_Frase;
Begin
  Id_Frase=Write (Id_Font[1],x,y,4,Frase_Video);
  Lung=StrLen(Frase);
  For (I=0;I<Lung;I++)
    StrCpy(Supporto,Frase);
    StrDel(Supporto,I,Lung-1-I);
    StrCat (Frase_Video,Supporto);
    Frame(250);
  End
  Repeat
    Frame;
  Until (z==10);
  Delete_Text(Id_Frase);
End
/* Sezione 4  
//
// Non attivata perchč non finita
// Parte Multi player
*/

Process Multi_Giocatore();
Private
  Giocatore;
Begin
  Net.Device=1;
  Net.Max_Players=2;
  Net.Mode=0;
  Giocatore=Net_Join_Game("Prova",Offset Multi_Player,SizeOf (Multi_Player));
  Repeat
    Multi_Player[Giocatore].Ready=1;
    Frame;
  Until (Multi_Player[0].Ready==1 And Multi_Player[1].Ready==1);
  Gioco(0,0);
  Fade_On();
  Loop
    If (Id_Paletta[0])
      Multi_Player[Giocatore].Vita=Utente[0].Vite;
      Multi_Player[Giocatore].Paletta.x=Id_Paletta[0].x;
      Multi_Player[Giocatore].Paletta.y=Id_Paletta[0].y;
      Multi_Player[Giocatore].Paletta.Graph=Id_Paletta[0].Graph;
      Switch (Giocatore)
        Case 0:Id_Paletta[1].x=Multi_Player[1].Paletta.x;
               Id_Paletta[1].y=Multi_Player[1].Paletta.y;
               Id_Paletta[1].Graph=Multi_Player[1].Paletta.Graph;
        End
        Case 1:Id_Paletta[1].x=Multi_Player[0].Paletta.x;
               Id_Paletta[1].y=Multi_Player[0].Paletta.y;
               Id_Paletta[1].Graph=Multi_Player[0].Paletta.Graph;
        End
      End
    End
    Frame;
  End
End
Process Paletta_Multi (x,y);
Begin
  File=File_Paletta;
  Loop
    Frame;
  End
End
Process Palla_Multi (x,y);
Begin
  File=File_Palla;
  Loop
    Frame;
  End
End
/*
// Sezione 5
// 
// Mappa Mondo per gioco singolo o doppio
*/
Process Mappa_Mondo ();
Private
  Pos_x,Pos_y;
  Pos_Pre_x,Pos_Pre_y;
  Byte Ava_Ind;
  Byte Numero_Regione;
  Linea[3];
  Rettangoli[10];
  Colore;
Begin
  Clear_Screen();
  Delete_Text(All_Text);
  File_Oggetti=Load_fpg ("Mondo.fpg");
  File=File_Oggetti;
  Load_Pal ("Mondo.pal");
  Start_Scroll (0,File,1,0,0,1);
  Fade_On();
  Numero_Regione=(Utente[0].Livello/4)+1;
  Get_Point(File,1,Numero_Regione-1,Offset Pos_Pre_x,Offset Pos_Pre_y);
  Get_Point(File,1,Numero_Regione  ,Offset Pos_x,Offset Pos_y);
  If (Utente[0].Livello-(Utente[0].Livello/4)*4==0)
    Scroll.x0=Pos_Pre_x;
    x=Rand (1,659);
    y=Rand (1,479);
    Graph=100;
    Colore=16;
    Linea[0]=Draw (1,Colore,15,0,x,y,x+1000,y+1000);
    Linea[1]=Draw (1,Colore,15,0,x,y,x+1000,y-1000);
    Linea[2]=Draw (1,Colore,15,0,x,y,x-1000,y+1000);
    Linea[3]=Draw (1,Colore,15,0,x,y,x-1000,y-1000);
    Rettangoli[0]=Draw (2,Colore,15,0,x-50,y-50,x+50,y+50);
    Rettangoli[1]=Draw (2,Colore,15,0,x-25,y-25,x+25,y+25);
    Timer[0]=0;
    If ((Pos_x) < 960-(Pos_x))
      Ava_Ind=True;
    Else
      Ava_Ind=False;
    End;
    Repeat
        If (Scroll.x0>960) Scroll.x0=0;   End;
        If (Scroll.x0<0)   Scroll.x0=960; End;
        If (Scroll.x0<>Pos_x)
          If (Ava_Ind)
            Scroll.x0++;
          Else
            Scroll.x0--;
          End;
        End;
        If (320>x)
          x++;
        Else If (320<x)
               x--;
             End
        End;
        If (Pos_y>y)
          y++;
        Else If (Pos_y<y)
               y--;
             End
        End;
        Colore++;
        If (Colore==32) Colore=16; End;
        Move_Draw (Linea[0],Colore,15,x,y,x+1000,y+1000);
        Move_Draw (Linea[1],Colore,15,x,y,x+1000,y-1000);
        Move_Draw (Linea[2],Colore,15,x,y,x-1000,y+1000);
        Move_Draw (Linea[3],Colore,15,x,y,x-1000,y-1000);
        Move_Draw (Rettangoli[0],Colore,15,x-50,y-50,x+50,y+50);
        Move_Draw (Rettangoli[1],Colore,15,x-25,y-25,x+25,y+25);
        If (Timer[0]>=50)
          Graph++;
          If (Graph==107) Graph=100; End
          Timer[0]=0;
        End;
        Frame;
    Until (x==320 And y==Pos_y And Graph==106 And Scroll.x0==Pos_x);
  Else
    Scroll.x0=Pos_x;
    x=320;
    y=Pos_y;
  End;
  Repeat
    For (Numero_Regione=2;Numero_Regione<=10;Numero_Regione++)
      Rettangoli[Numero_Regione]=Draw (2,Colore,15,0,x-Numero_Regione*20,y-Numero_Regione*20,x+Numero_Regione*20,y+Numero_Regione*20);
    End
    Frame(800);
  Until (Numero_Regione==11);
  Delete_Draw(All_Drawing);
  Graph=0;
  M_Seleziona_Livello (Id);
  Repeat
    Pos_x=Get_id(Type M_Seleziona_Livello);
    Frame;
  Until (Not Pos_x);
  Unload_Fpg(File_Oggetti);
  Stop_Scroll(0);
  Fade_Off();
  Gioco(0,0);
End;
// Grafica per selezionare il livello
Process M_Seleziona_Livello (Id_Mappa);
Private
  Id_Bolle[6];
  Byte Livello_Corrente;
  Byte Contatore;
Begin
  File=File_Oggetti;
  Livello_Corrente=Utente[0].Livello-(Utente[0].Livello/4)*4;
  Switch (Livello_Corrente)
    Case 0: Graph=130; End
    Case 1: Graph=131; End
    Case 2: Graph=132; End
    Case 3: Graph=133; End
  End
  Size=0;
  x=Id_Mappa.x;
  y=Id_Mappa.y;
  Repeat
    Size++;
    Frame(50);
  Until (Size==100);
  Id_Bolle[0]=M_Bolla(Id_Mappa.x   ,Id_Mappa.y+85,122);
  Id_Bolle[1]=M_Bolla(Id_Mappa.x-30,Id_Mappa.y+25,122);
  Id_Bolle[2]=M_Bolla(Id_Mappa.x+30,Id_Mappa.y+25,122);
  Id_Bolle[3]=M_Bolla(Id_Mappa.x-60,Id_Mappa.y-35,122);
  Id_Bolle[4]=M_Bolla(Id_Mappa.x   ,Id_Mappa.y-35,122);
  Id_Bolle[5]=M_Bolla(Id_Mappa.x+60,Id_Mappa.y-35,122);
  Id_Bolle[6]=M_Bolla(Id_Mappa.x   ,Id_Mappa.y-95,122);
  Switch (Livello_Corrente)
    Case 0: Id_Bolle[0].Graph=123;
            Id_Bolle[1].Graph=121;
            Id_Bolle[2].Graph=121;
            Id_Bolle[3].Graph=121;
            Id_Bolle[4].Graph=121;
            Id_Bolle[5].Graph=121;
            Id_Bolle[6].Graph=121;
    End;
    Case 1: Id_Bolle[0].Graph=124;
            Id_Bolle[1].Graph=123;
            Id_Bolle[2].Graph=122;
            Id_Bolle[3].Graph=121;
            Id_Bolle[4].Graph=121;
            Id_Bolle[5].Graph=121;
            Id_Bolle[6].Graph=121;
    End;
    Case 2: Id_Bolle[0].Graph=124;
            Id_Bolle[1].Graph=124;
            Id_Bolle[2].Graph=124;
            Id_Bolle[3].Graph=123;
            Id_Bolle[4].Graph=122;
            Id_Bolle[5].Graph=122;
            Id_Bolle[6].Graph=121;
    End;
    Case 3: Id_Bolle[0].Graph=124;
            Id_Bolle[1].Graph=124;
            Id_Bolle[2].Graph=124;
            Id_Bolle[3].Graph=124;
            Id_Bolle[4].Graph=124;
            Id_Bolle[5].Graph=124;
            Id_Bolle[6].Graph=123;
    End;
  End;
  Timer[0]=0;
  Repeat
    If (Key(_Right) And Timer[0]>=50)
      Switch (Livello_Corrente)
        Case 1:If (Id_Bolle[1].Graph==123)
                 Id_Bolle[1].Graph=122;
                 Id_Bolle[2].Graph=123;
               Else
                 Id_Bolle[1].Graph=123;
                 Id_Bolle[2].Graph=122;
               End
        End
        Case 2:If (Id_Bolle[3].Graph==123)
                 Id_Bolle[3].Graph=122;
                 Id_Bolle[4].Graph=123;
               Else If (Id_Bolle[4].Graph==123)
                      Id_Bolle[4].Graph=122;
                      Id_Bolle[5].Graph=123;
                    Else
                      Id_Bolle[5].Graph=122;
                      Id_Bolle[3].Graph=123;
                    End
               End
        End
      End
      Timer[0]=0;
    End
    If (Key(_Left) And Timer[0]>=50)
      Switch (Livello_Corrente)
        Case 1:If (Id_Bolle[1].Graph==123)
                 Id_Bolle[1].Graph=122;
                 Id_Bolle[2].Graph=123;
               Else
                 Id_Bolle[1].Graph=123;
                 Id_Bolle[2].Graph=122;
               End
        End
        Case 2:If (Id_Bolle[5].Graph==123)
                 Id_Bolle[5].Graph=122;
                 Id_Bolle[4].Graph=123;
               Else If (Id_Bolle[4].Graph==123)
                      Id_Bolle[4].Graph=122;
                      Id_Bolle[3].Graph=123;
                    Else
                      Id_Bolle[3].Graph=122;
                      Id_Bolle[5].Graph=123;
                    End
               End
        End
      End
      Timer[0]=0;
    End
    Frame;
  Until (key(_Enter));
  Contatore=0;
  While (Id_Bolle[Contatore].Graph<>123);
    Contatore++;
  End
  Switch (Contatore)
    Case 2: Utente[0].Sezione="B"; End
    Case 4: Utente[0].Sezione="B"; End
    Case 5: Utente[0].Sezione="C"; End
    Default: Utente[0].Sezione="A"; End
  End
  Signal (Type M_Bolla,S_Kill_Tree);
End;
// Grafica singolo livello
Process M_Bolla (x,y,Graph)
Begin
  File=File_Oggetti;
  Loop
    Frame;
  End;
End
/*
// Sezione 6
// 
// Funzioni per il controllo dei tasti
*/
Function Destra(Giocatore);
Private
  Byte SN=False;
Begin
  Switch (Tasti[Giocatore].Tipo_Sel)
    Case 1: If (Key(Tasti[Giocatore].Destra)) SN=True; End End
    Case 2: If (Joy.Right) SN=True; End End
  End
  Return (SN);
End
Function Sinistra(Giocatore);
Private
  Byte SN=False;
Begin
  Switch (Tasti[Giocatore].Tipo_Sel)
    Case 1: If (Key(Tasti[Giocatore].Sinistra)) SN=True; End End
    Case 2: If (Joy.Left) SN=True; End End
  End
  Return (SN);
End
Function Bottone(Giocatore);
Private
  Byte SN=False;
Begin
  Switch (Tasti[Giocatore].Tipo_Sel)
    Case 1: If (Key(Tasti[Giocatore].Bottone)) SN=True; End End
    Case 2: If (Joy.Button1) SN=True; End End
  End
  Return (SN);
End
/*
// Sezione 7
// 
// Tabella Racord
*/
Process Visualizza_Record (Byte Tipo);
Private
  Struct Salvataggio
     String Nome_Giocatore[30];
            Punteggio;
     Byte   Livello;
  End
  Struct Dati_Finali[41]
     String Nome_Giocatore[30];
     Int    Punteggio;
     Byte   Livello;
  End
  Struct Frasi[41];
    Nome1;
    Nome2;
    Nome3;
  End
  Byte Cont;
  FileRecord;
Begin
  If (Tipo<>0)
    Signal (Type Gioco,S_Freeze);
  End
  Fade_On();
  File_Record=Load_Fpg ("Record.fpg");
  Id_Font[0]=Load_Fnt ("Record1.fnt");
  Switch (Tipo)
    Case 1: FileRecord=Fopen("Hit\Record.hit","r");
            FSeek(FileRecord,FileLength(FileRecord)-SizeOf(Salvataggio),Seek_Set);
            FRead(Offset Salvataggio,SizeOf(Salvataggio),FileRecord);
            FClose(FileRecord);
            If (Utente[0].Punteggio>Salvataggio.Punteggio) Inserimento_Record(0); Frame; End
    End
    Case 2: FileRecord=Fopen("Hit\Record.hit","r");
            FSeek(FileRecord,FileLength(FileRecord)-SizeOf(Salvataggio),Seek_Set);
            FRead(Offset Salvataggio,SizeOf(Salvataggio),FileRecord);
            FClose(FileRecord);
            If (Utente[0].Punteggio>Salvataggio.Punteggio) Inserimento_Record(0); Frame; End
            If (Utente[1].Punteggio>Salvataggio.Punteggio) Inserimento_Record(1); Frame; End
    End
  End
  FileRecord=Fopen ("Hit\Record.hit","r");
  For (Cont=0;Cont<FileLength(FileRecord)/SizeOf(Salvataggio);Cont++)
    Fread (Offset Salvataggio,SizeOf(Salvataggio),FileRecord);
    Dati_Finali[Cont].Nome_Giocatore=Salvataggio.Nome_Giocatore;
    Dati_Finali[Cont].Livello=Salvataggio.Livello;
    Dati_Finali[Cont].Punteggio=Salvataggio.Punteggio;
  End
  FClose (FileRecord);
  Start_Scroll (0,File_Record,100,101,0,15);
  Frasi[41].Nome1=Write (Id_font[0],100,20,0,"Nome");
  Frasi[41].Nome2=Write (Id_font[0],300,20,0,"Livello");
  Frasi[41].Nome3=Write (Id_font[0],440,20,0,"Punteggio");
  For (Cont=0;Cont<20;Cont++)
    Frasi[Cont].Nome1=Write    (Id_font[0],100,Cont*20+50,0,Dati_Finali[Cont].Nome_Giocatore);
    Frasi[Cont].Nome2=Write_Int(Id_font[0],300,Cont*20+50,0,Offset Dati_Finali[Cont].Livello);
    Frasi[Cont].Nome3=Write_Int(Id_font[0],440,Cont*20+50,0,Offset Dati_Finali[Cont].Punteggio);
  End
  Write (Id_Font[0],320,460,4,"Premi un tasto per continuare");
  Repeat
    Scroll.X0--;
    Scroll.Y0--;
    Scroll.X1++;
    Scroll.Y1++;
    Frame(250);
  Until (Scan_Code!=0 Or Esci_Gioco==4);
  Delete_Text(All_Text);
  Stop_Scroll(0);
  Unload_fpg(File_Record);
  Unload_fnt(Id_Font[0]);
  Clear_Screen();
  If (Tipo==0)
    Menu_Iniziale();
  Else
    Signal (Type Gioco,S_Wakeup);
  End;
End
// Inserimento su file
Process Inserimento_Record(Byte Giocatore);
Private
  Struct Salvataggio
     String Nome_Giocatore[30];
     Int    Punteggio;
     Byte   Livello;
  End
  String Nome_Giocatore[30];
  Byte   Lung_Nome;
  Byte   Posx,Posy,PosTot;
  Int    Uscita;
  Byte   Grandi;
  FileRecord;
  FileTemp;
  String Caratteri=
    "abcdefghijklmnopqrstuvwxyz0123456789 !?.:-";
Begin
  Signal (Type Visualizza_Record,S_Freeze);
  File=File_Record;
  R_Sfondo();
  z=-20;
  Graph=10;
  x=20;
  y=200;
  Lung_Nome=0;
  Grandi=0;
  Posx=0;
  Posy=0;
  PosTot=0;
  Uscita=0;
  Timer=0;
  Write (Id_Font[0],40,100,0,Nome_Giocatore);
  Start_Scroll (0,File_Record,100,101,0,15);
  Repeat
    If (Key(_up   ) And Posy>0 And Timer>20) y-=40; Posy-=1; Timer=0; End
    If (Key(_down ) And Posy<2 And Timer>20) y+=40; Posy+=1; Timer=0; End
    If (key(_right) And Posx<14And Timer>20) x+=40; Posx+=1; Timer=0; End
    If (key(_left ) And Posx>0 And Timer>20) x-=40; Posx-=1; Timer=0; End
    If (key(_Enter) And Timer>20)
      If (Posy==0 And Posx>=0) PosTot=Posx; End
      If (Posy<>0 And Posx==0) PosTot=Posy*15; End
      If (Posy<>0 And Posx<>0) PosTot=Posx+Posy*15; End
      Switch (PosTot)
        Case 42 :If (Grandi==0)
                   Grandi=1;
                 Else
                   Grandi=0;
                 End
        End
        Case 43 :If (Lung_Nome>0)
                   StrDel (Nome_Giocatore,0,1);
                   Lung_Nome=StrLen(Nome_Giocatore);
                 End
        End
        Case 44 :If (Lung_Nome>1)
                   Uscita=1;
                 End
        End
        Default :
            If (Lung_Nome<=16)
              If (Grandi==1)
                StrCat (Nome_Giocatore,Upper(Caratteri[PosTot]));
              Else
                StrCat (Nome_Giocatore,Caratteri[PosTot]);
              End
              Lung_Nome=StrLen(Nome_Giocatore);
            End
        End
      End
      Timer=0;
    End
    Scroll.X0--;
    Scroll.Y0--;
    Scroll.X1++;
    Scroll.Y1++;
    Frame;
  Until (Uscita==1 Or Key(_Esc))
  Stop_Scroll(0);
  Signal(Type R_Sfondo,S_Kill);
  If (StrLen(Nome_Giocatore)<4)
    Nome_Giocatore="Default";
  End
  FileRecord=FOpen("Hit\Record.hit","r");
  FileTemp  =FOpen("Hit\Temp.hit","w");
  Repeat
    FRead (Offset Salvataggio,SizeOf(Salvataggio),FileRecord);
    FWrite(Offset Salvataggio,SizeOf(Salvataggio),FileTemp  );
  Until(Utente[Giocatore].Punteggio >= Salvataggio.Punteggio);
  Fseek (FileRecord,Ftell(FileRecord)-SizeOf(Salvataggio),seek_set);
  Fseek (FileTemp  ,Ftell(FileTemp  )-SizeOf(Salvataggio),seek_set);
  Salvataggio.Nome_Giocatore=Nome_Giocatore;
  Salvataggio.Punteggio=Utente[Giocatore].Punteggio;
  Salvataggio.Livello=Utente[Giocatore].Livello;
  FWrite(OffSet Salvataggio,SizeOf(Salvataggio),FileTemp);
  For (Uscita=FTell(FileRecord);Uscita<FileLength(FileRecord)-SizeOf(Salvataggio);Uscita+=SizeOf(Salvataggio))
    FRead (Offset Salvataggio,SizeOf(Salvataggio),FileRecord);
    FWrite(Offset Salvataggio,SizeOf(Salvataggio),FileTemp  );
  End
  FClose(FileTemp  );
  FClose(FileRecord);
  FileRecord=FOpen("Hit\Record.hit","w");
  FileTemp  =FOpen("Hit\Temp.hit","r");
  Repeat
    FRead (Offset Salvataggio,SizeOf(Salvataggio),FileTemp);
    FWrite(Offset Salvataggio,SizeOf(Salvataggio),FileRecord);
  Until (FTell(FileTemp)==FileLength(FileTemp));
  FClose(FileTemp  );
  FClose(FileRecord);
  Remove ("HIT\TEMP.hit");
  Delete_Text(All_Text);
  Clear_Screen();
  Signal (Type Visualizza_Record,S_Wakeup);
End
// Procedura dello sfondo con le lettere
Process R_Sfondo ();
Begin
  File=File_Record;
  z=-10;
  Graph=1;
  x=320;
  y=240;
  Loop
    Frame;
  End
End
/*
// Sezione 8
//
// Editor Livelli
*/
Process Editor();
Private
  String Sez[0],Gio[16];
Begin
  Clear_Screen();
  Delete_Text(All_Text);
  File_Oggetti=Load_fpg("Fare.Fpg");
  File_Fnt[0] =Load_fnt("Costr.fnt");
  File_Fnt[1] =Load_fnt("TestoNor.fnt");
  X=1;
  Y=1;
  Z=1;
  Sez="A";
  Gio="Singolo";
  Sfondo();
  Sfondo_Griglia ();
  Cancella();
  Salva   (Id);
  Carica  (Id);
  Chiudi  ();
  F_Livello_Dest(550,200,Id,1);
  F_Livello_Sini(450,200,Id,1);
  F_Livello_Dest(580,200,Id,2);
  F_Livello_Sini(420,200,Id,2);
  F_Livello_Dest(550,260,Id,3);
  F_Livello_Sini(450,260,Id,3);
  F_Livello_Dest(610,320,Id,4);
  F_Livello_Sini(390,320,Id,4);
  Write    (File_Fnt[1],515,0  ,1,"editor livelli");
  Write    (File_Fnt[1],515,180,1,"livello corrente");
  Write_int(File_Fnt[0],515,200,1,OffSet x);
  Write    (File_Fnt[1],515,240,1,"sezione");
  Write    (File_Fnt[0],515,260,1,Sez);
  Write    (File_Fnt[1],515,300,1,"tipo gioco");
  Write    (File_Fnt[0],515,320,1,Gio);
  TipoBlocco (350, 50,1);
  TipoBlocco (350,100,2);
  TipoBlocco (350,150,3);
  TipoBlocco (350,200,4);
  TipoBlocco (350,250,5);
  TipoBlocco (350,300,6);
  TipoBlocco (350,350,7);
  TipoBlocco (350,400,8);
  TipoBlocco (350,450,9);
  Controllo=0;
  Mouse.Graph=1;
  Mouse.Speed=2;
  Fade_On();
  Repeat
    Switch (Y)
      Case 1: Sez="A"; End;
      Case 2: Sez="B"; End;
      Case 3: Sez="C"; End;
      Case 4: Sez="D"; End;
    End
    Switch (Z)
      Case 1: Gio="Singolo";      End;
      Case 2: Gio="Doppio";       End;
      Case 3: Gio="VS a tempo";   End;
      Case 4: Gio="VS a livello"; End;
      Case 5: Gio="Vs a vita";    End;
      Case 6: Gio="Multi Player"; End;
    End;
    Frame;
  Until (Controllo==100);
  Signal (Type TipoBlocco,S_Kill_Tree);
  Signal (Type Cancella  ,S_Kill_Tree);
  Signal (Type Salva     ,S_Kill_Tree);
  Signal (Type Carica    ,S_Kill_Tree);
  Signal (Type Blocco_Ed  ,S_Kill);
  Signal (Type Oggetti_Ed ,S_Kill);
  Signal (Type Speciale_Ed,S_Kill);
  Signal(Type F_D_C,S_Kill);
  Signal(Type F_S_C,S_Kill);
  Signal(Type F_D_I,S_Kill);
  Signal(Type F_S_I,S_Kill);
  Signal(Type F_Livello_Dest,S_Kill);
  Signal(Type F_Livello_Sini,S_Kill);
  Signal(Type Sfondo_Griglia,S_Kill);
  Signal(Type Chiudi,S_Kill);
  Signal(Type Sfondo,S_Kill);
  Stop_Scroll(0);
  Delete_Text(All_Text);
  Unload_Fnt (File_Fnt[0]);
  Unload_Fnt (File_Fnt[1]);
  Unload_Fpg (File_Oggetti);
  Mouse.Graph=0;
  Frame;
  Fade_Off();
  Menu_Iniziale();
End
// Scrolling di fondo
Process Sfondo()
Begin
  Timer=0;
  Start_Scroll (0,File_Oggetti,200,201,0,15);
  Loop
    Switch (Rand(1,4))
      Case 1: Timer=0;
              Repeat
                Scroll.x0+=2;
                Scroll.y0+=2;
                Scroll.x1+=1;
                Scroll.y1+=1;
                Frame(300);
              Until (Timer>=500);
      End
      Case 2: Timer=0;
              Repeat
                Scroll.x0-=2;
                Scroll.y0+=2;
                Scroll.x1-=1;
                Scroll.y1+=1;
                Frame(300);
              Until (Timer>=500);
      End
      Case 3: Timer=0;
              Repeat
                Scroll.x0+=2;
                Scroll.y0-=2;
                Scroll.x1+=1;
                Scroll.y1-=1;
                Frame(300);
              Until (Timer>=500);
      End
      Case 4: Timer=0;
              Repeat
                Scroll.x0-=2;
                Scroll.y0-=2;
                Scroll.x1-=1;
                Scroll.y1-=1;
                Frame(300);
              Until (Timer>=500);
      End
    End
  End;
End
// Blocco dell'editor
Process Blocco_Ed(x,y,Byte Tipo);
Private
  Byte Calcolo;
  Byte In_Uso;
  Byte Colore; Colpi;
  Byte Lung,Alte;
  Int Prex,Prey;
Begin
  File=File_Oggetti;
  z=51;
  Switch (Tipo)
    Case 1: Graph=100; Lung=20; Alte=20; End
    Case 2: Graph=110; Lung=20; Alte=4 ; End
    Case 3: Graph=120; Lung=4 ; Alte=20; End
    Case 4: Graph=130; Lung=20; Alte=8 ; End
    Case 5: Graph=140; Lung=8 ; Alte=20; End
  End
  In_uso=0;
  Repeat
    If (Mouse.Left And (Controllo==0 Or In_Uso==1) And (Mouse.x>=x-Lung And Mouse.x<=x+Lung) And (Mouse.y>=y-Alte And Mouse.y<=y+Alte))
      If (In_uso==0)
        Signal (Type F_d_c, S_Kill);
        Signal (Type F_s_c, S_Kill);
        Signal (Type F_d_i, S_Kill);
        Signal (Type F_s_i, S_Kill);
        F_D_C(id,Tipo);
        F_S_C(id,Tipo);
        F_D_I(id,Tipo);
        F_S_I(id,Tipo);
        Write    (File_Fnt[1],515,360,1,"colore");
        Write_int(File_Fnt[0],515,380,1,OffSet Colore);
        Write    (File_Fnt[1],515,420,1,"colpi");
        Write_int(File_Fnt[0],515,440,1,OffSet Colpi);
        Controllo=1;
        In_Uso=1;
        Attuale (id,Tipo);
      End
      Prex=x;
      Prey=y;
      Repeat
        z=40;
        x=Mouse.x;
        y=Mouse.y;
        If (x<Lung+10 ) x=Lung+10 ; End
        If (x>290-Lung) x=290-Lung; End
        If (y<Alte+10 ) y=Alte+10 ; End
        If (y>410-Alte) y=410-Alte; End
        If (Collision(Type Blocco_Ed) Or Collision(Type Oggetti_Ed) Or Collision(Type Speciale_Ed))
          Mouse.Graph=2;
        Else
          Mouse.Graph=1;
        End
        Frame;
      Until (Not Mouse.Left);
      If (Collision(Type Blocco_Ed) Or Collision(Type Oggetti_Ed) Or Collision(Type Speciale_Ed))
        x=Prex;
        y=Prey;
      Else
        Calcolo=(x-10-Lung) / 8;
        x=Calcolo * 8 + 10 + Lung;
        Calcolo=(y-10-Alte) / 8;
        y=Calcolo * 8 + 10 + Alte;
      End
      Mouse.Graph=1;
      z=50+Colpi;
    End
    If (Mouse.Right And In_uso==1)
      Signal(Type F_D_C,S_Kill);
      Signal(Type F_S_C,S_Kill);
      Signal(Type F_D_I,S_Kill);
      Signal(Type F_S_I,S_Kill);
      Signal(Type Attuale,S_Kill);
      Delete_Text(8);
      Delete_Text(9);
      Delete_Text(10);
      Delete_Text(11);
      In_uso=0;
      Controllo=0;
    End
    Switch (Tipo)
      Case 1: Colore=Graph-99 ; End
      Case 2: Colore=Graph-109; End
      Case 3: Colore=Graph-119; End
      Case 4: Colore=Graph-129; End
      Case 5: Colore=Graph-139; End
    End
    Colpi =Z-50;
    Frame;
  Until (In_uso==1 And key(_del))
  Signal(Type Attuale,S_Kill);
  Controllo=0;
  Signal(Type F_D_C,S_Kill);
  Signal(Type F_S_C,S_Kill);
  Signal(Type F_D_I,S_Kill);
  Signal(Type F_S_I,S_Kill);
  Delete_Text(8);
  Delete_Text(9);
  Delete_Text(10);
  Delete_Text(11);
End
// Freccia destra colore
Process F_D_C (Id_Blocco,Byte Tipo)
Private
  Byte Base;
Begin
  File=File_Oggetti;
  Graph=10;
  x=550;
  y=380;
  Timer=0;
  Switch (Tipo)
    Case 1: Base=100; End
    Case 2: Base=110; End
    Case 3: Base=120; End
    Case 4: Base=130; End
    Case 5: Base=140; End
  End
  Loop
    If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Graph+=1;
      If (Graph==18) Graph=11; End
      Frame (300);
    Else
      Graph=10;
    End
    If (Mouse.Left And Timer>=50 And (Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      If (id_blocco.graph==Base+3)
        id_blocco.graph=Base;
      Else
        id_blocco.graph+=1;
      End
      Timer=0;
    End
    If (id_blocco.z-50==0 And id_blocco.z<>40) Id_Blocco.graph=Base+4; End
    Frame;
  End
End
// Freccia sinistra colore
Process F_S_C (Id_Blocco,Byte Tipo)
Private
  Byte Base;
Begin
  File=File_Oggetti;
  Graph=20;
  x=450;
  y=380;
  Timer=0;
  Switch (Tipo)
    Case 1: Base=100; End
    Case 2: Base=110; End
    Case 3: Base=120; End
    Case 4: Base=130; End
    Case 5: Base=140; End
  End
  Loop
    If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Graph+=1;
      If (Graph==28) Graph=21; End
      Frame (300);
    Else
      Graph=20;
    End
    If (Mouse.Left And Timer>=50 And (Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      If (id_blocco.graph==Base)
        id_blocco.graph=Base+3;
      Else
        id_blocco.graph-=1;
      End
      Timer=0;
    End
    If (id_blocco.z-50==0 And id_blocco.z<>40) Id_blocco.graph=Base+4; End
    Frame;
  End
End
// Freccia destra colpi
Process F_D_I (Id_Blocco,Byte Tipo)
Private
  Byte Base;
Begin
  File=File_Oggetti;
  Graph=10;
  x=550;
  y=440;
  Timer=0;
  Switch (Tipo)
    Case 1: Base=100; End
    Case 2: Base=110; End
    Case 3: Base=120; End
    Case 4: Base=130; End
    Case 5: Base=140; End
  End
  Loop
    If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Graph+=1;
      If (Graph==18) Graph=11; End
      Frame (300);
    Else
      Graph=10;
    End
    If (Mouse.Left And Timer>=50 And (Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      If (id_blocco.z==54)
        id_blocco.z=50;
      Else
        id_blocco.z+=1;
      End
      Timer=0;
    End
    If (id_blocco.graph==Base+4 And id_blocco.z-50<>0 And id_blocco.z<>40) Id_blocco.graph=Base; End
    Frame;
  End
End
// Freccia sinistra colpi
Process F_S_I (Id_Blocco,Byte Tipo)
Private
  Byte Base;
Begin
  File=File_Oggetti;
  Graph=20;
  x=450;
  y=440;
  Timer=0;
  Switch (Tipo)
    Case 1: Base=100; End
    Case 2: Base=110; End
    Case 3: Base=120; End
    Case 4: Base=130; End
    Case 5: Base=140; End
  End
  Loop
    If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Graph+=1;
      If (Graph==28) Graph=21; End
      Frame (300);
    Else
      Graph=20;
    End
    If (Mouse.Left And Timer>=50 And (Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      If (id_blocco.z==50)
        id_blocco.z=54;
      Else
        id_blocco.z-=1;
      End
      Timer=0;
    End
    If (id_blocco.graph==Base+4 And id_blocco.z-50<>0 And id_blocco.z<>40) Id_blocco.graph=Base; End
    Frame;
  End
End
// Contorni oggetti
Process Attuale (Id_Blocco,Byte Tipo)
Private
  Byte Base;
Begin
  File=File_Oggetti;
  Switch (Tipo)
    Case 1: Base=105; End
    Case 2: Base=115; End
    Case 3: Base=125; End
    Case 4: Base=135; End
    Case 5: Base=145; End
    Case 6: Base=170; End
    Case 7: Base=175; End
    Case 8: Base=180; End
    Case 9: Base=185; End
  End
  Graph=Base;
  Loop
    x=Id_Blocco.x;
    y=Id_Blocco.y;
    If (Graph==Base+4)
      Graph=Base;
    Else
      Graph+=1;
    End
    Frame (300);
  End
End
// Cancella schermata
Process Cancella();
Begin
  File=File_Oggetti;
  Graph=70;
  x=515;
  y=50;
  Loop
    If (Controllo==0 And (Mouse.x>=x-50 And Mouse.x<=x+50) And (Mouse.y>=y-25 And Mouse.y<=y+25))
      Graph+=1;
      If (Graph==77) Graph=71; End
      Frame (300);
    Else
      Graph=70;
    End
    If (Controllo==0 And Mouse.Left And (Mouse.x>=x-50 And Mouse.x<=x+50) And (Mouse.y>=y-25 And Mouse.y<=y+25))
      Signal (Type Blocco_Ed  ,S_Kill);
      Signal (Type Oggetti_Ed ,S_Kill);
      Signal (Type Speciale_Ed,S_Kill);
      Signal (Type Attuale ,S_Kill);
      Controllo=0;
    End
    Frame;
  End
End
// Blocchi del menu
Process TipoBlocco (x,y,Byte Tipo)
Begin
  File=File_Oggetti;
  Switch (Tipo)
    Case 1: Graph=155; End
    Case 2: Graph=156; End
    Case 3: Graph=157; End
    Case 4: Graph=158; End
    Case 5: Graph=159; End
    Case 6: Graph=160; End
    Case 7: Graph=161; End
    Case 8: Graph=162; End
    Case 9: Graph=163; End
  End
  Loop
    If (Mouse.Left And Controllo==0 And (Mouse.x>=x-25 And Mouse.x<=x+25) And (Mouse.y>=y-25 And Mouse.y<=y+25))
      Controllo=2;
      MuoviBlocco(x,y,Tipo);
    End
    Frame;
  End
End
// Blocchi in movimento
Process MuoviBlocco(x,y,Byte Tipo)
Private
  Byte Posx,Posy;
  Byte Lung,Alte;
Begin
  File=File_Oggetti;
  Switch (Tipo)
    Case 1: Graph=155; Lung=20; Alte=20; End
    Case 2: Graph=156; Lung=20; Alte=4 ; End
    Case 3: Graph=157; Lung=4 ; Alte=20; End
    Case 4: Graph=158; Lung=20; Alte=8 ; End
    Case 5: Graph=159; Lung=8 ; Alte=20; End
    Case 6: Graph=160; Lung=12; Alte=12; End
    Case 7: Graph=161; Lung=16; Alte=16; End
    Case 8: Graph=162; Lung=4 ; Alte=4 ; End
    Case 9: Graph=163; Lung=28; Alte=28; End
  End
  Repeat
    x=Mouse.x;
    y=Mouse.y;
    If (Mouse.Left And (Mouse.x>=10 And Mouse.x<=290-Lung) And (Mouse.y>=10 And Mouse.y<=410-Alte))
      If (Not Collision(Type Blocco_Ed) And Not Collision(Type Oggetti_Ed) And Not Collision(Type Speciale_Ed))
        Mouse.Graph=1;
        Posx=(x-10-Lung) / 8;
        Posy=(y-10-Alte) / 8;
        Switch (Tipo)
          Case 1..5: Blocco_Ed    (Posx*8+10+Lung,Posy*8+10+Alte,Tipo); End
          Case 6..8: Oggetti_Ed   (Posx*8+10+Lung,Posy*8+10+Alte,Tipo); End
          Case    9: Speciale_Ed  (Posx*8+10+Lung,Posy*8+10+Alte);      End
        End
      End
    End
    If (Collision(Type Blocco_Ed) Or Collision(Type Oggetti_Ed) Or Collision(Type Speciale_Ed))
      Mouse.Graph=2;
    Else
      Mouse.Graph=1;
    End
    Frame;
  Until (Mouse.Right);
  Controllo=0;
  Mouse.Graph=1;
End
// Oggetti
Process Oggetti_Ed (x,y,Byte Tipo)
Private
  Byte Calcolo;
  Byte In_Uso;
  Byte Lung,Alte;
  Int Prex,Prey;
Begin
  File=File_Oggetti;
  z=100;
  Switch (Tipo)
    Case 6: Graph=164; Lung=12; Alte=12; End
    Case 7: Graph=165; Lung=16; Alte=16; End
    Case 8: Graph=166; Lung=4 ; Alte=4 ; End
  End
  In_uso=0;
  Repeat
    If (Mouse.Left And (Controllo==0 Or In_Uso==1) And (Mouse.x>=x-Lung And Mouse.x<=x+Lung) And (Mouse.y>=y-Alte And Mouse.y<=y+Alte))
      If (In_uso==0)
        Controllo=1;
        In_Uso=1;
        Attuale (id,Tipo);
      End
      Prex=x;
      Prey=y;
      Repeat
        z=40;
        x=Mouse.x;
        y=Mouse.y;
        If (x<Lung+10 ) x=Lung+10 ; End
        If (x>290-Lung) x=290-Lung; End
        If (y<Alte+10 ) y=Alte+10 ; End
        If (y>410-Alte) y=410-Alte; End
        If (Collision(Type Blocco_Ed) Or Collision(Type Oggetti_Ed) Or Collision(Type Speciale_Ed))
          Mouse.Graph=2;
        Else
          Mouse.Graph=1;
        End
        Frame;
      Until (Not Mouse.Left);
      If (Collision(Type Blocco_Ed) Or Collision(Type Oggetti_Ed) Or Collision(Type Speciale_Ed))
        x=Prex;
        y=Prey;
      Else
        Calcolo=(x-10-Lung) / 8;
        x=Calcolo * 8 + 10 + Lung;
        Calcolo=(y-10-Alte) / 8;
        y=Calcolo * 8 + 10 + Alte;
      End
      Mouse.Graph=1;
      z=100;
    End
    If (Mouse.Right And In_uso==1)
      Signal(Type Attuale,S_Kill);
      In_uso=0;
      Controllo=0;
    End
    Frame;
  Until (In_uso==1 And key(_del))
  Signal(Type Attuale,S_Kill);
  Controllo=0;
End
// Blocco speciale (Boss)
Process Speciale_Ed (x,y)
Private
  Byte Calcolo;
  Byte In_Uso;
  Byte Colore; Colpi;
  Int Prex,Prey;
Begin
  File=File_Oggetti;
  z=51;
  Graph=167;
  In_uso=0;
  Repeat
    If (Mouse.Left And (Controllo==0 Or In_Uso==1) And (Mouse.x>=x-28 And Mouse.x<=x+28) And (Mouse.y>=y-28 And Mouse.y<=y+28))
      If (In_uso==0)
        Signal (Type FS_D_C, S_Kill);
        Signal (Type FS_S_C, S_Kill);
        FS_D_C(id,1);
        FS_S_C(id,1);
        FS_D_C(id,2);
        FS_S_C(id,2);
        Write    (File_Fnt[1],515,420,1,"colpi");
        Write_int(File_Fnt[0],515,440,1,OffSet Colpi);
        Controllo=1;
        In_Uso=1;
        Attuale (id,9);
      End
      Prex=x;
      Prey=y;
      Repeat
        z=40;
        x=Mouse.x;
        y=Mouse.y;
        If (x<28+10 ) x=28+10 ; End
        If (x>290-28) x=290-28; End
        If (y<28+10 ) y=28+10 ; End
        If (y>410-28) y=410-28; End
        If (Collision(Type Blocco_Ed) Or Collision(Type Oggetti_Ed) Or Collision(Type Speciale_Ed))
          Mouse.Graph=2;
        Else
          Mouse.Graph=1;
        End
        Frame;
      Until (Not Mouse.Left);
      If (Collision(Type Blocco_Ed) Or Collision(Type Oggetti_Ed) Or Collision(Type Speciale_Ed))
        x=Prex;
        y=Prey;
      Else
        Calcolo=(x-10-28) / 8;
        x=Calcolo * 8 + 10 + 28;
        Calcolo=(y-10-28) / 8;
        y=Calcolo * 8 + 10 + 28;
      End
      Mouse.Graph=1;
      z=50+Colpi;
    End
    If (Mouse.Right And In_uso==1)
      Signal(Type FS_D_C,S_Kill);
      Signal(Type FS_S_C,S_Kill);
      Signal(Type Attuale,S_Kill);
      Delete_Text(8);
      Delete_Text(9);
      In_uso=0;
      Controllo=0;
    End
    Colpi=z-50;
    Frame;
  Until (In_uso==1 And key(_del))
  Signal(Type Attuale,S_Kill);
  Controllo=0;
  Signal(Type FS_D_C,S_Kill);
  Signal(Type FS_S_C,S_Kill);
  Delete_Text(8);
  Delete_Text(9);
End
// Freccia destra colpi
Process FS_D_C (Id_Blocco,Byte Tipo)
Private
  Byte Da_Graph;
Begin
  File=File_Oggetti;
  Switch (Tipo)
    Case 1: x=550; y=440; Da_Graph=10; End
    Case 2: x=580; y=440; Da_Graph=30; End
  End
  Timer=0;
  Loop
    If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Graph+=1;
      If (Graph==Da_Graph+8) Graph=Da_Graph+1; End
      Frame (300);
    Else
      Graph=Da_Graph;
    End
    If (Mouse.Left And Timer>=50 And (Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Switch (Tipo)
        Case 1: id_blocco.z+=1 ; End
        Case 2: id_blocco.z+=10; End
      End
      If (id_blocco.z>=150)
        id_blocco.z=51;
      End
      Timer=0;
    End
    Frame;
  End
End
// Freccia sinistra colpi
Process FS_S_C (Id_Blocco,Byte Tipo)
Private
  Byte Da_Graph;
Begin
  File=File_Oggetti;
  Switch (Tipo)
    Case 1:x=450; y=440; Da_Graph=20; End
    Case 2:x=420; y=440; Da_Graph=40; End
  End
  Timer=0;
  Loop
    If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Graph+=1;
      If (Graph==Da_Graph+8) Graph=Da_Graph+1; End
      Frame (300);
    Else
      Graph=Da_Graph;
    End
    If (Mouse.Left And Timer>=50 And (Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Switch (Tipo)
        Case 1: id_blocco.z-=1 ; End
        Case 2: id_blocco.z-=10; End
      End
      If (id_blocco.z<=51)
        id_blocco.z=150;
      End
      Timer=0;
    End
    Frame;
  End
End
// Freccia destra livello
Process F_Livello_Dest (x,y,Id_Blocco,Byte Tipo)
Begin
  File=File_Oggetti;
  Timer=0;
  Loop
    Switch (Tipo)
      Case 2  :If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
                 Graph+=1;
                 If (Graph==38) Graph=31; End
                  Frame (300);
                Else
                  Graph=30;
                End
      End
      Default :If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
                 Graph+=1;
                 If (Graph==18) Graph=11; End
                  Frame (300);
                Else
                  Graph=10;
                End
      End
    End
    If (Mouse.Left And Timer>=50 And (Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Switch (Tipo)
        Case 1:If (id_blocco.x>=100)
                 Id_blocco.x=1;
               Else
                 Id_blocco.x+=1;
               End
        End
        Case 2:If (id_blocco.x>90)
                 Id_blocco.x=1;
               Else
                 Id_blocco.x+=10;
               End
        End
        Case 3:If (Id_Blocco.y==4)
                 Id_Blocco.y=1;
               Else
                 Id_Blocco.y+=1;
               End
        End
        Case 4:If (Id_Blocco.z==6)
                 Id_Blocco.z=1;
               Else
                 Id_Blocco.z+=1;
               End
        End
      End
      Timer=0;
    End
    Frame;
  End
End
// Freccia sinistra livello
Process F_Livello_Sini (x,y,Id_Blocco,Byte Tipo)
Begin
  File=File_Oggetti;
  Timer=0;
  Loop
    Switch (Tipo)
      Case 2  :If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
                 Graph+=1;
                 If (Graph==48) Graph=41; End
                  Frame (300);
                Else
                  Graph=40;
                End
      End
      Default :If ((Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
                 Graph+=1;
                 If (Graph==28) Graph=21; End
                  Frame (300);
                Else
                  Graph=20;
                End
      End
    End
    If (Mouse.Left And Timer>=50 And (Mouse.x>=x And Mouse.x<=x+30) And (Mouse.y>=y And Mouse.y<=y+30))
      Switch (Tipo)
        Case 1:If (id_blocco.x<=1)
                 Id_Blocco.x=100;
               Else
                 Id_blocco.x-=1;
               End
        End
        Case 2:If (id_blocco.x<=10)
                 Id_Blocco.x=100;
               Else
                 Id_blocco.x-=10;
               End
        End
        Case 3:If (Id_Blocco.y==1);
                 Id_Blocco.y=4;
               Else
                 Id_Blocco.y-=1;
               End
        End
        Case 4:If (Id_Blocco.z==1);
                 Id_Blocco.z=6;
               Else
                 Id_Blocco.z-=1;
               End
        End
      End
      Timer=0;
    End
    Frame;
  End
End
// Salva
Process Salva(Id_Principale);
Private
  Struct Salvataggio;
     Byte Tipo;
     Int  PosX,PosY;
     Byte Colore;
     Byte Colpi;
  End
  File_Salvato;
  Id_Blocchi;
  String Nome_File;
  String Lettere="ABCD";
Begin
  File=File_Oggetti;
  Graph=80;
  x=515;
  y=100;
  Loop
    If (Controllo==0 And (Mouse.x>=x-50 And Mouse.x<=x+50) And (Mouse.y>=y-25 And Mouse.y<=y+25))
      Graph+=1;
      If (Graph==87) Graph=81; End
      Frame (300);
    Else
      Graph=80;
    End
    If (Controllo==0 And Mouse.Left And (Mouse.x>=x-50 And Mouse.x<=x+50) And (Mouse.y>=y-25 And Mouse.y<=y+25))
      Mouse.Graph=3;
      Frame;
      Switch (Id_Principale.z)
        Case 1: Nome_File="Livelli/Singolo/Lev";   End;
        Case 2: Nome_File="Livelli/Doppio/Lev";    End;
        Case 3: Nome_File="Livelli/VSTempo/Lev";   End;
        Case 4: Nome_File="Livelli/VSLiv/Lev";     End;
        Case 5: Nome_File="Livelli/VSVita/Lev";    End;
        Case 6: Nome_File="Livelli/Multi/Lev";     End;
      End
      StrCat (Nome_File,Itoa(Id_Principale.x));
      StrCat (Nome_File,Lettere[Id_Principale.y-1]);
      StrCat (Nome_File,".con");
      Salvataggio.Tipo=0;
      Id_Blocchi=Get_Id(Type Blocco_Ed);
      While (Id_Blocchi)
        If (Id_Blocchi.x>640 Or Id_Blocchi.y>480)
          Signal (Id_Blocchi,S_Kill);
        End
        If (Id_Blocchi.z<>50)
          Salvataggio.Tipo+=1;
        End
        Id_Blocchi=Get_Id(Type Blocco_Ed);
      End
      Id_Blocchi=Get_Id(Type Speciale_Ed);
      While (Id_Blocchi)
        If (Id_Blocchi.x>640 Or Id_Blocchi.y>480)
          Signal (Id_Blocchi,S_Kill);
        Else
          Salvataggio.Tipo+=1;
        End
        Id_Blocchi=Get_Id(Type Speciale_Ed);
      End
      If (Salvataggio.Tipo==0)
        Messaggio(2);
      Else
        Salvataggio.Tipo=0;
        Id_Blocchi=Get_Id(Type Oggetti_Ed);
        While (Id_Blocchi)
          If (Id_Blocchi.Graph==164)  Salvataggio.Tipo+=1; End
          Id_Blocchi=Get_Id(Type Oggetti_Ed);
        End
        If (Salvataggio.Tipo==1)
          Messaggio(3);
        Else
          File_Salvato=Fopen(Nome_File,"w");
          Id_Blocchi=Get_Id(Type Blocco_Ed);
          While (Id_Blocchi)
            Salvataggio.PosX=Id_Blocchi.x;
            Salvataggio.PosY=Id_Blocchi.y;
            Switch (Id_Blocchi.Graph)
              Case 100..104: Salvataggio.Tipo=1;
                             Salvataggio.Colore=Id_Blocchi.Graph-99;
                             Salvataggio.Colpi =Id_Blocchi.z-50;
              End
              Case 110..114: Salvataggio.Tipo=2;
                             Salvataggio.Colore=Id_Blocchi.Graph-109;
                             Salvataggio.Colpi =Id_Blocchi.z-50;
              End
              Case 120..124: Salvataggio.Tipo=3;
                             Salvataggio.Colore=Id_Blocchi.Graph-119;
                             Salvataggio.Colpi =Id_Blocchi.z-50;
              End
              Case 130..134: Salvataggio.Tipo=4;
                             Salvataggio.Colore=Id_Blocchi.Graph-129;
                             Salvataggio.Colpi =Id_Blocchi.z-50;
              End
              Case 140..144: Salvataggio.Tipo=5;
                             Salvataggio.Colore=Id_Blocchi.Graph-139;
                             Salvataggio.Colpi =Id_Blocchi.z-50;
              End
            End
            Fwrite (Offset Salvataggio,SizeOf(Salvataggio),File_Salvato);
            Id_Blocchi=get_id(Type Blocco_Ed);
          End
          Id_Blocchi=Get_Id(Type Oggetti_Ed);
          While (Id_Blocchi)
            Salvataggio.PosX=Id_Blocchi.x;
            Salvataggio.PosY=Id_Blocchi.y;
            Salvataggio.Colore=0;
            Salvataggio.Colpi =0;
            Switch (Id_Blocchi.Graph)
              Case 164: Salvataggio.Tipo=6; End
              Case 165: Salvataggio.Tipo=7; End
              Case 166: Salvataggio.Tipo=8; End
            End
            Fwrite (Offset Salvataggio,SizeOf(Salvataggio),File_Salvato);
            Id_Blocchi=get_id(Type Oggetti_Ed);
          End
          Id_Blocchi=Get_Id(Type Speciale_Ed);
          While (Id_Blocchi)
            Salvataggio.PosX=Id_Blocchi.x;
            Salvataggio.PosY=Id_Blocchi.y;
            Salvataggio.Tipo=9;
            Salvataggio.Colore=0;
            Salvataggio.Colpi =Id_Blocchi.z-50;
            Fwrite (Offset Salvataggio,SizeOf(Salvataggio),File_Salvato);
            Id_Blocchi=get_id(Type Speciale_Ed);
          End
          FClose(File_Salvato);
          Messaggio (1);
        End
      End
      Mouse.Graph=1;
    End
    Frame;
  End
End
// Carica
Process Carica(Id_Principale);
Private
  Struct Salvataggio;
     Byte Tipo;
     Int  PosX,PosY;
     Byte Colore;
     Byte Colpi;
  End
  File_Salvato;
  Contatore;
  Id_Blocco;
  String Nome_File="Livelli\Lev";
  String Lettere="ABCD";
Begin
  File=File_Oggetti;
  Graph=90;
  x=515;
  y=150;
  Loop
    If (Controllo==0 And (Mouse.x>=x-50 And Mouse.x<=x+50) And (Mouse.y>=y-25 And Mouse.y<=y+25))
      Graph+=1;
      If (Graph==97) Graph=91; End
      Frame (300);
    Else
      Graph=90;
    End
    If (Controllo==0 And Mouse.Left And (Mouse.x>=x-50 And Mouse.x<=x+50) And (Mouse.y>=y-25 And Mouse.y<=y+25))
      Mouse.Graph=3;
      Frame;
      Switch (Id_Principale.z)
        Case 1: Nome_File="Livelli/Singolo/Lev";   End;
        Case 2: Nome_File="Livelli/Doppio/Lev";    End;
        Case 3: Nome_File="Livelli/VSTempo/Lev";   End;
        Case 4: Nome_File="Livelli/VSLiv/Lev";     End;
        Case 5: Nome_File="Livelli/VSVita/Lev";    End;
        Case 6: Nome_File="Livelli/Multi/Lev";     End;
      End
      StrCat (Nome_File,Itoa(Id_Principale.x));
      StrCat (Nome_File,Lettere[Id_Principale.y-1]);
      StrCat (Nome_File,".con");
      File_Salvato=Fopen(Nome_File,"r");
      If (File_Salvato==0)
        Messaggio (5);
      Else
        Signal (Type Blocco_Ed  ,S_Kill);
        Signal (Type Oggetti_Ed ,S_Kill);
        Signal (Type Speciale_Ed,S_Kill);
        Controllo=0;
        For (Contatore=0;Contatore<FileLength(File_Salvato);Contatore+=SizeOf(Salvataggio))
          Fread (Offset Salvataggio,SizeOf(Salvataggio),File_Salvato);
          Switch (Salvataggio.Tipo)
            Case 1..5: Id_Blocco=Blocco_Ed (Salvataggio.PosX,Salvataggio.PosY,Salvataggio.Tipo);
                       Id_Blocco.Graph+=Salvataggio.Colore-1;
                       Id_Blocco.Z+=Salvataggio.Colpi-1;
            End
            Case 6..8: Id_Blocco=Oggetti_Ed (Salvataggio.PosX,Salvataggio.PosY,Salvataggio.Tipo);
            End
            Case 9   : Id_Blocco=Speciale_Ed (Salvataggio.PosX,Salvataggio.PosY);
                       Id_Blocco.Z+=Salvataggio.Colpi-1;
            End
          End
        End
        FClose(File_Salvato);
        Messaggio(4);
      End
      Mouse.Graph=1;
    End
    Frame;
  End
End
// Messaggio
Process Messaggio (Byte Tipo);
Begin
  z=-300;
  File=File_Oggetti;
  Switch (Tipo)
    Case 1: Graph=190; End
    Case 2: Graph=191; End
    Case 3: Graph=192; End
    Case 4: Graph=193; End
    Case 5: Graph=194; End
  End
  Controllo=1;
  Signal (Type TipoBlocco,S_Freeze);
  Signal (Type Cancella  ,S_Freeze);
  Signal (Type Salva     ,S_Freeze);
  Signal (Type Carica    ,S_Freeze);
  Signal (Type F_Livello_Dest,S_Freeze);
  Signal (Type F_Livello_Sini,S_Freeze);
  Size=0;
  x=320;
  y=240;
  Repeat
    If (Size<100) Size+=10; Frame(100); End
    Frame;
  Until (Mouse.Right Or key(_Esc))
  Controllo=0;
  Signal (Type TipoBlocco,S_Wakeup);
  Signal (Type Cancella  ,S_Wakeup);
  Signal (Type Salva     ,S_Wakeup);
  Signal (Type Carica    ,S_Wakeup);
  Signal (Type F_Livello_Dest,S_Wakeup);
  Signal (Type F_Livello_Sini,S_Wakeup);
End
// Sfondo griglia
Process Sfondo_Griglia ();
Begin
  File=File_Oggetti;
  Graph=2;
  x=0;
  y=0;
  z=200;
  Loop
    Frame;
  End
End
// Chiudi Schermata
Process Chiudi();
Begin
  File=File_Oggetti;
  Graph=50;
  x=638;
  y=2;
  Repeat
    If (Controllo==0 And (Mouse.x>=x-20 And Mouse.x<=x) And (Mouse.y>=y And Mouse.y<=y+20))
      Graph=51;
    Else
      Graph=50;
    End
    If (Controllo==0 And Mouse.Left And (Mouse.x>=x-20 And Mouse.x<=x) And (Mouse.y>=y And Mouse.y<=y+20))
      Controllo=100;
    End
    Frame;
  Until (Controllo==100);
  Frame;
End
 

 
 

Anno scolastico 2000/2001
Davide Scot - 5Bi