#include <iostream>
#include <fstream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;


int main(int argc, char** argv) {
	
ifstream plik;
ofstream plik0;
int	linie;
unsigned char mapa[16000];

int znaki0[256],znaki1[256],znaki2[256],znaki3[256],znaki4[256];
int z0,z1,z2,z3,z4;
unsigned char a;
int i,ii,nr;
unsigned char zestaw[2048],zestaw0[1024],zestaw1[1024],zestaw2[1024],zestaw3[1024],zestaw4[1024];
unsigned char tablica0[256],tablica1[256],tablica2[256],tablica3[256],tablica4[256];
unsigned char tablica0b[256],tablica1b[256],tablica2b[256],tablica3b[256],tablica4b[256];

/*
//level0
const int injekt0[] ={ 0xd8,0xd9,0xcd,0x45,0x8c,0x48,0x8f };
const int injekt1[] ={ 0xcd,0xd8,0xd9,0x47,0x46,0x8d,0x8e,0x48,0xd3,0xe6,0x8f };
const int injekt2[] ={ 0xd2,0xd1,0xcd,0x45,0x8c,0x48,0xd4,0xe7,0x8f };
const int injekt3[] ={ 0xcf,0xce,0xcd,0x48,0x8f,0x49,0x90 };
const int injekt4[] ={ 0xcd,0x48,0x8f };  */


 
//Level1
const int injekt0[] = {0x6e,0x7b,0x72,0x7d,0x6b,0xe2,0x8f,0x6a,0x35,0x18,0xee,0x7a,0xb7,0x30,
		0x69,0xde,0xe0,0x77,0xeb,0x71,0xef,0x79,0x74,0x14,0x33,0x32,0xd8,0xd9,0xcd,0x45,0x8c,
		0x48 };
const int injekt1[] ={ 0x30,0x7a,0x71,0x74,0x6e,0x72,0x7d,0xda,0x6a,0xf1,0xff,0xec,0xde,0x7b,
		0x6b,0xe2,0x8f,0x35,0x18,0xee,0x70,0xd7,0x77,0xef,0xeb,0xcd,0xd8,0xd9,0x47,0x8d,0x8e,
		0x48,0xd3,0xe6 };
const int injekt2[] ={ 0x30,0x7a,0xd7,0xdd,0x71,0x74,0x7b,0xda,0x6a,0xf1,0xde,0xe0,0x6e,0x72,
		0x7d,0xf1,0xff,0xec,0xde,0x82,0x77,0x78,0xe2,0x92,0x1b,0x8e,0xcd,0x45,0x8c,0x48,0xd4,
		0xe7,0x8f,0x00 };
const int injekt3[] ={ 0x30,0x7a,0xb7,0x7b,0x73,0x69,0x74,0x6a,0xdf,0xde,0xeb,0xff,0x1f,0xd7,
		0xdd,0x71,0xda,0xf1,0xe0,0x76,0x79,0x77,0x78,0x1c,0x92,0xed,0xcf,0xce,0x4f,0xcd,0x48,
		0x8f,0x49,0x90,0x00 };
const int injekt4[] ={ 0x7a,0xb7,0x7b,0x72,0x6b,0x30,0x69,0x6a,0xdf,0xe0,0x77,0xeb,0x73,0x74,
		0xde,0xeb,0xff,0x1f,0x76,0x6e,0x79,0x7d,0xe1,0x1b,0x1e,0xf1,0xcd,0x48,0x8f,0xd2,0xd1 }; 		 

plik.open("l1-map.bin",ios::in | ios::binary);
for(i=0;i<200;i++)
	plik.read((char*)&mapa[i*40],40);
plik.close();
linie=200;

plik.open("l1-charset.bin",ios::in | ios::binary);
plik.read((char*)&zestaw,2048);
plik.close(); 



for(i=0;i<256;i++)
{
	znaki0[i]=0;
	znaki1[i]=0;
	znaki2[i]=0;
	znaki3[i]=0;
	znaki4[i]=0;	
	tablica0[i]=-1;
	tablica1[i]=-1;
	tablica2[i]=-1;
	tablica3[i]=-1;
	tablica4[i]=-1;
}



for(i=0;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];	
		znaki0[a]++;	
	}

nr=sizeof(injekt0)/sizeof(injekt0[0]);		
for(i=0;i<nr;i++)	
	znaki0[injekt0[i]]++;

cout << nr << "\n";		
	
for(i=1;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		znaki1[a]++;	
	}	

nr=sizeof(injekt1)/sizeof(injekt1[0]);	
for(i=0;i<nr;i++)	
	znaki1[injekt1[i]]++;	

cout << nr << "\n";

for(i=2;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		znaki2[a]++;	
	}

nr=sizeof(injekt2)/sizeof(injekt2[0]);	
for(i=0;i<nr;i++)	
	znaki2[injekt2[i]]++;	

cout << nr << "\n";

for(i=3;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		znaki3[a]++;	
	}

