
#include "map2karte.h"
#include "main.h"

/*-------------------- Defines und globale Variablen --------------------*/
#define cmax	100
#define pmax	10

/*----- Initialisierung der globalen Variablen ----*/
static int	table[16383];					// alle Texturen Index=Texture, Eintrag=Farbe
static int	scriptcolor[cmax][2];			// nötig zum verarbeiten von texture.txt
static int	pointer[pmax];					// speichert Position der Küstenfarben




//--------------------------------------------------
//
//--------------------------------------------------
int getScriptcolor()
{
char leer[30];
int buffer,tmp,i=0,j=0;
int anz=0;

FILE *data;
	printf("SYS|Read Color Data...\n");
	
	printf("SYS|Reading color_area.txt...\n");
	data=fopen("scripts/color_area.txt","r");	
	while( fscanf(data,"%x",&scriptcolor[anz][1])!=EOF )
	{	
		fscanf(data,"%d",&scriptcolor[anz][0]);
		fscanf(data,"%d",&buffer);					// low
		fscanf(data,"%d",&buffer);					// high
		fgets(leer,30,data);						// Beschreibung

		anz++;
	}
	fclose(data);

/***** 2 Datei mit Farbdefinitionen in den Table verarbeiten *****/

	printf("SYS|Reading color_coast.txt...\n");
	data=fopen("scripts/color_coast.txt","r");	
	while( fscanf(data,"%x",&scriptcolor[anz][1])!=EOF )
	{	
		if(i%2!=0) 
		{
			scriptcolor[anz][1]=scriptcolor[anz-1][1];			// Küstenfarben ersetzen
			pointer[j]=scriptcolor[anz][1];
			j++;
		}
		fscanf(data,"%d",&scriptcolor[anz][0]);
		fscanf(data,"%d",&buffer);					// low
		fscanf(data,"%d",&buffer);					// high
		fgets(leer,30,data);						// Beschreibung

		anz++;
		i++;
	}
	fclose(data);


/***** 3 Datei mit Farbdefinitionen in den Table verarbeiten *****/

	printf("SYS|Reading color_mntn.txt...\n");
	data=fopen("scripts/color_mntn.txt","r");	
	while(fgets(leer,5,data)!=NULL)		
	{
		fgets(leer,30,data);						// Beschreibung
		fscanf(data,"%x",&scriptcolor[anz][1]);		// Gruppencode
		fscanf(data,"%d",&scriptcolor[anz][0]);		// Texturengruppe
		fgets(leer,30,data);						// Restzeile
		fscanf(data,"%x",&tmp);
		if(tmp!=0)
		{
			fgetc(data);
			fscanf(data,"%d",&buffer);
		}
		for(i=0;i<8;i++)
			fgets(leer,15,data);

		anz++;
	}
	fclose(data);

return anz;
}



//--------------------------------------------------
//
//--------------------------------------------------
void getScripttiles(int colormax)
{
int i,tmp,anzahl,id;
char leer[30];

printf("SYS|Reading texture_area.txt...\n");
FILE *tiles = fopen("scripts/texture_area.txt","r");	

	
	while( fgets(leer,5,tiles)!=NULL )		
	{					
			fgets(leer,30,tiles);					// Beschreibung
			fscanf(tiles,"%d",&tmp);				// Texturengruppe
			for(i=0;i<colormax;i++)
				if(tmp==scriptcolor[i][0])
				{
					tmp=scriptcolor[i][1];			// Übergabe der Farbcode
					fscanf(tiles,"%d",&anzahl);		// Anzahl der GruppenIDs
					for( i=0;i<anzahl;i++ )
					{
						id=0;
						fscanf(tiles,"%x",&id);		
						if(table[id]==0xE6FF00)
							table[id]=tmp;			// ablegen der gelesenen ID im Table
					}
					i=colormax+10;					// for-Schleifenabbruch
				}
			if(i==colormax)
			{
				fscanf(tiles,"%d",&anzahl);			// Anzahl der GruppenIDs
				for( i=0;i<anzahl;i++ )
				{
					fscanf(tiles,"%x",&id);		
					if(table[id]==0xE6FF00)
						table[id]=0xFFC8C8;			// Farbe nicht zugewiesen daher FFC8C8(rosa)
				}
			}
	}
	fclose(tiles);
}


/*


//--------------------------------------------------
//
//--------------------------------------------------
void loadCoastData()
{
int j;
char leer[25];

FILE *datei=fopen("scripts/coast_texture.txt","r");	
	

	while( fgets(leer,25,datei)!=NULL )
	{
		neu->next = (coast*)malloc(sizeof(coast));

		fgets(leer,25,datei);							//Beschreibung
		fscanf(datei,"%x",&neu->color_a);
		fscanf(datei,"%x",&neu->fault);					//für Lücken
		for( j=0;j<12;j++)
		{
			fscanf(datei,"%x",&neu->item[j][0]);
			if( fgetc(datei)==',' )
				fscanf(datei,"%x",&neu->item[j][1]);
			else 
				neu->item[j][1]=0;
		}
		fscanf(datei,"%x",&neu->color_b);
		fscanf(datei,"%x",&neu->spezial);
		for( j=0;j<12;j++)
		{
			fscanf(datei,"%x",&neu->side[j][0]);
			if( fgetc(datei)==',' )
				fscanf(datei,"%x",&neu->side[j][1]);
			else neu->side[j][1]=0;
		}
		if( neu->side[11][1]!=0 )						//Berücksichtigung: getc evtl.'\o' gelöscht
			fgets(leer,25,datei);
		fgets(leer,25,datei);

		neu = neu->next;
		neu->next=NULL;
	}
	fclose(datei);
}

*/

