//===================================================
//=== Magia Liter v 1.1 - M. Awgul - wiosna 2021. 23 ====
//===================================================
#include <fstream>
#include <iostream>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>

using namespace std;
ALLEGRO_DISPLAY *okno = NULL;                       // inicjacja okna/ekranu
ALLEGRO_BITMAP *el,*lit,*obr,*tlo,*ee,*buf,*gwiazda = NULL;  // inicjacja bitmapy
ALLEGRO_KEYBOARD_STATE klaw;                        // klawiszee klawiatury
ALLEGRO_MOUSE_STATE myszka;                         // myszka
ALLEGRO_FONT  *ff,*f20,*f40 = NULL;                 // czcionki
ALLEGRO_EVENT ev;                                   // zda+rzenia
ALLEGRO_SAMPLE *samp0,*samp1,*samp2,*samp3,*samp4,  // sample
*samp5,*samp6,*samp7,*samp8,*samp9,*samp10 = NULL;  // sample

int ih=0, zad=0;   // liczba słów w bazie i zadań
string h[9000];    // tablica bazy słów
int hh[20];        // numery wpisywanych znaków
int x=260, y=70;   // wsp.  tablicy
int const a=80;    // wielkość boku pola diagramu
int pole[36], kop[36], pz[36];   //tablica, kopia tab., pola zapalone
int px  [36];    // wsp. pól tablicy
int py  [36];    //      ''
int cz = 122;    // czas na wpis ( 6=1sek. 90=15sek.) pzy ustawieniu na 0.16
string ht[6];    // elementy opisu obrazka
int gr=0, g[3];  // gracz i konto gracza
int bonus=0;     // bonus za czas
int runda=11;    // nr rundy gry
int lampki[13];
int mx=0,my=0,mb=0,mz=0;  //dla myszki
string abc[]= {"gr.A","gr.B","gr.C","INFO","OPIS GRY","WYJSCIE",""};
string sf[7];    // wybrane słowa
int fin=0;       // 0=rozgrywka 1=finał
string fhas[7];  // hasła finału
int fnr[7];      // nr haseł we finale
int bank=0;      // kasa w banku
int pech=0;      // nie trafone hasło
string wybrane;  //
int nrwz[12];    // numery wybranych zadań

