#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;
/////////////////////////
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();
}
};
int mx=0,my=0,mb=0;
void myszka();
int kolor(short unsigned int p);
void narysuj(short unsigned int[WX][WY], wzory &);
void init();
/////////////////////////////////////////////////////////
int main()
{
allegro_init();
init();
BITMAP *bufor = NULL;
short unsigned int baza[WX][WY];
short unsigned int bazaBufor[WX][WY];
for(int x=0; x<WX; x++) for(int y=0; y<WY; y++) {baza[x][y] = 0; bazaBufor[x][y] = 0;}
bool flagaZycia = true;
bool czas = true;
int wzor = 0;
string etykieta;
int licznik_klikniecia = 0, licznik_klawisza = 0, licznik_pauzy = 0;
int limit_klikniecia = 10*SKALA, limit_klawisza = 15*SKALA, limit_pauzy = 15*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));
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_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] = 0; bazaBufor[x][y] = 0;}}
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++)
{
int otoczenie =
(bool)baza[ (x-1+WX)%WX ][ (y-1+WY)%WY ] +
(bool)baza[ (x-1+WX)%WX ][ y ] +
(bool)baza[ (x-1+WX)%WX ][ (y+1)%WY ] +
(bool)baza[ x ][ (y-1+WY)%WY ] +
(bool)baza[ x ][ (y+1)%WY ] +
(bool)baza[ (x+1)%WX ][ (y-1+WY)%WY ] +
(bool)baza[ (x+1)%WX ][ y ] +
(bool)baza[ (x+1)%WX ][ (y+1)%WY ];
if( (baza[x][y] == 0) && (otoczenie == 3) ){bazaBufor[x][y] = 1;}
if( (baza[x][y] > 0) && (otoczenie == 3 || otoczenie == 2) ){bazaBufor[x][y] = baza[x][y];}
if( (baza[x][y] > 0) && (otoczenie != 3 && otoczenie != 2) && flagaZycia ){bazaBufor[x][y] = 0;}
if( (bazaBufor[x][y] > 0) && (bazaBufor[x][y] == baza[x][y]) )
{
if( baza[x][y] < 65400 )
bazaBufor[x][y] += 100;
}
}
}
}
for(int x=0; x<WX; x++)
{
for(int y=0; y<WY; y++)
{
if(baza[x][y]){rectfill(bufor, SKALA*x, SKALA*y, SKALA*(x+1), SKALA*(y+1), kolor(baza[x][y]) );}
baza[x][y] = bazaBufor[x][y];
}
}
textprintf_ex(bufor,font,20,20,makecol(200,200,200),-1, "smierc: A wl, S wyl; Q reset");
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, "pauza %s smierc %s", (czas) ? "wyl" : "wl", (!flagaZycia) ? "wyl" : "wl" );
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));
}
int kolor(short unsigned int p)
{
p /= 255;
if(p == 0)
{return makecol(0,255,0);}
else if(p>0 && p<=127)
{return makecol(2*p,255,0);}
else if(p>127 && p<255)
{return makecol(255,255 - 2*p,0);}
else
{return makecol(255,0,0);}
}
void narysuj (short unsigned int 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] = 1;
}
}
/////////////