// Auteurs
// Matthieu Aubry
// Anthony Combe
// Licence
// Domaine publique
unit interface_unit;

interface

uses crt;

CONST GUIlarg=70; GUIhaut=20; NBFONC=5;
        
type guimat=array[1..GUIlarg,1..GUIhaut] of char;
pguimat = ^guimat;

procedure print_matrice(mat: pguimat);
procedure addstringtmp(x,y : integer; str:string; mat: pguimat; temps:longint);
procedure addstring_(x,y : integer; str:string; mat: pguimat);
procedure addstring(x,y : integer; str:string; mat: pguimat);
procedure init_matrice(mat: pguimat);
function readstring(x,y : integer; mat: pguimat) : string;
procedure geretempsfonction(mat:pguimat; VAR av1, av2:longint; cycles : longint; n:integer);

implementation

// permet d'afficher la matrice de caractère à l'écran
procedure print_matrice(mat: pguimat);
var i, j :integer;
begin
    clrscr();
    for j:=1 to GUIhaut do
    begin
        for i:=1 to GUIlarg do
            write(mat^[i,j]);
        writeln('');
    end;

end;


// écrit une chaine de caractère dans la matrice en respectant un délai entre chaque caractère
procedure addstringtmp(x,y : integer; str:string; mat: pguimat; temps:longint);
var i :integer;
begin
    i:=0;
    while i<> length(str) do
    begin
    print_matrice(mat);
    delay(temps);    
    inc(i);
    mat^[i+x, y] := str[i];
        
    end;
end;

// écrit une chaine dans la matrice sans l'afficher
procedure addstring_(x,y : integer; str:string; mat: pguimat);
var i :integer;
begin
    for i:=1 to length(str) do
        mat^[i+x, y] := str[i];
    
end;


// écrit une chaine dans la matrice et l'affiche
procedure addstring(x,y : integer; str:string; mat: pguimat);
var i :integer;
begin
    for i:=1 to length(str) do
        mat^[i+x, y] := str[i];
    print_matrice(mat);
    
end;

// initialise le cadre de la matrice
procedure init_matrice(mat: pguimat);
var i, j :integer;
begin

    for i:=1 to GUIlarg do mat^[i, 1]:='*';
    for j:=2 to GUIhaut-1 do
        begin
        mat^[1, j] := '*';
        for i:=2 to GUIlarg-1 do mat^[i,j]:=' ';
        mat^[GUIlarg, j] := '*';
        end;
    for i:=1 to GUIlarg do mat^[i, GUIhaut]:='*';
    
    addstring(20,3, 'INSA PETANQUE v1.0 alpha', mat);
end;

// lit une chaine de caractère tapé au clavier dans la matrice
function readstring(x,y : integer; mat: pguimat) : string;
var i:integer;
str : string[30];
ch : char;
begin
    ch := '0';
    i:=0;

    repeat
    delay(10);
    if KeyPressed then
        begin
            ch := ReadKey;
            // on lit le clavier jusqu'à l'appui sur la touche entrée
            if ch<>chr(13) then
            begin
                inc(i);
                str[i] := ch;
                str[0] := chr(i);
                mat^[x+i, y] := ch;
                print_matrice(mat); 
            end;
        end;   
    until ch = chr(13);   
    
    readstring := str;
end;

// actualise les barres de défilement
procedure geretempsfonction(mat:pguimat; VAR av1, av2:longint; cycles : longint; n:integer);
var i:integer;
begin
    if mat<>NIL then
    begin
        // effacement de la première barre
        if (av2 MOD (cycles DIV GUIlarg)) = 0 then
        begin
        
    
                
            // calcul de l'avancement total
            av1 := ((GUIlarg-10) * n) DIV NBFONC;
            av1 := av1+ ((GUIlarg-10) * av2) DIV cycles DIV NBFONC ;
    
            
            delay(40);
            // écriture des barres
            addstring_(5 + (av2 * (GUIlarg-10)) DIV cycles, 15, '.', mat);
            addstring_(5 + av1, 18, '.', mat);
            print_matrice(mat);
            
        end;
        
        if av2 = cycles then
        begin
            av2 := 0;
            // effacement de l'avancement partiel
            for i:=5 to GUIlarg-4 do
                mat^[i,15] := ' ';
        end
        else inc(av2);
    end;
    
end;








begin
end.