program Breakthrough_GUI;
// Crée le 27/05/2012
// Version 3.0 - Version finalisée de l'interface graphique

uses ai, game_gui, crt, gLib2D, sdl_addon, sdl, sdl_ttf, sysutils;

// RODRIGUEZ Sébastien - 
// Procédure qui change le fond et le titre selon la victoire ou la défaite.
procedure screen(win1 : integer ; var background, title : gimage ; font1, font2 : PTTF_Font ; first : integer);
begin
	if win1 = 1 then
	begin
		background:= gtexload('victory.jpg');
		if first = 1 then
			title:= gtextload('VICTOIRE DES BLANCS',font1)
		else
			title := gtextload('VICTOIRE DES NOIRS',font1);
	end
	else
	begin
		background:= gtexload('defeat.jpg');
		if first = 2 then
			title:= gtextload('VICTOIRE DES BLANCS',font1)
		else
			title := gtextload('VICTOIRE DES ROUGES',font1);
	end;
	blit(200,0,0,800,600,background,g_up_left);
	blitText(g_scr_w div 2,120,title,white);
end;


// RODRIGUEZ Sébastien - 
// Procédure qui affiche l'écran de fin (victoire ou défaite) et permet le retour au menu principal.
procedure EndScreen(win1 : integer ; font1, font2 : PTTF_Font ; first : integer);
var
background,title,retour:gimage;
hl:integer;
begin
       hl:=0;
       while true do
       begin
               gClear(black);
               screen(win1,background,title,font1,font2,first);
               Retour := gTextLoad('RETOUR', font2);
               blitText(g_scr_w div 2,460,retour,colorText(hl=5,false));
               gflip;
               gtexfree(retour);
               gtexfree(background);
               while sdl_update = 1 do
               begin
                       hl := hlSouris(sdl_get_mouse_x,sdl_get_mouse_y);
                       if (sdl_mouse_left_click) and (hl=5) then exit;
                       if sdl_do_quit then exit;
               end;
       end;
end;

// RODRIGUEZ Sébastien - 
// Procédure permettant de libérer jusqu'à 6 images entrés en paramètres.
procedure FreeAll(var image,image2,image3,image4,image5,image6 : gimage);
begin
		gtexfree(image);
		gtexfree(image2);
		gtexfree(image3);
		gtexfree(image4);
		gtexfree(image5);
		gtexfree(image6);	
end;

// INGOUFF Christian - 
// Remplit un fichier de sauvegarde initial chargé au démarrage d'une nouvelle partie.
procedure iniFill(size : coord; multi : integer);
var
	f : text;
	i, j : integer;
begin
	assign(f,'save0.txt');
	rewrite(f);
	writeln(f,1);
	if multi = 0 then
		writeln(f,1)
	else
		writeln(f,random(2)+1);
	writeln(f,multi);
	writeln(f,size.x);
	writeln(f,size.y);
	for j := 0 to 1 do
		for i := 0 to size.x-1 do
			writeln(f,2);
	for j := 2 to size.y-3 do
		for i := 0 to size.x-1 do
			writeln(f,0);
	for j := size.y-2 to size.y-1 do
		for i := 0 to size.x-1 do
			writeln(f,1);
	close(f);
end;

// RODRIGUEZ Sébastien - 
// Procédure qui associe un entier de 0 a 3 en taille de 5 à 12.
function assignTaille(size :integer):integer;
begin
	case size of 
	0: assigntaille := 5;
	1: assigntaille := 8;
	2: assigntaille := 10;
	3: assigntaille := 12;
	end;
end;

// RODRIGUEZ Sébastien - 
// Procédure qui initialise la partie en choisissant le niveau de l'IA et la taille de la grille.
procedure startGame(font,font2 : PTTF_font; fond,diff,taille: integer);
var
	size : coord;
	m,mCol : matrix;
	turn, first : integer;
	win1 : integer;