void init(int ekr)  // instalowanie 'narzedzi'
{
    al_init();                    // Allegro 5
    al_install_keyboard();        // klawiatura
    al_install_mouse();           // myszka
    al_init_image_addon();        // grafika
    srand( time( NULL ) );        // liczby losowe
    al_init_font_addon();         // czcionki systemowe
    al_init_ttf_addon();          // czcionki skalowane
    al_install_audio();           // dźwięki
    al_init_acodec_addon();       // kodeki muzyki
    al_reserve_samples(9);        // rezerwacja pamieci dla sampli

    if(ekr==1) al_set_new_display_flags(ALLEGRO_FULLSCREEN);
    if(ekr==0) al_set_new_display_flags(ALLEGRO_WINDOWED);

    okno = al_create_display( 1024, 768 );                 // rozmiar okna
    buf = al_create_bitmap( 1024, 768 );                   // dodatkowa bitmapa
    obr= al_create_bitmap(7*a,5*a);                        // bitmapa obrazka
    gwiazda= al_create_bitmap(66,66);
    el = al_load_bitmap("media/elecc.png");                // el. graf.
    ee = al_load_bitmap("media/M L.png");                  // efekty graf.
    lit = al_load_bitmap("media/lit.png");                 // litery
    tlo = al_load_bitmap("media/tlo3.png");                // fło gry
    al_convert_mask_to_alpha( el,al_map_rgb(255,0,255) );  // maska (kolor alfa)
    ff = al_load_ttf_font( "media/arialbd.ttf",28, 0 );    // czcionka
    f20 = al_load_ttf_font( "media/arialbd.ttf",20, 0 );   //  ''
    f40 = al_load_ttf_font( "media/arial.ttf",40, 0 );     //  ''
    samp0 = al_load_sample( "media/samp/s0.ogg" );  // intro
    samp1 = al_load_sample( "media/samp/s1.ogg" );  // zapalanie
    samp2 = al_load_sample( "media/samp/s2.ogg" );  // kasopwanie
    samp3 = al_load_sample( "media/samp/s3.ogg" );  // brak lit.
    samp4 = al_load_sample( "media/samp/s4.ogg" );  // obrazek
    samp5 = al_load_sample( "media/samp/s5.ogg" );  // gratulacje
    samp6 = al_load_sample( "media/samp/s6.ogg" );  // czas
    samp7 = al_load_sample( "media/samp/s7.ogg" );  // klik
    samp8 = al_load_sample( "media/samp/s8.ogg" );  // pech
    samp9 = al_load_sample( "media/samp/s9.ogg" );  // podkład finału
    samp10 = al_load_sample( "media/samp/s10.ogg" ); //złe hasło finału
    if(ekr==0)  memset(pole,99,sizeof pole);  // pocz. ust. pol tablicy na '99'
    al_set_target_bitmap(gwiazda);
    al_draw_bitmap_region(el,144,164,66,66,0,0,0);
    al_set_target_bitmap(al_get_backbuffer(okno));
}
void mouse()
{
    mz=0;                           // zadeklarowana strefa na korej jest strzalka
    mx=myszka.x;                    // miejsce strzalki 'x'
    my=myszka.y;                    // miejsce strzalki 'y'
    mb=myszka.buttons;              // klawisz myszki '0,1,2,3'
    al_get_mouse_state( & myszka);  // czy? wcisniety klawisz myszki
    for(int i=0; i<3; ++i)          // strefy przycisków
        if(mx>860 && mx<860+140 && my>395+i*50 && my<395+i*50+40)  mz=i+1;
}
void intro()
{
    int b=0;
    al_play_sample(samp0, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
    for(int i=0; i<500; ++i)
    {
        al_get_keyboard_state(&klaw);
        if(al_key_down(& klaw, ALLEGRO_KEY_ESCAPE)) break; // opuszczenie Intro
        ++b;
        if(i%100==0)  b=0;
        al_clear_to_color(al_map_rgb(0,5,5));
        if(i<100)          al_draw_scaled_bitmap(ee,0,0,285,410,-150+b*4,-50+b*2,285,810-b*4,0);
        if(i>99)           al_draw_scaled_bitmap(ee,0,0,285,410,-150+400,150,285,410,0);
        if(i>100 && i<200) al_draw_scaled_bitmap(ee,0,411,285,410,800-b*4,50+b*2,285,810-b*4,0);
        if(i>199)          al_draw_scaled_bitmap(ee,0,411,285,410,800-400,250,285,410,0);
        if(i>200 && i<300) al_draw_scaled_bitmap(ee,286,0,285,410,-150+b*4,-50+b*2,285,810-b*4,0);
        if(i>299 )         al_draw_scaled_bitmap(ee,286,0,285,410,-150+400,150,285,410,0);
        if(i>300 && i<400) al_draw_scaled_bitmap(ee,286,411,285,410,800-b*4,50+b*2,285,810-b*4,0);
        if(i>399)          al_draw_scaled_bitmap(ee,286,411,285,410,800-400,250,285,410,0);
        if(i>350)  al_draw_text(ff,al_map_rgb(122,122,22),600,500,0,"v.1.1 (2021)");
        al_flip_display();
        al_rest(0.003);
    }
    al_rest(1);
    for(int i=0; i<44; ++i)  // scieminianie obrazu
    {
        al_draw_tinted_scaled_bitmap(el,al_map_rgba(0,0,0,i),80,a,10,10,100,100,800,600,0);
        al_flip_display();
        al_rest(0.05);
    }
}
void wczytaniebazy()
{
    fstream plik;
    string data;
    plik.open("C:Users/Public/bank.txt", ios::in ), plik>>data,plik>>bank; //
    plik.close();
    //--- rozszyfrowanie i załadowanie bazy słów -----
    plik.open("media/bazaH.txt", ios::in ); // otwarcie pliku
    getline( plik, data);                   // załadowaiie zaszyfrowanej bazy
    plik.close();
    int d=data.size();                      // wielkość pliku
    plik.open("media/pxx.txt", ios::out );             // plik tymczasowy
    for(int i=0; i<d; ++i)  plik << char(data[i]-11);  // rozszyfrowanie
    plik.close();
    plik.open("media/pxx.txt", ios::in );              // ładowaiie rozszyfrowanej bazy
    while(!plik.eof())  ++ih, getline(plik,h[ih],'q'); // ładowanie bazy do tablicy h[], 'q' to separator
    plik.close();
    // remove("media/pxx.txt");                           // usunięcie pliku tymczasowego
    // --  zlicza linie zadań/opisów obrazków ---
    plik.open("media/data.txt", ios::in );
    while(!plik.eof())  ++zad, getline(plik,ht[0]);
    plik.close();
}
void wsp_pul_tablicy()
{
    int b=0;
    for(int j=0; j<7; ++j)
        for(int i=0; i<5; ++i)
            px[b]=x+a*j, py[b]=y+a*i, ++b;
}
void losowanie() // losowanie słów tylko 5-literiwych i pozbycie sie znaków Unicode i zastąpienie ich dużymi literami
{
    int los=0, v=0, c=0, c2=0, b=0 ;
    string aa="", a="";
    wybrane="";
    for(int i=0; i<7; ++i)  sf[i]=""; // czyszczenie
    while(1)
    {
        los= rand()% ih; // losowanie
        aa=h[los];       // wybrane słowo
        v=0;
        //----  wymiana liter Unicode na duże znaki -------------
        while(1)
        {
            c=(int) aa[v];
            if(c<0)
            {
                c2= (int) aa[v+1]; // druga liczba znaku unicode
                if(c==(-60) && c2==(-123)) a="A";
                if(c==(-60) && c2==(-121)) a="B";
                if(c==(-60) && c2==(-103)) a="C";
                if(c==(-59) && c2==(-126)) a="D";
                if(c==(-59) && c2==(-124)) a="E";
                if(c==(-61) && c2==(-77) ) a="F";
                if(c==(-59) && c2==(-101)) a="G";
                if(c==(-59) && c2==(-70) ) a="H";
                if(c==(-59) && c2==(-68) ) a="I";
                c=0,c2=0;
                // skasowaninie dwuch miejsc znaku unicode i wstawienie w to miejsce
                // znaku zmiennej 'a' i cofnięcie 'licznika pozycji zmiennej 'aa' o 1.
                aa.erase(v,2), aa.insert(v,a), --v;
            }
            ++v;
            if(v>aa.size())  break;
        }//---------------------------------------------
        if(aa.size()==5)
        {
            sf[b]=h[los];  // oryginalne słowa z bazy na potrzeby Finału
            wybrane+=aa;   // za zmienionymi znakami na potrzeby gry
            ++b;           // kolejne słowo
        }

        if(b>6)  break;
    }
}
void Szykowanie_tablicy()
{
    //--- losowanie i ładowanie obrazka ---
    int los=0,v=0;
    while(1)
    {
        los = rand()% zad;
        nrwz[runda]=los;
        v=0;
        for(int i=0; i<runda; ++i)
            if(los==nrwz[i]) ++v;
        if(v==0) break;
    }
 //   los=271;?????????????????????????
    string tmp, str, dd;
    itoa(los, (char*)tmp.c_str(), 10);
    str = tmp.c_str();
    dd="media/obrazki/"+str+".jpg";
    obr = al_load_bitmap(dd.c_str());  // wybrany obrazek
    //----------------------
    fstream plik;
    //--- teksty obrazka ----
    plik.open("media/data.txt",ios::in) ;
    for(int j=0; j<zad; ++j)
    {
        // załadowanie i rozdzielenie tekstu obrazka
        if(j==los) for(int i=0; i<6; ++i)  getline(plik,ht[i],'/');
        //
        if(j>los) break;
        getline(plik, dd) ;
    }
    plik.close();
    //-------------------------
    //--- szykowanie liter tablicy ------
    if(fin==0)  losowanie();
    string aa=wybrane;
    int c=0;
    for(int i=0; i<35; ++i)
    {
        c= (int)wybrane[i];
        if(c>96)   pole[i]=c-97; // nr znaków do tablicy od 0-26
        if(c<96)   pole[i]=c-39; // nr znaków do tablicy od
    }
    //--------------------------------------
    //--- mieszanie tablicy ---
    int p1=0, p2=0, z=0, b=0;
    // cykle mieszania
    while(1)
    {
        p1=rand()% 34, p2=rand()% 34;
        if(p1!=p2)  z=pole[p1], pole[p1]= pole[p2], pole[p2]=z, ++b;
        if(b>50)   break;
    }
    //------------------------------
    for(int i=0; i<35; ++i)  kop[i]=pole[i];  // kopia tablicy

    ///============= final ==============
    if(fin==1)
    {
        //--- bonusy ---
        int  bb[]= {5,5,5,10,10,20,20,30,30,40,40,50,75,100,200,1};  // --- bonusy tablicy
        los=0, b=0;
        for(int i=0; i<35; ++i)
        {
            los=rand()% 15;
            kop[i]=bb[los];
        }
        los=rand()% 30, kop[los]=0;
        //---------------------------
        //--- tablica liter ----
        int c=0;
        for(int i=0; i<35; ++i)
        {
            c= (int)wybrane[i];
            if(c>96)   pole[i]=c-97; // nr znaków do tablicy od 0-26
            if(c<96)   pole[i]=c-39; // nr znaków do tablicy od
        }
        //--------------------------------------
        //--- mieszanie liter tablicy kolumnami ---
        for(int i=0; i<7; ++i)
        {
            int p1=0, p2=0, z=0, b=0;
            while(1)
            {
                p1=rand()% 5+i*5, p2=rand()% 5+i*5;
                if(p1!=p2)  z=pole[p1], pole[p1]= pole[p2], pole[p2]=z, ++b;
                if(b>33 )   break;
            }
        }
    }//-------------------------
}
void plan( int ok, int start, int cw)
{
    ALLEGRO_COLOR kz=al_map_rgb(22,222,22), ks=al_map_rgb(166,166,166), kc=al_map_rgb(111,111,111);
    al_draw_bitmap(tlo,0,0,0);  // tło gry - plan
    if(fin==0)
    {
        // skalowanie niewłaścuiwego obrazka
        al_draw_scaled_bitmap(obr,0,0,al_get_bitmap_width(obr),al_get_bitmap_height(obr),x,y,560,400,0) ;
        // ---
        al_draw_textf(ff,al_map_rgb(20,200,18),122,92,1,ht[1].c_str());           // kat.
        if(ok<3)  al_draw_textf(ff,al_map_rgb(22,22,22),530 ,32,1,ht[2].c_str());  // opis obrazka
        if(ok==3) al_draw_textf(ff,al_map_rgb(22,22,22),530 ,32,1,ht[3].c_str());  // hasło
    }
    if(fin==1) ///=== gra finałowa
    {
        al_draw_tinted_scaled_bitmap(el,al_map_rgba(30,50,30,50),100,a,5,5,0,0,1024,768,0);  // tło gry - plan
        al_draw_bitmap_region(tlo,16,41,212,548,16,41,0);
        al_draw_bitmap_region(tlo,242,20,595,514,242,20,0);
        al_draw_bitmap_region(tlo,243,546,596,62,243,546,0);
        al_draw_scaled_bitmap(tlo,20,50,5,5,23,45,200,90,0);  // tło pod napis 'FINAL'

        al_draw_bitmap_region(el,0,225,150,50,55,70,0);

        //      al_draw_textf(f40,kz,125,70,1,"FINAŁ");               // napis 'FINAL'
        al_draw_bitmap_region(tlo,18,270,210,50,18,270-30,0); // przesunięcie lini
        al_draw_bitmap_region(tlo,18,300,208,100,18,400,0);   // tlo pod hasla
        al_draw_textf(f20,ks,122,265,1,"Ukryte hasła");       // napis
        for(int i=1; i<=7; ++i)  al_draw_textf(f20,ks,70,269+i*28,1,"%d .",i); // numery 1-7.
        for(int i=0; i<7; ++i) al_draw_bitmap_region(el,210,170,a+2,40,x+i*a-1,30,1),
            // al_draw_bitmap_region(el,150,170,58,38,x+11+i*a,34,1),
            al_draw_textf(ff,kz,x+a/2+i*a,36,1,"%d",i+1); // numery na górnej belce
        for(int i=0; i<7; ++i)
        {
            if(fnr[i]==1)  al_draw_text(ff,kz,95,291+i*28,0,fhas[i].c_str());  // odgadnięte h.
            if(fnr[i]==0 && ok==5)  al_draw_text(ff,kc,95,291+i*28,0,sf[i].c_str()); // nieodgadnięte
        }
        //--- napis Magia Liter ---
        al_draw_scaled_bitmap(ee,286,0,285,410,840,30,285-130,410-180,0);
        al_draw_scaled_bitmap(ee,286,411,285,410,880,130,285-130,410-180,0);
    }
    //-----------------------------------
    int y=155, x=216;
    al_draw_textf(f20,al_map_rgb(199,199,199),x,y,2,"%d",ih);       // wielkość bazy
    al_draw_textf(f20,al_map_rgb(199,199,199),x,y+30,2,"%d",zad);   // ilość zadań / obrazków
    al_draw_textf(f20,al_map_rgb(20,200,80),x,y+60,2,"%d",bank);    // kasa w banku
    if(bank==0) al_draw_textf(f20,al_map_rgb(200,20,80),x,y+60,2,"%d",bank);    // kasa w banku
    if(fin==0)  al_draw_textf(ff,al_map_rgb(200,200,20),122,y+140,1,"Runda: %d",runda); // rnuda

    //--- lampki wskaźnik zadań -  szary, zielony, czerwony
    for(int i=1; i<=runda; ++i)
        if(runda>0 && fin==0)
            al_draw_scaled_bitmap(el,10+lampki[i]*10,a,5,5,21+i*15,470,10,20,0);
    //--------------------------

    ALLEGRO_COLOR kk, k1=al_map_rgba(30,30,30,1);
    int bb=7;   // szerokość poświaty bloku ngracza
    if(fin==1)  bb=10;
    for(int i=0; i<3; ++i)   // blok gracza i przyciski
    {
        if(i==gr)  kk=al_map_rgb(200,200,200);  // gdy aktualny gracz
        if(i!=gr)  kk=al_map_rgb(133,133,133);  // gdy nie  ''
        if(i==gr) for(int b=0; b<bb; ++b)                               // poświata
                al_draw_tinted_scaled_bitmap(el,k1,20,a,5,5,100+i*300-b*2,650-b*2,252+b*4,62+b*4,0);  // blok gracza

        al_draw_scaled_bitmap(el,0,100,252,62,100+i*300,650,252,62,0);  // blok gracza
        al_draw_textf(f40,kk,115+i*300,658,0,abc[i].c_str());           //nr gracza
        al_draw_textf(f40,kk,330+i*300,660,2,"%d",g[i]);                //pkt gracza
        // rozjaśnienie aktywnego bloku gracza
        if(i==gr)   al_draw_tinted_scaled_bitmap(el,al_map_rgba(40,40,99,1),20,a,5,5,100+i*300,650,252,62,0);
        //--- przyciski ---
        kk=al_map_rgb(133,133,133);   // kolor szary
        al_draw_scaled_bitmap(el,0,163,140,40,860,395+i*50,140,40,0);   // przycisk
        al_draw_textf(f20,kk,930,404+i*50,1,abc[i+3].c_str());          // tekst
    }
    // podświetlenie aktywnych przycisków
    if(mz>0 && fin==0)  al_draw_textf(f20,al_map_rgb(199,199,199),930,404+mz*50-50,1,abc[mz+2].c_str());  //
    if(mz==3 && fin==1)  al_draw_textf(f20,al_map_rgb(199,199,199),930,404+mz*50-50,1,abc[mz+2].c_str());  //

    // --- wskaźnik czasu ---
    al_draw_scaled_bitmap(el,0,a,5,20,32,553,184-4,13,0);   // 5-ziel 0-czerwony
    al_draw_scaled_bitmap(el,10,a,5,20,32,553,cw*1.5,13,0); // czarny
    // małe kwadraciki
    if(pech>0 && pech<4)
        for(int i=0; i<pech; ++i)  al_draw_bitmap_region(el,20,a+10,9,9,240-1,551+i*14,0); //zółte
    if(pech>2 && pech<4 && ok==0)
        for(int i=0; i<pech; ++i)  al_draw_bitmap_region(el,41,a+1,9,9,240-1,551+i*14,0);// czerwone
}
void tablica()
{
    ALLEGRO_COLOR  k=al_map_rgb(199,199,99);
    if(fin==0) // skalowanie obrazka jeśli niewymiarowy  --- al_draw_bitmap(obr,x,y,0),
        al_draw_scaled_bitmap(obr,0,0,al_get_bitmap_width(obr),al_get_bitmap_height(obr),x,y,560,400,0) ;
    int r=65;
    for(int i=0; i<35; ++i)
    {
        if(fin==1) ///===
        {
            if (kop[i]==0)  al_draw_textf(f40,al_map_rgb(222,66,22),px[i]+a/2,py[i]+16,1,"X");
            if (kop[i]>0)   al_draw_textf(ff,k,px[i]+a/2,py[i]+22,1,"%d",kop[i]);
        }
        if(pole[i]<90 && fin==0)  al_draw_scaled_bitmap(el,pz[i]*a,0,a,a,px[i],py[i],a,a,1);  // pola
        if(pole[i]<90 && fin==1)  al_draw_scaled_bitmap(el,(pz[i]+3)*a,2,a,a-4,px[i]+2,py[i],a-4 ,a,1);  // pola

        if(pole[i]<90)   al_draw_bitmap_region(lit,pole[i]*r,0,r,r+8,px[i]+7,py[i]+1,0); // litery
    }
}
void czasRundy(int &cr)
{
    if(fin==1) return;
    //--- zegar ---
    int  dx=230,ty=350;
    ALLEGRO_COLOR kz = al_map_rgb(20,200,80);  //zielony
    al_draw_textf(f40,kz,dx/2+10, ty-2,2,":");
    al_draw_textf(f40,kz,dx/2+54,ty,2,"%d",cr%60);                    // 00:0x
    if(cr%60<10)  al_draw_textf(f40,kz,dx/2+54,ty,2,"0%d",cr%60);     // 00:x0
    if(cr/60<10)  al_draw_textf(f40,kz,dx/2+10, ty,2,"0%d ",cr/60);   // 0x:00
    if(cr/60>9)   al_draw_textf(f40,kz,dx/2+10, ty,2,"%d ",cr/60);    // x0:00
    // --- bonudy czasowe ---
    dx=215, ty=155+90;
    if(cr>0 && cr<61) bonus=150 ;
    if(cr>60 && cr<121) bonus=100;
    if(cr>120)  bonus=50;
    if(cr>180 or cr==0)  bonus=0;
    al_draw_textf(f20,kz,dx,ty,2,"%d",bonus);
}

void finx(int ok, int start, int cw)
{
    al_set_target_bitmap(buf);

    plan(ok,start,cw);
    tablica();
    int  x=540, y=484;
    ALLEGRO_COLOR k1=al_map_rgb(140,40,40), k2=al_map_rgb(0,20,20), kk=al_map_rgb(200,200,200);
    al_play_sample(samp8,0.8,0.0,1.2,ALLEGRO_PLAYMODE_ONCE,NULL);
    int tx=20;
    if(pech<100)  tx=tx*2;
    if(pech>9 && pech<100)  tx=tx*3;
    if(pech>99 && pech<1000)  tx=tx*4;
    if(pech>999)  tx=tx*5;
    al_draw_textf(ff,k1, 820-tx,484,2,"Zabieramy Ci te:") ;
    al_draw_textf(ff,k2, 820,484,2,"%d ",pech) ;
    float zw=0.001;
    x=216,  y=155;
    al_set_target_bitmap(al_get_backbuffer(okno));
    for(int i=0; i<pech; ++i)
    {
        al_draw_bitmap(buf,0,0,0);
        --g[gr];
        ++bank;
        if(pech-i<100) zw=0.01;
        if(pech-i<10) zw=0.05;
        al_play_sample(samp7, 0.5, 0.0,0.5,ALLEGRO_PLAYMODE_ONCE,NULL); // ?????????
        al_draw_bitmap_region(tlo,160,212,61,28,160,212,0);
        al_draw_textf(f20,al_map_rgb(20,200,80),x,y+60,2,"%d",bank);    // kasa w banku
        al_draw_scaled_bitmap(el,260,100,5,5,205+gr*300,665,133,33,0);
        al_draw_textf(f40,kk,330+gr*300,660,2,"%d",g[gr]);     //pkt gracza
        al_flip_display();
        al_rest(zw );
    }
    pech=0;
}

void wpisywanie_z_klawiatury( int &vh , int &rr, int &ok, int &br, int &cw, int &zn, int &cr, string &wp, int start)
{
    ALLEGRO_EVENT_QUEUE * event_queue = al_create_event_queue();
    al_register_event_source( event_queue, al_get_keyboard_event_source());
    al_play_sample(samp7, 1.0,0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL); //
    int kod=0;                   // nr znaku ASCII
    char c=0;                    // znak w/g kodu
    wp="";                       // wpisywane słowo
    vh=0,rr=0, ok=0;             // licznik liter w słowie i...
    int zk=0;                    // zwolnienie klawisza
    int b=0;                     // właściwy klawisz
    br=0;                        // brakująca litera
    string zz="";                // polska litera
    int nz=0;                    // numer znaku/literki
    int tx=260, ty=545, d=42;    // wsp. dla pola wpisu
    double czas = al_get_time(); // zegar
    cw=0;                        // licznik czasu wpisywania
    int kp[35];         // kopia tablicy 'pole[]'
    for(int i=0; i<35; ++i)  kp[i]=pole[i];  // kopiowanie tablicy
    zn=99;
    int k=0;                     // zmienna dla kursora
    fstream plik;
    plik.open("nowe_slowa.txt", ios::out|ios::app);
    double czasR = al_get_time();
    int los=0, zap=0, kas=0, z=0, pp[9];  // dla zapalania liter
    float zw=0.001;                       //
    int dt=0;                             //długosc wpisanego tekstu w px.
    int fk=0;                             // nr kolumny we finale
    int ww=0;                             // licznik premii za hasło w finale
    if(fin==1 or (fin==0 && ok==2))  al_play_sample(samp9, 0.6, 0.0,1.0,ALLEGRO_PLAYMODE_LOOP,NULL);
    int puste=0, suma=0;
    for(int i=0; i<35; ++i)  if(pole[i]==99) ++ puste;
    int x=0;
    //--- ZNAKI Z KLAWIATURY---
    while(!al_key_down(& klaw, ALLEGRO_KEY_ESCAPE ))
    {

        plan(ok,start,cw);
        tablica();
        if(ok==2) al_draw_scaled_bitmap(el,60,a,10,10,250,551,582,50,0); // tlo wpisu czarne
        if(ok==0)  al_draw_textf(ff,al_map_rgb(20,20,120),530,484,1,"wpisz słowo");
        if ( al_get_time() > czasR + 1 )  ++cr, czasR = al_get_time();
        czasRundy(cr);
        //--- zasłanianie przycisków
        if(fin==0)   for(int i=0; i<3; ++i)  al_draw_tinted_scaled_bitmap(el,al_map_rgba(100,100,100,150),80,a,5,5,860,395+i*50,140,40,0);
        if(fin==1)   for(int i=0; i<2; ++i)  al_draw_tinted_scaled_bitmap(el,al_map_rgba(100,100,100,150),80,a,5,5,860,395+i*50,140,40,0);
//---
        al_get_keyboard_state( & klaw );        //sprawdza czy >wcisniety klawisz
        al_get_next_event( event_queue, & ev );
        kod =  ev.keyboard.unichar;
        if(kod>64 && kod<97) kod=kod+32;  // zamiana dużych liter na małe ( przy włączonym 'CapsLocku')
        c=kod;
        if(kod>96 && kod<123 && ok<10)  wp=wp+c, nz=kod-97;  //kolejna litera (nie polska
        if(kod==32 && ok==2)   wp=wp+c;             // spacja
        // polskie z prawym altem z 'CapsLockiem' i bez
        if (kod==260 or kod==261)  zz="ą", nz=26;
        if (kod==262 or kod==263)  zz="ć", nz=27;
        if (kod==280 or kod==281)  zz="ę", nz=28;
        if (kod==321 or kod==322)  zz="ł", nz=29;
        if (kod==323 or kod==324)  zz="ń", nz=30;
        if (kod==211 or kod==243)  zz="ó", nz=31;
        if (kod==346 or kod==347)  zz="ś", nz=32;
        if (kod==377 or kod==378)  zz="ź", nz=33;
        if (kod==379 or kod==380)  zz="ż", nz=34;
        if((kod>64 && kod<123) or kod>200)  b=1;    // jeśli wybrano własciwy klawisz
        if(kod>200 && ok<20)  wp=wp+zz;                    // dodanie 'polskiej' litery
        if(kod==8 or kod==127 or (kod>64 && kod<123) or kod>200 or kod==32)
            al_play_sample(samp7, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
        hh[vh]=nz;  // numery wpisanych znaków
        //--- cofanie litery ---  Bakspace i Delette
        if((kod==8 or kod==127) && vh>0)  wp.resize(wp.size()-1), --vh;  // minus jeden znak
        if((kod==8 or kod==127) && ok==2 && wp.size()>0)  wp.resize(wp.size()-1);
        //-----------------------
        if(wp.size()>13 && ok<2) wp.resize(wp.size()-1), --vh; // limit znaków słowa
        //--- wstawianie liter do pola wpisu ---
        if(vh>0 )  for(int i=0; i<vh; ++i)  al_draw_bitmap_region(lit,hh[i]*52,80,52,62,tx+i*d,ty,0);
        if(b>0 && ok==0)  ++vh, b=0;

        //--- kursor ---
        ++k;
        if(k>400) k=0;
        if(k<201 && ok==0)  al_draw_text(f40,al_map_rgb(20,60,120),268+vh*d,552,0,"_");
        if(k>200 && ok==0)  al_draw_text(f40,al_map_rgb(140,160,220),268+vh*d,552,0,"_");
        // dla wpisywania hasła
        dt= al_get_text_width ( f40, wp.c_str() ) ;  // długość tekstu w pikselach
        if(k<201 && ok>0)   al_draw_text(f40,al_map_rgb(20,60,120),265+dt,550,0,"_");
        if(k>200 && ok>0)   al_draw_text(f40,al_map_rgb(140,160,220),265+dt,550,0,"_");
        //---------------

        if(puste>31) // ddy za mało liter do układania słowa
        {
            pech=4;  ///;;;;;;;;;;;;;;;;;;;;;;;;;;;
            return;
        }//
        zw=0.001; //czas na oddech procka
        //
        if(fin==0)
        {
            //--- zatwierdzenie słowa -------
            if(kod==13 && wp.size()>3 )
            {
                b=0,  rr=vh;
                //--- sprawdza słowo w dostępnej bazie --
                for(int i=0; i<ih; ++i)
                    if(wp==h[i] && vh>0)
                    {
                        ok=1;
                        break;
                    }
                if(ok==0 )  ++pech, plik<<wp<<endl;  // do bazy nieznane słowo = chwilowe do skutku
                if(ok==0 )    // gdy nieznane słowo
                {
                    al_play_sample(samp10, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
                    ++gr;
                    return;
                }
                //=-- sprawdza słowo z tablicą dla gry ------
                for (int j=0; j<vh; ++j)
                    for(int i=0; i<35; ++i)
                    {
                        if(hh[j]==kp[i])
                        {
                            kp[i]=99, ++b;
                            break;
                        }
                        if(i>=34 && br==0)  br=hh[j]+1, zn=j; // brakujaca litera
                    }
                if(b<vh)
                {
                    ++pech, ++gr;
                    al_play_sample(samp3, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
                    return;   // gdy brakuje litery na planszy
                }
            }
            //--- kasowanie ---------------------
            if(vh>0 && kas==1 && ok==1 && br==0 )
            {
                int w=wp.size();
                if(vh==w)  al_play_sample(samp2,1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,0), al_rest(0.001);
                for(int i=0; i<35; ++i)
                    if(pz[i]==1 && pole[i]<66)
                    {
                        pz[i]=0, pole[i]=99;  // zmiany w tablicaach
                        --vh;
                        ++g[gr];  // punkty gracza
                        if(vh==0)
                        {
                            z=0, ok=2, kas=0, zap=0, wp="", b=0, pech=0 ;
                            if(cw>60) cw=60;  // dodatkowy czas
                            if(fin==0)      al_play_sample(samp9, 0.4, 0.0,1.0,ALLEGRO_PLAYMODE_LOOP,NULL);
                        }
                        break;
                    }
                zw=0.1;
            }
            //-----------------------------
            //--- zapalanie ---
            if(zap>0)  al_draw_textf(ff,al_map_rgb(20,20,120),510,484,1," %d pkt",zap);
            if(zap<vh && ok==1 && kas==0)  // zapalanie
            {
                z=0, los=0;
                for(int i=0; i<35; ++i)                 // tablica pół z literami
                    if(hh[zap]==kop[i])  pp[z]=i, ++z;  // zlicza i zapisuje te same litery
                los=rand()% z;                          // wybiera lterke jeśli jest więcej
                pz[pp[los]]=1;
                kop[pp[los]]=99;
                ++zap;
                if (zap>=vh) kas=1;
                zw=0.8;
                al_play_sample(samp1, 0.7, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
                tablica();
            }
            //---------------------
            //--- odgadywanie haSŁA ---
            if(ok==2)
            {
                al_draw_textf(ff,al_map_rgb(20,20,120),530,484,1,"Odgadnij hasło");
                // --- kasowanie  zbędnych spacji ---
                char ch=(32);
                if(wp[0]==ch) wp.replace(0,1,""); // na początku

                if(wp[wp.size()-1]==ch && wp[wp.size()-2]==ch )   wp.resize(wp.size()-1),--vh;
                al_draw_textf(f40,al_map_rgb(20,220,220),260,550,0,wp.c_str()); //
                if(kod==13)
                {
                    if(wp[wp.size()-1]==ch)  wp.resize(wp.size()-1),--vh; //kasowanie ostatniej spacji
                    if (wp==ht[4] or wp==ht[5])  ok=3; // gdy dobre hasło
                }
                if(kod==13 && ok==2)    // gdy nie podano hasła
                {
                    al_stop_samples();
                    al_play_sample(samp10, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
                    ++gr;
                    zw=0.5;
                    return;
                }
            }
            // ---dobre hasło ---
            if(ok==3)
            {
                al_stop_samples();
                al_play_sample(samp4, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
              //  int bc=0;
                for(int i=0; i<bonus; ++i)
                {
                    lampki[runda]=2;
                    al_play_sample(samp7, 0.5, 0.0,0.5,ALLEGRO_PLAYMODE_ONCE,NULL);
                    plan(ok,start,cw), tablica();//
                    czasRundy(cr);
                    al_draw_textf(f20,al_map_rgb(20,200,80),215,155+90,2,"%d",bonus-i-1) ;
                    al_draw_bitmap_region(tlo,244,33,550,33,244,33,0);
                    al_draw_textf(ff,al_map_rgb(22,22,22),530 ,32,1,ht[3].c_str()); // opis obrazka
                    al_draw_textf(ff,al_map_rgb(22,22,22),530 ,484,1,"%d pkt",bonus);
                    if(i<35 && pole[i]<66)  pole[i]=99;
                    al_draw_scaled_bitmap(el,60,a,10,10,250,551,582,50,0); // tlo
                    al_draw_textf(f40,al_map_rgb(20,220,220),260,550,0,wp.c_str()); //
                    ++g[gr];

                    al_flip_display();
                    if(i<35) al_rest(0.04);
                    if(i>34) al_rest(0.02);
                }
                czasRundy(cr);
                al_rest(1);
                bonus=0;
                return;
            }
        }

        ///================= final ========================
        if(fin==1)
        {
            mouse();

            //--- zatwierdzenie słowa -------
            if(kod==13 && vh>3 && ok==0 )
            {
                //--- sprawdza słowo w dostępnej bazie --
                for(int i=0; i<ih; ++i)
                    if(wp==h[i] )
                    {
                        ok=11;  // słowo jest w bazie
                        break;
                    }
                if(ok==0 )  vh=0, wp="",al_play_sample(samp10, 0.5, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL); // nie znam takiego słowa
                //------------------------------
                //-- sprawdz słowo z tablicą dla fin ------
                if(ok==11)
                {
                    for(int i=0; i<35; ++i)  kp[i]=pole[i]; // kopiowanie tablicy
                    fk=0;
                    for(int kk=0; kk<7; ++kk)       // kolumny (hasła)
                    {
                        b=0;
                        for (int j=0; j<5; ++j)
                            for(int i=0; i<5; ++i)
                                if(hh[j]==kp[i+kk*5])
                                {
                                    pp[j]=i+kk*5;  // nr zapalanej litery
                                    kp[i+kk*5]=99;
                                    ++b;
                                    break;
                                }
                        if(b==vh)                // dobre słowo
                        {
                            ok=21;
                            break;
                        }
                        ++fk;
                        if(fk==7)  al_rest(1.3);  //pauza dla sampla
                    }
                    if(fk==7) wp="",vh=0, ok=0, b=0,fk=0, al_play_sample(samp10, 0.5, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL); // nie znam takiego słowa
                }
            }
            //-- kasowanie i premie ---

            if(ok==22)
            {
                if(z==1)  al_play_sample(samp2,0.8,0.0,1.2,ALLEGRO_PLAYMODE_ONCE,NULL);
                int traf=0;
                fhas[fk]=wp;   // trafione hasło do tablicy
                fnr[fk]=1;     // numer trafionego hasła do tablicy
                zw=0.1;        //
                if(kop[z+fk*5]>0)  suma+=kop[z+fk*5], g[gr]+=kop[z+fk*5];    // bonus dla gracza
                if(kop[z+fk*5]==0) ww=suma, pech=suma, x=1, finx(ok,start,cw);  // gdy trafiony 'X' kasa gracza do banku
                if(x==1) suma=0, x=0;
                pole[z+fk*5]=99, ++z;                            // kasowanie litery z pola
                for(int i=0; i<=7; ++i) if(fnr [i]==1) ++traf ;  // licznik trafionych haseł
                if(traf>=7 && z>=5 && cw<cz)  fin=7, zw=1;       // wszystkie hasła trafne
                if(z>4) ok=0, vh=0, wp="", b=0, z=0, fk=0;       // czyszczenie danych
            }
            //--- zapalanie ---
            if(ok==21)
            {
                al_play_sample(samp1, 0.7, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
                pz[pp[z]]=1;
                ++z;
                if(z>4) ok=22, z=0, b=0, vh=0;
                zw=0.7;
            }

            tablica();
            // premie z kolumny
            if(ww>0)   al_draw_textf(ff,al_map_rgb(144,44,44),265,484,0,"-%d ",ww);
            al_draw_textf(ff,al_map_rgb(0,20,20),820,484,2,"%d ",suma);
            if(fin==7)  break;
            if(mz==3 && mb>0 && fin==1)           return;                      // wyjscie z gry
        }
        ///================================================


        // --- odmierzanie czasu ---
        // if ( al_get_time() > czas + 0.2 && ok!=1  )  ++cw, czas=al_get_time(); // CZAS UCIEKAJĄCY
        if (fin==0 && al_get_time() > czas + 0.16 && ( ok==0 or( ok==2 && wp.size()==0 ) ) ) ++cw, czas=al_get_time();  // gracza
        if (fin==1 && al_get_time() > czas + 0.75 && ( ok==0 or( ok==22 && wp.size()==0 ) )) ++cw, czas=al_get_time(); // finał
        if(cw>=cz)
        {
            al_stop_samples();
            al_play_sample(samp6, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
            if(fin==1) fin=2, ok=5, al_rest(2);
            if(fin==0) ok=0, br=0, rr=0, wp="", ++pech, ++gr;
            return; // koniec czasu
        }
//for(int ee= 0;ee<7;++ee)  al_draw_textf(ff,al_map_rgb(144,244,44),5,ee*30,0,fnr[ee].c_str());
        al_flip_display();  // wsio na ekran
        al_rest(zw);
        //--- oczekiwanie na zwolnienie klawisza klawiatury
        zk=0;
        if(kod>13 or kod==8)
            while(1)
            {
                al_get_next_event( event_queue, &ev ); //
                kod = ev.keyboard.unichar;
                if(kod==0 || zk>100)  break;
                ++zk;
                al_rest(0.002);
            }
        //-----------
    }
}
void wypisanie_slowa(int rr, int zn)
{
    int xt=260;
    for(int i=0; i<rr; ++i)
    {
        if(zn==i) al_draw_scaled_bitmap(el,41,a+1,10,10,xt+i*42+4,548,46,56,0); // czerwone tlo pod literą
        al_draw_bitmap_region(lit,hh[i]*52,80,52,60,xt+i*42,545,0);
    }
}
void nie_znam_slowa( string wp, int &start)
{
    if(pech>3)  return;
    al_draw_scaled_bitmap(el,40,a,5,5,360,482,358,35,0);  // czerwone tło textu
    al_draw_text(ff,al_map_rgb(200,200,200),540,482,1,"Nie znam tego słowa");
}
void brak_litery(int br)
{
    al_draw_text(ff,al_map_rgb(220,220,220),500,484,1,"brakuje litery");
    al_draw_bitmap_region(lit,(br-1)*52,80,52,60,600,468,0);  // brakująca litera
}
void koniec_czasu()
{
    al_draw_text(ff,al_map_rgb(220,220,220),540,484,1,"Koniec czasu");
    al_draw_textf(ff,al_map_rgb(200,200,200),540,560 ,1,"< SPACE > to start");
}
void zle_haslo(string wp)
{
    if(wp.size()==0) al_draw_textf(ff,al_map_rgb(220,220,20),540,484,1,"Nie podano hasła");
    if(wp.size()>0)
        al_draw_scaled_bitmap(el,40,a,5,5,440,482,200,35,0),
        al_draw_textf(ff,al_map_rgb(220,200,200),540,484,1,"Złe hasło");
    al_draw_textf(ff,al_map_rgb(200,200,200),540,560 ,1,"< SPACE > to start");
}
void poczRundy( int &start)
{
    al_set_mouse_xy( okno,930,560);  // miejsce wskaźnika myszki
    al_play_sample(samp7, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);

    if(runda==12) /// ========================
    {
        if(g[0]>g[1] && g[0]>g[2])  gr=0;
        if(g[1]>g[0] && g[1]>g[2])  gr=1;
        if(g[2]>g[0] && g[2]>g[1])  gr=2;

        string aa= abc[gr];
        aa=aa .erase(0,3); // usunięcie 'rg.'
        aa="Do finału przechodzi gracz "+aa;

        for(int i=0; i<30; ++i)
        {
            al_draw_tinted_scaled_bitmap(tlo,al_map_rgba(90,90,90,90+i),20,50,5,5,22,288,195,120,0); // zasłanianie Rundy i zegara
            al_draw_scaled_bitmap(el,60,a,5,5,x,280-i,a*7,i*2,0); // ciemny pas
            al_flip_display(), al_rest(0.02);
        }
        al_draw_text(ff,al_map_rgb(120,220,220),530,265,1,aa.c_str());
        al_flip_display(), al_rest(2.1);
        fin=1;
        // ściemnianie

        for(int i=0; i<80; ++i)
            al_draw_scaled_bitmap(el,60,a,5,5,x,260,a*7,50,0),
            al_draw_tinted_scaled_bitmap(el,al_map_rgba(0,0,0,10),60,a,5,5,0,0,1024,768,0),
            al_flip_display(), al_rest(0.01 );
    } /// ======================================

    Szykowanie_tablicy(), ++runda , start=1, pech=0, lampki[runda]=1;
    int cw=0,ok=0;
    int r=65, v=0;
    while(1)
    {
        if(fin==1)  plan(cw,start,ok);
        ++v;
        for(int i=0; i<v; ++i)
        {
            if(pole[i]<90 && fin==0)   al_draw_scaled_bitmap(el,pz[i]*a,0,a,a,px[i],py[i],a,a,1);  // pola
            if(pole[i]<90 && fin==1)  al_draw_scaled_bitmap(el,(pz[i]+3)*a,2,a,a-4,px[i]+2,py[i],a-4 ,a,1);  // pola
            if(pole[i]<90)   al_draw_bitmap_region(lit,pole[i]*r,0,r,r+8,px[i]+7,py[i]+1,0);
        }
        al_play_sample(samp7, 0.5, 0.0,0.5,ALLEGRO_PLAYMODE_ONCE,NULL);
        al_flip_display();
        al_rest(0.07);
        if(v>=35)  break;
    }
    al_rest(0.5);
}
void pokaz(int &pp, float &zw, int &start)
{
    ht[2]=ht[3], lampki[runda]=3;
    al_draw_scaled_bitmap(el,20,a+10,5,5,360,482,358,35,0);  // tło textu
    al_draw_text(ff,al_map_rgb(60,60,20),530,484,1,"Runda bez odpowiedzi");
    pole[pp]=99,++pp;
    zw=0.05;
    if(pp>=35) pp=0, zw=0, start=0;
}
void info(int ok, int start, int cr, int cw)
{
    while(1)
    {
        mouse();
        plan(ok,start,cw), czasRundy(cr), tablica();
        //  al_draw_tinted_scaled_bitmap(el,al_map_rgba(50,50,50,170),a*3,0,a*2,a,200,100,200+470,100+410,0);
        al_draw_tinted_scaled_bitmap(el,al_map_rgba(50,50,50,170),20,20,5,5,200,100,200+470,100+410,0);
        al_draw_scaled_bitmap(el,300,100,160,160,200,100,200+470,100+415,0);
        ALLEGRO_COLOR kk =al_map_rgb(200,200,200);
        al_draw_text(ff,al_map_rgb(160,160,20),530,140,1,"--- Informacje o grze ---");
        int ty=190, d=25;
        al_draw_text(f20,kk,530,ty,1,"Gra na podstawie teleturnieju TV z 1996 roku."), ty+=d;
        al_draw_text(f20,kk,530,ty,1,"o tym samym tytule nadawanego w TVP2."), ty+=d+d/2;
        al_draw_text(f20,kk,530,ty,1,"Kod napisany w C++ i Allegro5 jesienią 2019 roku."), ty+=d;
        al_draw_text(f20,kk,530,ty,1,"Do stworzenia gry zachęcił mnie Krystian Jabłoński."), ty+=d+d/2;
        al_draw_text(f20,kk,530,ty,1,"Zasady gry bardzo zbliżone do ogyginału"), ty+=d;
        al_draw_text(f20,kk,530,ty,1,"Można dodawać własne obrazki z opisami"), ty+=d;
        al_draw_text(f20,kk,530,ty,1,"według zasad opisanych w pliku 'info.txt'. "), ty+=d+d/2;
        al_draw_textf(f20,kk,530,ty,1,"Baza zawiera  %d   słów - zajęło to sporo czasu.",ih), ty+=d+d;
        al_draw_text(f20,kk,530,ty,1,"Nowe słowa zapisywane są do pliku 'nowe_slowa.txt'"), ty+=d;
        al_draw_text(f20,kk,530,ty,1,"Te sprawdzone możecie przesyłać mi to dołączę do bazy. "), ty+=d+d+20;
        kk =al_map_rgb(16,166,166);
        al_draw_text(f20,kk,530,ty,1,"Autor: Marian Awgul   ( Rawicz, PL. 2019 )"), ty+=d+d;
        al_flip_display();
        al_rest(0.001);
        if(mb==0) return;
    }
}
void opis(int ok, int start,int cr, int cw)
{
    while(1)
    {
        mouse();
        plan(ok,start,cw), czasRundy(cr), tablica();
        al_draw_tinted_scaled_bitmap(el,al_map_rgba(50,50,50,180),20,20,5,5,200,30,200+470,100+610,0);
        al_draw_scaled_bitmap(el,300,100,160,160,200,30,200+470,100+615,0);
        ALLEGRO_COLOR k1=al_map_rgb(16,166,166), k2=al_map_rgb(133,166,166), k3=al_map_rgb(160,160,20);
        int tx=240, ty=93, d=25;
        al_draw_text(ff,k3,tx,53,0,"Skrócony opis i zasady gry");
        al_draw_text(f20,k3,tx,65,0,"__________________________________");
        al_draw_text(f20,k2,tx,ty,0,"Do odgadnięcia 12 haseł odsłanianego obrazka."), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Wpisujemy tylko słowa rzeczowniki w mianowniku,"), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"minimun 4-literowe i tylko z liter widocznych na tablicy ."), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Za każdą trafioną literkę 1 pkt, za hasło bonus 50-150 pkt."), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Słowa i hasła wpisywane są małymi literani."), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Czas zatrzymywany jest przy odsłanianiu obrazka, bonusów,"), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"wpisywaniu hasła i podczas korzystania z przycisków."), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Sterowanie:"), ty+=d;
        al_draw_text(f20,k1,tx,ty,0,"     SPACJA - początek gry, rundy i kontynuacja gry;"), ty+=d;
        al_draw_text(f20,k1,tx,ty,0,"     ENTER  - zatwierdzenie słowa lub hasła-odpowiedzi"), ty+=d;
        al_draw_text(f20,k1,tx,ty,0,"     BACKSPACE, DELETE - cofanie wpisanych liter"), ty+=d;
        al_draw_text(f20,k1,tx,ty,0,"     ESC - opuszczenie gry"), ty+=d;
        al_draw_text(f20,k1,tx,ty,0,"     F11  - przełączenie na pełny ekran"), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Myszka - obsługa przycisków: INFO, OPIS GRY, WYJŚCIE"), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Strata kolejki gdy: "), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"   - brak wpisanego słowa w bazie, brak litery w tablicy,"), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"   - koniec czasu lub nietrafione hasło."), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Trzy kolejki bez poprawnego słowa kończą aktualną rundę."), ty+=d;
        al_draw_text(f20,k1,tx,ty+=10,0,"Finał:.......");
        al_draw_text(f20,k2,tx+100,ty,0,"Do finału przechodzi gracz, który zdobył najwięcej"), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"punktów. Tu mamy 90 sek. na odgadnięcie i wpisanie 7 słów"), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"ukrytych w kolumnach  1-7. Kolejność odgadywania dowolna."), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"Pod każdą literką ukryty jest bonus lub utrata dotychczas"), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"zebranych punktów. Aby otrzymać szystkie utracone punkty "), ty+=d;
        al_draw_text(f20,k2,tx,ty,0,"i kasę z Banku należy odgadnąć wszystkie słowa."), ty+=d;
        al_flip_display();
        al_rest(0.001);
        if(mb==0) return;
    }
}