nr=sizeof(injekt3)/sizeof(injekt3[0]);	
for(i=0;i<nr;i++)	
	znaki3[injekt3[i]]++;
	
cout << nr << "\n";		
	
for(i=4;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		znaki4[a]++;	
	}	

nr=sizeof(injekt4)/sizeof(injekt4[0]);	
for(i=0;i<nr;i++)	
	znaki4[injekt4[i]]++;
	
cout << nr << "\n";					
	
z0=0;
z1=0;
z2=0;
z3=0;
z4=0;
for(i=0;i<256;i++)
{
	if(znaki0[i]>0) z0++;
	if(znaki1[i]>0) z1++;
	if(znaki2[i]>0) z2++;
	if(znaki3[i]>0) z3++;
	if(znaki4[i]>0) z4++;		
}

cout << "zestaw0 = " << z0 << " znakow\n";
cout << "zestaw1 = " << z1 << " znakow\n";
cout << "zestaw2 = " << z2 << " znakow\n";
cout << "zestaw3 = " << z3 << " znakow\n";
cout << "zestaw4 = " << z4 << " znakow\n";

nr=0;
for(i=0;i<256;i++)
{
	if(znaki0[i]>0)
	{
		tablica0[i]=(unsigned char)nr;
		tablica0b[nr]=(unsigned char)i;
		for(ii=0;ii<8;ii++)
			zestaw0[nr*8+ii]=zestaw[i*8+ii];			
		nr++;	
	}
}

plik0.open("zestaw0_l.fnt",ios::out | ios::binary);
plik0.write((char*)&zestaw0,1024);
plik0.close();

plik0.open("mask0_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica0b,128);
plik0.close();

plik0.open("unmask0_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica0,256);
plik0.close();

nr=0;
for(i=0;i<256;i++)
{
	if(znaki1[i]>0)
	{
		tablica1[i]=(unsigned char)nr;
		tablica1b[nr]=(unsigned char)i;
		for(ii=0;ii<8;ii++)
			zestaw1[nr*8+ii]=zestaw[i*8+ii];			
		nr++;	
	}
}

plik0.open("zestaw1_l.fnt",ios::out | ios::binary);
plik0.write((char*)&zestaw1,1024);
plik0.close();

plik0.open("mask1_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica1b,128);
plik0.close();

plik0.open("unmask1_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica1,256);
plik0.close();

nr=0;
for(i=0;i<256;i++)
{
	if(znaki2[i]>0)
	{
		tablica2[i]=(unsigned char)nr;
		tablica2b[nr]=(unsigned char)i;
		for(ii=0;ii<8;ii++)
			zestaw2[nr*8+ii]=zestaw[i*8+ii];			
		nr++;	
	}
}

plik0.open("zestaw2_l.fnt",ios::out | ios::binary);
plik0.write((char*)&zestaw2,1024);
plik0.close();

plik0.open("mask2_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica2b,128);
plik0.close();

plik0.open("unmask2_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica2,256);
plik0.close();

nr=0;
for(i=0;i<256;i++)
{
	if(znaki3[i]>0)
	{
		tablica3[i]=(unsigned char)nr;
		tablica3b[nr]=(unsigned char)i;
		for(ii=0;ii<8;ii++)
			zestaw3[nr*8+ii]=zestaw[i*8+ii];			
		nr++;	
	}
}

plik0.open("zestaw3_l.fnt",ios::out | ios::binary);
plik0.write((char*)&zestaw3,1024);
plik0.close();

plik0.open("mask3_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica3b,128);
plik0.close();

plik0.open("unmask3_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica3,256);
plik0.close();

nr=0;
for(i=0;i<256;i++)
{
	if(znaki4[i]>0)
	{
		tablica4[i]=(unsigned char)nr;
		tablica4b[nr]=(unsigned char)i;
		for(ii=0;ii<8;ii++)
			zestaw4[nr*8+ii]=zestaw[i*8+ii];			
		nr++;	
	}
}

plik0.open("zestaw4_l.fnt",ios::out | ios::binary);
plik0.write((char*)&zestaw4,1024);
plik0.close();

plik0.open("mask4_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica4b,128);
plik0.close();

plik0.open("unmask4_l.fnt",ios::out | ios::binary);
plik0.write((char*)&tablica4,256);
plik0.close();

for(i=0;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		mapa[i*40+ii]=tablica0[a];
	}
	
for(i=1;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		mapa[i*40+ii]=tablica1[a];
	}
	
for(i=2;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		mapa[i*40+ii]=tablica2[a];
	}	

for(i=3;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		mapa[i*40+ii]=tablica3[a];
	}	
	
for(i=4;i<linie;i=i+5)
	for(ii=0;ii<40;ii++)
	{
		a=mapa[i*40+ii];
		mapa[i*40+ii]=tablica4[a];
	}		
	
plik0.open("mapa_l.bin",ios::out | ios::binary);
plik0.write((char*)&mapa,8000);
plik0.close();	
	
	return 0;
}