begin
	gClear(black);
	size.x := assignTaille(taille);
	size.y := size.x; // Ouais... On avait prévu des grilles non carrées, mais le sort en a décidé autrement.
	iniFill(size,diff);
	load(m,mCol,size,0,diff,turn,first);
	game(m,mCol,size,font2,diff,fond,turn,first,win1);
	if win1 > 0 then endScreen(win1,font,font2,first);
	exit;
end;

// RODRIGUEZ Sébastien - 
// Procédure qui sauvegarde les paramètres de taille, de difficulté de l'IA et de l'entier régissant la couleur du fond d'écran.
procedure sauvWrite(fond,diffi,taille:integer);
var
	f: text;
BEGIN
	assign(f, 'FondSauv.txt') ;
	rewrite(f) ; 
	writeln(f, fond) ;
	writeln(f, taille);
	writeln(f, diffi);
	close(f) ;
end;

// RODRIGUEZ Sébastien - 
// Procédure qui charge les paramètres de taille, de difficulté de l'IA et de l'entier régissant la couleur du fond d'écran.
Procedure sauvread(var fond,diffi,taille:integer);
var
f : text;
BEGIN
	if fileExists('FondSauv.txt') then
	begin
		assign(f, 'FondSauv.txt') ;
		reset(f) ; 
		readln(f, fond) ;
		readln(f,taille);
		readln(f,diffi);
		close(f) ;
	end
	else
	begin
		fond := 0;
		taille := 1;
		diffi := 1;
	end;
end;

// RODRIGUEZ Sébastien - 
// Procédure qui assigne à quatres images les les lignes de textes reliées à la page 1 ou la page 2 de l'aide dans le menu Comment Jouer.
procedure regle(var texte,texte2,texte3,texte4:gimage; page2:boolean; font3:PTTF_Font);
begin
	if not page2 then
	begin
	texte:= gTextLoad('BIENVENUE DANS LE BREAKTHROUGH. POUR GAGNER IL SUFFIT D ETRE LE PREMIER',font3);
	texte2:=gTextLoad('A ACHEMINER UN PION A L AUTRE BOUT DU PLATEAU. CHAQUE PION PEUT SE',font3);
	texte3:=gtextLoad('DEPLACER EN DIAGONALE ET TOUT DROIT MAIS NE PEUT RECULER.',font3);
	texte4:=gtextload('VOUS NE POUVEZ PRENDRE UN PION ADVERSE QU EN DIAGONALE.',font3);
	end
	else
	begin
	texte:=gtextload('TOUT SE JOUE A L AIDE DE VOTRE SOURIS. CONTRE L ORDINATEUR',font3);
	texte2:=gTextLoad('VOUS INCARNEZ LES PIONS BLANCS ET JOUEZ LE PREMIER.',font3);
	texte3:=gTextLoad('POUR DESELECTIONER UN PION CLIQUEZ A NOUVEAU SUR CELUI CI',font3);
	texte4:=gtextload('OU SUR UNE CASE DE DEPLACEMENT NON VALIDE.',font3);
	end;
end;

// RODRIGUEZ Sébastien - 
// Procédure qui adapte le message Aller à la page X selon la position actuelle dans les pages de l'aide.
procedure pagination(page2: boolean ; var nextpage : gimage; font2:PTTF_Font);
begin
		if not page2 then
		nextpage:= gTextLoad('ALLER A LA PAGE II',font2)
		else
		nextpage:= gtextLoad('ALLER A LA PAGE I ',font2);
end;