void koniecFin(int ok, int start)
{

    al_rest(1);
    int cw, cr;
    int v=60, f=0;
    al_stop_samples();
    if(fin==7)  f=7, al_play_sample(samp5, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,NULL);
    // --- ciemny pas ---
    for(int i=0; i<v; ++i)
    {
        al_draw_tinted_scaled_bitmap(el,al_map_rgba(0,0,0,i/3),60,a,5,5,x,270-i,a*7,i*2,0);
        al_flip_display(), al_rest(0.01);
    }
    fin=1;
    cw=120;
    float zw=0.00;

    int gw=(bank+g[gr])/120;  // początkowa ilość gwiazdek
    float gwx[gw];
    float gwy[gw], kt=0.0;
    int r[bank], licz=0;
    for(int i=0; i<gw; ++i)        // początkowe dane
        gwx[i]=rand() % (200+gw)+(412-gw/2), gwy[i]=rand() % 800-800, r[i]=rand() % 25+5;

    while(!al_key_down(& klaw, ALLEGRO_KEY_ESCAPE))
    {
        al_get_keyboard_state(&klaw);

        plan(ok,start,cw), czasRundy(cr), tablica();
        if(bank<1)   bank=0;
        if(bank==0)  ++licz, zw=0.001;
        if(licz>800)  --gw, licz=0;
        if(gw>0)  ++licz;

        //--- gwiazdki
        /// if(f==7  && gw>=0)
        {
            zw=0.005;
            ++kt;
            if(kt>360) kt=1;
            float b=0.0;
            for(int i=1; i<gw; ++i)
            {
                b=(i+r[i]*0.9)/66;
                if(i%2==0)   gwx[i]+=0.07;
                if(i%2>0)   gwx[i]-=0.07;
                gwy[i]+=0.5+0.09*r[i]/2;
                // rysowanie
                al_draw_scaled_rotated_bitmap(gwiazda,33,33,gwx[i],gwy[i],b,b,kt*3.14/180,0);
                // nowe dane po zniknięciu gwiazdy
                if(gwy[i]>800) gwy[i]=-33, gwx[i]=rand() % (200+gw)+(412-gw/2);
            }
        }
        if(gw>0)  al_draw_textf(f20,al_map_rgb(120,220,220),20,5,0,"gw: %d",gw-1);
        //----------------
        if(f==7 && bank>0)
        {

            al_draw_tinted_scaled_bitmap(el,al_map_rgba(0,0,0,180),60,a,5,5,x,280-70,a*7,140 ,0);
            al_draw_textf(f40,al_map_rgb(120,220,220),530,220,1,"GRATULACJE");
            al_draw_textf(ff,al_map_rgb(60,160,160),530,280,1,"Cała kasa z banku %d dla Ciebie",bank);
            ++g[gr], --bank;
            if(bank>1000)              zw=0.0;
            if(bank>100 )  zw=0.001;
            if(bank>10 )    zw=0.005;
            if(bank>    0 )               zw=0.01;
            if(gw>0)  al_draw_textf(f20,al_map_rgb(120,220,220),20,5,0,"gw: %d",gw-1);
        }
        if(bank==0 and gw>0)   zw=0.01;
        if(f==0 or bank==0)
        {
            al_draw_tinted_scaled_bitmap(el,al_map_rgba(0,0,0,180),60,a,5,5,x,270-50,a*7,100,0);
            al_draw_textf(ff,al_map_rgb(120,220,220),530,230,1,"Twoja wygrana to:  %d  zł",g[gr]);
            al_draw_textf(ff,al_map_rgb(60,160,160) ,530,275,1,"Nowa gra  T / N");
            if(gw>0)  al_draw_textf(f20,al_map_rgb(120,220,220),20,5,0,"gw: %d",gw-1);
        }

        //--- nowa gra ---
        if( al_key_down(& klaw, ALLEGRO_KEY_T)) // nowa gra
        {
            for(int i=0; i<44; ++i)  // scieminienie obrazu
            {
                al_draw_tinted_scaled_bitmap(el,al_map_rgba(0,0,0,i),80,a,10,10,0,0,1024,768,0);
                al_flip_display();
                al_rest(0.01);
            }
            fin=3;
            // czyszczenie tablic
            memset(pole,99,sizeof pole);
            memset(lampki,0,sizeof lampki);
            memset(fhas,0,sizeof fhas);
            memset(fnr,0,sizeof fnr);
            memset(pz,0,sizeof pz);
            memset(g,0,sizeof g);
            bonus=0;
            for(int i=1; i<5; ++i)  ht[i]="";
            al_set_target_bitmap(obr);
            al_draw_bitmap_region(tlo,px[0],py[0],a*7,a*5,0,0,0);
            al_draw_textf(f40,al_map_rgb(20,180,20),280,180,1,"Nowa Gra");
            al_set_target_bitmap(al_get_backbuffer(okno));
            al_stop_samples();
            return;
        }

        //---  opuszczenie gry ---
        if( al_key_down(& klaw, ALLEGRO_KEY_N))  // opuszczenie gry
        {
            fin=5;
            al_stop_samples();
            return;
        }
        al_flip_display();
        al_rest(zw);
    }
}

