#include "fxlib.h"
#include "Main.h"
#include "MonochromeLib.h"
#include <stdio.h>
#include <stdlib.h>

int x, x_ball, y_ball, J1, J2, pointJ1, pointJ2;
int acc_ball_x, acc_ball_y;
int vitesse, nbrJoueur, niveauOrdi, handle, choix, Tmenu;
int key;
char affichage[100];
FONTCHARACTER filename[]={'\\','\\','f','l','s','0','\\','p','o','n','g','r','.','t','x','t',0};

int AddIn_main(int isAppli, unsigned short OptionNum)
{
	Bdisp_AllClr_DDVRAM();
	demmarage();
	lectureReglage();
	choix=0;
	do{
		choix = menu();
		if(choix==1) jeu();
		if(choix==2) reglages();
		Bdisp_PutDisp_DD();
	}while(choix!=3);
	quitter();
}

// A finir
void jeu(){
	int nombre;
	Bdisp_AllClr_DDVRAM();
	PrintXY(51,0,"PONG",0);
	ML_line(63,8,63,63, 3);
	Bdisp_DrawLineVRAM(1,8,127,8);
	Bdisp_PutDisp_DD();
	lectureReglage();
	Tmenu=1;
	SaveDisp(SAVEDISP_PAGE1);
	pointJ1=pointJ2=0;
	do{
		setPos();
		nombre=0;
		do{
			nombre++;
			// Affichage
			Bdisp_AllClr_DDVRAM();
			RestoreDisp(SAVEDISP_PAGE1);
			Bdisp_DrawLineVRAM(1,J2+4,1,J2-4);
			Bdisp_DrawLineVRAM(2,J2+4,2,J2-4);
			Bdisp_DrawLineVRAM(126,J1+4,126,J1-4);
			Bdisp_DrawLineVRAM(127,J1+4,127,J1-4);
			Bdisp_SetPoint_VRAM(x_ball,y_ball,1);
			sprintf(affichage,"%d",pointJ2);
			PrintXY(55,10,affichage,0);
			sprintf(affichage,"%d",pointJ1);
			PrintXY(65,10,affichage,0);
			Bdisp_PutDisp_DD();
			
			// Deplacement J1
			if(IsKeyDown(30018) && J1>13) J1--;
			if(IsKeyDown(30023) && J1<59) J1++;
			
			// Colision palet/Joueur
			if((x_ball==3 && acc_ball_x<0 && (J2+5>y_ball && J2-5<y_ball)) || (x_ball==125 && acc_ball_x>0 && (J1+5>y_ball && J1-5<y_ball))){
				acc_ball_x = -acc_ball_x;
				if(x_ball==125) acc_ball_y = y_ball - J1;
				if(x_ball==3) acc_ball_y = y_ball - J2;
				acc_ball_y = acc_ball_y / 2;
			}
			
			// Colision haut/bas
			if(y_ball <= 9 || y_ball >=63){
				acc_ball_y = -acc_ball_y;
				if(y_ball <= 9) y_ball=9;
				if(y_ball >=63) y_ball=63;
			}
			
			// Adaptation vitesse balle
			if(nombre==1){
				x_ball+=acc_ball_x;
				y_ball+=acc_ball_y;
				nombre=0;
			}
			
			// Mode 2 joueurs deplacement J2
			if(nbrJoueur==2){
				if(IsKeyDown(30006) && J2>13) J2--;
				if(IsKeyDown(30007) && J2<59) J2++;
			}
			
			// Mise en pause
			if(IsKeyDown(30002)) pause();
			
			// Reglage Vitesse
			Sleep(10*(10-vitesse));
		}while(x_ball >= 0 && x_ball <= 127 && Tmenu!=0);
		if(x_ball <=0) pointJ1++;
		else pointJ2++;
	}while(pointJ1 != 7 && pointJ2 != 7 && Tmenu!=0);
	// Si un des 2 joueurs a gagné
	if(Tmenu==1){
		if(pointJ1>pointJ2) x=1;
		else x=2;
		Bdisp_AllClr_DDVRAM();
		locate(2,3);
		Print("Le joueur   gagne !");
		sprintf(affichage,"%d",x);
		locate(10,3);
		Print(affichage);
		locate(5,6);
		Print("Press [ExE]");
		do{
			GetKey(&key);
		}while(key!=30004);
	}
}

// Fini !
void reglages(){
	Bdisp_AllClr_DDVRAM();
	x=20;
	choix=1;
	locate(6,1);
	Print("+ Reglages +");
	Bdisp_DrawLineVRAM(1,8,127,8);
	PrintMini(20,20,"Vitesse:",0);
	PrintMini(20,30,"Nbr. Joueur:",0);
	PrintMini(20,40,"Niv. Ordi:",0);
	PrintMini(20,55,"Retour",0);
	lectureReglage();
	do{
		PrintXY(10,x,">",0);
		PrintMini(80,30,"         ",0);
		if(nbrJoueur==1){
			PrintMini(80,30," 1J ",0);
			PrintMini(95,30," 2J ",3);
		}
		else{
			PrintMini(80,30," 1J ",3);
			PrintMini(95,30," 2J ",0);
		}
		sprintf(affichage,"%d",vitesse);
		PrintMini(92,20,affichage,0);
		sprintf(affichage,"%d",niveauOrdi);
		PrintMini(92,40,affichage,0);
		GetKey(&key);
		PrintXY(10,x," ",0);
		Bdisp_PutDisp_DD();
		if(key==30023) choix++;
		if(key==30018) choix--;
		
		if(choix==1){
			if(key==30020 && vitesse!=0) vitesse--;
			if(key==30021 && vitesse!=9) vitesse++;
		}
		if(choix==2){
			if(key==30020) nbrJoueur=1;
			if(key==30021) nbrJoueur=2;
		}
		if(choix==3){
			if(key==30020 && niveauOrdi!=0) niveauOrdi--;
			if(key==30021 && niveauOrdi!=9) niveauOrdi++;
		}
		
		if(choix==0) choix=4;
		if(choix==5) choix=1;
		if(choix==1) x=20;
		if(choix==2) x=30;
		if(choix==3) x=40;
		if(choix==4) x=55;
	}while(key!=30004 || choix!=4);
	ecritureReglage();
}

