|
| 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 |