void koniec()
{
    al_save_bitmap("pic.png",obr);
    fstream plik;
    plik.open("C:Users/Public/bank.txt", ios::out ), plik<<"123",plik<<" ",plik<<bank; //
    plik.close();
    for(int i=0; i<50; ++i)
        al_draw_tinted_scaled_bitmap(el,al_map_rgba(0,0,0,10),60,a,5,5,0,0,1024,768,0),
        al_flip_display(), al_rest(0.005 );
    al_clear_to_color(al_map_rgb(0,0,0));
    al_destroy_display( okno );   // kasowanie bitmap
    al_destroy_bitmap ( el );
    al_destroy_bitmap ( ee );
    al_destroy_bitmap ( lit );
    al_destroy_bitmap ( obr );
    al_destroy_bitmap ( tlo );
    al_destroy_bitmap ( gwiazda );
    al_destroy_font ( ff );
    al_destroy_font ( f20 );
    al_destroy_font ( f40 );
    al_destroy_sample ( samp0 );
    al_destroy_sample ( samp1 );
    al_destroy_sample ( samp2 );
    al_destroy_sample ( samp3 );
    al_destroy_sample ( samp4 );
    al_destroy_sample ( samp5 );
    al_destroy_sample ( samp6 );
    al_destroy_sample ( samp7 );
    al_destroy_sample ( samp8 );
    al_destroy_sample ( samp9 );
    al_destroy_sample ( samp10 );
}