//--------------------------------------------------
//
//--------------------------------------------------
void getScriptcliff()
{
int i=0;
int color,buffer,id;
char leer[25];
			

	FILE *f_data;
	f_data = fopen("scripts/texture_cliff.txt","r");

	fgets(leer,25,f_data);
	fscanf(f_data,"%x",&color);								//Farbfestsetzung
	fgets(leer,25,f_data);									//Beschreibung
	fgets(leer,25,f_data);									//Leerzeile

	while( fgets(leer,25,f_data)!=NULL )					//Beschreibung
	{	
		while( fscanf(f_data,"%x",&buffer)!=0 && fgetc(f_data)!=EOF )
		{	
			fscanf(f_data,"%x",&buffer);
			for(i=0;i<3;i++)
				if(fscanf(f_data,"%x",&id)!=0)
					if(table[id]==0xE6FF00)
						table[id]=color;
			fgets(leer,25,f_data);							//Beschreibung
		}
	}
	fclose(f_data);
}



//--------------------------------------------------
//
//--------------------------------------------------
void getSmoothData()
{
int i,buffer,color,id;
char leer[25],tmp;

FILE *datei = fopen("scripts/texture_smooth.txt","r");	
printf("SYS|Reading texture_smooth.txt...\n");	
	
	while( fgets(leer,25,datei)!=NULL )
	{		
		fgets(leer,25,datei);				// Beschreibung
		fscanf(datei,"%x",&color);
		fscanf(datei,"%x",&buffer);
		fscanf(datei,"%d",&buffer);
		for( i=0;i<12;i++ )
		{
			fscanf(datei,"%x",&id);
			if(table[id]==0xE6FF00)
				table[id]=color;
			if( tmp=fgetc(datei)==',' )
			{
				fscanf(datei,"%x",&id);
				if(table[id]==0xE6FF00)
					table[id]=color;
			}	
		}
		if(tmp==',')
			fgets(leer,25,datei);			// Zeilenende
		fgets(leer,25,datei);				// Leerzeile
	}
	fclose(datei);
}



//--------------------------------------------------
//
//--------------------------------------------------
void ReadMUL()
{
int blockx, blocky, x, y;
int empty = 0;
FILE *map0 = fopen(mapmul,"rb");

	printf("SYS|Read %s and create Array...\n",mapmul);
	for(blockx=0; blockx<768; blockx++)
	{
		for(blocky=0; blocky<512; blocky++)
		{
			fread( &empty, 4, 1, map0 );					// BlockHeader ohne Funktion

			for(y=(8*blocky); y<(8*(blocky+1)); y++)
			{
				for(x=(8*blockx); x<(8*(blockx+1)); x++)
				{
					BMPID[x][y]=0;
					MapAlt[x][y]=0;
					if(x < XBORDER && y < YBORDER)
					{
						fread( &BMPID[x][y], 2, 1, map0 );
						if(BMPID[x][y]<4096)
							BMPID[x][y]=table[BMPID[x][y]];		// ID->Farbe
						fread( &MapAlt[x][y], 1, 1, map0 );
					}
				}
			}
		}
	}
	fclose(map0);
}



//--------------------------------------------------
//
//--------------------------------------------------
void Render()
{
int x,y,i,j;
int A=0xE6FF00,B=0;

	printf("SYS|Compensate Coasts...\n");
		for(x=1; x<XBORDER; x++)
			for(y=1; y<YBORDER; y++){
				i=0;
				if(BMPID[x][y] == A)
					while(pointer[i]!=-1 && i<10){
						B=pointer[i];
						for(j=1;j<4;j++){
							//Seiten
							if(BMPID[x][y-j]==B){BMPID[x][y]=B; break;}
							if(BMPID[x][y+j]==B){BMPID[x][y]=B; break;}
							if(BMPID[x+j][y]==B){BMPID[x][y]=B; break;}
							if(BMPID[x-j][y]==B){BMPID[x][y]=B; break;}
							//ECKEN
							if(BMPID[x+j][y+j]==B){BMPID[x][y]=B; break;}
							if(BMPID[x-j][y-j]==B){BMPID[x][y]=B; break;}
							if(BMPID[x+j][y-j]==B){BMPID[x][y]=B; break;}
							if(BMPID[x-j][y+j]==B){BMPID[x][y]=B; break;}
						}
						i++;
					}
			}
}



//--------------------------------------------------
//
//--------------------------------------------------
int map2karte()
{
int i;
int colormax;				// Begrenzungsvar

	system("cls");
	printf("---------------------------------------\n");
	printf("SYS|Clear Array...\n");
	for(i=0;i<4096;i++)		// vorbesetzen mit 0xE6FF00, für die 
		table[i]=0xE6FF00;	// Vergabe der Farben relevant (neogelb)
	for(i=0;i<10;i++)
		pointer[i]=-1;
	getConfig();
	colormax = getScriptcolor();
	printf("SYS|Create Tokentable...\n");
	getScripttiles(colormax);
	getSmoothData();
	ReadMUL();
	Render();
	printf("---------------------------------------\n");
	printf("Write\n");
	WriteBMP("bmp\\karte_xxl.bmp",1);

	printf("Done.\n");

return 0;
}