#include <allegro.h>
#include <string>
#include <fstream>
using namespace std;
//wymiary
const int WXp = 800, WYp = 600, SKALA = 2;
const int WX = WXp/SKALA;
const int WY = WYp/SKALA;
char rlimit = 30, glimit = 30, blimit = 30;
/////////////////////////
volatile long speed = 0;
void increment_speed()
{
speed++;
}
END_OF_FUNCTION(increment_speed);
LOCK_VARIABLE(speed);
LOCK_FUNCTION(increment_speed);
/////////////////////////
volatile int close_button_pressed = FALSE;
void close_button_handler(void)
{
close_button_pressed = TRUE;
}
END_OF_FUNCTION(close_button_handler)
//////////////////////////
class wzory
{
public:
string nazwa;
short int * dane;
int rozmiar;
wzory() {};
wzory(string nazwa, int limit, bool & ok) : nazwa(nazwa)
{
string nazwapliku = nazwa + ".ogl";
ifstream plik;
plik.open( nazwapliku.c_str() );
plik >> rozmiar;
dane = new short int[rozmiar];
short int x;
if( plik.good() )
{
for(int i=0; i<rozmiar; i++)
{
plik >> x;
dane[i] = x;
}
ok = true;
}
else
{
ok = false;
}
plik.close();
}
};
class rgb
{
public:
unsigned short int r:5, g:5, b:5, a:1;
};
union puszka
{
rgb kolor;
unsigned short int i;
};
int mx=0,my=0,mb=0;
void myszka();
int kolor(puszka p);
void narysuj(puszka [WX][WY], wzory &);
void init();
/////////////////////////////////////////////////////////
int main()
{
allegro_init();
init();
BITMAP *bufor = NULL;
puszka baza[WX][WY];
puszka bazaBufor[WX][WY];
for(int x=0; x<WX; x++) for(int y=0; y<WY; y++) {baza[x][y].i = 0; bazaBufor[x][y].i = 0;}
bool flagaZycia = true;
bool czas = true;
int wzor = 0;
string etykieta;
int licznik_klikniecia = 0, licznik_klawisza = 0, licznik_pauzy = 0, licznik_koloru=0;
int limit_klikniecia = 10*SKALA, limit_klawisza = 15*SKALA, limit_pauzy = 15*SKALA, limit_koloru=2*SKALA;
//log
//ofstream log("log.txt", ios::app);
////wczytywanie wzorow
ifstream listaPlikow( "list.txt" );
int liczbaPlikow=0;
string nic;
//policzenie plikow
if( listaPlikow.good() )
{
while( !listaPlikow.eof() )
{
listaPlikow >> nic;
liczbaPlikow++;
}
}
listaPlikow.clear();
listaPlikow.seekg( 0, ios::beg );
wzory * katalog = new wzory[liczbaPlikow];
string nazwaWzoru;
if( listaPlikow.good() )
{
int i=0;
bool ok;
while( !listaPlikow.eof() )
{
listaPlikow >> nazwaWzoru ;
katalog[i] = wzory(nazwaWzoru, 1, ok);
if( ok )
{
i++;
}
else
{
liczbaPlikow--;
}
}
}
listaPlikow.close();
bufor = create_bitmap(WXp,WYp);
/////// glowna petla
while (!key[KEY_ESC] && !close_button_pressed)
{
//clear_to_color(bufor, makecol(100,100,100));
clear_to_color(bufor, makecol(00,00,00));
myszka();
if( licznik_klikniecia < limit_klikniecia ){ licznik_klikniecia++; }
if( licznik_klikniecia > limit_klikniecia ){ licznik_klikniecia = limit_klikniecia; }
if( licznik_pauzy < limit_pauzy ){ licznik_pauzy++; }
if( licznik_koloru < limit_koloru ){ licznik_koloru++; }
if( licznik_klawisza < limit_klawisza ){ licznik_klawisza++; }
etykieta = katalog[wzor].nazwa;
if( key[KEY_Z] && licznik_klawisza == limit_klawisza )
{
licznik_klawisza = 0;
wzor = (wzor+liczbaPlikow-1)%liczbaPlikow;
}
if( key[KEY_X] && licznik_klawisza == limit_klawisza )
{
licznik_klawisza = 0;
wzor = (wzor+1)%liczbaPlikow;
}
if( key[KEY_A] && licznik_klawisza == limit_klawisza ){licznik_klawisza=0; czas = !czas;}
if( key[KEY_S] && licznik_klawisza == limit_klawisza ){licznik_klawisza=0; flagaZycia = !flagaZycia;}
if( key[KEY_Q] ){for(int y=0; y<WY; y++) for(int x=0; x<WX; x++) {baza[x][y].i = 0; bazaBufor[x][y].i = 0;}}
if( key[KEY_R] && licznik_koloru == limit_koloru && (rlimit < 30) ){licznik_koloru=0; rlimit++;}
if( key[KEY_T] && licznik_koloru == limit_koloru && (rlimit > 1) ){licznik_koloru=0; rlimit--;}
if( key[KEY_F] && licznik_koloru == limit_koloru && (glimit < 30) ){licznik_koloru=0; glimit++;}
if( key[KEY_G] && licznik_koloru == limit_koloru && (glimit > 1) ){licznik_koloru=0; glimit--;}
if( key[KEY_V] && licznik_koloru == limit_koloru && (blimit < 30) ){licznik_koloru=0; blimit++;}
if( key[KEY_B] && licznik_koloru == limit_koloru && (blimit > 1) ){licznik_koloru=0; blimit--;}
if(mb == 1 && licznik_klikniecia == limit_klikniecia)
{
licznik_klikniecia = 0;
narysuj(bazaBufor, katalog[wzor]);
}
if( czas )
{
for(int x=0; x<WX; x++)
{
for(int y=0; y<WY; y++)
{
puszka sasiad[8];
short int otoczenie =
(bool)(sasiad[0].i = baza[ (x-1+WX)%WX ][ (y-1+WY)%WY ].i) +
(bool)(sasiad[1].i = baza[ (x-1+WX)%WX ][ y ].i) +
(bool)(sasiad[2].i = baza[ (x-1+WX)%WX ][ (y+1)%WY ].i) +
(bool)(sasiad[3].i = baza[ x ][ (y-1+WY)%WY ].i) +
(bool)(sasiad[4].i = baza[ x ][ (y+1)%WY ].i) +
(bool)(sasiad[5].i = baza[ (x+1)%WX ][ (y-1+WY)%WY ].i) +
(bool)(sasiad[6].i = baza[ (x+1)%WX ][ y ].i) +
(bool)(sasiad[7].i = baza[ (x+1)%WX ][ (y+1)%WY ].i);
if( (baza[x][y].i == 0) && (otoczenie == 3) || ( !flagaZycia && (otoczenie > 6 && otoczenie < 8) ) )
{
bazaBufor[x][y].kolor.r = ( (sasiad[0].kolor).r + (sasiad[1].kolor).r + (sasiad[2].kolor).r + (sasiad[3].kolor).r + (sasiad[4].kolor).r + (sasiad[5].kolor).r + (sasiad[6].kolor).r + (sasiad[7].kolor).r )/otoczenie;
(bazaBufor[x][y].kolor).g = ( (sasiad[0].kolor).g + (sasiad[1].kolor).g + (sasiad[2].kolor).g + (sasiad[3].kolor).g + (sasiad[4].kolor).g + (sasiad[5].kolor).g + (sasiad[6].kolor).g + (sasiad[7].kolor).g)/otoczenie;
(bazaBufor[x][y].kolor).b = ( (sasiad[0].kolor).b + (sasiad[1].kolor).b + (sasiad[2].kolor).b + (sasiad[3].kolor).b + (sasiad[4].kolor).b + (sasiad[5].kolor).b + (sasiad[6].kolor).b + (sasiad[7].kolor).b)/otoczenie;
}
if( (baza[x][y].i > 0) && (otoczenie == 3 || otoczenie == 2) ){bazaBufor[x][y].i = baza[x][y].i;}
if( (baza[x][y].i > 0) && (otoczenie != 3 && otoczenie != 2) && flagaZycia ){bazaBufor[x][y].i = 0;}
}
}
}
for(int x=0; x<WX; x++)
{
for(int y=0; y<WY; y++)
{
if(bazaBufor[x][y].i){circlefill(bufor, SKALA*x, SKALA*y, SKALA, makecol(bazaBufor[x][y].kolor.r*8, bazaBufor[x][y].kolor.g*8, bazaBufor[x][y].kolor.b*8) );}
baza[x][y].i = bazaBufor[x][y].i;
}
}
textprintf_ex(bufor,font,20,20,makecol(200,200,200),-1, "Q reset, R/T F/G V/B kolory");
textprintf_ex(bufor,font,20,40,makecol(200,200,200),-1, "wzor rysowania: %s (%d/%d)", etykieta.c_str(), wzor+1, liczbaPlikow);
textprintf_ex(bufor,font,20,60,makecol(200,200,200),-1, "pauz(A) %s (S)mierc %s", (czas) ? "wyl" : "wl", (!flagaZycia) ? "wyl" : "wl" );
textprintf_ex(bufor,font,20,80,makecol(200,200,200),-1, "R%.0f%% G%.0f%% B%.0f%%", (float)(31-rlimit)/0.3, (float)(31-glimit)/0.3, (float)(31-blimit)/0.3 );
rectfill(bufor, 6, 77, 18, 89, makecol( 255, 255, 255 ) );
rectfill(bufor, 7, 78, 17, 88, makecol( (30-rlimit)*8, (30-glimit)*8, (30-blimit)*8 ) );
blit(bufor,screen,0,0,0,0,WXp,WYp);
clear_keybuf();
}
///////////
destroy_bitmap(bufor);
allegro_exit();
return 0;
}
END_OF_MAIN()
/////////////////////////////////////////////////////////
void myszka()
{
if( mx != mouse_x || my != mouse_y || mb != mouse_b)
{
mx = mouse_x/SKALA;
my = mouse_y/SKALA;
mb = mouse_b;
}
};
void init()
{
LOCK_FUNCTION(close_button_handler);
set_close_button_callback(close_button_handler);
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,WXp,WYp,0,0);
install_mouse();
set_mouse_speed(5,5);
show_mouse(screen);
unscare_mouse();
install_timer();
install_int_ex(increment_speed, BPS_TO_TIMER(200));
srand(10);
}
void narysuj (puszka tab[WX][WY], wzory & wzor)
{
for(int i=0; i<wzor.rozmiar; i+=2)
{
tab[(mx+*(wzor.dane+i)+WX)%WX][(my+*(wzor.dane+i+1)+WY)%WY].kolor.r = rand()%rlimit + (30-rlimit) + 1;
tab[(mx+*(wzor.dane+i)+WX)%WX][(my+*(wzor.dane+i+1)+WY)%WY].kolor.g = rand()%glimit + (30-glimit) + 1;
tab[(mx+*(wzor.dane+i)+WX)%WX][(my+*(wzor.dane+i+1)+WY)%WY].kolor.b = rand()%blimit + (30-blimit) + 1;
}
}
/////////////