int main()
{
    int ekr=0;
    init(ekr);
    intro();
    ALLEGRO_EVENT_QUEUE * event_queue = al_create_event_queue();  // zdarzenia
    al_register_event_source( event_queue, al_get_keyboard_event_source());
    int vh=0, rr=0; // długość słowa
    int ok=0;       // znane/nieznane słowo
    int br=0;       // brakująca litera
    int  cw=0, zn=99;
    float zw=0.001;         // wskażnik zwolnienia procesora
    string wp;              // wpisywane słowo
    double czasR = al_get_time(); // zegar rundy
    int cr=0;                     // czs rundy
    int start=0; //
    wczytaniebazy();
    wsp_pul_tablicy();
    int pp=0;  //
    int ccc=0; // litery pozostałe do wygaszenia
    int zz=0; // zaczynamy...
    ALLEGRO_COLOR k1=al_map_rgb(20,180,20), k2=al_map_rgb(200,200,200);
    int gw=99;
    float gwx[gw];
    float gwy[gw];
    float sz[gw], kt=0.0;
    int r[gw];

    float v=0.000;
    int b=1000;
    for(int i=0; i<100; ++i) v+=0.001, b=b-10;

    while(!al_key_down(& klaw, ALLEGRO_KEY_ESCAPE))
    {
        al_get_keyboard_state(&klaw);
        mouse();
        if(al_key_down( & klaw, ALLEGRO_KEY_F11) && ekr==0)       // zmiana wielkości ekranu
            koniec(), ++ekr, init(ekr), obr = al_load_bitmap("pic.png");
        plan(ok,start,cw), czasRundy(cr), tablica();         // rysowanie
        if(zz==0)  al_draw_textf(f40,k1,540,250,1,"No to... zaczynamy");;
        if(start==0)  cr=0, al_draw_textf(ff,k2,540,560,1,"< SPACE > to start");
        if(start==0 && al_key_down(& klaw, ALLEGRO_KEY_SPACE))  poczRundy(start),zz=1; //
        zw=0.01;                                                     // jednostka czasu
        if(al_get_time()> czasR +1 && start>0)  ++cr, czasR = al_get_time();  // czas

        if(al_key_down(& klaw, ALLEGRO_KEY_SPACE))
            wpisywanie_z_klawiatury(vh,rr,ok,br,cw,zn,cr,wp,start);  // wpisywanie z klawiatury

        if(fin==2 or fin==7)       koniecFin(ok,start );             // koniec gry
        if(fin==3) ok=0,cw=0,vh=0,start=0,pech=0,runda=0,gr=0,fin=0; // nowa gra
        if(fin==5)  break;                                           // opuszczenie gry
        if (gr>2) gr=0;
        if(ok==3) start=0;
        if(vh>0)                    wypisanie_slowa(rr,zn);     // wypisanie słowa
        if(vh>0 && ok==0 && cw<90)  nie_znam_slowa(wp,start);   // brak w bazie
        if(br>0 && vh>0)            brak_litery(br);            // brak litery na tablicy
        if(cw>=cz)                  koniec_czasu();             // koniec_czasu
        if(pech>3 && start>0)       pokaz(pp,zw,start), vh=0;   // nie odgadnięto hasła
        if(ok>1 && wp!=ht[4] && wp!=ht[5] )  zle_haslo(wp);     // złe lub nie podano hasła
        if(mz==1 && mb>0)           info(ok,start,cr,cw);       // info
        if(mz==2 && mb>0)           opis(ok,start,cr,cw);       // opis
        if(mz==3 && mb>0)           break;                      // wyjscie z gry
        //-------------------------------
        al_flip_display();
        al_rest(zw);
    }
    fstream plik;
    koniec();
    remove("pic.png");
    return 0;
}