// RODRIGUEZ Sébastien - 
// Procédure qui affiche le contenu du menu Comment Jouer.
procedure Commentjouer(titre:gimage; var fond:integer;font,font2 : PTTF_Font);
var
bd,retour,texte,texte2,nextpage,texte3,texte4: gimage;
hl : integer;
page2 : boolean;
font3 : PTTF_Font;
begin
	hl:=0;
	font3 := TTF_OpenFont('REVOLUTIONII.ttf',20);
	page2:= false;
	while true do
	begin
		gClear(black);
		retour := gTextLoad('RETOUR',font2);
		pagination(page2,nextpage,font2);
		initchangementFond(fond,bd,titre);
		Regle(texte,texte2,texte3,texte4,page2,font3);
		blitText(G_SCR_W div 2,260,texte,white);
		blitText(G_SCR_W div 2,290,texte2,white);
		blitText(G_SCR_W div 2,320,texte3,white);
		blitText(G_SCR_W div 2,350,texte4,white);
		blitText(G_SCR_W div 2,420,nextpage,colorText(hl=4,false));		
		blitText(G_SCR_W div 2,460,retour,colorText(hl=5,false));
		gflip;
		FreeAll(texte,texte2,texte3,texte4,retour,bd);
		while sdl_update = 1 do
		begin
			if sdl_do_quit then exit;
			hl := hlSouris(sdl_get_mouse_x,sdl_get_mouse_y);
			if sdl_mouse_left_click or sdl_mouse_right_click then
				if hl=4 then
					page2 := not page2
				else if hl=5 then
					exit;
		end;
	end;
end;

// RODRIGUEZ Sébastien - 
// Procédure qui dessine la barre et choisit la couleur selon si la position se trouve dessus ou non.
procedure barre(x,y,hl : integer);
begin
	gBeginRects(nil);
		gSetAlpha(200);
		gSetColor(colorText(hl=1+(y-300) div 40,false));
		gSetCoordMode(g_up_left);
		gSetScaleWH(150,3);
		gSetCoord(450,y-1);
		gAdd;
		
		gSetCoordMode(g_center);
		gSetScaleWH(20,40);
		gSetCoord(x,y);
		gAdd;
	gEnd;
end;

// RODRIGUEZ Sébastien - 
// fonction qui renvoit la position de la barre par palliers.
function coordBarre(x : integer):integer;
begin
	if x < 475 then
		coordBarre := 450
	else if x < 525 then
		coordBarre := 500
	else if x < 575 then
		coordBarre := 550
	else
		coordBarre := 600;
end;

// RODRIGUEZ Sébastien - 
// Procédure de synthétisation de l'affichage du menu des paramètres.
procedure iniMenuPara(var retour,diffi,taille,couleurfond : gImage ; quit : boolean ; font : pttf_font);
begin
	retour:= gTextLoad('RETOUR',font);
	diffi:= gTextLoad('DIFFICULTE',font);
	taille:= gTextLoad('TAILLE',font);
	couleurfond:= gTextLoad('FOND',font);
	blitText(G_SCR_W div 2-100,300,taille,white);
	blitText(G_SCR_W div 2-100,340,diffi,white);
	blitText(G_SCR_W div 2-100,380,couleurfond,white);
	blitText(G_SCR_W div 2,460,retour,colorText(quit,false));
end;

// RODRIGUEZ Sébastien - 
// Procédure qui affiche la taille de la grille et la difficulté selon la position de la barre correspondante
procedure iniAffPara(var aff_taille, aff_diff : gImage ; diff, size : integer ; font : pttf_font);
begin
	case size of
		0 : aff_taille := gTextLoad(' 5 X 5 ', font);
		1 : aff_taille := gTextLoad(' 8 X 8 ', font);
		2 : aff_taille := gTextLoad('10 X 10', font);
		3 : aff_taille := gTextLoad('12 X 12', font);
	end;
	case diff of
		0 : aff_diff := gTextLoad('Facile', font);
		1 : aff_diff := gTextLoad('Normal', font);
		2 : aff_diff := gTextLoad('Avancé', font);
		3 : aff_diff := gTextLoad('Expert', font);
	end;
	blitText(700, 300, aff_taille, white);
	blitText(700, 340, aff_diff, white);
end;