// Fini !
int menu(){
	Bdisp_AllClr_DDVRAM();
	x=20;
	choix=1;
	locate(6,1);
	Print("Pong 1960");
	Bdisp_DrawLineVRAM(1,8,127,8);
	PrintXY(20,20,"Jouer",0);
	PrintXY(20,30,"Reglages",0);
	PrintXY(20,45,"Quitter",0);
	PrintXY(10,20,">",0);
	
	do{
		GetKey(&key);
		PrintXY(10,x," ",0);
		Bdisp_PutDisp_DD();
		if(key==30023) choix++;
		if(key==30018) choix--;
		if(choix==0) choix=3;
		if(choix==4) choix=1;
		if(choix==1) x=20;
		if(choix==2) x=30;
		if(choix==3) x=45;
		PrintXY(10,x,">",0);
	}while(key!=30004);
	return choix;
}



//======== fonctions supplementaires =======

// Fini !
void setPos(){
	x_ball=63;
	y_ball=36;
	acc_ball_x=1;
	acc_ball_y=0;
	J1=36;
	J2=36;
}

// Fini !
void pause(){
	ML_rectangle(1,9,127,63,0,0,3);
	ML_rectangle(45, 25, 85, 40,1,1,0);
	PrintXY(50,30,"PAUSE",0);
	Bdisp_PutDisp_DD();
	Sleep(500);
	do{
		GetKey(&key);
	}while(key!=30002 && key!=30008);
	PrintXY(50,30,"     ",0);
	if(key==30008) Tmenu=0;
	else{
		for(x=3;x>=1;x--){
			sprintf(affichage,"  %d  ",x);
			PrintXY(50,30,affichage,0);
			Bdisp_PutDisp_DD();
			Sleep(1000);
		}
	}
}

// Fini !
void demmarage(){
	handle = Bfile_OpenFile(filename,_OPENMODE_READWRITE);
	if(handle== -1){
		Bfile_CreateFile(filename, 8);
		handle = Bfile_OpenFile(filename,_OPENMODE_READWRITE);
		vitesse=1;
		nbrJoueur=1;
		niveauOrdi=1;
		ecritureReglage();
		locate(1,1);
		Print("Un fichier a ete cree");
		locate(6,2);
		Print("pongr.txt");
		locate(1,3);
		Print("  Merci de ne pas le");
		locate(1,4);
		Print("supprimer.");
		locate(5,6);
		Print("Press [ExE]");
		do{
			GetKey(&key);
		}while(key!=30004);
	}
	lectureReglage();
}

// Fini !
void quitter(){
	Bfile_CloseFile(handle);
	Bdisp_AllClr_DDVRAM();
	locate(8,4);
	Print("Bye :)");
	Bdisp_PutDisp_DD();
	Sleep(1000);
}



//======== Fonctions pour le fichier ========

// Fini !
void lectureReglage(){
	char buffer[7];
	int i=0;
	Bfile_ReadFile(handle,buffer,7,0);
	
	if(buffer[2]=='1') nbrJoueur=1;
	else nbrJoueur=2;
	switch(buffer[0]){
		case '1': vitesse=1;
		break;
		case '2': vitesse=2;
		break;
		case '3': vitesse=3;
		break;
		case '4': vitesse=4;
		break;
		case '5': vitesse=5;
		break;
		case '6': vitesse=6;
		break;
		case '7': vitesse=7;
		break;
		case '8': vitesse=8;
		break;
		case '9': vitesse=9;
		break;
		case '0': vitesse=0;
		break;
	}
	switch(buffer[4]){
		case '1': niveauOrdi=1;
		break;
		case '2': niveauOrdi=2;
		break;
		case '3': niveauOrdi=3;
		break;
		case '4': niveauOrdi=4;
		break;
		case '5': niveauOrdi=5;
		break;
		case '6': niveauOrdi=6;
		break;
		case '7': niveauOrdi=7;
		break;
		case '8': niveauOrdi=8;
		break;
		case '9': niveauOrdi=9;
		break;
		case '0': niveauOrdi=10;
		break;
	}
}

// Fini !
void ecritureReglage(){
	char buffer[7];
	sprintf(buffer,"%d+%d+%d+-",vitesse,nbrJoueur,niveauOrdi);
	Bfile_CloseFile(handle);
	Bfile_DeleteFile(filename);
	Bfile_CreateFile(filename, 8);
	handle = Bfile_OpenFile(filename,_OPENMODE_READWRITE);
	Bfile_WriteFile(handle,buffer,7);
}


/* Aide affichage
+---------------------+
|      Pong 1960      |
|                     |
|                     |
|       Bye :)        |
|                     |
|                     |
|                     |
|                     |
+---------------------+
Reglage: vitesse(1,2,3,4,5,6,7,8,9,0)+nombre joueurs(1,2)+niveau ordi(1,2,3,4,5,6,7,8,9,0)+-
*/

#pragma section _BR_Size
unsigned long BR_Size;
#pragma section
#pragma section _TOP
int InitializeSystem(int isAppli, unsigned short OptionNum){return INIT_ADDIN_APPLICATION(isAppli, OptionNum);}
#pragma section