// RODRIGUEZ Sébastien - 
// Procédure qui convertit la position de la barre de chaque paramètre en entier plus simple utilisés dans la sauvegarde du menu et l'initialisation du jeu.
procedure caseSetting(i : integer ; var fond,diff,size : integer ; x : integer);
begin
	case i of
		1 : size := (coordBarre(x)-450) div 50;
		2 : diff := (coordBarre(x)-450) div 50;
		3 : fond := (coordBarre(x)-450) div 50;
	end;
end;

// RODRIGUEZ Sébastien - 
// Procédure de synthétisation des barres du menu Parametre.
procedure TripleBarre(var size,diff,fond:integer; hl: integer);
begin
		barre(455+size*50,300,hl);
		barre(455+diff*50,340,hl);
		barre(455+fond*50,380,hl);
end;

// RODRIGUEZ Sébastien - 
// Procédure qui affiche le contenu du menu des parametres tout en permettant leur modifications à l'aide de trois barres.
procedure MenuParametre(titre : gimage ; var fond, diff, size : integer ; font2,font3 : PTTF_Font);
var
hl,i:integer;
bd,retour,diffi,taille,couleurfond,aff_taille,aff_diff:gimage;
quit, hold : boolean;
begin
	hl:=0;	hold := false;	quit := false;
	while true do
	begin
		gclear(Black);
		initchangementFond(fond,bd,titre);
		iniMenuPara(retour,diffi,taille,couleurfond,quit,font2);
		iniAffPara(aff_taille,aff_diff,diff,size,font3);
		TripleBarre(size,diff,fond,hl);
		gflip;
		FreeAll(taille,retour,diffi,couleurfond,bd,aff_taille);
		gTexFree(aff_diff);
		while sdl_update = 1 do
		begin
			hl := hlSouris(sdl_get_mouse_x - 180,sdl_get_mouse_y);
			quit := (sdl_get_mouse_x > g_scr_w div 2 - 150) and (sdl_get_mouse_x < g_scr_w div 2 + 150) and (sdl_get_mouse_y > 445) and (sdl_get_mouse_y < 475);
			i := 1;
			if hold then caseSetting(hl,fond,diff,size,sdl_get_mouse_x);
			if sdl_hold_left_click then // appuyer sur clic gauche
				while (i < 4) and not hold do
				begin
					hold := i = hl;
					i := i+1;
				end;
			if sdl_mouse_left_click then // relâcher clic gauche
				if quit then
					exit
				else
					hold := false;
			if sdl_do_quit then exit;
		end;
	end;
end;

// RODRIGUEZ Sébastien - 
// Procédure qui affiche le contenu du menu des parametres .
procedure menuNouvellepartie(var fond, diff, size : integer ; titre : gimage; font, font2 : PTTF_Font);
var
bd,Mono,Multi,Retour:gimage;
hl : integer;
begin
	hl := 0;
	while true do
	begin
		gClear(black);
		Mono := gTextLoad('UN JOUEUR', font2);
		Multi := gTextLoad('DEUX JOUEURS', font2);
		Retour := gTextLoad('RETOUR', font2);
		initchangementFond(fond,bd,titre);
		blitText(G_SCR_W div 2,300,Mono,colorText(hl=1,false));
		blitText(G_SCR_W div 2,340,Multi,colorText(hl=2,false));
		blitText(G_SCR_W div 2,380,retour,colorText(hl=3,false));
		gFlip;
		FreeAll(mono,multi,retour,bd,bd,bd);
		while sdl_update = 1 do
		begin
			hl := hlSouris(sdl_get_mouse_x,sdl_get_mouse_y);
			if sdl_mouse_left_click then
				if (hl > 0) and (hl < 4) then
				begin
					if hl = 1 then
						startGame(font,font2,fond,diff+1,size) // Monojoueur vs. Bot
					else if hl = 2 then
						startGame(font,font2,fond,0,size); // Multijoueur
					exit;
			end;
			if sdl_do_quit then exit;
		end;
	end;
end;

// INGOUFF Christian
// Procédure du menu Charger Une partie.
procedure loadDisp(fond : integer ; font,font2 : PTTF_Font ; titre : gimage);
var
m, mCol : matrix;
size : coord;
bd,save1,save2,save3,retour : gimage;
hl, multi, turn, first : integer;
win1 : integer;
begin
	hl := 0;
	while true do
	begin
		gClear(black);
		changementFond(fond,bd);
		catSaveDisp(bd,save1,save2,save3,retour,font2,hl);
		blitText(G_SCR_W div 2,120,titre,white);
		gFlip;
		FreeAll(save1,save2,save3,retour,bd,bd);
		while sdl_update = 1 do
		begin
			hl := hlSouris(sdl_get_mouse_x,sdl_get_mouse_y);
			if sdl_mouse_left_click then
			begin
				if (hl > 0) and (hl < 4) and fileExists('save'+inttostr(hl)+'.txt') then
				begin
					load(m,mCol,size,hl,multi,turn,first);
					game(m,mCol,size,font2,multi,fond,turn,first,win1);
					if win1 > 0 then endScreen(win1,font,font2,first);
					exit;
				end
				else if hl = 4 then exit;
			end;
			if sdl_do_quit then exit;
		end;
	end;
end;

// RODRIGUEZ Sébastien - 
// Procédure de synthétisation du texte du menu principal.
procedure TexteMenuPrincipal(var parametre,charger,regle,newgame,quit:gimage; font2 : PTTF_Font);
begin
		Parametre := gTextLoad('PARAMETRES', font2);
		Charger := gTextLoad('CHARGER', font2);
		Regle := gTextLoad('COMMENT JOUER', font2);
		newGame := gTextLoad('NOUVELLE PARTIE',font2);
		Quit := gTextLoad('QUITTER',font2);
end;

// RODRIGUEZ Sébastien - 
// Procédure qui affiche le contenu du menu des parametres.
procedure MenuPrincipal(var fond, diff, size : integer ; titre : gimage; font, font2, font3 : PTTF_Font);
var
bd,NewGame,Quit,Parametre,Charger,Regle:gimage;
hl : integer;
begin
	hl := 0;
	while true do
	begin
		gClear(black);
		TexteMenuPrincipal(parametre,charger,regle,newgame,quit,font2);
		initchangementFond(fond,bd,titre);
		blitText(G_SCR_W div 2,300,newgame,colorText(hl=1,false));
		blitText(G_SCR_W div 2,340,parametre,colorText(hl=2,false));
		blitText(G_SCR_W div 2,380,charger,colorText(hl=3,false));
		blitText(G_SCR_W div 2,420,regle,colorText(hl=4,false));
		blitText(G_SCR_W div 2,460,quit,colorText(hl=5,false));
			gFlip;
			FreeAll(regle,parametre,charger,Newgame,Quit,bd);		
		while sdl_update = 1 do
		begin
			hl := hlSouris(sdl_get_mouse_x,sdl_get_mouse_y);
			if sdl_mouse_left_click then
			begin
				case hl of
				1 : menunouvellepartie(fond,diff,size,titre,font,font2);
				2 : MenuParametre(titre,fond,diff,size,font2,font3);
				3 : loadDisp(fond,font,font2,titre);
				4 : Commentjouer(titre,fond,font,font2);
				5 : exit;
				end;
			end;
			if sdl_do_quit then exit;
		end;
	end;
end;

var
	font,font2,font3 : PTTF_Font;
	titre:gimage;
	fond, diff, size : integer;
begin
	randomize;
	gClear(black);
	sauvRead(fond,diff,size);
	font := TTF_OpenFont('REVOLUTIONII.ttf', 70);
	titre := gTextLoad('BREAKTHROUGH', font);
	font2 := TTF_OpenFont('REVOLUTIONII.ttf', 30);
	font3 := TTF_OpenFont('font.ttf', 30);
	menuprincipal(fond,diff,size,titre,font,font2,font3);
	gtexfree(titre);
	sauvWrite(fond,diff,size);
end.

